Tool Use 工具调用:Agent 与外部世界交互的核心机制
每日学习笔记 · 2026-08-03
Tool Use 工具调用:Agent 与外部世界交互的核心机制
📌 今日速览
模型只是”大脑”,工具才是”手脚”——这是过去 30 天学完架构、记忆、Skill、Context、Multi-Agent、评估后,第一次系统地把”Agent 如何行动”这件事讲清楚。今天从 4 篇文章里梳理出工具调用的协议层(Function Call / MCP)、形态层(Tool / Skill / Plugin)、模式层(ReAct / Plan-Execute / LATS)、防护层(Guardrails / 风险分级)四个维度。最核心的反共识观点是:工具调用不是”写个 function_call 就完事”,而是要按”用户意图”重新组织 Schema;工具描述三要素(何时调、参数怎么填、结果怎么用)决定了一个工具能不能被模型用对。
一、为什么今天聊这个?
过去 30 天我们学完的脉络是:
- 7-23 架构演进:从 Prompt 到 Graph
- 7-24 记忆系统:Memory 分层与复用
- 7-27 Skill 技能系统:流程、约束、验收标准
- 7-28 Context Engineering:上下文决定单次决策
- 7-29 Multi-Agent:多智能体协作模式
- 7-30 / 7-31 评估与可观测性:怎么判断 Agent “能信”
但始终有一个底层问题没正面回答:模型怎么”动手”?
所有的架构、记忆、Context、Multi-Agent,最终都要靠模型”调一个外部动作”来落地——查数据库、读写文件、发邮件、调用 API。这个”动手”的能力,就是 Tool Use。它是 Agent 与外部世界交互的核心机制,是”想”到”做”的桥梁。
今天 4 篇文章从 4 个不同视角把这件事讲透了:
- WorkBuddy 产品视角:Function Call / MCP / Skill / Plugin 共同构成能力层
- OpenAI 官方指南:标准化工具定义、编排模式、风险分级
- 架构对比视角:ReAct / Plan-and-Execute / LLM Compiler 工具调用机制差异
- 设计模式视角:ReAct / Reflection / Reflexion / LATS 反思与验证机制
二、核心内容
2.1 全景图:工具调用的四层抽象
把今天学到的内容压成一个四层模型:
┌─────────────────────────────────────────────────┐│ 防护层:Guardrails / 风险分级 / max_iterations │├─────────────────────────────────────────────────┤│ 模式层:ReAct / Plan-Execute / LATS / Reflection│├─────────────────────────────────────────────────┤│ 形态层:Tool / MCP / Skill / Plugin │├─────────────────────────────────────────────────┤│ 协议层:Function Call / MCP Protocol │└─────────────────────────────────────────────────┘- 协议层解决”模型怎么请求动作、外部系统怎么标准化接入”
- 形态层解决”按什么形式组织能力”
- 模式层解决”在循环中怎么决策何时调、调几次”
- 防护层解决”工具调用的安全和成本边界”
下面逐层拆解。
2.2 协议层:Function Call 与 MCP
这是今天学到的第一个反共识点——很多文章把 Function Call 和 MCP 混为一谈,实际上它们解决的是不同层面的问题。
Function Call:模型怎么请求动作?
- 模型与外部系统之间的结构化协议
- 解决的核心问题:“一个模型怎么请求执行动作”
- 主要消费者:模型 + Agent
- 典型内容:名称、描述、Schema、调用结果
完整执行流程:
- 产品把可用工具的名称、用途和参数 Schema 提供给模型
- 模型根据用户目标,输出一个结构化的调用请求
- Agent 校验参数、检查权限,执行 API、脚本或本地函数
- Agent 把执行结果作为
tool result放回上下文 - 模型读取结果,决定直接回答还是继续调用其他工具
MCP(Model Context Protocol):外部系统怎么标准化接入?
- Anthropic 在 2024 年底发布的开放协议
- 解决的核心问题:“外部系统怎么标准化接入 Agent”
- 主要消费者:Agent / Server
- 典型内容:Tools、Resources、Prompts 三种原语
| 原语 | 驱动方 | 职责 | 典型用法 |
|---|---|---|---|
| Resources | 应用/Agent 驱动 | 有 URI 标识的只读内容 | 拼进 messages,不经过 tool |
| Tools | 模型驱动 | 模型能调用的动作/函数 | 模型在推理时自己决定调用 |
| Prompts | 用户驱动 | Server 预组织的可复用消息 | 斜杠命令触发 |
关键区分
| 维度 | Function Call | MCP |
|---|---|---|
| 本质 | 基础协议(动作请求) | 标准化协议(系统接入) |
| 解决问题 | 模型怎么请求动作 | 外部系统怎么标准化接入 |
| 范围 | 单个工具调用 | Tools + Resources + Prompts |
| 适配成本 | 每个系统需单独适配 | 统一协议,一次接入 |
MCP 统一的是连接协议,不自动解决认证、数据授权、网络隔离和高危审批——这是 WorkBuddy 那篇文章反复强调的边界。
2.3 形态层:Tool / MCP / Skill / Plugin 怎么选?
很多团队做 Agent 时一上来就堆工具,结果遇到工具爆炸问题。WorkBuddy 那篇文章给了一个非常实用的判断框架。
形态选择对照表
| 需求 | 优先形态 | 原因 |
|---|---|---|
| 稳定的底层操作(读文件、执行命令) | 内置 Tool | 延迟低、权限和 UX 可深度集成 |
| 腾讯文档、IMA 等外部系统 | MCP / Connector / SDK | 服务端集中维护,能力标准化复用 |
| 团队高频、稳定的工作流程 | Skill | 沉淀步骤、判断标准与失败处理 |
| 需要同时装连接、流程、规则和 Hook | Plugin | 作为组合与分发单位 |
六个判断维度
“没有一种形态对所有能力都最优。判断标准是:”
- 能力边界:这个能力是不是单一动作?
- 更新频率:多久变一次?
- 权限风险:高危还是低危?
- 上下文成本:每次调用占多少 token?
- 执行延迟:对实时性要求?
- 跨产品复用价值:能不能在多个产品里用?
四个概念的精确定位
| 概念 | 核心问题 | 主要消费者 | 典型内容 |
|---|---|---|---|
| Function Call | 一个模型怎么请求执行动作? | 模型 + Agent | 名称、描述、Schema、调用结果 |
| MCP | 外部系统怎么标准化接入 Agent? | Agent / Server | Tools、Resources、Prompts |
| Skill | 一类任务应该按什么方法做? | Agent | 流程、约束、脚本、验收标准 |
| Plugin | 怎么把一组能力安装和分发? | 用户 / 团队 / 产品 | MCP、Skills、Rules、模板 |
关键洞察:Tool 负责”一个动作”,Skill 负责”一类任务的做法”,两者可以组合——一个”发周报” Skill 可能同时调用腾讯文档 MCP、知识库 MCP 和本地脚本。
2.4 模式层:ReAct / Plan-Execute / LATS / Reflection 怎么选?
这是今天学到的第二个反共识点——很多人以为”ReAct 就是 Agent 标配”,但实际上有 7 种主流模式,每种在工具调用上的取舍完全不同。
7 种模式工具调用机制对比
| 模式 | 工具调用方式 | LLM 调用次数 | 灵活性 | 鲁棒性 | Token 成本 |
|---|---|---|---|---|---|
| ReAct | Thought→Action→Observation 循环 | 高(每步一次) | ★★★★★ | 中 | 高 |
| Plan & Execute | Planner 一次性生成计划→Executor 执行 | 较低 | ★★ | 差 | 中 |
| ReWOO | 变量占位符计划,无观察推理 | 低 | ★ | 差 | 低 |
| LLM Compiler | DAG 并行执行(3.6x 提速) | 低 | ★★ | 差 | 低 |
| Basic Reflection | 完成后 LLM 自我批判 | 中高 | ★★★ | 中 | 中高 |
| Reflexion | Evaluator+Reflector+动态记忆 | 很高 | ★★★★ | 强 | 高 |
| LATS | 多路径搜索+回溯 | 极高 | ★★★★★ | 最强 | 最高 |
作者的核心观点
ReWOO / Plan & Execute / LLM Compiler 本质上都是通过构建类工作流形式来加速,但 ReWOO 舍弃了 ReAct “根据现实反馈调整策略”这一核心特性,属于”开历史倒车”,产品化之路会很艰难。
核心洞察:ReAct 的 Observation 机制是其精髓——将推理过程的每一步都与现实世界反馈核对,本质上是一种”强化学习”思路,从”开放式生成”升级为”闭环控制”。其他反思类模式是在无法或不便实时获取工具反馈时的替代方案。
选型决策树
1. 通用场景 → ReAct(基础但灵活) │ ├── 想加速但保持灵活性? │ └── Plan & Execute / LLM Compiler(工具并行) │ └── 工具间需传数据?→ ReWOO │ ├── 无法获取真实环境反馈?(如写文章) │ └── Basic Reflection(单次内迭代) │ └── 需跨试验学习?→ Reflexion │ └── 需探索性决策? └── LATS(多路径搜索+反思+回溯)2.5 工具爆炸:表现与应对
当工具数量增长到数十甚至上百个时,单 Agent 会出现:
- Prompt 溢出:工具描述占用大量 context window
- 选择困难:LLM 在众多相似工具间选择错误率上升
- 调试困难:无法判断 Agent 为何选了错误的工具
- 成本飙升:每步推理都要处理全部工具定义
五种应对策略
| 策略 | 说明 |
|---|---|
| 工具分组 | 将工具按领域分簇,每次只暴露相关簇 |
| 工具检索(Tool Retrieval) | 用 RAG 思想动态检索 Top-K 相关工具 |
| 路由 Agent | 设置”路由器”先判断任务类型,再分发到对应专业 Agent |
| 工具合并 | 将多个细粒度工具合并为粗粒度复合工具 |
| 升级到多 Agent | 真正多领域时再考虑(慎重) |
OpenAI 给的数据参考:一些实现可成功管理 15+ 个定义清晰、互不重叠的工具,但有些实现即使工具 <10 个且存在重叠也会出现问题。拆分前先尝试改善工具的命名清晰度、参数明确性、描述详细度。
渐进式加载(Progressive Disclosure)
工具越多、语义越重叠,模型选择越困难。分阶段能力发现机制:
- 能力类别 / Server 简介
- ToolSearch 搜索候选
- 只加载选中工具 Schema
2.6 工具设计的关键原则
这是今天最有落地价值的部分。
原则 1:Schema 按用户意图组织,不照搬底层 API
“例如’创建 Issue’可能涉及创建、加描述、加 tag、加附件四个底层接口,但对 Agent 应该只暴露一个
create_issue工具,把描述、tag、附件作为参数。Issue 相关操作也可以收进一个工具,用不同 action(create / delete / update / close)区分。“
原则 2:工具描述三要素
一个可用的工具至少要说明三件事:
- 什么时候调用(Description 与相似工具区分)
- 参数怎么填(枚举、默认行为)
- 结果怎么继续处理(成功返回关键字;失败返回原因和修正方法)
原则 3:错误处理策略
工具结果过长时:
- 分页、截断或写入文件
- 截断时必须明确告诉模型”结果未完整”,附上总量、截断位置和继续读取方法
- 否则模型会把前 100 条误当成全部
错误返回:
- 不只返回 error 或一段堆栈
- 要返回失败原因、可修正参数、是否可重试和建议下一步
- 把 Agent 受阻视为”环境中缺少工具、规则或文档”的信号
原则 4:三大工具类型(OpenAI 视角)
| 类型 | 作用 | 示例 |
|---|---|---|
| Data(数据类) | 检索执行工作流所需的上下文 | 查询交易数据库、读取 PDF、网络搜索 |
| Action(动作类) | 与系统交互以执行操作 | 发送邮件、更新 CRM、工单转人工 |
| Orchestration(编排类) | Agent 本身可作为其他 Agent 的工具 | Refund Agent、Research Agent、Writing Agent |
2.7 防护层:风险分级与 Guardrails
工具调用一旦涉及真实系统,安全问题就不容忽视。
工具风险分级(OpenAI 视角)
按以下因素对每个工具进行风险评估:
| 评估因素 | 风险维度 |
|---|---|
| 访问类型 | 只读 vs. 写操作 |
| 可逆性 | 动作是否可回滚 |
| 权限要求 | 所需账号权限等级 |
| 财务影响 | 是否涉及资金变动 |
风险等级:Low / Medium / High
风险驱动的自动化动作
- 低风险工具:可直接执行
- 中高风险工具:执行前暂停,触发 Guardrail 检查
- 高风险工具:升级到人工介入(尤其是不可逆、敏感、高影响操作)
典型高风险动作(必须人工介入):
- ❌ 取消用户订单
- ❌ 授权大额退款
- ❌ 支付操作
- ❌ 涉及敏感数据的写操作
Guardrails 层次化防御
“Think of guardrails as a layered defense mechanism. While a single one is unlikely to provide sufficient protection, using multiple, specialized guardrails together creates more resilient agents.”
| Guardrail 类型 | 防护目标 |
|---|---|
| Rules-based | 已知威胁(黑名单、长度限制、regex) |
| Tool safeguards | 按风险等级控制工具执行 |
| PII filter | 模型输出中的 PII 信息 |
| Moderation | 有害/不当输入 |
| Output validation | 品牌一致性 |
防护措施清单(来自实战踩坑)
| 措施 | 作用 | 示例 |
|---|---|---|
| max_iterations | 防止无限循环 | 必设,有开发者遇到过跑一整夜的情况 |
| timeout | 防止长任务卡死 | 5 分钟超时 |
| permissionMode | 权限分级 | acceptEdits / interactive / planOnly |
| 行为边界 | 提示词约束 | ”不要删除任何测试文件” |
| verbose 调试 | 可观测性 | 打印推理过程 |
| 群聊收敛 | 防止无限辩论 | max_rounds + Moderator |
| 循环移交检测 | 防止死锁 | A→B→A 模式识别 |
三、4 篇文章的共同观点
读完 4 篇,有 6 个观点是高度共识的:
- 模型只是大脑,工具是手脚——四篇文章都强调”模型不能自己动手,必须通过工具与外部世界交互”。
- 工具设计比工具数量更重要——WorkBuddy 强调”按用户意图组织 Schema”,OpenAI 强调”15+ 个定义清晰工具 OK,重叠的 10 个就不行”。
- 从单 Agent 起步,按需升级——OpenAI 明确”maximize a single agent’s capabilities first”,架构对比文也警告”如果单 Agent 能解决,不要强上多 Agent”。
- ReAct 的 Observation 是核心——即使在推崇 Plan-Execute、LLM Compiler 的作者眼里,ReAct 的”每步与现实反馈核对”仍是不可替代的。
- 必须设置 max_iterations 和 timeout——所有文章都强调这个是”踩过的坑”。
- 风险分级和 Guardrails 是工业级落地的必要条件——OpenAI、WorkBuddy、ANOLISA 都反复强调。
四、4 篇文章的不同视角
| 维度 | WorkBuddy(产品视角) | OpenAI(官方指南) | 架构对比文 | 设计模式文 |
|---|---|---|---|---|
| 核心关注 | Tool/Skill/Plugin 形态选择 | 标准化工具定义 + 编排 | ReAct vs Plan-and-Execute | 7 种模式工具调用机制 |
| 侧重点 | 协议层(MCP vs Function Call) | 风险分级 + Guardrails | 何时升级架构 | 反思与验证机制 |
| 独特观点 | MCP 不解决认证和授权 | 工具是 Data/Action/Orchestration 三类 | 单 Agent 起步,按需升级 | ReWOO “开历史倒车” |
| 对 ReAct 态度 | 工具调用基础 | 编排循环默认模式 | 推荐基础但提示可加速 | 视为核心范式,其他模式是替代 |
| 对 MCP 态度 | 详细解释三大原语 | 未直接提及 | 未直接提及 | 未直接提及 |
最有趣的分歧:
- WorkBuddy 把 Skill 当成与 Tool 并列的形态,而 OpenAI 指南里 Skill 这个概念几乎不存在(更强调”Agent as Tool”)
- 架构对比文和设计模式文都认为 ReWOO 牺牲反馈换效率得不偿失,而 LLM Compiler 论文(DAG 并行)则被认为 3.6x 提速有效
- WorkBuddy 强调 MCP 解决”接入”但解决不了”安全”,OpenAI 则更强调用 Tool safeguards 解决安全
五、对你(产品/工程师)的行动建议
如果你正在做 Agent 产品
- 先盘点工具清单,按”用户意图”重新组织——把”创建 Issue 的 4 个底层接口”合并成 1 个
create_issue,按 action 区分。 - 每个工具写好”工具描述三要素”——何时调、参数怎么填、结果怎么用。没有这三件事的工具不要上线。
- 给所有工具打风险等级——访问类型、可逆性、权限、财务影响。高风险工具强制走人工审批。
- 设置 max_iterations 和 timeout——这两个不设迟早出事。
- ReAct 是默认起点——除非有明确证据说明效率不够,否则不要上 Plan-Execute 或 LATS。
如果你正在选架构
┌─ 简单任务 ─────────→ ReAct(默认) 起步 ────┤ └─ 简单但要加速 ─→ Plan & Execute / LLM Compiler
┌─ 工具爆炸 ────→ 工具分组 + Tool Retrieval 进阶 ────┤ └─ 跨领域 ──────→ 多 Agent(慎重评估)
┌─ 写文章等无外部反馈 ─→ Basic Reflection 反思 ────┤ └─ 需跨试验学习 ─→ Reflexion如果你正在做平台
- 外部系统接入优先上 MCP——一次接入,标准化复用。
- 但不要指望 MCP 解决安全——MCP 之上还要叠自己的鉴权和审批。
- Skill / Plugin 是分发单位——Tool 是原子能力,Skill 是流程,Plugin 是打包。
六、一句话总结
工具调用不是”写个 function_call 就行”——它是一个四层体系:协议层(Function Call / MCP)解决”怎么动”,形态层(Tool / Skill / Plugin)解决”按什么形式组织”,模式层(ReAct / Plan-Execute)解决”在循环中怎么决策”,防护层(Guardrails / 风险分级)解决”动到什么程度要停下来”。
ReAct 的 Observation 是不可替代的核心范式,其他模式是它的变体或替代。 工具爆炸是真实挑战,但答案不是堆多 Agent,而是渐进式加载 + 路由分发。模型决定 Agent 的上限,工具决定 Agent 的边界。
📚 参考资料
- 《从模型到 Harness:WorkBuddy 如何把 Agent 做成可用产品》—— 工具调用四层抽象、MCP 三原语、Skill/Plugin 形态选择
- OpenAI《A Practical Guide to Building Agents》—— 标准化工具定义、风险分级、Guardrails 层次化防御
- 《AI Agent 架构设计模式:ReAct vs Plan-and-Execute vs Multi-Agent 深度对比》—— 工具爆炸、架构升级路径、五种编排模式
- 《AI Agent 主流的设计模式(ReAct, Reflection, LATS)其实没有很复杂》—— 7 种模式工具调用机制对比、反思与验证
生成时间:2026-08-03 13<44主题>44主题>:Tool Use 工具调用覆盖文章:4 篇
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!













