LangChain Agent提前终止问题求助:声明调用工具却未执行
LangChain Agent未执行收尾工具问题排查与解决
可能原因
- OpenAI GPT-4模型迭代:上月OpenAI对GPT-4系列模型做过指令对齐、输出逻辑的调整,可能导致Agent思考链提前终止。
- 结构化Agent模板兼容性:旧版LangChain的
STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION模板,可能和新版GPT-4的输出格式不匹配,导致Agent误判任务已完成。 - 上下文窗口占满:前置工具返回内容过长,耗尽GPT-4的上下文空间,导致跳过收尾工具调用步骤。
解决方法
1. 强化Prompt约束
修改Agent的系统Prompt,明确强制要求必须执行收尾工具后才能结束:
任务完成的唯一判定标准是调用了[你的收尾工具名称],未调用该工具前,绝对不能终止流程,必须继续触发工具调用。
同时在Prompt中明确收尾工具的触发时机:
所有前置工具执行完成后,立即调用[你的收尾工具名称],不得省略该步骤。
2. 自定义输出解析器强制检查
针对结构化Agent的输出,自定义解析器,检查是否遗漏收尾工具调用,若遗漏则强制触发:
from langchain.agents import AgentOutputParser from langchain.schema import AgentAction, AgentFinish from langchain.agents.structured_chat.output_parser import StructuredChatOutputParser class ForceFinalToolParser(AgentOutputParser): def __init__(self, final_tool_name): self.final_tool_name = final_tool_name super().__init__() def parse(self, llm_output: str) -> AgentAction | AgentFinish: # 执行原有结构化解析逻辑 base_parser = StructuredChatOutputParser() parsed = base_parser.parse(llm_output) # 检查是否触发终止且未调用收尾工具 if isinstance(parsed, AgentFinish): # 从思考日志中检查是否已调用目标工具 if self.final_tool_name not in parsed.log: return AgentAction( tool=self.final_tool_name, tool_input={}, # 替换为你的工具输入参数 log="必须调用收尾工具完成任务" ) return parsed
绑定到Agent上:
from langchain.agents import StructuredChatAgent parser = ForceFinalToolParser(final_tool_name="你的收尾工具名称") agent = StructuredChatAgent.from_llm_and_tools( llm=your_gpt4_llm, tools=your_tools, output_parser=parser, # 保留原有其他参数 )
3. 截断前置工具返回内容
限制前置工具的返回长度,避免耗尽上下文空间:
def your_pre_tool_function(input_data): # 原有工具执行逻辑 raw_result = execute_pre_tool(input_data) # 截断到合理长度,比如1500字符 max_len = 1500 truncated_result = raw_result[:max_len] + "\n[内容已截断,仅保留关键信息]" if len(raw_result) > max_len else raw_result return truncated_result
4. 切换Agent类型验证
暂时切换到CHAT_ZERO_SHOT_REACT_DESCRIPTION类型Agent测试,若问题消失,说明是结构化Agent的特定兼容性问题,可以针对性调整模板。
5. 检查Azure OpenAI模型版本
登录Azure OpenAI控制台,确认当前GPT-4部署的模型版本是否有变更(比如从旧版切换到gpt-4-0613或更高),若有,尝试回滚到之前稳定的版本测试。
内容的提问来源于stack exchange,提问作者Cekir
相关产品推荐
相关产品推荐

