当前位置: 首页 > 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
  • 欧盟数字法开出首张罚单:苹果和Meta合计被罚7亿欧元
  • 乌克兰关切有中国人在俄军中服务,外交部:坚决反对无端指责
  • 宫崎骏电影《幽灵公主》4K修复版定档五一
  • 三部门:对不裁员少裁员的参保企业实施稳岗返还政策至今年底
  • 女子“伸腿阻拦高铁关门”被行拘,事件追踪:当时发生了什么?
  • 复旦大学史地学系在北碚