【导航台账】制造业数据与AI践行者老蒋的技术博客全系列文章汇总(持续更新)
📌 文章摘要
控制台反复输出一行黄色警告:
'ConversationBufferMemory' got multiple output keys: dict_keys(['output', 'intermediate_steps'])。这个警告不影响程序运行,但它暴露了一个潜在的隐患——AgentExecutor的return_intermediate_steps=True产生了多个输出键,而ConversationBufferMemory默认只认output键,可能导致记忆存储错位。本文教你如何通过显式指定output_key彻底消除这个隐患。
问题现象
兄弟们,你是否有过这样的经历——代码跑得好好的,但控制台里总是飘着一行黄色警告,看了就心烦?
我跑Case02测试的时候,每一轮对话结束,控制台都会输出一行:
UserWarning: 'ConversationBufferMemory' got multiple output keys:
dict_keys(['output', 'intermediate_steps']).
The default 'output' key is being used. If this is not desired,
please manually set 'output_key'.
我当时的第一反应是:这不科学啊......
代码没报错,Agent也能正常工作,记忆也能正常保存,但这行警告就是赖着不走,每一轮都出来刷存在感。
虽然不影响程序运行,但作为一个写代码写了二十多年的老家伙,看到黄色警告就像看到屋里有个蟑螂——你知道它不会咬你,但就是浑身不舒服。
根因分析
说实话,这个警告本身不影响功能,但真正让我在意的是——它说“默认使用'output'键”,意味着如果有多个输出键,其他键会被忽略。
万一哪一天intermediate_steps里的信息也很重要呢?
第一层:return_intermediate_steps=True会产生多个输出
在AgentExecutor中,有一个配置叫return_intermediate_steps。把它设为True,Agent的返回值就会变成多个键:
executor = AgentExecutor(
agent=agent,
tools=tools,
memory=memory,
return_intermediate_steps=True, # 👈 这个配置
verbose=True
)
当这个配置打开时,AgentExecutor会返回:
-
output:Agent的最终回答 -
intermediate_steps:Agent的推理中间步骤(Thought → Action → Observation 的完整链条)
第二层:ConversationBufferMemory默认只认output键
ConversationBufferMemory在存储对话历史时,需要知道“哪个键是Agent的回答”。
默认情况下,它使用output作为输出键。当它检测到返回值里有多个键时,它只会取output的值存进去,其他键(包括intermediate_steps)直接忽略。
# ConversationBufferMemory 默认配置
memory = ConversationBufferMemory(
memory_key="chat_history",
# output_key 没有指定,默认是 "output"
)
所以这个警告的意思是:
“兄弟,你返回了多个键,但我只会用
output,其他的我不管了。如果你希望我用别的键,你得告诉我。”
第三层:潜在隐患
当前代码中,handle_parsing_errors=True兜底了所有异常,所以这个警告没有造成实质性影响。
但隐患是存在的:
-
记忆错位的风险:如果未来某一天需要记忆的不仅仅是
output,而是Agent的完整推理过程,当前配置会丢失intermediate_steps的内容 -
版本升级的兼容性:LangChain新版本可能对
output_key的处理方式发生变化,不显式指定可能会导致更严重的问题
解决方案
第一步:在ConversationBufferMemory中显式指定output_key
# ✅ 显式指定 output_key
memory = ConversationBufferMemory(
memory_key="chat_history",
output_key="output", # 👈 明确告诉Memory用哪个键
return_messages=True
)
这样Memory就知道它该存output这个键的值,不会因为它不认识的键而产生混淆。
第二步:如果希望记忆包含中间步骤
你也可以反向操作——把return_intermediate_steps关掉,如果不需要追踪中间步骤的话:
# ✅ 方案二:如果不关心中间步骤,直接关掉
executor = AgentExecutor(
agent=agent,
tools=tools,
memory=memory,
return_intermediate_steps=False, # 关闭后只返回 output
verbose=True
)
验证结果
修改之后,警告消失:
# ✅ 控制台干净了
Memory正常工作,不再因为额外的intermediate_steps键而产生混淆。
经验总结
这个警告虽然不影响程序运行,但它暴露了一个设计上的坑:当多个输出键并存时,Memory只会认它认识的键,其他键会被丢弃。
落到具体操作上就是三条:
-
显式指定
output_key是防御性编程的一种。 在ConversationBufferMemory初始化时,养成加上output_key="output"的习惯——即使当前只有一个输出键,未来也可能会有多个。提前锁定,避免踩坑。 -
如果不需要
intermediate_steps,直接关掉。return_intermediate_steps=False让Agent的返回值保持简单,只输出output一个键。Memory不会产生歧义,代码也更干净。 -
黄色警告要当回事。 功能跑通了不代表没有问题,有些隐患会在某个版本更新后突然爆发。看到警告就搞清楚它想说什么,然后一次性解决掉,避免积压。
说白了就是一句话:给Memory指明‘该用哪个键’的规则,消除歧义,避免记忆错位。
系列导航
-
本文属于《数据与AI工程排坑笔记》系列
-
下一篇:系列暂告一段落(Case02三篇排坑笔记已全部产出)
本文问题源自:《Agent的记忆系统:从短时记忆到长时记忆》实战过程,完整源码及深度教程见该文:链接
💡 建议收藏:下次配置LangChain Memory时,快速对照本文的3步自检清单排查。
互动与交流
你在LangChain的Memory配置中,有没有遇到过类似的黄色警告?或者你平时看到警告会追查到底,还是选择“先跑起来再说”?欢迎评论区交流,反正我是那种看到黄灯就想搞清楚原因的人。


1524

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



