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里面有这个缓存就行

了

相关推荐
饺子大魔王的男人2 小时前
Redis 内存和连接异常怎么排查?用 redis_exporter 搭一套可远程抓取的监控链路
数据库·redis·bootstrap
夕除3 小时前
redis--RDB AOF
数据库·redis·缓存
夕除5 小时前
redis--UV
redis
ShineWinsu7 小时前
对于Redis:Redis的认识以及分布式系统的解析
linux·数据库·c++·redis·缓存·消息队列·分布式架构
Wang's Blog9 小时前
Java 项目实战: 外卖平台优化-使用Redis作为缓存产品与TTL配置
java·redis·缓存
分布式存储与RustFS11 小时前
AI 训练大文件 Range 读爆炸?RustFS 前面挂一层 Cachey
缓存·云原生·开源·对象存储·分布式存储·ai训练·s3
RISCV_Explorer12 小时前
技术指南:从总线协议到软件可见行为——RISC-V 多核缓存一致性的 Linux 实践
linux·缓存·risc-v
一只旭宝12 小时前
【C++复习】四种类型转换 + 常见设计模式 + Redis/MySQL(后端面试复习完整版)
c++·redis·笔记·mysql·设计模式
小羊没烦恼!12 小时前
【译】利用Asp.net MVC处理文件的上传下载
开发语言·缓存·c#·word·powerpoint·.net
ShineWinsu12 小时前
对于Redis:Redis特性以及应用场景的解析
linux·c++·redis·缓存·高并发·分布式系统·key-value