LangChain实战:大模型RAG与Agent智能体的长期会话记忆实现
1. 项目概述大模型RAG与Agent智能体实战中的长期会话记忆在构建基于大模型的智能对话系统时长期会话记忆是实现自然交互的核心能力。想象一下当你与人类客服交流时对方能记住你之前提过的需求和个人信息这种连续性体验正是我们需要在AI系统中复现的。本次实战将使用LangChain框架通过BaseChatMessageHistory类和property装饰器实现对话历史的持久化存储。这个方案特别适合需要处理多轮复杂对话的场景比如智能客服、个性化教学助手或医疗咨询系统。传统的大模型对话往往存在健忘症每次提问都像初次见面而我们的技术方案能让AI记住对话上下文甚至跨会话保持记忆。在RAG检索增强生成架构中这种记忆能力可以显著提升回答的相关性和一致性。2. 核心组件解析与技术选型2.1 LangChain中的消息历史管理BaseChatMessageHistory是LangChain提供的抽象基类定义了对话历史存储的标准接口。它支持常见的操作如add_message、clear等让我们可以灵活选择存储后端。在实际项目中我推荐优先考虑这些实现方案RedisBackedChatMessageHistory适合高并发生产环境利用Redis的TTL功能可以自动清理过期对话PostgresChatMessageHistory当需要复杂查询或事务支持时关系型数据库是不二之选DynamoDBChatMessageHistory无服务器架构下的弹性扩展方案from langchain.memory import RedisChatMessageHistory # 初始化Redis存储的对话历史 message_history RedisChatMessageHistory( session_iduser123_session456, urlredis://localhost:6379/0, ttl3600 # 1小时过期 )2.2 property装饰器的妙用在管理对话历史时property装饰器帮助我们以更优雅的方式封装核心属性。比如当我们需要在获取历史消息时自动进行敏感信息过滤class SafeChatHistory: def __init__(self): self._messages [] property def messages(self): return [self._filter_sensitive_info(msg) for msg in self._messages] def _filter_sensitive_info(self, message): # 实现敏感信息过滤逻辑 return message.replace(信用卡, ***)这种设计模式带来三个显著优势保持接口简洁内部实现可随时变更添加访问控制逻辑无需修改客户端代码实现惰性计算和缓存等高级特性3. 完整实现方案与核心代码剖析3.1 持久化存储的集成实现让我们构建一个支持MongoDB存储的定制化历史记录类。选择MongoDB是因为其灵活的文档结构特别适合存储多变的对话数据from pymongo import MongoClient from langchain.schema import BaseChatMessageHistory, HumanMessage, AIMessage class MongoChatMessageHistory(BaseChatMessageHistory): def __init__(self, session_id, mongo_uri, db_namechat_db): client MongoClient(mongo_uri) self.db client[db_name] self.collection self.db[chat_history] self.session_id session_id def add_message(self, message): doc { session_id: self.session_id, type: human if isinstance(message, HumanMessage) else ai, content: message.content, timestamp: datetime.now() } self.collection.insert_one(doc) property def messages(self): cursor self.collection.find( {session_id: self.session_id} ).sort(timestamp, 1) return [self._convert_doc_to_message(doc) for doc in cursor] def _convert_doc_to_message(self, doc): if doc[type] human: return HumanMessage(contentdoc[content]) return AIMessage(contentdoc[content])重要提示在生产环境中务必为session_id和timestamp字段创建复合索引可以大幅提升查询性能db.chat_history.create_index([(session_id, 1), (timestamp, 1)])3.2 与LangChain Agent的集成将定制化的历史记录类集成到LangChain工作流中需要配置ConversationChainfrom langchain.chains import ConversationChain from langchain.llms import OpenAI llm OpenAI(temperature0) memory ConversationChain( llmllm, memoryMongoChatMessageHistory( session_iduser_123, mongo_urimongodb://localhost:27017 ), verboseTrue ) response memory.run(你好我想咨询理财产品) print(fAI回复: {response}) # 后续对话会自动保持上下文 response memory.run(有哪些适合新手的选项)4. 性能优化与生产级部署4.1 分级存储架构设计对于高流量生产系统我推荐采用分级存储策略热存储Redis缓存最近15分钟的活跃对话温存储MongoDB保存7天内的完整历史冷存储定期将过期数据归档到对象存储如S3这种架构在保证响应速度的同时也控制了存储成本。以下是实现示例class TieredChatMessageHistory(BaseChatMessageHistory): def __init__(self, session_id): self.redis RedisChatMessageHistory(session_id) self.mongo MongoChatMessageHistory(session_id) property def messages(self): # 优先从Redis获取不存在则查询MongoDB if not self.redis.messages: last_hour_msgs self.mongo.get_recent_messages(hours1) self.redis.bulk_add(last_hour_msgs) return self.redis.messages4.2 对话压缩与摘要技术长期对话会产生大量历史消息可能超出大模型的上下文窗口限制。解决方案是自动生成对话摘要from langchain.chains.summarize import load_summarize_chain def summarize_dialog(messages): text \n.join([f{msg.type}: {msg.content} for msg in messages]) summary_chain load_summarize_chain(llm, chain_typemap_reduce) return summary_chain.run(text)在实际部署中建议当对话轮次超过10轮时自动触发摘要生成并将摘要作为新的系统消息插入。5. 安全合规与隐私保护5.1 敏感信息处理方案对话系统必须妥善处理用户隐私数据。我采用的三层过滤机制在实践中效果显著实时过滤使用预定义规则过滤明显敏感信息如信用卡号模式匹配存储加密对持久化存储的内容进行字段级加密访问控制基于RBAC模型限制历史记录的访问权限from cryptography.fernet import Fernet class EncryptedChatHistory(MongoChatMessageHistory): def __init__(self, encryption_key, **kwargs): self.cipher Fernet(encryption_key) super().__init__(**kwargs) def add_message(self, message): encrypted_content self.cipher.encrypt(message.content.encode()) message.content encrypted_content.decode() super().add_message(message) property def messages(self): raw_messages super().messages for msg in raw_messages: msg.content self.cipher.decrypt(msg.content.encode()).decode() return raw_messages5.2 合规性设计要点根据GDPR等法规要求对话系统必须实现数据保留策略自动过期删除用户数据导出功能全量删除能力Right to be Forgotten在MongoDB实现中可以通过TTL索引和定期作业来实现// 创建30天过期的TTL索引 db.chat_history.createIndex( { timestamp: 1 }, { expireAfterSeconds: 2592000 } )6. 实战问题排查与调试技巧6.1 常见问题速查表问题现象可能原因解决方案对话丢失上下文会话ID不一致确保前后使用相同的session_id历史记录加载慢未创建合适索引为session_id和timestamp创建复合索引存储空间增长过快未设置数据过期配置TTL或定期归档旧数据敏感信息泄露未做加密处理实施字段级加密或脱敏6.2 调试日志配置在开发阶段启用LangChain的详细日志有助于理解内部工作机制import logging logging.basicConfig(levellogging.DEBUG) logger logging.getLogger(langchain) logger.setLevel(logging.DEBUG) # 在历史记录类中添加调试日志 class LoggingChatHistory(MongoChatMessageHistory): def add_message(self, message): logger.debug(fAdding message: {message}) super().add_message(message) property def messages(self): msgs super().messages logger.debug(fRetrieved {len(msgs)} messages) return msgs7. 高级应用场景扩展7.1 跨会话记忆聚合通过用户ID关联多个会话实现真正的长期记忆class UserCentricHistory: def __init__(self, user_id): self.user_id user_id self.sessions self._load_user_sessions() def _load_user_sessions(self): # 从数据库查询该用户的所有历史会话 return db.sessions.find({user_id: self.user_id}) property def lifetime_messages(self): all_msgs [] for session in self.sessions: history MongoChatMessageHistory(session[session_id]) all_msgs.extend(history.messages) return sorted(all_msgs, keylambda x: x.timestamp)7.2 基于记忆的个性化响应利用历史对话数据定制回答风格def personalize_response(memory, new_query): history memory.load_memory_variables({})[history] user_style analyze_communication_style(history) if user_style[prefers_formal]: prompt f请用正式商务语气回答以下问题{new_query} else: prompt f请用轻松口语化的方式回答{new_query} return llm(prompt)这种个性化处理能让对话体验更加自然亲切大幅提升用户满意度。

相关新闻

hot100 最长公共子序列(1143)

hot100 最长公共子序列(1143)

本题采用二维动态规划 (2D Dynamic Programming) 算法解决双字符串最长公共子序列 (LCS, Longest Common Subsequence) 的求解问题。其核心本质是将两个序列的全局拓扑匹配问题,拆解为二维状态空间阵列中的自底向上一维步进收敛模型。通过构建大小为 (m 1) * (n 1…

2026/7/28 21:41:00阅读更多 →
瑞德克斯平台:流程清晰度的路径梳理

瑞德克斯平台:流程清晰度的路径梳理

在外汇相关服务里,瑞德克斯平台是否值得长期关注,往往取决于几个清晰的体验点:说明是否好理解、提示是否到位、流程是否连贯、支持是否稳定。下面从这些维度对瑞德克斯平台做一次正向梳理与要点归纳。外汇相关信息更新频繁,平台将…

2026/7/28 21:41:00阅读更多 →
Assert工具(断言)的使用、ReturnAssert工具

Assert工具(断言)的使用、ReturnAssert工具

文章目录 assert机制为什么要用assert完整版代码(包括异常处理)判断是否是空字符串生产环境为什么不推荐用断言assert和AssertUtils的区别Assert工具为什么不受断言开关的影响呢?spring Assert的使用判断字符串是否为空spring只有Assert这一个实现类吗? 自定义断言工具自定义…

2026/7/28 21:41:00阅读更多 →
5分钟彻底清理Windows驱动垃圾:DriverStore Explorer终极指南

5分钟彻底清理Windows驱动垃圾:DriverStore Explorer终极指南

5分钟彻底清理Windows驱动垃圾:DriverStore Explorer终极指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你的C盘空间是否莫名其妙地减少?系统启动速度越来越…

2026/7/28 22:43:21阅读更多 →
计算机毕业设计之Hadoop技术下的校园二手交易系统的设计与实现

计算机毕业设计之Hadoop技术下的校园二手交易系统的设计与实现

自从新冠疫情爆发以来,各个线下实体越来越难做,线下购物的人也越来越少,随之带来的是一些不必要的浪费,尤其是即将毕业的大学生,各种用品不方便携带走导致被遗弃,造成大量的浪费。本系统目的就是让毕业生的…

2026/7/28 22:43:21阅读更多 →
TI bq77910A BMS评估模块硬件解析与软件配置实战指南

TI bq77910A BMS评估模块硬件解析与软件配置实战指南

1. 评估模块概览与核心价值如果你正在设计一个基于4到10节串联锂离子或聚合物电池的电池包,那么电池管理系统(BMS)的硬件保护环节绝对是你无法绕开的核心。市面上方案很多,但当你需要一款集成度高、保护功能全面且便于前期评估的芯…

2026/7/28 22:43:21阅读更多 →
SpringBoot+Vue物流管理系统开发与部署指南

SpringBoot+Vue物流管理系统开发与部署指南

1. 项目概述 这个前后端分离的物流管理系统采用了当下最流行的技术栈组合:SpringBootVueMyBatisMySQL。作为一名长期从事企业级应用开发的工程师,我完整实现了这套系统并整理了详细的部署指南。系统包含了物流行业常见的核心功能模块,如订单管…

2026/7/28 22:43:21阅读更多 →
3大核心技巧:让你的Android手机流畅运行Windows游戏和应用

3大核心技巧:让你的Android手机流畅运行Windows游戏和应用

3大核心技巧:让你的Android手机流畅运行Windows游戏和应用 【免费下载链接】winlator Android application for running Windows applications with Wine and Box86/Box64 项目地址: https://gitcode.com/GitHub_Trending/wi/winlator 你是否曾经想过在Andro…

2026/7/28 22:43:21阅读更多 →
能源路由器厂商全景解析:技术路线、核心产品与选型参考

能源路由器厂商全景解析:技术路线、核心产品与选型参考

随着AI数据中心单机柜功耗从8kW向120kW甚至更高水平跃升,传统AC 10kV/380V工频变压器加UPS的供电模式正面临越来越大的压力。低压大电流带来的线损、散热和布线难题,驱动行业加速探索从"多级变换"向"一级直供"的架构演进。在这一背景…

2026/7/28 22:41:20阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:29阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:29阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:29阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/28 20:22:24阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/28 3:17:03阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →