当前位置: 首页 > java >正文

Spring AI - Redis缓存对话

先看效果

在这里插入图片描述
对话过程被缓存到了Redis 中。

原理

在上一节我们快速入门了SpringAI,具体文章请查看:快速入门Spring AI

创建 ChatClient 的代码如下:

this.chatClient = ChatClient.builder(chatModel).defaultSystem(DEFAULT_PROMPT).defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory())).defaultAdvisors(new SimpleLoggerAdvisor()).defaultOptions(OpenAiChatOptions.builder().temperature(0.0d).build()).build();

其中new MessageChatMemoryAdvisor(new InMemoryChatMemory()) 会将对话缓存在内存中,查看类InMemoryChatMemory 的源码发现,它实际上实现了ChatMemory 接口,实现了 addget以及clear三个方法。

实现

先添加 Redis 的依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

然后定义一个类 RedisChatMemory 实现 ChatMemory 接口,实现三个方法:

@Override
public void add(String conversationId, List<Message> messages) {long time = System.currentTimeMillis();for (Message message : messages) {redisTemplate.opsForHash().put(conversationId, String.valueOf(time), message);}
}@Override
public List<Message> get(String conversationId, int lastN) {Map<Object, Object> entries = redisTemplate.opsForHash().entries(conversationId);return entries.entrySet().stream().sorted((o1, o2) -> {long time1 = Long.parseLong(o1.getKey().toString());long time2 = Long.parseLong(o2.getKey().toString());return Long.compare(time1, time2);}).limit(lastN).map(e -> new UserMessage(e.getValue().toString())).collect(Collectors.toList());
}@Override
public void clear(String conversationId) {redisTemplate.delete(conversationId);
}

再把 RedisChatMemory 注册成 Bean 对象:

@Bean
public RedisChatMemory redisChatMemory(RedisTemplate<String, Object> redisTemplate) {return new RedisChatMemory(redisTemplate);
}

最后替换 ChatClient 定义中的 InMemoryChatMemory

this.chatClient = ChatClient.builder(chatModel).defaultSystem(DEFAULT_PROMPT)
//      .defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory())).defaultAdvisors(new MessageChatMemoryAdvisor(redisChatMemory)).defaultAdvisors(new SimpleLoggerAdvisor()).defaultOptions(OpenAiChatOptions.builder().temperature(0.0d).build()).build();

具体代码:代码地址

http://www.xdnf.cn/news/1524.html

相关文章:

  • 第五章:5.3 ESP32物联网应用:阿里云IoT平台与腾讯云IoT平台的数据上传与远程控制
  • 阻塞式队列
  • 非关系型数据库 八股文 Redis相关 缓存雪崩 击穿 穿透
  • Vite/Rollup 模块热更新
  • Springboot整合Redis主从
  • Java基础系列-HashMap源码解析2-AVL树
  • Java内存模型之JMM
  • NEUOJ网格路径
  • 本地服务器 Odoo 安装指南,并实现公网访问
  • MySQL基础增删改
  • LeetCode-47. 全排列 II
  • 杰理ac792开发板按键不起效果
  • ElasticSearch:高并发场景下如何保证读写一致性?
  • 搭建TypeScript单元测试环境
  • 高性能全闪存储在大模型训练与推理中的效率提升作用
  • HTTP 请求头的 key 不区分大小写。
  • 接口测试和功能测试详解
  • 【AI】Windows环境安装SPAR3D单图三维重建心得
  • 玩转Docker | 使用Docker部署Neko自托管浏览器
  • Chronos - 时间序列预测语言模型
  • SwiftUI 1.Text介绍和使用
  • Elasticsearch 报错 Limit of total fields [1000] has been exceeded
  • SwiftUI 3.Button介绍和使用
  • Python爬虫学习:高校数据爬取与可视化
  • UIAutomator 与 Playwright 在 AI 自动化中的界面修改对比
  • Java学习手册:Web 安全基础
  • MyBatis 升级至 MyBatis-Plus 详细步骤
  • 常用嵌入式软件代码编码规范的关系和覆盖
  • 海康NVR配置NAS-TrueNAS
  • Mysql 简单数据查询