AgentExecutor的return_intermediate_steps一开,Memory就报警了?一个配置冲突的踩坑实录

【导航台账】制造业数据与AI践行者老蒋的技术博客全系列文章汇总(持续更新)

📌 文章摘要

控制台反复输出一行黄色警告:'ConversationBufferMemory' got multiple output keys: dict_keys(['output', 'intermediate_steps'])。这个警告不影响程序运行,但它暴露了一个潜在的隐患——AgentExecutorreturn_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兜底了所有异常,所以这个警告没有造成实质性影响。

但隐患是存在的:

  1. 记忆错位的风险:如果未来某一天需要记忆的不仅仅是output,而是Agent的完整推理过程,当前配置会丢失intermediate_steps的内容

  2. 版本升级的兼容性: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只会认它认识的键,其他键会被丢弃。

落到具体操作上就是三条:

  1. 显式指定output_key是防御性编程的一种。 在ConversationBufferMemory初始化时,养成加上output_key="output"的习惯——即使当前只有一个输出键,未来也可能会有多个。提前锁定,避免踩坑。

  2. 如果不需要intermediate_steps,直接关掉return_intermediate_steps=False让Agent的返回值保持简单,只输出output一个键。Memory不会产生歧义,代码也更干净。

  3. 黄色警告要当回事。 功能跑通了不代表没有问题,有些隐患会在某个版本更新后突然爆发。看到警告就搞清楚它想说什么,然后一次性解决掉,避免积压。

说白了就是一句话:给Memory指明‘该用哪个键’的规则,消除歧义,避免记忆错位。

系列导航

本文问题源自《Agent的记忆系统:从短时记忆到长时记忆》实战过程,完整源码及深度教程见该文:链接

💡 建议收藏:下次配置LangChain Memory时,快速对照本文的3步自检清单排查。

互动与交流

你在LangChain的Memory配置中,有没有遇到过类似的黄色警告?或者你平时看到警告会追查到底,还是选择“先跑起来再说”?欢迎评论区交流,反正我是那种看到黄灯就想搞清楚原因的人。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值