智联工坊实战:LangChain Agent记忆系统从零搭建(Buffer/Window/SummaryBuffer三种模式对比

📅 2026/8/24 12:55:53
智联工坊实战:LangChain Agent记忆系统从零搭建(Buffer/Window/SummaryBuffer三种模式对比
导航收藏不迷路—制造业数据与AI践行者老蒋的技术博客全系列文章汇总持续更新文章摘要兄弟们你们的AI助手是不是也像条“金鱼”——刚说过的事转头就忘本文带你给【智联工坊】的制造Agent装上三种“记忆芯片”Buffer、Window、SummaryBuffer。全程实战附完整代码和3种模式对比测试数据。看完你就知道记忆能解决什么、解决不了什么、为什么本地小模型在“刚才那个”这种指代上会翻车。全源码开源可直接复用。开篇差点被Agent的“金鱼记忆”整破防说实话这事让我挺郁闷的。上一篇文章我把智联工坊的制造Agent搭好了——能算OEE、能查手册、能问排班。班组长小刘试用了一下反馈得很委婉但我听懂了。他说“老蒋这个能算OEE了挺好的。就是……每次我都要把话重复好几遍。它记不住我。”他的实际体验是这样的小刘“我想查OEE。” Agent“请提供产线名称和日期。” 小刘“交互屏组装A线。” Agent“请提供日期。” 小刘“2026-07-12。” Agent终于开始算了。我当时的第一反应是这不科学啊……我都把对话传给Agent了它怎么还是像个第一次见面的陌生人后来我才搞明白——这还真不是Bug而是Agent的出厂设置就是“金鱼记忆”。每次对话都是独立的它根本不记得你上一句说了什么。本文要解决的痛点给这个“金鱼记忆”的Agent装上记忆芯片让它能记住用户之前说的话实现跨轮次的信息关联。适合谁读已经跑通基础Agent比如看过我上一篇智联工坊实战制造知识库工具调用Agent从零搭建OEE手册排班文章的兄弟想进一步优化对话体验的制造企业IT工程师、AI架构师。脱敏声明本文基于虚拟工厂“智联工坊”场景所有数据均已脱敏处理。正文一、方案设计三种记忆模式三种“记笔记”的方式LangChain提供了三种记忆实现。我这人说话啰嗦但为了让你好理解我直接打个比方记忆类型打个比方优点缺点什么时候用BufferMemory把整本笔记从头抄到尾一个字不丢对话越长、Token越贵短对话、调试WindowMemory只留着最近3页Token可控超过3页的直接扔了固定轮数对话SummaryBufferMemory前面的总结成一段摘要近的详细、远的压缩每次总结都要花钱调LLM正式上线首选我的建议很实在你在本地调试用BufferMemory就行简单省事。真要上生产线给班组长用最好用SummaryBufferMemory长期看能省不少Token钱。二、核心实现这次我只改了3个地方工程目录结构和Case01几乎一样只动了3个地方javy21_manufacturing_ai_practice/ ├── common/ │ ├── base_agent_builder.py # ① 增加了memory注入 │ ├── memory_factory.py # ② 新建记忆工厂类 │ └── ... ├── cases/ │ └── case02_memory_agent/ # ③ 新建案例复用Case01的工具 │ ├── tools/ # 完全复制Case01的三个工具 │ ├── agent/ │ │ └── builder.py # 就5行代码指定用哪种记忆 │ └── scripts/ │ └── 01_test_memory.py # 测试脚本改动1common/memory_factory.py——新建一个记忆工厂把三种记忆类型统一管理。class MemoryFactory: staticmethod def create_memory(memory_type: str buffer, llmNone, window_k: int 5): if memory_type buffer: return ConversationBufferMemory(return_messagesTrue, memory_keychat_history) elif memory_type window: return ConversationBufferWindowMemory(kwindow_k, return_messagesTrue, memory_keychat_history) elif memory_type summary_buffer: return ConversationSummaryBufferMemory(llmllm, max_token_limit2000, return_messagesTrue, memory_keychat_history) return None改动2common/base_agent_builder.py——在build()方法里把记忆注入进去。def build(self) - AgentExecutor: tools self._register_tools() self._memory self._create_memory() # 创建记忆实例 prompt PromptTemplate.from_template(self._get_prompt_template()) # 模板里要有{chat_history} agent create_react_agent(self.llm, tools, prompt) executor AgentExecutor( agentagent, toolstools, memoryself._memory, # 关键把记忆塞进去 verboseTrue, max_iterations5 ) return executor这里要留个心眼你的Prompt模板里必须有{chat_history}占位符不然记忆传进去了也不生效。这个坑我等下在排坑笔记里专门讲。改动3case02_memory_agent/agent/builder.py——就5行代码指定用哪种记忆。class MemoryAgentBuilder(BaseAgentBuilder): def __init__(self, memory_type: str buffer, **kwargs): super().__init__(memory_typememory_type, **kwargs) def _register_tools(self) - List[BaseTool]: return [ CalculateOEETool(), SearchManualTool(), QueryShiftTool() ]三、运行验证实测三种记忆模式我设计了一个5轮对话测试模拟班组长小刘的真实使用场景轮次用户说什么Agent应该怎么做1我想查OEE问产线和日期2交互屏组装A线只问日期记住前面说的是查OEE32026-07-12调用工具返回OEE数据4再查一下环境监测校准B线问日期记住要查的是B线5就刚才那个日期理解“刚才”就是第3轮的日期BufferMemory实测结果轮次Agent实际表现我咋看1问产线和日期✅ 没问题2只问日期✅ 记住意图了3返回86.39%✅ 信息拼上了4问日期✅ 知道要查B线5没懂“刚才那个日期”❌ 翻车了看到第5轮我沉默了。记忆确实传进去了Agent也确实记住了我之前说过的话。但它理解不了“刚才那个”指的是哪一天。这个事让我想明白了一个道理保存不等于理解。模型能记住你说了什么但不代表它真的“懂”你在说什么。这不是代码的问题是本地小模型的能力边界。Qwen2.5-7B在指代消解任务上确实还有差距。WindowMemory和SummaryBufferMemory的实测结果跟BufferMemory几乎一样——前4轮都正常第5轮都翻车。Window的窗口机制在这次测试里没触发因为就5轮SummaryBuffer倒是多加载了几个tokenizer文件证明它确实在工作。所以我的结论很实在记忆模式基础记忆跨轮关联理解“刚才那个”Token消耗我推荐BufferMemory✅✅❌最高调试用WindowMemory✅✅窗口内❌中等定长对话SummaryBufferMemory✅✅❌最低正式上线用四、一点真心话记忆不是银弹这个实验让我接受了一个现实再好的记忆系统也无法弥补模型本身的理解缺陷。如果用户的表达是模糊的比如“刚才那个”、“上次那个”本地小模型大概率会翻车。这不是你代码写得好不好的问题是当前技术阶段下7B参数模型的能力天花板。那怎么办我的建议很实际在工程上做补偿设计对话流程时尽量引导用户给出明确的、结构化的信息。在预期上做管理告诉用户“请尽量一次性提供产线名称和日期”而不是让用户误以为Agent什么都能听懂。在选型上做取舍如果你的场景对模糊指代要求很高可能需要考虑升级到更大参数量的模型或者用create_structured_chat_agent来更精确地控制工具调用。说白了就是技术要有敬畏心别指望一个7B的模型能听懂“刚才那个”这种只有人才懂的模糊指代。总结怕你忘了我再啰嗦一遍本文解决了什么给Case01的制造Agent点击链接看详情装上了记忆芯片让它能记住用户之前说过的话。三个核心认知记忆能解决“忘记”但解决不了“不理解”。对话历史确实保存了但模型能不能正确理解“刚才那个”是另一回事。这个区别是质的区别。三种记忆模式各有各的坑。Buffer耗Token最多Window会丢超出窗口的内容SummaryBuffer每次都要调LLM做摘要有成本。Prompt设计比记忆类型更重要。我在调试过程中走了一大段弯路——写了超长的Prompt、加了好多“绝对禁止”的规则结果模型反而不知道该听哪条了。最后删掉一半规则效果反而更好。智能工厂对标本方案对应GB/T 39116-2020中“数据资源”能力域辅域——实现对话历史的结构化管理与复用降低生产管理中的信息沟通成本。系列导航本文所属系列【AI赋能数据开发工程手册】上一篇智联工坊实战制造知识库工具调用Agent从零搭建OEE手册排班下一篇智联工坊实战多工具协同Agent让AI像人类一样规划与执行复杂任务互动与交流你在用LangChain的Memory时有没有遇到过“记忆传了但不生效”的尴尬或者你的本地小模型有没有在“刚才那个”这种问题上翻过车欢迎评论区吐槽咱们互相安慰一下。说实话我调试第5轮翻车的时候是真的有点郁闷的。关于作者制造业数据与AI践行者老蒋23年IT老兵。聚焦制造业数据架构与AI融合落地。全流程实战全源码开源。标签#AI Agent#LangChain#制造业数据#智能工厂#记忆系统