LangChain AgentExecutor invoke()仅返回最后消息未返回完整输出问题
问题解决指南:AgentExecutor.invoke()仅返回最后一条消息的处理方案
核心结论
AgentExecutor并没有被LangGraph替代,你不需要强制使用流式输出,问题出在默认配置下不会返回中间工具调用结果,调整参数或使用回调就能获取完整过程数据。
1. 关于LangGraph的角色
LangGraph是LangChain生态中用于构建复杂多Agent协作流程的工具,AgentExecutor作为单Agent任务执行的核心组件依然有效,两者定位不同,简单单Agent场景用AgentExecutor完全没问题。
2. 获取中间工具调用结果的两种方法
默认情况下,AgentExecutor.invoke()仅返回LLM最终生成的回答(result["output"]),但可以通过以下方式拿到web_fetcher返回的HTML等中间数据:
- 方法一:开启返回中间步骤参数
初始化AgentExecutor时添加return_intermediate_steps=True,这样invoke的结果会包含intermediate_steps字段,里面存储了所有工具调用的输入输出记录:# 初始化AgentExecutor时开启参数 agent_executor = AgentExecutor( agent=your_agent, tools=your_tools, return_intermediate_steps=True ) # 调用后提取web_fetcher的结果 result = agent_executor.invoke({"input": "你的查询内容"}) for step in result["intermediate_steps"]: tool_name = step[0].tool tool_output = step[1] if tool_name == "web_fetcher": print("web_fetcher返回的HTML内容:", tool_output) - 方法二:用回调捕获实时数据
自定义回调类,在工具调用完成时触发逻辑捕获输出,适合需要实时处理中间结果的场景:from langchain.callbacks.base import BaseCallbackHandler class ToolOutputHandler(BaseCallbackHandler): def on_tool_end(self, output, **kwargs): # 这里可以拿到每个工具调用的输出,包括web_fetcher的HTML if kwargs["tool"] == "web_fetcher": print("实时获取到web_fetcher输出:", output) # 调用时传入回调 agent_executor = AgentExecutor(agent=your_agent, tools=your_tools) result = agent_executor.invoke( {"input": "你的查询内容"}, callbacks=[ToolOutputHandler()] )
3. 流式输出的必要性
流式输出不是必须的,它的作用是实时返回LLM的生成内容,和获取中间工具调用结果无关。如果只是需要拿到web_fetcher的返回数据,用上面的方法更直接高效。
4. 额外检查项
确认你的Agent类型配置正确(比如ToolCallingAgent、StructuredChatAgent等),工具已正确注册到Agent中,避免因Agent逻辑异常导致中间步骤未被记录。
内容的提问来源于stack exchange,提问作者Charles Thayer
相关产品推荐
相关产品推荐

