何时拒绝使用工具:Agent 不是万能钥匙

📅 2026/7/24 21:56:16
何时拒绝使用工具:Agent 不是万能钥匙
摘要Agent 的核心能力之一是调用工具但有能力调用不等于应该调用。本文探讨 Agent 何时应该拒绝使用工具以及如何通过 System Prompt、工具描述和条件边来引导 Agent 做出正确判断。引言很多人初学 Agent 时会陷入一个误区既然给了 Agent 一堆工具那它就应该尽量多用。但现实恰恰相反——好的 Agent 知道什么时候不用工具。想象这些场景用户问11等于几Agent 却去调用计算器 API用户说你好Agent 却去查用户画像数据库用户问Python 的 list 怎么排序Agent 却去搜索 Google这些场景不仅浪费时间和金钱还会让用户体验变得糟糕。核心原则只有一条只有当 LLM 自身无法可靠回答或者工具能显著提升回答质量时才应该调用工具。核心概念一、应该拒绝工具调用的 8 种场景场景说明示例常识性问题模型预训练时已经学过“中国的首都是哪里”简单推理不需要计算或外部数据“苹果是水果还是蔬菜”闲聊/创作不涉及工具能力“帮我写一首诗”、“你好”工具成本过高付费 API 或增加明显延迟简单问题却调用付费搜索 API工具可能有副作用写操作、发送通知等未经确认就发邮件、删文件工具可靠性低可能返回错误或过时信息依赖一个经常宕机的第三方 API用户明确要求用户说别查了直接告诉我尊重用户意愿工具不适用问题与工具能力无关问天气却调用了数据库查询工具二、Agent 如何做出判断Agent 判断是否调用工具主要依赖三个机制┌─────────────────────────────────────────┐ │ Agent 决策流程 │ ├─────────────────────────────────────────┤ │ │ │ 1. System Prompt 中的指导规则 │ │ ↓ │ │ 2. 工具描述中的适用/不适用条件 │ │ ↓ │ │ 3. ReAct 思考步骤Thought → Action │ │ ↓ │ │ 4. 条件边走工具路径 or 直接回答路径 │ │ │ └─────────────────────────────────────────┘代码示例1. System Prompt引导 Agent 何时用/不用工具system_prompt你是一个智能助手拥有以下工具 - search_web: 搜索互联网获取实时信息 - calculator: 执行复杂数学计算 ## 工具使用原则 ### 应该使用工具的情况 - 用户询问实时信息天气、新闻、股价 - 需要精确计算财务、统计、科学计算 - 需要获取用户个人数据订单、历史记录 ### 不应该使用工具的情况 - 常识性问题历史、地理、科学常识 - 简单的数学运算心算即可 - 闲聊、问候、创意写作 - 用户明确要求直接回答时 ### 判断流程 1. 先思考我能否凭借自身知识可靠回答 2. 如果能 → 直接回答不调用工具 3. 如果不能 → 选择最合适的工具 4. 如果工具可能有副作用 → 先征求用户同意 2. 工具描述包含正向和反向场景fromlangchain.toolsimporttooltooldefsearch_web(query:str)-str:搜索互联网获取实时信息。 适用场景 - 查询实时天气、新闻、股价 - 获取最新的产品信息或价格 - 查找模型训练数据截止后发生的事件 不适用场景 - 历史事件如二战什么时候结束 - 科学常识如水的化学式是什么 - 数学计算请使用 calculator 工具 - 用户的主观感受或意见类问题 Args: query: 搜索关键词应简洁明确 # 实际搜索逻辑returnresults3. LangGraph 条件边默认不走工具路径fromlanggraph.graphimportStateGraph,ENDfromlangchain.agentsimportAgentStatedefshould_use_tool(state)-str:条件边判断是否应该调用工具last_messagestate[messages][-1]# 如果 LLM 决定调用工具ifhasattr(last_message,tool_calls)andlast_message.tool_calls:returnuse_tool# 默认路径直接回答不调用工具returndirect_answer# 构建工作流workflowStateGraph(AgentState)workflow.add_node(agent,call_model)workflow.add_node(tools,call_tools)# 条件边根据判断走不同路径workflow.add_conditional_edges(agent,should_use_tool,{use_tool:tools,# 需要工具 → 走工具节点direct_answer:END,# 不需要工具 → 直接结束})workflow.set_entry_point(agent)appworkflow.compile()4. 完整示例带成本意识的 Agentfromlangchain_openaiimportChatOpenAIfromlanggraph.graphimportStateGraph,ENDfromtypingimportTypedDict,AnnotatedimportoperatorclassAgentState(TypedDict):messages:Annotated[list,operator.add]tool_cost_estimate:float# 估算工具调用成本defcall_model(state:AgentState):responsemodel.invoke(state[messages])return{messages:[response]}defshould_use_tool(state:AgentState)-str:last_messagestate[messages][-1]# 检查是否有工具调用意图ifnothasattr(last_message,tool_calls):returndirect_answer# 检查成本如果预估成本过高再次确认ifstate.get(tool_cost_estimate,0)0.1:# 可以在这里加入用户确认逻辑returnconfirm_with_userreturnuse_tool# 构建带成本控制的 AgentworkflowStateGraph(AgentState)workflow.add_node(agent,call_model)workflow.add_node(tools,call_tools)workflow.add_node(confirm,ask_user_confirmation)workflow.add_conditional_edges(agent,should_use_tool,{use_tool:tools,confirm_with_user:confirm,direct_answer:END,})workflow.add_edge(confirm,tools)# 用户确认后执行workflow.add_edge(tools,END)workflow.set_entry_point(agent)appworkflow.compile()最佳实践1. 用 System Prompt 明确指导System Prompt 是引导 Agent 行为的第一道防线。明确列出应该用和不应该用的场景让模型在决策时有据可依。✅ 好的做法 对于常识性问题直接回答不要调用工具 ❌ 不好的做法 你可以使用搜索工具没有说明何时不用2. 在工具描述中加入反向场景工具的 docstring 不仅是说明文档更是 Agent 决策的依据。明确写出不适用场景能显著减少误调用。tooldefmy_tool():工具描述。 适用... 不适用... ← 这部分很重要 3. 优先使用模型自身知识模型预训练时已经学到了大量知识。对于这些问题直接回答比调用工具更快、更便宜、更可靠。判断标准模型训练数据截止前就已确定的事实 → 直接回答需要实时性或精确性的信息 → 调用工具简单推理和创作 → 直接回答需要外部系统交互 → 调用工具4. 为有副作用的工具加确认机制写操作发邮件、删文件、修改数据应该有确认环节避免 Agent 自作主张。defshould_execute_write_operation(state):写操作需要用户确认ifstate[pending_action][type]write:returnask_confirmationreturnexecute5. 监控工具调用的 ROI每次工具调用都有成本API 费用、延迟、错误风险。定期审视哪些工具调用是不必要的哪些工具返回的信息模型本身就知道工具调用是否显著提升了回答质量总结Agent 不是工具用得越多越好而是该用时用不该用时果断拒绝。记住三个关键点System Prompt 是方向盘明确告诉模型何时用、何时不用工具工具描述是说明书包含正向和反向场景帮助模型做出正确判断条件边是分流器让 Agent 有直接回答的默认路径而不是强制走工具好的 Agent 像一个经验丰富的专家——知道什么时候该查资料什么时候凭经验就能给出答案。