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

相关推荐
二宝哥11 小时前
CentOS 7.9 系统下 Redis 5.0.4 单机安装与源码编译安装指南
redis·centos
时空无限15 小时前
vllm 缓存对模型启动时间的影响
缓存·vllm
ShiXZ21317 小时前
Redis docker-compose 部署指南
redis·docker·eureka
青山木20 小时前
Redis 缓存一致性全解:从 Cache Aside 到延迟双删、Canal+MQ 的进阶之路
java·数据库·redis·后端·缓存
YDS82920 小时前
大营销平台 —— 活动SKU库存扣减业务及其一致性处理
java·spring boot·redis·rabbitmq·ddd
咏方舟【长江支流】21 小时前
【开源】跨语言·跨平台·跨数据库(6) ——一种ORM缓存的接口实现和容错处理
数据库·缓存·开源·咏方舟-长江支流·用宝框架
爬也要爬着前进1 天前
redis主从搭建
数据库·redis·缓存
用户095367515832 天前
在系统的学习 redis 前的疑惑
redis·go
吴声子夜歌2 天前
Redis 3.x——集群故障转移
java·数据库·redis·集群
明豆2 天前
Redis 分布式缓存生产实战
redis·分布式·缓存