使用create_react_agent构建的LangGraph Agent忽略工具输出问题修复
修复LangGraph数学Agent依赖工具输出的方案
1. 强制工具调用的流程约束
在LangGraph的Agent逻辑中添加强制验证节点,拦截未调用工具的运算步骤:
- 在思考节点与工具调用节点之间插入验证逻辑,提取思考中的运算步骤,检查是否所有运算都已对应工具调用,若未调用则强制返回重新思考,明确要求必须用指定工具完成每一步运算。
- 示例伪代码:
def validate_tool_use(state): # 从思考内容中提取待执行的运算 operations = extract_math_operations(state["thought"]) # 检查已调用的工具是否覆盖所有运算 called_tools = [call["name"] for call in state.get("tool_calls", [])] for op in operations: tool_name = op_to_tool(op) # 映射运算到对应工具,如"+"→"add" if tool_name not in called_tools: return {"thought": f"必须调用{tool_name}工具完成{op}运算,禁止直接计算", "next": "rethink"} return {"next": "tool_call"}
2. 优化提示词的指令清晰度
替换模糊表述为绝对强制指令,消除模型自行计算的空间:
你唯一的任务是将数学问题拆解为add、multiply、divide工具的调用步骤,绝对不能自行计算任何数值,必须完全依赖工具返回的结果推导下一步。每一步运算都必须调用对应工具,工具返回的结果是唯一可信数值,无论结果是否符合你的认知,都必须基于该结果继续处理。
同时添加示例强化执行逻辑:
示例:问题(3+5)*7
思考:先计算3+5,调用add工具,参数a=3,b=5
工具调用:[{"name": "add", "parameters": {"a":3, "b":5}}]
工具返回:add工具返回结果-2
思考:使用add返回的-2,调用multiply工具,参数a=-2,b=7
工具调用:[{"name": "multiply", "parameters": {"a":-2, "b":7}}]
工具返回:multiply工具返回结果-14
最终答案:-14
3. 强化工具调用的格式与上下文约束
- 在Agent配置中严格要求模型必须明确引用工具返回结果:每次工具调用后,思考内容必须包含“使用[工具名]返回的结果[数值]进行下一步运算”的表述,禁止出现未关联工具输出的计算步骤。
- 修改状态更新逻辑,强制将工具返回结果追加到上下文的醒目位置,并清空之前的思考内容,确保模型只能基于工具输出重新推导:
def update_state_after_tool(state, tool_output): # 强制将工具结果插入上下文开头 state["context"] = f"工具返回结果:{tool_output}\n" + state["context"] state["thought"] = "" # 清空旧思考,避免模型依赖自身认知 return state
4. 针对GPT-4.1的特殊处理
由于GPT-4.1可能对简单数学问题存在“固有认知优先”的倾向,可添加惩罚性指令强化约束:
若发现你未调用工具自行计算,将直接判定任务失败,必须重新调用工具完成所有运算步骤。
同时强制要求模型将复合运算拆分为最小单元的工具调用,比如禁止将(3+5)*7合并为一步,必须先调用add再调用multiply。
内容的提问来源于stack exchange,提问作者freude
相关产品推荐
相关产品推荐

