【导航台账】制造业数据与AI践行者老蒋的技术博客全系列文章汇总(持续更新)
📌 文章摘要
在LangChain中配置了
ConversationBufferMemory,Agent却依然“金鱼记忆”——每次对话都像第一次见面。明明传入了memory,为什么就是不生效?本文带你排查这个90%开发者都会踩的坑:Prompt模板中缺少{chat_history}占位符。附完整代码对比和3步自检清单。
问题现象
兄弟们,你们有没有遇到过这种情况——明明按照官方文档把ConversationBufferMemory传进了AgentExecutor,Agent还是像个金鱼一样,转头就忘?
我当时的情况是这样的:
# 我自信满满地写了这段代码
memory = ConversationBufferMemory(return_messages=True)
executor = AgentExecutor(
agent=agent,
tools=tools,
memory=memory, # 👈 明明传了啊!
verbose=True
)
结果跑起来之后:
用户: 我想查OEE
Agent: 请问您想查询哪条产线、哪一天的OEE?
用户: 交互屏组装A线
Agent: 请问您想查询哪条产线、哪一天的OEE? # ❌ 又问了同样的问题!
用户: 2026-07-12
Agent: 请问您想查询哪条产线、哪一天的OEE? # ❌ 还在问!
我当时的第一反应是:这不科学啊……😀😀😀
我把memory传进去了,Agent怎么还是像个第一次见面的陌生人?每次都要把话重复三遍,它到底有没有记住我说过什么?
根因分析
说实话,这个坑我翻来覆去查了半天。看了好几遍官方文档,确认memory参数确实传对了,但Agent就是记不住。
后来我开了verbose=True,仔细看Agent的Prompt输入,才发现问题所在。
第一层:AgentExecutor确实把历史传进去了
从日志里能看到,ConversationBufferMemory确实在工作——它在默默地把历史消息存起来了。
但是,存了不等于用了。
第二层:Prompt模板里没有占位符
我打开我的Prompt模板一看:
template = """
你是一个制造业AI助手,可以调用以下工具:{tools}
规则:
- 如果用户信息不足,直接询问。
- 如果信息完整,调用对应工具。
Question: {input}
Thought: {agent_scratchpad}
"""
关键问题来了:{chat_history}在哪???
没有{chat_history}占位符,AgentExecutor就算有再多的历史消息,也塞不进去,Agent根本看不到之前说过什么。
第三层:memory_key的默认值
ConversationBufferMemory的memory_key默认值是"chat_history"(LangChain 0.3.x版本)。
所以Prompt模板里必须有{chat_history}这个占位符,名字还不能写错。写{history}不行,写{chat}也不行,必须是{chat_history}。
说白了就是:你传了记忆,但Prompt里没给记忆留位置,它想生效也生效不了。
解决方案
第一步:在Prompt模板中添加{chat_history}占位符
# ✅ 正确写法
template = """
你是一个制造业AI助手,可以调用以下工具:{tools}
规则:
- 如果用户信息不足,直接询问。
- 如果信息完整,调用对应工具。
对话历史:
{chat_history} # 👈 必须有这一行
Question: {input}
Thought: {agent_scratchpad}
"""
第二步:确保memory_key与占位符一致
# ✅ memory_key 必须与 Prompt 中的占位符名称一致
memory = ConversationBufferMemory(
return_messages=True,
memory_key="chat_history" # 默认就是 "chat_history",不用改
)
第三步:验证记忆是否生效
修改后重新运行,Agent的行为应该是这样的:
用户: 我想查OEE
Agent: 请问您想查询哪条产线、哪一天的OEE?
用户: 交互屏组装A线
Agent: 好的,您查询的是交互屏组装A线,请问是哪一天呢? # ✅ 记住了意图!
用户: 2026-07-12
Agent: 交互屏组装A线在2026-07-12的OEE为86.39% # ✅ 信息拼上了!
经验总结
怕你忘了,我再啰嗦一遍😀😀😀:传了Memory,不等于Memory生效。你的Prompt里必须有{chat_history},少一行都不行。
落到具体操作上就是三条:
-
Prompt模板中必须包含
{chat_history}占位符。这是记忆生效的必要条件,没有它,记忆传了也是白传。 -
memory_key必须与占位符名称一致。默认是"chat_history",如果你改了,两边都要保持一致。改了memory_key但忘了改Prompt占位符,一样不生效。 -
用
verbose=True调试。如果记忆没生效,先打开verbose=True看看Agent收到的Prompt里到底有没有历史消息。这是最快定位问题的方式。
一句话总结:Memory是水,Prompt是杯子。水装得再多,杯子里没有,也喝不到。
系列导航
-
本文属于《数据与AI工程排坑笔记》系列
-
下一篇:《Prompt写了2000字,Agent反而躺平了?一个反直觉的踩坑实录》
本文问题源自:《Agent的记忆系统:从短时记忆到长时记忆》实战过程,完整源码及深度教程见该文:链接
💡 建议收藏:下次配置LangChain Memory时,快速对照本文的3步自检清单排查。

599



被折叠的 条评论
为什么被折叠?



