springAI alibaba 最新版本如何配置缓存会话记忆到redis

本来想让AI写一下下面步骤的,测试了豆包,deepseek这些都不行,AI写的东西都是瞎写的,,我都无语了,只能直接手动写了,啥也做不了,不得不吐槽

  1. pom.xml导入依赖
java 复制代码
 <!-- DashScope ChatModel 支持(如果使用其他模型,请跳转 Spring AI 文档选择对应的 starter) -->
        <dependency>
            <groupId>com.alibaba.cloud.ai</groupId>
            <artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
            <version>1.1.2.0</version>
        </dependency>

        <!--spring-ai-alibaba memory-redis-->
        <dependency>
            <groupId>com.alibaba.cloud.ai</groupId>
            <artifactId>spring-ai-alibaba-starter-memory-redis</artifactId>
            <version>1.1.2.0</version>
        </dependency>
        <!--jedis-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>

2.yml文件配置

java 复制代码
spring:
  application:
    name: spring_ai_001
  ai:
    dashscope:
      api-key: sk-xxxx
      base-url: https://dashscope.aliyuncs.com
      chat:
        options:
          model: qwen-plus
  data:
    redis:
      host: localhost
      port: 6379
      database: 8
      timeout: 3000
      connect-timeout: 3000

3.配置有两种方式,我们看一下源码,ChatMemoryRepository 下面有几个实现类,我下面配置的是 JedisRedisChatMemoryRepository

4.写一个config配置类

java 复制代码
package com.hx.springai.config;

import com.alibaba.cloud.ai.memory.redis.JedisRedisChatMemoryRepository;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.JedisPoolConfig;

@Configuration
public class ChatRedisConfig {

    @Value("${spring.data.redis.host}")
    private String host;
    @Value("${spring.data.redis.port}")
    private int port;
    @Value("${spring.data.redis.database}")
    private int database;

    // 1. Jedis Redis 仓库(官方提供,就是你要的类
    @Bean
    public JedisRedisChatMemoryRepository jedisRedisChatMemoryRepository(){
        JedisRedisChatMemoryRepository.RedisBuilder builder = JedisRedisChatMemoryRepository.builder();
        return builder.host(host)
                .port(port)
                .database(database)
                .build();
    }

    // 2. 绑定到消息窗口记忆(最多保留 N 条)
    @Bean
    public ChatMemory chatMemory(JedisRedisChatMemoryRepository repo) {
        return MessageWindowChatMemory.builder()
                .maxMessages(20) // 可改
                .chatMemoryRepository(repo)
                .build();
    }
}

5.在你自己的model或者client中指定一下 ChatMemory 就可以了

java 复制代码
@Bean(name = "qwenChatClient")
    public ChatClient qwenChatClient(@Qualifier("qwenModel") ChatModel chatModel,
                                     ChatMemory chatMemory) {
        return ChatClient.builder(chatModel)
                .defaultOptions(OpenAiChatOptions.builder().model(qwen_plus).build())
                .defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build())
                .build();
    }

6.controller层写法

java 复制代码
package com.hx.springai.controller;

import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.function.Consumer;

import static org.springframework.ai.chat.memory.ChatMemory.CONVERSATION_ID;

/**
 * 使用redis保存会话记忆
 */
@RestController
@RequestMapping("/redis")
public class ChatRedisController {

    @Resource(name = "qwenChatClient")
    private ChatClient qwenChatClient;


    @RequestMapping("/chat")
    public String chat(String msg,String userId){
        String content = qwenChatClient.prompt(msg).advisors(new Consumer<ChatClient.AdvisorSpec>() {
            @Override
            public void accept(ChatClient.AdvisorSpec advisorSpec) {
                advisorSpec.param(CONVERSATION_ID, userId);
            }
        }).call().content();
        return content;
    }

    @RequestMapping("/chat2")
    public String chat2(String msg,String userId){
        String content = qwenChatClient.prompt( msg)
                .advisors(advisorSpec -> advisorSpec.param(CONVERSATION_ID, userId))
                .call()
                .content();
        return content;
    }
}

最后看一下效果,只要多发几次消息,redis里面有这个缓存就行

相关推荐
Devin~Y4 小时前
大厂Java面试实录:Spring Boot/Cloud、JVM、Redis、Kafka、MyBatis 到 RAG/Agent 的三轮连环问(含答案详解)
java·jvm·spring boot·redis·spring cloud·kafka·mybatis
jran-4 小时前
Redis NoSQL&Redis架构&数据结构
数据库·redis·缓存
lifewange15 小时前
Redis 集合(Set)运算完全指南
数据库·chrome·redis
phltxy18 小时前
Redis 主从复制
java·数据库·redis
shixiaoyu66619 小时前
Redis主从原理及哨兵搭建
redis
环流_20 小时前
redis:持久化rdb
java·数据库·redis
難釋懷20 小时前
Redis通信协议-基于Socket自定义Redis的客户端
数据库·redis·缓存
环流_20 小时前
redis:AOF
数据库·redis·spring
半夜修仙21 小时前
Redis入门
数据库·redis·缓存