Spring AI - Redis缓存对话

打印 上一主题 下一主题

主题 1556|帖子 1556|积分 4668

先看效果


对话过程被缓存到了Redis 中。
原理

   在上一节我们快速入门了SpringAI,具体文章请查看:快速入门Spring AI
  创建 ChatClient 的代码如下:
  1. this.chatClient = ChatClient.builder(chatModel)
  2.         .defaultSystem(DEFAULT_PROMPT)
  3.         .defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory()))
  4.         .defaultAdvisors(new SimpleLoggerAdvisor())
  5.         .defaultOptions(OpenAiChatOptions.builder().temperature(0.0d).build())
  6.         .build();
复制代码
其中new MessageChatMemoryAdvisor(new InMemoryChatMemory()) 会将对话缓存在内存中,查看类InMemoryChatMemory 的源码发现,它实际上实现了ChatMemory 接口,实现了 add,get以及clear三个方法。
实现

先添加 Redis 的依赖:
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>
复制代码
然后定义一个类 RedisChatMemory 实现 ChatMemory 接口,实现三个方法:
  1. @Override
  2. public void add(String conversationId, List<Message> messages) {
  3.     long time = System.currentTimeMillis();
  4.     for (Message message : messages) {
  5.         redisTemplate.opsForHash().put(conversationId, String.valueOf(time), message);
  6.     }
  7. }
  8. @Override
  9. public List<Message> get(String conversationId, int lastN) {
  10.     Map<Object, Object> entries = redisTemplate.opsForHash().entries(conversationId);
  11.     return entries.entrySet().stream()
  12.             .sorted((o1, o2) -> {
  13.                 long time1 = Long.parseLong(o1.getKey().toString());
  14.                 long time2 = Long.parseLong(o2.getKey().toString());
  15.                 return Long.compare(time1, time2);
  16.             }).limit(lastN)
  17.             .map(e -> new UserMessage(e.getValue().toString()))
  18.             .collect(Collectors.toList());
  19. }
  20. @Override
  21. public void clear(String conversationId) {
  22.     redisTemplate.delete(conversationId);
  23. }
复制代码
再把 RedisChatMemory 注册成 Bean 对象:
  1. @Bean
  2. public RedisChatMemory redisChatMemory(RedisTemplate<String, Object> redisTemplate) {
  3.     return new RedisChatMemory(redisTemplate);
  4. }
复制代码
最后替换 ChatClient 定义中的 InMemoryChatMemory:
  1. this.chatClient = ChatClient.builder(chatModel)
  2.         .defaultSystem(DEFAULT_PROMPT)
  3. //      .defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory()))
  4.         .defaultAdvisors(new MessageChatMemoryAdvisor(redisChatMemory))
  5.         .defaultAdvisors(new SimpleLoggerAdvisor())
  6.         .defaultOptions(OpenAiChatOptions.builder().temperature(0.0d).build())
  7.         .build();
复制代码
具体代码:代码地址

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张春

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表