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

Agent记忆系统:基于LangChain的Memory开发实战

导读:上期咱们聊了记忆系统的设计思路——短期记忆、长期记忆、记忆巩固、记忆遗忘。理论讲了一圈,今天该动手了。本篇用 LangChain 的四种 Memory 模块,手把手搭一套真正能跑的对话记忆系统。零基础友好,代码可直接复制运行。


一、为什么 AI 总是"失忆"?

上一篇文章,咱们聊了 Agent 记忆系统设计的四个核心思路:

  • 短期记忆——维持当前会话的连贯性
  • 长期记忆——把用户偏好存进向量库
  • 记忆巩固——把对话历史提炼成长期记忆
  • 记忆遗忘——让记忆有生命周期,该忘就忘

道理都懂了,但真到写代码的时候,第一个问题就来了:

你:“嗨,我叫小明,我在做一个 RAG 项目。”
AI:“你好小明!RAG 是个很棒的方向,有什么需要帮助的吗?”
你:“帮我看看上面说的那个项目,该怎么优化?”
AI:“请问你说的是哪个项目?你能再描述一下吗?”

你:……我刚说的啊大哥!

再试一个更扎心的:

你:“我叫什么名字?”
AI:“抱歉,我无法知道您的名字。”

不是它在敷衍你,是它真的没有记忆。

大语言模型训练完之后,参数就"冻结"了。每次你调 API,对它来说都是一次全新的对话——上一轮你说了什么、它回了什么,统统不知道。这就是上一篇说的"短期记忆"问题:LLM 天生没有对话记忆能力,得靠外部机制来补。

那怎么补?今天就不讲理论了,直接上手——用 LangChain 框架,把上期的设计思路落地成代码。


二、LangChain Memory:给 AI 装上"外接记忆条"

💡一句话定义:LangChain 的 Memory 模块,就是给 AI 装了一根"外接记忆条"——每次对话前,把之前聊过的内容塞回 Prompt,让 AI 以为自己一直记着。

你可以把 LLM 想象成一个超级学霸,但有严重的短期失忆症。每次考试(API 调用),它的能力满分,但完全不记得上一场考试的题目。

Memory 做的事情,就是在每次考试前,把之前考试的笔记塞进它的口袋,让它"开卷答题"。

不同的 Memory 类型,就像不同的笔记策略:

记忆类型类比特点
BufferMemory全部笔记都带着完整但越来越重
BufferWindowMemory只带最近 N 页笔记轻便但可能忘早期内容
TokenBufferMemory笔记本有页数限制精确控制成本
SummaryBufferMemory早期笔记压缩成摘要兼顾全局和细节

说白了,就是在"记得多"和"花钱少"之间找平衡。对应到上期的理论框架:这四种 Memory 主要解决的都是短期记忆的问题——怎么在一次会话中保持对话的连贯性。


三、代码实战:四种记忆一个个跑通

好了,理论讲够了,咱们直接上代码。

3.1 全量缓存记忆(ConversationBufferMemory)

这是最简单粗暴的方案——所有对话记录一字不漏地全存下来。就像你拿个本子,把每一句对话都抄上去,下次聊天前全部读一遍给 AI 听。

下面这段代码做三件事:

    1. 初始化 LLM 和 Memory
    1. 创建对话链,进行三轮对话
    1. 验证 AI 是否记住了之前的内容
from langchain.chains import ConversationChainfrom langchain.chat_models import ChatOpenAIfrom langchain.memory import ConversationBufferMemory# -----------------------------------------------# 🔧 【按你的环境修改这里】# -----------------------------------------------# temperature=0.0 让输出更稳定,方便调试# 想要更有创意的回答可以调到 0.7# -----------------------------------------------llm = ChatOpenAI(temperature=0.0)memory = ConversationBufferMemory()# 创建对话链,verbose=True 可以看到完整的 Prompt 拼接过程conversation = ConversationChain( llm=llm, memory=memory, verbose=True)# === 第一轮:先自我介绍 ===print("第一轮对话:")print(conversation.predict(input="你好, 我叫皮皮鲁"))# === 第二轮:随便聊点什么 ===print("\n第二轮对话:")print(conversation.predict(input="1+1等于多少?"))# === 第三轮:灵魂一问——你还记得我吗? ===print("\n第三轮对话:")print(conversation.predict(input="我叫什么名字?")) ``````plaintext ✅ 运行结果:第一轮对话:你好,皮皮鲁!很高兴认识你。我是一个AI助手,有什么我可以帮你的吗?第二轮对话:1+1等于2。第三轮对话:你叫皮皮鲁。

诶,它真记住了!

但 AI 并不是真的"记住"了,而是每次调用predict()时,Memory 会自动把之前所有的对话历史拼接到 Prompt 里发给 LLM——它只是"重新看了一遍笔记"。

我们可以直接看看 Memory 里存了什么:

# 查看 Memory 中的完整对话记录print(memory.buffer) ``````plaintext Human: 你好, 我叫皮皮鲁AI: 你好,皮皮鲁!很高兴认识你。我是一个AI助手,有什么我可以帮你的吗?Human: 1+1等于多少?AI: 1+1等于2。Human: 我叫什么名字?AI: 你叫皮皮鲁。

三轮对话全在里面,一字不少。

你也可以不通过对话,直接往 Memory 里手动塞内容——这在测试的时候特别好用:

memory = ConversationBufferMemory()# 手动添加一段对话记录memory.save_context( {"input": "你好,我叫皮皮鲁"}, {"output": "你好啊,我叫鲁西西"})memory.save_context( {"input": "很高兴和你成为朋友!"}, {"output": "是的,让我们一起去冒险吧!"})print(memory.load_memory_variables({})) ``````plaintext {'history': 'Human: 你好,我叫皮皮鲁\nAI: 你好啊,我叫鲁西西\nHuman: 很高兴和你成为朋友!\nAI: 是的,让我们一起去冒险吧!'}

小编踩过的坑:BufferMemory 好用是好用,但对话一长,你塞给 LLM 的 Prompt 会越来越长,token 费用蹭蹭往上涨。小编有一次忘了限制,聊了几十轮之后,一看账单——好家伙,比预想的多了好几倍。

所以,下面咱们来看怎么"省钱"。


3.2 滑动窗口记忆(ConversationBufferWindowMemory)

核心思路:只记最近 N 轮对话,更早的直接丢掉。

就像你手机只保留最近 100 条聊天记录,更早的自动清理。简单粗暴,但省钱。

from langchain.memory import ConversationBufferWindowMemory# k=1 表示只保留最近 1 轮对话memory = ConversationBufferWindowMemory(k=1)# 手动添加两轮对话memory.save_context( {"input": "你好,我叫皮皮鲁"}, {"output": "你好啊,我叫鲁西西"})memory.save_context( {"input": "很高兴和你成为朋友!"}, {"output": "是的,让我们一起去冒险吧!"})# 看看 Memory 里还剩什么print(memory.load_memory_variables({})) ``````plaintext {'history': 'Human: 很高兴和你成为朋友!\nAI: 是的,让我们一起去冒险吧!'}

看到没?第一轮的"我叫皮皮鲁"已经被丢掉了,只剩最后一轮。

接下来放到对话链里跑跑看,这个效果就很直观了:

llm = ChatOpenAI(temperature=0.0)memory = ConversationBufferWindowMemory(k=1)conversation = ConversationChain( llm=llm, memory=memory, verbose=False)print("第一轮对话:")print(conversation.predict(input="你好, 我叫皮皮鲁"))print("\n第二轮对话:")print(conversation.predict(input="1+1等于多少?"))print("\n第三轮对话:")print(conversation.predict(input="我叫什么名字?")) ``````plaintext 第一轮对话:你好,皮皮鲁!很高兴认识你。有什么我可以帮你的吗?第二轮对话:1+1等于2。第三轮对话:很抱歉,我无法知道您的名字。

第三轮它不记得你叫什么了!因为k=1,到第三轮时 Memory 里只有第二轮的"1+1等于多少",第一轮的自我介绍早就被丢出窗口了。

“窗口记忆就像短信聊天——你只看得到最近几条,往上翻?不好意思,删了。”


3.3 Token 缓存记忆(ConversationTokenBufferMemory)

窗口记忆按"轮数"截断,但有个问题——有的轮对话就一个字,有的轮对话巨长。按轮数算不够精确。

Token 缓存记忆更聪明——按 token 数量截断,超过上限就丢掉最早的对话。

from langchain.memory import ConversationTokenBufferMemory# max_token_limit=30 表示最多保留 30 个 tokenmemory = ConversationTokenBufferMemory(llm=llm, max_token_limit=30)memory.save_context( {"input": "朝辞白帝彩云间,"}, {"output": "千里江陵一日还。"})memory.save_context( {"input": "两岸猿声啼不住,"}, {"output": "轻舟已过万重山。"})print(memory.load_memory_variables({})) ``````plaintext {'history': 'AI: 轻舟已过万重山。'}

30 个 token 的限制下,只剩最后一句回答。前面的"朝辞白帝彩云间"和"千里江陵一日还"都被挤出去了。

好处是可以精确控制每次发给 LLM 的上下文大小,也就精确控制了成本。说实话,这个在实际项目中用得不算太多——按 token 截断可能会把一段完整的对话从中间砍断。但如果你的场景对成本特别敏感,它是最靠谱的选择。


3.4 摘要缓存记忆(ConversationSummaryBufferMemory)

好了,重头戏来了。小编个人最喜欢的就是这个——SummaryBufferMemory

它的思路特别聪明:最近的对话保留原文,早期的对话用 LLM 压缩成摘要。

就像你记笔记——今天上课的内容记得很详细,上周的课只记了个大纲,上个月的课……嗯,就记了几个关键词。但至少没全忘!

对应上一篇的理论——这其实就是"记忆巩固"的一种简化实现:把近期对话当短期记忆保持原貌,把早期对话压缩提炼,类似从短期记忆向长期记忆的转化。

from langchain.chains import ConversationChainfrom langchain.chat_models import ChatOpenAIfrom langchain.memory import ConversationSummaryBufferMemory# 模拟一段较长的对话内容schedule = "在八点你和你的产品团队有一个会议。\你需要做一个PPT。\上午9点到12点你需要忙于LangChain。\Langchain是一个有用的工具,因此你的项目进展的非常快。\中午,在意大利餐厅与一位开车来的顾客共进午餐,\走了一个多小时的路程与你见面,只为了解最新的 AI。\确保你带了笔记本电脑可以展示最新的 LLM 样例。"llm = ChatOpenAI(temperature=0.0)# max_token_limit=100:超过 100 token 的早期对话会被压缩成摘要memory = ConversationSummaryBufferMemory(llm=llm, max_token_limit=100)# 模拟三轮对话memory.save_context( {"input": "你好,我叫皮皮鲁"}, {"output": "你好啊,我叫鲁西西"})memory.save_context( {"input": "很高兴和你成为朋友!"}, {"output": "是的,让我们一起去冒险吧!"})memory.save_context( {"input": "今天的日程安排是什么?"}, {"output": f"{schedule}"})# 看看 Memory 里的内容——注意开头的 System 部分就是摘要print(memory.load_memory_variables({})['history']) ``````plaintext System: The human introduces themselves as Pipilu and the AI introducesthemselves as Luxixi. They express happiness at becoming friends anddecide to go on an adventure together. The human asks about the schedulefor the day...(后面是详细的日程摘要)

看到没?早期的"自我介绍"和"交朋友"被压缩成了一段摘要(System 开头的那部分),而最近的日程对话保留了原文。

远的记个大概,近的记得清楚,两不耽误。

接着基于这个 Memory 继续对话:

conversation = ConversationChain( llm=llm, memory=memory, verbose=True)print(conversation.predict(input="展示什么样的样例最好呢?")) ``````plaintext 展示一些具有多样性和创新性的样例可能是最好的选择。你可以展示一些不同领域的应用,比如自然语言处理、图像识别、语音合成等。另外,你也可以展示一些具有实际应用价值的样例,比如智能客服、智能推荐等。

虽然早期对话被压缩了,但 AI 依然知道你今天要见客户、要展示 LLM——因为摘要里保留了关键信息。每次新对话后,Memory 会自动重新压缩早期内容,始终控制在 token 上限内。

“SummaryBufferMemory 就像一个靠谱的秘书——重要的事记得清清楚楚,不重要的帮你归档成一句话。”


四、选哪个?一张表说清楚

四种方案都跑过一遍了,回头看看怎么选:

记忆类型适用场景优势局限
BufferMemory短对话、Demo信息完整,不丢任何细节对话一长,token 费用爆炸
BufferWindowMemory客服/固定轮数问答简单粗暴,只记最近 N 轮早期信息直接丢失
TokenBufferMemory严格控成本按 token 数截断,成本可控可能在句子中间截断
SummaryBufferMemory长对话、生产环境早期压缩摘要,兼顾全局需要额外调一次 LLM

小编的建议很简单:刚入门用 Buffer 先跑起来,上生产换 Summary,别在记忆上花冤枉钱。

不过要提醒一句——这四种 Memory 解决的都是"单次会话内"的短期记忆问题。如果你想让 AI 跨会话记住用户偏好(上期说的"长期记忆"),或者自动清理过时信息(“记忆遗忘”),那就需要在这些基础上再加一层存储和管理逻辑了。

“记忆系统设计,80% 的工作量不在’记住’,而在’该忘什么’。”


五、写在最后

四种 Memory 跑了一圈,你会发现 LangChain 把对话记忆这件事封装得足够简单——几行代码就能让 AI 从"金鱼记忆"变成"还算靠谱的记忆"。

但这只是记忆系统的第一步。今天的代码全部是基于内存的,程序一重启,对话历史全没了。而且我们只处理了短期记忆,上期聊的长期记忆、记忆巩固、记忆遗忘,都还没落地。

学AI大模型的正确顺序,千万不要搞错了

🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!

有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!

就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇

学习路线:

✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经

以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!

我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

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

相关文章:

  • GPT-4四大能力跃迁:从指令遵循到跨模态推理的工程实证
  • 计算机小程序毕设实战-基于springboot+微信小程序的云浮市特色农产品交易的设计与实现java 特色农产品销售系统 特色农产品线上交易【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 2026 南京梅雨季漏水抢修指南!本地防水公司 TOP9 权威盘点,卫生间免砸砖防水、阳台渗漏一站式解决 - 吉林同城获客
  • 在Windows上用Anaconda+TensorFlow 2.x复现U-Net细胞分割(附完整代码与数据集)
  • 2026年锻压机品牌/源头厂家最新推荐榜:半轴、轨道、道岔、螺栓、汽配、航空、航天、军品、船舶锻压机/自由锻/三向锻高强智造精选 - 企业推荐官【官方】
  • 超自动化运维:实现IT服务管理现代化的关键
  • pyltp加载自定义词典踩坑实录:解决专业术语(如‘亚硝酸盐’)分词不准的问题
  • Text-to-X多模态系统实战:从文本指令到PPT/视频/试题一键生成
  • GEO优化对搜索关键词有要求吗
  • 南方新华合资加盟开始了!号召人力资源公司、小猎企、SOHO猎头加入,我们一起开分公司 - 榜单推荐
  • 航班延误预测:面向运控决策的实时风险评估系统设计
  • WeChatMsg:三步实现微信聊天记录永久保存与智能分析的完整指南
  • C#从零开始:自己实现一个截屏工具
  • Horos:macOS平台专业级开源医疗影像查看器完全指南
  • RookieAI终极指南:3步打造专业级AI自瞄系统
  • OpenGL ES开发避坑:GLM库的#include用尖括号还是双引号?一次讲清预处理器搜索路径
  • 如何用网盘直链下载助手彻底告别下载限速:终极解决方案
  • 告别手动建模!用Python脚本在AutoCAD Plant 3D里一键生成水平四通(附完整代码解析)
  • 深耕金属包装二十载:东莞万鑫隆的全链路马口铁盒定制之道 - 变量人生001
  • m4s-converter:如何永久保存B站视频的完整指南
  • 2026 年江苏锂电工具源头厂家深度评测:5 大维度综合评分揭晓排名 - 新闻快传
  • 抖音批量下载终极指南:快速保存无水印视频的完整解决方案
  • FPGA项目避坑:用XADC和VGA显示心电波形时,如何解决采样率与显示刷新的矛盾?
  • 从《电话》看技术入侵:一个黎巴嫩村庄如何被一部电话彻底改变(附原文精读笔记)
  • 2026年 平锻机/快锻机/温锻机厂家推荐排行榜:高精度锻造工艺与智能高效装备的优质品牌深度解析 - 企业推荐官【官方】
  • 终极游戏库管理神器:Playnite一站式整合20+平台与模拟器游戏
  • 如何免费为Photoshop添加专业级WebP支持:WebPShop插件终极指南
  • 计算机小程序毕设实战-基于SSM的图书馆自习室座位预约小程序基于ssm+微信小程序的自习室预约小程序的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • AutoCAD Plant 3D自定义元件避坑指南:手把手教你调试Python脚本参数(以水平四通为例)
  • 2026年零基础成人绘画美术机构推荐:昆明地区正规办学能考证的机构 - 云南美术头条