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

相关推荐
wj3055853782 小时前
Claude Code接入MiMo缓存失效?1个变量秒修复
缓存·mimo·claude code
x***r1513 小时前
Redis Desktop Manager 0.8.8 安装教程(Windows redis-desktop-manager-0.8.8.384详细步骤)
数据库·windows·redis
无涯大者4 小时前
Redis 实现页面缓存、购物车、登录 token示例、点赞 / 阅读计数,排行榜 示例
redis·缓存
真实的菜5 小时前
Redis 从入门到精通(十三):性能优化与运维实战 —— 慢查询、内存优化、监控与安全
运维·redis·性能优化
zzqssliu5 小时前
taocarts高并发缓存架构:多级缓存策略、热点数据预加载与防缓存穿透实战
缓存·架构
Java 码思客8 小时前
【Redis分布式缓存实战】第20章 Redis监控运维与自动化体系
运维·redis·缓存
勇往直前plus8 小时前
Redis&Python 梳理
数据库·redis·python
我是一颗柠檬8 小时前
【Java项目技术亮点】分布式锁实现与优化:从Redisson到ZooKeeper,彻底搞懂分布式锁的底层原理
java·redis·分布式·中间件·java-zookeeper
myenjoy_18 小时前
采集网关的离线缓存与断点续传——当网络不可靠时,数据一条都不能丢
网络·缓存
我血条子呢9 小时前
飞书缓存移到D盘
缓存·飞书