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

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();

具体代码:代码地址

相关文章:

  • 基于Flask与Ngrok实现Pycharm本地项目公网访问:从零部署
  • 开源模型应用落地-语音合成-Spark-TTS-零样本克隆与多语言生成的突破
  • 浏览器相关知识点
  • 【AI 加持下的 Python 编程实战 2_09】DIY 拓展:从扫雷小游戏开发再探问题分解与 AI 代码调试能力(上)
  • Joint communication and state sensing under logarithmic loss
  • iOS18 MSSBrowse闪退
  • Unity 创建、读取、改写Excel表格数据
  • 理解计算机系统_网络编程(1)
  • 自建开源远程协助服务RustDesk —— 筑梦之路
  • Axure中继器表格:实现复杂交互设计的利器
  • 【Bug】 [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
  • 【工具变量】各市ZF数字治理指标数据集(2001-2024年)
  • 大语言模型(LLM)的Prompt Engineering:从入门到精通
  • 同z科技面经
  • 2024从Maven-MySQL-Nginx部署
  • 【解决】layui layer的提示框,弹出框一闪而过的问题
  • 众趣科技X世界读书日丨数字孪生技术赋能图书馆空间智慧化运营
  • RPC通信原理实战
  • 7.7 Axios+Redux+JWT全链路实战:打通前后端API通信最佳实践
  • 【论文阅读】Hierarchical Group-Level Emotion Recognition
  • 魔都眼|石库门里看车展,五一来张园体验城市“漫时光”
  • 长三角铁路今日预计发送旅客420万人次,有望创单日客发量新高
  • 人民日报社论:坚定信心、奋发有为、创新创造——写在“五一”国际劳动节
  • 两部门预拨4000万元支持山西、广西、陕西做好抗旱救灾工作
  • 美参议院通过新任美国驻华大使任命,外交部回应
  • 对谈|李钧鹏、周忆粟:安德鲁·阿伯特过程社会学的魅力