LangChain 四种记忆模块实战:手把手打造 AI 对话记忆系统,告别“失忆”尴尬!
一、为什么 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 听。下面这段代码做三件事初始化 LLM 和 Memory创建对话链进行三轮对话验证 AI 是否记住了之前的内容from langchain.chains import ConversationChainfrom langchain.chat_models import ChatOpenAIfrom langchain.memory import ConversationBufferMemory# -----------------------------------------------# 【按你的环境修改这里】# -----------------------------------------------# temperature0.0 让输出更稳定方便调试# 想要更有创意的回答可以调到 0.7# -----------------------------------------------llm ChatOpenAI(temperature0.0)memory ConversationBufferMemory()# 创建对话链verboseTrue 可以看到完整的 Prompt 拼接过程conversation ConversationChain( llmllm, memorymemory, verboseTrue)# 第一轮先自我介绍 print(第一轮对话)print(conversation.predict(input你好, 我叫皮皮鲁))# 第二轮随便聊点什么 print(\n第二轮对话)print(conversation.predict(input11等于多少))# 第三轮灵魂一问——你还记得我吗 print(\n第三轮对话)print(conversation.predict(input我叫什么名字)) plaintext ✅ 运行结果第一轮对话你好皮皮鲁很高兴认识你。我是一个AI助手有什么我可以帮你的吗第二轮对话11等于2。第三轮对话你叫皮皮鲁。诶它真记住了但 AI 并不是真的记住了而是每次调用predict()时Memory 会自动把之前所有的对话历史拼接到 Prompt 里发给 LLM——它只是重新看了一遍笔记。我们可以直接看看 Memory 里存了什么# 查看 Memory 中的完整对话记录print(memory.buffer) plaintext Human: 你好, 我叫皮皮鲁AI: 你好皮皮鲁很高兴认识你。我是一个AI助手有什么我可以帮你的吗Human: 11等于多少AI: 11等于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# k1 表示只保留最近 1 轮对话memory ConversationBufferWindowMemory(k1)# 手动添加两轮对话memory.save_context( {input: 你好我叫皮皮鲁}, {output: 你好啊我叫鲁西西})memory.save_context( {input: 很高兴和你成为朋友}, {output: 是的让我们一起去冒险吧})# 看看 Memory 里还剩什么print(memory.load_memory_variables({})) plaintext {history: Human: 很高兴和你成为朋友\nAI: 是的让我们一起去冒险吧}看到没第一轮的我叫皮皮鲁已经被丢掉了只剩最后一轮。接下来放到对话链里跑跑看这个效果就很直观了llm ChatOpenAI(temperature0.0)memory ConversationBufferWindowMemory(k1)conversation ConversationChain( llmllm, memorymemory, verboseFalse)print(第一轮对话)print(conversation.predict(input你好, 我叫皮皮鲁))print(\n第二轮对话)print(conversation.predict(input11等于多少))print(\n第三轮对话)print(conversation.predict(input我叫什么名字)) plaintext 第一轮对话你好皮皮鲁很高兴认识你。有什么我可以帮你的吗第二轮对话11等于2。第三轮对话很抱歉我无法知道您的名字。第三轮它不记得你叫什么了因为k1到第三轮时 Memory 里只有第二轮的11等于多少第一轮的自我介绍早就被丢出窗口了。“窗口记忆就像短信聊天——你只看得到最近几条往上翻不好意思删了。”3.3 Token 缓存记忆ConversationTokenBufferMemory窗口记忆按轮数截断但有个问题——有的轮对话就一个字有的轮对话巨长。按轮数算不够精确。Token 缓存记忆更聪明——按 token 数量截断超过上限就丢掉最早的对话。from langchain.memory import ConversationTokenBufferMemory# max_token_limit30 表示最多保留 30 个 tokenmemory ConversationTokenBufferMemory(llmllm, max_token_limit30)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(temperature0.0)# max_token_limit100超过 100 token 的早期对话会被压缩成摘要memory ConversationSummaryBufferMemory(llmllm, max_token_limit100)# 模拟三轮对话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( llmllm, memorymemory, verboseTrue)print(conversation.predict(input展示什么样的样例最好呢)) plaintext 展示一些具有多样性和创新性的样例可能是最好的选择。你可以展示一些不同领域的应用比如自然语言处理、图像识别、语音合成等。另外你也可以展示一些具有实际应用价值的样例比如智能客服、智能推荐等。虽然早期对话被压缩了但 AI 依然知道你今天要见客户、要展示 LLM——因为摘要里保留了关键信息。每次新对话后Memory 会自动重新压缩早期内容始终控制在 token 上限内。“SummaryBufferMemory 就像一个靠谱的秘书——重要的事记得清清楚楚不重要的帮你归档成一句话。”四、选哪个一张表说清楚四种方案都跑过一遍了回头看看怎么选记忆类型适用场景优势局限BufferMemory短对话、Demo信息完整不丢任何细节对话一长token 费用爆炸BufferWindowMemory客服/固定轮数问答简单粗暴只记最近 N 轮早期信息直接丢失TokenBufferMemory严格控成本按 token 数截断成本可控可能在句子中间截断SummaryBufferMemory长对话、生产环境早期压缩摘要兼顾全局需要额外调一次 LLM小编的建议很简单刚入门用 Buffer 先跑起来上生产换 Summary别在记忆上花冤枉钱。不过要提醒一句——这四种 Memory 解决的都是单次会话内的短期记忆问题。如果你想让 AI 跨会话记住用户偏好上期说的长期记忆或者自动清理过时信息“记忆遗忘”那就需要在这些基础上再加一层存储和管理逻辑了。“记忆系统设计80% 的工作量不在’记住’而在’该忘什么’。”AI行业迎来前所未有的爆发式增长从DeepSeek百万年薪招聘AI研究员到百度、阿里、腾讯等大厂疯狂布局AI Agent再到国家政策大力扶持数字经济和AI人才培养所有信号都在告诉我们AI的黄金十年真的来了在行业火爆之下AI人才争夺战也日趋白热化其就业前景一片蓝海我给大家准备了一份全套的《AI大模型零基础入门进阶学习资源包》包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。有需要的小伙伴可以V扫描下方二维码免费领取人才缺口巨大人力资源社会保障部有关报告显示据测算当前****我国人工智能人才缺口超过500万****供求比例达1∶10。脉脉最新数据也显示AI新发岗位量较去年初暴增29倍超1000家AI企业释放7.2万岗位……单拿今年的秋招来说各互联网大厂释放出来的招聘信息中我们就能感受到AI浪潮比如百度90%的技术岗都与AI相关就业薪资超高在旺盛的市场需求下AI岗位不仅招聘量大薪资待遇更是“一骑绝尘”。企业为抢AI核心人才薪资给的非常慷慨过去一年懂AI的人才普遍涨薪40%脉脉高聘发布的《2025年度人才迁徙报告》显示在2025年1月-10月的高薪岗位Top20排行中AI相关岗位占了绝大多数并且平均薪资月薪都超过6w在去年的秋招中小红书给算法相关岗位的薪资为50k起字节开出228万元的超高年薪据《2025年秋季校园招聘白皮书》AI算法类平均年薪达36.9万遥遥领先其他行业总结来说当前人工智能岗位需求多薪资高前景好。在职场里选对赛道就能赢在起跑线。抓住AI风口轻松实现高薪就业但现实却是仍有很多同学不知道如何抓住AI机遇会遇到很多就业难题比如❌ 技术过时只会CRUD的开发者在AI浪潮中沦为“职场裸奔者”❌ 薪资停滞初级岗位内卷到白菜价传统开发3年经验薪资涨幅不足15%❌ 转型无门想学AI却找不到系统路径83%自学党中途放弃。他们的就业难题解决问题的关键在于不仅要选对赛道更要跟对老师我给大家准备了一份全套的《AI大模型零基础入门进阶学习资源包》包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。有需要的小伙伴可以V扫描下方二维码免费领取