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

LangChain 会话记忆核心:记忆管理策略

写在前面

多轮对话会导致历史消息超出模型上下文限制(如DeepSeek的128K),因此需要记忆管理策略。LangChain提供三种方案:修剪(移除首尾部分消息)、删除(永久删除状态快照)和总结摘要(推荐,将早期消息压缩为摘要,再与近期消息拼接)。文章重点演示了SummarizationMiddleware中间件的使用:设置触发条件(消息超过3条就进行总结摘要)和保留条数(保留最近1条对话),结合InMemorySaver实现checkpointer快照create_agent创建带记忆的智能体。测试表明,经过多轮对话后,模型能通过消息摘要记住用户的关键信息(如“花哥”“爱猫”“爱爬山”),有效缓解上下文溢出问题。


目录

一. 为什么需要这个记忆管理策略?

1. 原因

二. 具体的策略有哪些?

1. 修剪

2. 删除

3. 总结摘要(推荐)

三. 总结摘要的具体代码实现

1. 代码实现

2. 效果测试、信息解读


一. 为什么需要这个记忆管理策略?

1. 原因

多轮对话会导致历史消息越来越多,最终超出模型的上下文限制(DeepSeek的上下文不能超过128K),langchain提供了一些记忆管理的策略来解决这个问题。

二. 具体的策略有哪些?

1. 修剪

拿到消息历史后,先移除前N条或后N条消息,再调用模型。

举例:如下图,当新消息来了,发现快要超出上下文限制了,修剪(去除)掉上面老旧的几条历史对话。图中就是修剪掉了ABCD这四条消息,然后将下面几条新的消息发送给了大模型。

缺点:如果为了不让上下文超限,就简单地修剪掉几条旧对话,虽然能暂时解决上下文超限问题,但很容易导致重要记忆丢失。

2. 删除

永久删除AgentState的快照。

举例:如下图,干脆直接删掉了之前的几个对话,这样是解决了上下文溢出的问题、节省了快照内存。

缺点:快照直接没了,后续想回滚都不行,风险较大。

3. 总结摘要(推荐)

先总结历史消息中的早期消息,得到消息摘要,然后用消息摘要和最近的消息形成消息列表,再调用模型。

举例:当新消息来了,发现之前的历史消息太多,要超出上下文限制了,此时应该再调用一个“总结摘要模型”,此时就能将之前的历史消息,总结成一个消息S。

优点:理论上,当我们压缩完,后续消息又多了,我们还可以调用“总结摘要模型”,对其再一次进行压缩。以此类推,可以无限压缩。

三. 总结摘要的具体代码实现

1. 代码实现

from aiohttp.web_middlewares import middleware # 1、导入消息摘要中间件的包、初始化消息摘要中间件 from langchain.agents.middleware import SummarizationMiddleware # 加载环境变量(如果不这么做,无法获取我们配置的ApiKey) from dotenv import load_dotenv load_dotenv() middleware = SummarizationMiddleware( model="deepseek-chat", trigger=("messages",3), # 触发时机:当消息超过3条时,进行总结摘要 keep=("messages",1) # 保留的会话数:1 ) # 2、导入checkpointer所需的包、初始化checkpointer from langgraph.checkpoint.memory import InMemorySaver checkpointer = InMemorySaver() # 基于内存存储,为了方便此处就不采用持久化存储了 # 3、创建智能体,并设置消息摘要中间件、checkpointer from langchain.agents import create_agent agent = create_agent( model="deepseek-chat", middleware=[middleware], checkpointer=checkpointer, ) # 4、测试效果:配置一个thread_id,并进行多轮对话 config = {"configurable":{"thread_id":"thread_3"}} # 开始多轮对话 from langchain.messages import HumanMessage agent.invoke({"messages":[HumanMessage(content="你好,我是花哥")]},config) agent.invoke({"messages":[HumanMessage(content="我喜欢讲故事")]},config) agent.invoke({"messages":[HumanMessage(content="我最喜欢的动物是猫")]},config) agent.invoke({"messages":[HumanMessage(content="我最喜欢的运动是爬山")]},config) # 测试记忆效果 final_response = agent.invoke({"messages":[HumanMessage(content="你还记得我吗?")]},config) # 打印响应结果 for message in final_response["messages"]: message.pretty_print()

2. 效果测试、信息解读

================================ Human Message ================================= Here is a summary of the conversation to date: ## SESSION INTENT 用户“花哥”的主要目标是进行关于猫的故事互动。用户已补充信息:最喜欢的运动是爬山。AI正在尝试将“猫”与“爬山”主题结合,并引导用户从三种互动方式(用户讲、共同续写、AI讲)中选择一种继续推进。 ## SUMMARY - 用户“花哥”喜欢讲故事、喜欢猫、喜欢爬山。 - AI提议将猫与爬山主题结合,并重点建议了“共同续写”方式(例如一只爱爬山的猫,或爬山时遇到神秘的猫),以及AI可以先讲一个《喜欢爬山的猫》的故事作为开场。 - AI询问用户:是否先从用户的想法开始,还是由AI先抛砖引玉。用户尚未做出最终选择,仍处于互动方式确认阶段。 ## ARTIFACTS None ## NEXT STEPS 等待花哥从AI的最新提议中做出选择:是用户自己提供开头共同续写,还是由AI先讲一个关于喜欢爬山的猫的故事。 ================================ Human Message ================================= 你还记得我吗? ================================== Ai Message ================================== 哈哈,当然记得你,花哥!你爱讲故事、爱猫、爱爬山,咱们正一起琢磨怎么把这三样有意思的事串起来呢~现在请你做个决定——咱们是 **“你来开头,我来续”**(你给个关于猫与爬山的故事开头),还是 **“我来抛砖引玉”**(我先讲一个《喜欢爬山的猫》的故事)?选一个,咱们这就开讲!🐱⛰️
  • 由于我们之前进行了4轮对话,也就是产生了8条历史对话(一问一答),此时超出了我们设置的trigger(历史对话超过3条就进行总结摘要)
  • 响应结果中,我们能看到Here is a summary of the conversation to date字样,此时说明的确触发了消息摘要
  • 从最后一行,确实能看出,大模型的确通过消息摘要,记住了我们之前说的四个因素。

以上就是本篇文章的全部内容,喜欢的话可以留个免费的关注呦~~~

http://www.jsqmd.com/news/969105/

相关文章:

  • MIPI D-PHY协议测试:超越示波器的全栈验证方案
  • SDXL VAE FP16修复:让你的AI绘画显存减半,速度翻倍的终极指南
  • 新疆书法教育培训教师正规报名渠道推荐:官方授权机构与避坑指南 - 教育推荐官【官方】
  • Mido终极指南:如何在Python中轻松实现MIDI音乐编程
  • 别再只用ArcMap了!揭秘ArcGIS Desktop三兄弟:ArcGlobe、ArcScene和ArcCatalog的正确打开方式
  • USB枚举全流程解析:从控制传输到设备识别的实战指南
  • 2026杭州黄金回收深度测评:六家店零套路优选 - 商业快讯早知道
  • 英雄联盟玩家的终极效率工具:LeagueAkari完整使用指南
  • 2026年AI论文网站实测认证:5款神器从选题到排版全流程通关秘籍
  • 抖音无水印批量下载器:5分钟快速上手完整指南
  • goweb3系列解析6:gorpc 模块解析gorpc 是 goweb3 项目中基于 go-micro 框架构建的 gRPC 通信模块,提供服务端启动、客户端调用、服务注册与发现等微服务通信能力
  • FPGA时序收敛利器:Quartus DSE自动优化原理与实战
  • 桌面整理革命:NoFences如何用开源方案终结杂乱桌面时代
  • 上海迪士尼33VIP到底怎么订?内行直言:认准正规渠道服务商 - 热点观察
  • 差分串行通讯端接原理与实战:从阻抗匹配到信号完整性优化
  • 3步实现Mac Boot Camp驱动的自动化部署:告别繁琐手动操作
  • 汽车CAN总线解码器开发实战:从硬件设计到协议逆向解析
  • MCP2515+MCP2551 CAN总线硬件设计与软件调试全攻略
  • 别再硬编码了!Flowable流程运行时动态探查节点全攻略
  • 题解:洛谷 P13018 [GESP202506 七级] 调味平衡
  • 从逻辑缺失到产品败局:工程师如何用第一性原理思维重塑研发全链条
  • 如何快速实现本地千万级图片库秒级搜索:完全离线的图片管理终极指南
  • 终极Discord消息清理指南:如何用Undiscord快速批量删除数千条聊天记录
  • 2026年国内二烯烃深冷橡塑板主流厂家TOP3综合评测 - 廊坊广华节能科技
  • Kubernetes 调度器深度原理:从默认调度到自定义调度器的全链路解析
  • 163MusicLyrics完整使用指南:免费获取网易云QQ音乐歌词的终极方案
  • 甘肃省定西市寄件实用指南:线上四大寄件全国低价寄件渠道,适配城乡各类大件物流,大件搬家,小件快递发货场景 - 时讯资讯
  • 5分钟掌握百度网盘秒传链接:永久分享文件的终极完整指南
  • 从试用受限到无限畅用:3步解锁Cursor Pro高级功能的终极方案
  • 从鲇鱼到食人鱼:小米模式对硬件创新的启示与反思