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

langchain4j集成QWen、Redis聊天记忆持久化

        langchain4j实现聊天记忆默认是基于进程内存的方式,InMemoryChatMemoryStore是具体的实现了,是将聊天记录到一个map中,如果用户大的话,会造成内存溢出以及数据安全问题。位了解决这个问题 langchain4提供了ChatMemoryStore接口,让开发者可以灵活的选择存储策略,常用的可以使用mysql、redis、mongodb等,本文以redis为例,集成百炼平台通义千问实现大模型聊天记忆持久化。

 一、引入依赖

       具体详情可参考官网

https://docs.langchain4j.dev/integrations/language-models/dashscope
    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: '3.4.0'// langchain4j AiService整合spring bootimplementation group: 'dev.langchain4j', name: 'langchain4j-spring-boot-starter', version: '1.0.0-beta4'// langchain4j整合千问dashscopeimplementation group: 'dev.langchain4j', name: 'langchain4j-community-dashscope-spring-boot-starter', version: '1.0.0-beta4'

          yaml配置

langchain4j:## https://docs.langchain4j.dev/integrations/language-models/dashscopecommunity:dashscope:chat-model:api-key: 百炼平台申请model-name: qwen-plusspring:data:redis:host: server200port: 6379database: 3

二、持久化配置

        官网参考地址https://docs.langchain4j.dev/tutorials/chat-memory/

@Configuration
public class ChatMemoryConf {/*** 聊天记录持久化存储到redis中* @param redisTemplate* @return*/public ChatMemoryStore chatMemoryStore(RedisTemplate<String,String>  redisTemplate){return  new ChatMemoryStore(){@Overridepublic List<ChatMessage> getMessages(Object memoryId) {String value = redisTemplate.opsForValue().get("chat:" + memoryId.toString());if(value == null || value.isEmpty()){return List.of();}return ChatMessageDeserializer.messagesFromJson(value);}@Overridepublic void updateMessages(Object memoryId, List<ChatMessage> list) {String messages = ChatMessageSerializer.messagesToJson(list);redisTemplate.opsForValue().set("chat:" + memoryId.toString(), messages);}@Overridepublic void deleteMessages(Object memoryId) {redisTemplate.delete("chat:" + memoryId.toString());}};}@Beanpublic ChatMemoryProvider chatMemoryProvider(RedisTemplate<String,String>  redisTemplate){return memoryId -> MessageWindowChatMemory.builder().maxMessages(10).id(memoryId).chatMemoryStore(chatMemoryStore(redisTemplate)).build();}}

三、创建AiService代理

       AiService的具体功能,可以看官网(https://docs.langchain4j.dev/tutorials/ai-services),上面有很详细的解释和示例

@AiService
public interface DashScopeAssistant {@SystemMessage("Answer using slang")String chat(@MemoryId String  chatId, @UserMessage  String userMessage);}

@Service
public class DashScopeChatMemoryService {private final static Logger LOGGER = LoggerFactory.getLogger(DashScopeChatMemoryService.class);private final DashScopeAssistant dashScopeAssistant;@Autowiredpublic DashScopeChatMemoryService(QwenChatModel qwenChatModel,ChatMemoryProvider chatMemoryProvider) {dashScopeAssistant =  AiServices.builder(DashScopeAssistant.class).chatMemoryProvider(chatMemoryProvider).chatModel(qwenChatModel).build();}public String persistentChat(String chatId, String userMessage){String chat = dashScopeAssistant.chat(chatId, userMessage);LOGGER.info("persistent chat output : {}" ,chat);return chat;}
}

 四、测试持久化

chatMemoryService.persistentChat("101", "我是赵光义");
chatMemoryService.persistentChat("101", "我是北宋的第二位皇帝,在高粱河被辽国打败了");
chatMemoryService.persistentChat("101", "你知道为为什么叫车神吗?");

    通过断点观察,数据已经成功存入redis


 

相关文章:

  • 基于Arduino的贪吃蛇游戏机
  • 一、网络基础
  • 普通IT的股票交易成长史--20250512复盘
  • 【速写】use_cache参数与decode再探讨
  • 【嵌入式系统设计师(软考中级)】第三章:嵌入式系统软件基础知识——①软件及操作系统基础
  • 电脑端音乐播放器推荐:提升你的听歌体验!
  • 免费多线程下载工具
  • 数字人教学技术与产品方案的全面解析
  • 【论信息系统项目的质量管理】
  • MySQL创建了一个索引表,如何来验证这个索引表是否使用了呢?
  • 在Windows 境下,将Redis和Nginx注册为服务。
  • 自适应主从复制模拟器的构建与研究
  • 使用ACE-Step在本地生成AI音乐
  • 双向链表专题
  • DAY05:深入解析生命周期与钩子函数
  • MYSQL事务原理分析(三)
  • nginx配置sse流传输问题:直到所有内容返回后才往下传输
  • java反序列化commons-collections链6
  • LVGL(lv_switch开关)
  • 输出重定向
  • 反制美国钢铝关税!印度拟对美国部分商品征收关税
  • AI观察|从万元到百万元,DeepSeek一体机江湖混战
  • 央行等印发《关于金融支持广州南沙深化面向世界的粤港澳全面合作的意见》
  • 《AI×SCIENCE十大前沿观察》9:合成数据和数据基础设施
  • 撤制镇如何突破困境?欢迎订阅《澎湃城市报告》第23期
  • 江西省司法厅厅长张强已任江西省委政法委分管日常工作副书记