AI开发-python-langchain框架(3-19-智能问答-保留会话历史)
于RunnableWithMessageHistory实现多会话隔离与持久化记忆
在构建LLM对话应用时,多会话隔离与对话历史持久化是从demo走向生产级的关键。本文基于ReAct智能体实践,拆解RunnableWithMessageHistory的会话隔离实现,及可扩展的数据库持久化方案,助力快速落地稳定对话应用。
一、核心需求:为什么需要会话隔离与持久化记忆?
LLM本身无状态,无法记住历史交互,实际应用中需解决两个核心问题:
1. 多用户会话隔离:确保不同用户对话互不干扰,每个用户拥有独立“记忆空间”;
2. 对话历史持久化:保障服务重启后历史不丢失,用户可跨会话续聊,无需重复说明背景。
二、实践核心:用RunnableWithMessageHistory实现多会话隔离
RunnableWithMessageHistory是会话管理核心工具,可自动关联历史、注入提示词,简化开发,核心逻辑如下:
1. 分配唯一会话ID(session_id),作为区分不同会话的核心标识;
2. 用户发起对话时,传入session_id,工具自动读取对应历史,填充至提示词{chat_history}占位符;
3. 对话结束后,自动将新消息(用户输入+AI回复)追加至对应会话历史,实现记忆延续。
优势:开发者无需关注历史拼接、存储逻辑,可专注智能体核心功能开发。
三、扩展升级:对话历史持久化(数据库落地方案)
基础场景的字典内存存储,重启服务会丢失数据,需替换为持久化数据库,核心是修改会话历史获取函数,适配不同存储场景。
(一)主流持久化方案选型
根据业务场景灵活选择,无需局限单一方案:
1. Redis:适配高并发、低延迟场景(如在线客服),读写快、支持过期策略,通过langchain-redis快速集成;
2. 关系型数据库(PostgreSQL/MySQL):适配数据安全、需审计场景(如企业内部系统),支持事务,通过langchain-community集成;
3. SQLite:适配小型应用、本地部署/测试,轻量无独立服务,快速落地降低成本;
4. MongoDB:适配非结构化数据场景(如多模态对话),文档型存储,通过langchain-mongodb集成。
(二)持久化通用实现步骤
所有方案流程一致,可直接复用:
1. 安装对应存储依赖包,确保环境齐全;
2. 重写会话历史获取函数:根据session_id从数据库查询,无记录则初始化并写入;
3. 将新函数传入RunnableWithMessageHistory,替换内存存储逻辑;
4. 配置存储连接参数(地址、端口等),适配生产环境。
(三)持久化核心设计要点
避免数据混乱、性能瓶颈,需注意4点:
1. 会话与消息映射:通过session_id关联,保持消息时间顺序,还原完整对话;
2. 异常处理:数据库连接失败时,降级为内存存储,保障服务可用并记录日志;
3. 数据清理:设置会话过期策略(如30天未活跃删除),支持用户主动删除,符合合规;
4. 序列化兼容:将LLM消息对象(HumanMessage等)序列化为JSON存储,读取时反序列化。
四、生产级落地建议
聚焦性能、安全、可扩展性,确保应用稳定:
1. 性能优化:高并发配置数据库连接池,关系型数据库建立索引,用对话摘要压缩历史减少token消耗;
2. 安全合规:加密存储敏感信息,明确数据生命周期,支持用户删除历史;
3. 可扩展性:继承BaseChatMessageHistory实现自定义存储,通过配置动态切换存储方案,增加监控指标。
五、总结
RunnableWithMessageHistory通过session_id实现多会话隔离,自动管理历史注入,大幅简化开发;对话历史持久化核心是替换存储层,根据业务场景选择合适数据库,即可快速落地生产级记忆能力,实现LLM“有记忆、多会话”的连续对话。
代码实现(要持久化存储修改如下代码中存储和获取会话历史的方法即可实现,需要的自行修改,这里就演示核心的功能):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
|
输出结果:
Agent 创建成功
============================================================
测试 Agent 工具调用
============================================================
Parent run 5a054763-47a5-4360-b529-78012bbde271 not found for run 7b1f1b02-d9ac-4da8-b935-034ee28d0b7c. Treating as a root run.
> Entering new AgentExecutor chain...
l.
</think>
Thought: 用户只是在打招呼自我介绍,这是一个简单的问候,不需要使用华为商城搜索工具来查询信息。我应该友好地回应用户的问候。
更多推荐



所有评论(0)