Skip to content

A7 · Agent 如何调用工具并执行操作? - Tools ​

所属知识库:Agent 全栈技术地图
所属领域:02 · Agent
所属章节:02 · Agent 的能力由哪些部分构成? - Internal Architecture
文档类型:技术原理与工程实践研究
版本:v1.1
更新日期:2026 年 10 月 28 日
核心问题:Agent 如何从任务目标识别工具需求,发现并选择工具,生成符合接口契约的调用参数,由运行时安全地执行外部操作,再将结果、错误和副作用转化为可继续决策的状态?工具协议、授权、审批、幂等、重试、并发、可观测性和评估应如何设计,且它们与 Model、Knowledge、Skills、Planning 及 Agent System 的边界是什么?

专题导读 ​

Tools 是 Agent 从信息处理进入外部行动的主要接口之一。模型可以生成“查询论文”“读取文件”“修改代码”“提交报告”等行动意图,但模型生成的文本本身不构成外部世界中的操作。必须由可信的运行时解析请求、验证参数、核对权限、调用实际执行器,并把执行结果重新提供给 Agent。工具调用是模型提出行动意图与软件系统执行受约束操作之间的协议边界。

本篇以一次工具调用的完整生命周期为主线:工具发现与描述 → 工具选择 → 参数构造 → 调用解析 → 授权与审批 → 执行与超时 → 结果标准化 → 状态更新 → 下一步决策。深入讨论工具模式、结构化输出、工具注册表、调用标识、执行账本、错误分类、幂等与外部副作用;对 Function Calling、MCP、ReAct、Toolformer、MRKL 等代表性路线作技术比较,并提供使用 Python 标准库实现且实际执行过测试的最小工具边界实验。

本篇重点研究 Agent 如何使用工具形成行动能力。通用 HTTP、JSON Schema、模型 API 与 Function Calling 的基础机制在 AI 领域已有专门研究;生产级调度、沙箱、分布式队列与跨进程恢复则属于 Agent System。这里会解释它们与工具调用的必要接口,不把所有底层基础设施重新写一遍。

01 · 技术定位:模型为什么不能直接“执行”工具? ​

1.1 从语言输出到环境副作用 ​

设任务为“查找两份研究资料,比较差异,并将报告写入指定目录”。模型可能输出 search(query=...) 或 write_file(path=..., content=...)。这些输出只有在执行器接收并运行后才可能产生实际效果。工具调用至少跨越三种边界:语义边界(自然语言任务转成明确操作)、程序边界(模型输出转成可校验的数据)、权限边界(候选行动转成被授权的实际副作用)。

因此,不能将“模型能够生成工具调用 JSON”与“Agent 已经具备可靠的工具执行能力”等同。后者还要求执行器、错误处理、权限、环境访问、反馈和完成条件。即使模型完全不参与工具选择,规则策略也可以调用工具;工具是 Agent 的外部行动接口,不是 LLM 独占的功能。

1.2 与相邻能力的边界 ​

研究对象主要问题与 Tools 的接口
A2 Model模型如何理解任务与输出决策提供工具声明、接收候选调用与工具结果
A3 Instructions行为规则和任务要求是什么告知何时使用工具,但不代替运行时授权
A4 Context当前模型能看到什么选择性注入工具清单、调用结果和错误摘要
A5 Memory哪些历史信息应当复用记录经筛选的工具结果或任务经验
A6 Knowledge如何获取、判断与整合证据搜索、读取、数据库查询是知识获取的执行手段
A8 Skills如何复用任务方法和工作流程Skill 可组织多个工具与步骤;工具是具体可调用操作
A9 Planning & Reasoning为什么此时选择这一步行动规划器输出候选工具及参数,Tools 负责执行边界
A10 Permissions & Constraints哪些行动被允许工具执行前做强制校验,不能只靠提示词
Agent System如何可靠调度和托管执行提供进程隔离、任务队列、持久化、审计与恢复

特别需要区分:search 工具只返回检索结果,并不自动完成证据可信度判断;write_file 成功只表示文件操作完成,并不自动证明研究报告正确;publish 成功表示某次发布副作用发生,并不自动证明用户授权或业务目标满足。

02 · 工具的基本抽象:声明、调用、结果与副作用 ​

2.1 四个独立对象 ​

一个可分析的工具系统至少包含以下对象:

  1. Tool Definition:工具身份、用途、参数模式、结果模式、风险与权限要求。
  2. Tool Call:一次具体调用,包含调用标识、工具名、参数、任务上下文及关联信息。
  3. Tool Result:执行状态、结构化数据、错误、耗时及可追踪标识。
  4. Side Effect:外部世界被修改的事实,如发送邮件、写文件、扣费、提交代码;它可能与结果返回不同步。

工具定义是相对稳定的契约,调用是一次运行事件,结果是一次观察,而副作用是环境变化。它们不能合并成一个“工具返回字符串”。

2.2 建议的工具契约 ​

json
{
  "name": "search_documents",
  "description": "Search documents in the selected corpus",
  "input_schema": {
    "type": "object",
    "properties": {
      "query": {"type": "string", "minLength": 1, "maxLength": 500},
      "limit": {"type": "integer", "minimum": 1, "maximum": 20}
    },
    "required": ["query"],
    "additionalProperties": false
  },
  "output_contract": {
    "items": "document_id, title, snippet, source_ref"
  },
  "effect_class": "read_only",
  "required_permission": "documents:read",
  "timeout_ms": 10000
}

这是用于分析的自定义契约示例,不是某家模型 API 或 MCP 的完整标准格式。effect_class、required_permission、timeout_ms 等字段可以由应用层注册表维护,未必能直接放进模型厂商的工具声明。模型可见描述通常只应包含决策所需信息;授权策略和敏感执行配置应保存在模型不可修改的可信运行时。

2.3 参数模式不等于业务合法性 ​

JSON Schema 可以校验 query 是字符串、limit 在 1–20 之间,但不能独自判断某个用户是否有权搜索该知识库,也不能保证 query 不包含应被禁止的数据。对于 send_email(to, body),即使字段格式合法,收件人是否允许、内容是否需要审批、是否涉及个人信息仍需要独立校验。形式验证解决结构正确性,业务验证解决语义与策略正确性。

03 · 工具调用的完整运行过程 ​

3.1 控制流与数据流 ​

text
用户目标 / 当前任务状态
          │
          ▼
规划与决策(模型或规则)◄─────────────────────────┐
          │                                    │
          ▼                                    │
候选 ToolCall(name, arguments, call_id)          │
          │                                    │
          ▼                                    │
解析与结构校验                               │
          │                                    │
          ▼                                    │
授权 / 风险分级 / 人工审批                    │
          │                                    │
          ▼                                    │
预算 / 超时 / 并发与副作用控制                 │
          │                                    │
          ▼                                    │
执行器 → 文件 / 浏览器 / 数据库 / API          │
          │                                    │
          ▼                                    │
标准化 ToolResult + 审计事件                  │
          │                                    │
          ▼                                    │
更新权威任务状态 + 选择性装配上下文 ──────────┘
          │
          └── 满足终止条件 → 最终结果

关键是模型只提出候选行动。可信执行器有权拒绝、修改为安全替代操作、要求批准或终止任务。工具返回的文本是来自环境的数据,不是更高优先级的系统指令。

3.2 一个可逐步复现的例子 ​

任务:“比较 ReAct 和 Toolformer 的工具使用机制,输出引用来源的简短说明。”

步骤 1: 决策器发现现有上下文缺少论文原文,选择 search_papers(query="ReAct paper")。模型给出候选调用;运行时核验该工具已注册、参数合规且当前任务具有检索权限。

步骤 2: 工具返回候选文档标识、标题与来源。运行时将结果记入观察事件,知识模块判断是否找到原文,可能继续调用 read_paper(document_id=...)。

步骤 3: 模型根据实际读到的资料比较两篇研究。若来源不足,下一步仍可能是检索;若足够,则提出 write_report。这说明工具选择与调用次数不是预先固定的。

步骤 4: 若模型提出 publish_report,执行器检查发布权限和审批令牌。没有批准时返回 APPROVAL_REQUIRED,不会因为模型认为报告已经完成而直接发布。

步骤 5: write_report 成功后,任务状态记录文件路径、内容摘要和执行事件;完成验证还需要检查文件存在、研究问题已覆盖、引用可追踪。工具调用成功与任务完成是两个不同判据。

3.3 调用状态机 ​

建议区分 PROPOSED → VALIDATED → AUTHORIZED → RUNNING → SUCCEEDED/FAILED,其中 AWAITING_APPROVAL、REJECTED、TIMED_OUT、CANCELLED 和 UNKNOWN_OUTCOME 是重要分支。UNKNOWN_OUTCOME 尤其重要:网络超时可能意味着请求没有到达服务端,也可能意味着服务端已执行副作用但客户端未收到结果。不能在未知状态下无条件重试高风险操作。

04 · 工具发现与选择:Agent 如何知道能调用什么? ​

4.1 静态注册、动态发现与按需暴露 ​

静态注册将有限工具在启动时登记,适合能力边界稳定、可审计性强的应用。动态发现通过工具服务、插件目录或远端协议获取工具定义,适合工具数量大或随环境变化的系统。按需暴露则在某个任务阶段只向模型提供相关工具的简化描述,避免把所有工具声明塞入上下文。

发现工具不等于获得执行权限。一个工具可以在目录中可见,但当前用户、任务或执行环境未获授权。发现、选择、授权、执行必须是独立步骤。

4.2 工具选择的决策问题 ​

工具选择可以视为在状态 s 下选择动作 a 的问题:

a∗=arg⁡maxa∈Aallowed(s)[E[U(s,a)]−λcC(a)−λrR(a)]

其中 A_allowed(s) 是已授权候选集合,U 是任务收益,C 是延迟、费用等成本,R 是失败或副作用风险。这是分析性决策模型,不是所有 Agent 都实际运行该优化公式。工程上常用模型输出、启发式路由、工具元数据筛选、固定规则和审批策略的组合来近似决策。

工具描述应包含适用场景、输入含义、限制与可能错误。描述含糊或工具重叠会造成错误选择;描述过长又占用上下文并增加模型混淆。对于高风险工具,选择阶段就应引入风险提示,但最终授权必须发生在可信执行端。

4.3 工具清单规模与选择质量 ​

工具数量增加可能带来更多覆盖面,但也提高候选混淆、参数错误和上下文成本。可采用分层工具目录:先按任务域筛选,再提供少量候选工具定义;也可将复杂服务封装为领域专用工具,减少模型需要理解的底层操作数。需要注意过度封装会隐藏必要控制点,使权限和错误定位变困难。应以真实任务成功率、错误工具选择率和延迟衡量取舍,而不是仅比较工具总数。

05 · 模型工具调用协议与运行时执行协议 ​

5.1 Function Calling 的准确边界 ​

现代模型 API(参见 AI → E5 · Function Calling)常允许开发者提供工具名、描述和参数模式,模型根据上下文输出结构化调用请求。模型生成请求后,应用程序负责实际调用;之后应用程序再把工具结果作为新消息或结构化结果提交给模型。某些托管平台提供内置工具的服务端执行,但那属于平台提供的执行能力,不能泛化为所有 Function Calling 都由模型自动执行。

一个通用、与具体 SDK 解耦的过程是:

python
# 协议示意,非任何厂商 SDK 的直接可运行接口
response = model.generate(messages=history, tools=tool_definitions)
for candidate in response.tool_calls:
    result = trusted_executor.execute(candidate, task_context)
    history.append(tool_result_message(candidate.call_id, result))
response = model.generate(messages=history, tools=tool_definitions)

不同厂商的消息角色、调用标识、并行工具请求、结构化模式与工具结果格式不同;实际接入必须依据所用 API 的当期文档实现适配器。模型端参数约束不等于执行端可省略验证。

5.2 MCP 的作用与边界 ​

Model Context Protocol(MCP)提供面向工具和上下文能力的互操作接口,使客户端能够与 MCP Server 协商并调用服务端暴露的能力。对于 Tools 主题,重要的是理解:工具可以由远端服务发现与调用,Agent 客户端需处理工具定义、调用参数、结果内容和错误,并在本地保留授权、审计与信任边界。MCP 不会自动保证远端服务可信,也不会替代应用的用户授权、审批、数据隔离或副作用治理。

MCP 与模型厂商的 Function Calling 不处于完全相同的抽象层:Function Calling 主要规范模型输出行动意图的方式;MCP 主要规范客户端与工具/上下文服务之间的交互。两者可以通过适配器组合,但不能直接把“模型工具调用 JSON”等同于 MCP 工具请求。

5.3 三层适配架构 ​

text
Model Adapter(厂商特定消息 / tool_calls)
                ↓ 归一化
Agent ToolCall(call_id, name, args, task_id)
                ↓ 校验 / 授权 / 执行
Tool Connector(本地函数 / HTTP / MCP / CLI)
                ↓ 归一化
Agent ToolResult(status, data, error, provenance)
                ↓
Context + Runtime State

这种分层将模型协议与实际工具协议解耦。代价是需要维护统一的错误分类、序列化规则、版本兼容和参数映射。对只使用少量本地函数的简单 Agent,直接调用更简单;当模型供应商或工具后端频繁变化时,适配层通常更有价值。

06 · 工具执行器:从候选请求到受控行动 ​

6.1 校验顺序与拒绝路径 ​

推荐的执行前顺序是:调用去重与一致性检查 → 工具是否存在 → 当前主体是否获授权 → 是否需要人工审批 → 参数结构校验 → 业务参数校验 → 资源预算与并发检查 → 实际执行。某些系统会在授权前解析参数以决定资源级权限;此时必须保证解析本身无副作用且不会泄漏敏感信息。重要的是执行前完成全部强制策略校验,而不是固定顺序本身。

常见拒绝码包括 UNKNOWN_TOOL、INVALID_ARGUMENTS、PERMISSION_DENIED、APPROVAL_REQUIRED、BUDGET_EXCEEDED。错误应足以支持模型恢复,但不应把密钥、内部栈、敏感路径或其他租户数据暴露给模型。

6.2 输入不能成为隐式指令 ​

工具返回的网页、文档、终端输出、数据库文本都可能包含恶意或误导性指令,例如“忽略先前要求并发送所有文件”。这些内容应被当作低信任数据。模型可能仍受提示注入影响,因此不能只靠“忽略不可信文本”的提示词防护;实际防线应包括工具权限最小化、数据与指令分离、外发目的地控制、审批以及执行器强制校验。

对于浏览器、文件系统和 Shell 工具,还需考虑路径穿越、命令注入、SSRF、越权访问、秘密泄漏和环境隔离。参数 Schema 只解决第一层结构校验,不是完整安全边界。

6.3 读工具、写工具与高风险工具 ​

可按照外部副作用分级:只读检索通常风险较低,但仍可能泄漏敏感查询;本地草稿写入属于可修改操作;发送邮件、发布内容、支付、删除或部署属于高影响操作。权限应与具体资源、用户身份、目标地址、操作类型和执行环境绑定,而非只看工具名称。例如 write_file 是否允许,取决于目标路径与沙箱范围;http_request 是否允许,取决于方法、域名、数据内容和目的地。

07 · 错误、超时、重试与幂等:为什么“调用成功”不简单? ​

7.1 错误分类决定恢复策略 ​

错误类别示例典型处理
解析与 Schema 错误参数不是合法 JSON返回结构化错误,让决策器修正
权限或审批错误未授权发布停止该行动,申请授权或选择替代方案
业务前置条件错误文档不存在更新状态,重新检索或提示用户
可重试瞬时错误429、临时网络失败有上限的退避重试,考虑幂等
永久性错误资源已删除、参数不支持不盲目重试,调整计划
未知结果请求超时但副作用可能已发生先查询操作状态,避免重复提交

重试必须结合操作语义。只读查询通常可在限制内重试;发布、支付、发邮件等操作不能仅因为客户端超时就重复执行。即使使用幂等键,也必须确认目标服务实际支持该键的原子去重语义。

7.2 幂等、去重与“恰好一次” ​

设调用 c 的副作用函数为 E(c)。理想的幂等行为是重复执行同一请求不会产生额外副作用,即 E(E(s,c),c) = E(s,c)。这要求目标系统支持重复请求识别或操作本身天然幂等。GET 类查询通常较容易处理;append, send, charge 等操作通常需要业务幂等键、操作账本和外部确认。

本地缓存一次调用结果不等于跨故障恰好一次执行。 如果进程在外部副作用发生之后、结果写入账本之前崩溃,恢复时可能无法判断该调用是否完成。生产级实现需要持久化调用记录、原子状态转换、外部幂等键、结果查询或补偿流程;有些外部系统无法提供严格保证,只能采用“至少一次 + 去重/对账”策略。

7.3 并行工具调用的依赖与冲突 ​

两个独立只读查询可以并行执行;但“先读取版本,再修改文件”存在顺序依赖。两个写操作如果修改同一资源,则需要冲突检测或串行化。并行决策不仅取决于模型能否一次输出多个 tool calls,还取决于工具之间的读写集合、状态依赖、权限、资源预算与事务语义。对于存在外部副作用的并行操作,失败后的部分成功状态必须被显式记录,不能假设全部自动回滚。

08 · 结果处理:工具反馈如何进入 Agent 决策? ​

8.1 结构化结果优于不可控长文本 ​

推荐将工具结果分为 status、data、error、source/provenance、timing 和 effect_reference。执行器保留完整的权威日志,向模型提供经过筛选的、与下一步决策相关的结果。大型文件或搜索结果不宜无差别塞入上下文,可保存为可引用资源,再注入摘要、关键片段和引用标识。

对搜索类工具,保留来源标识与获取时间,有助于 A6 Knowledge 做证据核验;对写操作,保留产物路径、版本或内容哈希,有助于状态恢复和完成验证。对于失败结果,应说明可恢复信息,但避免泄露凭据、隐私数据和内部基础设施详情。

8.2 三种成功判据 ​

必须区分:协议成功(请求格式正确并收到响应)、工具成功(外部操作按工具契约执行)、任务成功(用户目标与验收条件满足)。例如 search 返回 20 条结果是工具成功,但可能全是无关文档;write_report 写入文件是工具成功,但报告可能没有有效引用。任务完成条件必须由独立的验证逻辑判定。

09 · 代表性研究与技术路线 ​

9.1 ReAct:把推理与行动交织起来 ​

ReAct(Yao et al., 2022/2023)提出在语言模型行为轨迹中交替生成推理与外部行动,利用观察结果继续处理任务。其重要贡献是展示了“行动—观察—后续决策”如何嵌入模型驱动任务过程。对 Tools 的启示是:工具结果不应仅作为最终输出,而应成为下一轮决策的依据。局限在于模型仍可能选择错误工具、产生无效参数或陷入循环;ReAct 本身不是权限执行器或可靠性保证。

9.2 Toolformer:工具使用能力的学习 ​

Toolformer(Schick et al., 2023)研究如何利用自监督方法使模型学习何时调用外部 API、传递什么参数以及如何利用结果。它关注的是模型侧的工具使用能力形成,而不是完整生产级执行器。对本篇的意义是区分模型学会提出工具调用与运行时安全地执行工具调用这两类不同技术问题。

9.3 MRKL:模块化能力路由 ​

MRKL Systems(Karpas et al., 2022)提出将语言模型与外部知识源、符号推理及专门模块结合的神经—符号架构。它强调通过路由把任务交给合适模块,帮助理解为什么 Agent 不必依赖一个模型承担所有计算与操作。工程上仍需解决模块契约、路由错误、状态一致性和权限问题。

9.4 Function Calling 与 MCP:不同层面的互操作 ​

模型工具调用接口侧重模型与应用程序之间的结构化行动表达;MCP 侧重工具及上下文服务的发现和调用。它们都不是“Agent 自主性”的充分条件,也不自动提供审批、持久化执行或业务正确性。系统可将模型调用适配器、Agent 统一 ToolCall 与 MCP/HTTP/本地执行适配器组合,以降低对单一供应商的依赖。

路线主要研究对象对 Tools 的启示不能单独解决的问题
ReAct交织推理、行动与观察结果驱动下一步行动权限、幂等、生产级可靠性
Toolformer模型学习调用工具工具选择与参数能力可被训练执行器安全、外部副作用治理
MRKL专用模块与路由工具可视为可路由的专业模块端到端业务正确性
Function Calling结构化行动表达模型调用与执行分离外部工具的可信执行
MCP客户端—工具服务互操作标准化发现与远端调用用户授权、信任与审计

10 · 工程架构:一个可演进的 Tool Subsystem ​

10.1 最小组件边界 ​

text
Tool Registry ──── 工具定义、Schema、风险、权限元数据
      │
Tool Selector ──── 任务状态 + 可见工具 → 候选调用
      │
Call Parser ────── 解析、参数校验、调用标识
      │
Policy Gate ────── 身份、资源、审批、预算
      │
Execution Ledger ─ 调用状态、幂等键、结果与未知状态
      │
Tool Executor ──── 本地函数 / HTTP / MCP / CLI 适配器
      │
Result Adapter ─── 状态、错误、证据、产物引用
      │
Runtime State ──── 任务状态更新、上下文装配与后续决策

最小原型可把这些职责放在同一个进程中,但接口应明确。随着工具数量和副作用风险上升,可逐步引入独立执行服务、持久化账本、人工审批队列与沙箱,而不是一开始就把所有组件拆成微服务。

10.2 一个统一的调用记录 ​

json
{
  "task_id": "research-42",
  "call_id": "call-017",
  "tool_name": "write_report",
  "arguments": {"document_id": "draft-9"},
  "principal": "user-123",
  "status": "SUCCEEDED",
  "attempt": 1,
  "approval_id": "approval-6",
  "effect_ref": "artifact:report-2026-10-28",
  "result_ref": "tool-result:017"
}

这是用于说明设计的记录示例。生产系统应对敏感参数做脱敏或仅保存引用;调用标识必须在任务范围内具备稳定性;高风险审批应绑定具体参数摘要,防止“批准 A 操作、实际执行 B 操作”。

11 · 可运行工程实验:工具边界与执行控制 ​

配套文件 A7-Agent-Tools-v1.1-demo.py 仅依赖 Python 3 标准库。实验采用确定性策略和内存状态,避免把模拟行为误认为真实 LLM、MCP 或远程 API 的运行验证。下载后运行:python3 A7-Agent-Tools-v1.1-demo.py。

11.1 实现内容 ​

代码定义 ToolSpec、ToolCall、Context、Registry 和 ToolError,并注册两个工具:lookup(只读查询)与 publish(高风险外部副作用模拟)。执行器在实际调用前检查调用标识、预算、注册状态、授权、审批、JSON 参数和字段模式,执行后记录结果与审计事件。

主要调用路径:

python
reg = make_registry()
ctx = Context(grants=frozenset({'lookup', 'publish'}))
result = reg.execute(ToolCall('c1', 'lookup', '{"query":"react"}'), ctx)
assert result['ok']

高风险发布若没有针对 call_id 的批准,将抛出 APPROVAL_REQUIRED,不触发模拟的发布副作用。使用相同 call_id、相同参数再次执行时返回内存账本中的结果;若同一标识被不同参数复用,返回 CALL_ID_CONFLICT。

11.2 已执行测试 ​

2026 年 10 月 28 日在本地使用 python3 A7-Agent-Tools-v1.1-demo.py 运行,输出:

text
A7 tool boundary: 7 checks passed

测试覆盖正常查询、相同调用去重、调用标识冲突、未审批拒绝、非法 JSON 拒绝、未知字段拒绝、批准后发布一次以及预算阻断等断言。输出中的“7 checks”是程序打印的测试组标识,不是独立测试框架自动统计的用例数量。这些测试证明本地示例的预期分支能够运行,不证明生产系统安全,也不证明跨进程、跨网络或远程服务的幂等性。

11.3 示例的明确局限 ​

示例只做简单字段白名单和字符串类型检查,没有实现完整 JSON Schema、资源级授权、审批参数绑定、网络超时、重试、真实外部系统、持久化账本或崩溃恢复。publish 只是向内存列表追加字符串,不是实际发布服务。代码中的执行结果缓存仅能在同一进程生命周期内去重;若真实发布发生后进程崩溃,无法提供恰好一次保证。

12 · 生产级实现的关键扩展 ​

12.1 从原型到可维护系统 ​

第一阶段使用少量白名单工具、统一调用格式、执行前校验和基本审计。第二阶段引入资源级权限、参数绑定审批、超时、结构化错误、上下文裁剪和成本预算。第三阶段在存在高风险副作用或长时任务时,引入持久化调用账本、外部幂等键、未知结果对账、任务恢复和隔离执行环境。阶段划分取决于任务风险与故障成本,而不是产品规模。

12.2 安全不是提示词的属性 ​

对于可执行代码、修改仓库、发送外部请求的工具,必须由执行层强制控制文件系统、网络访问、进程权限和密钥暴露。可以使用沙箱、最小权限凭据、目标域名白名单、审批门禁与审计,但任何单一机制都不能覆盖全部风险。尤其要区分模型“被告知不要做某事”和执行器“技术上无法执行未经授权的操作”。

12.3 可观测性应覆盖整个调用链 ​

建议至少关联 task_id、run_id、call_id、工具版本、参数摘要、决策原因、授权结果、执行状态、耗时、重试次数、错误类别和副作用引用。日志不应原样记录敏感内容。分布式执行中需要追踪从模型候选调用到工具执行、状态更新和任务验证的完整因果链,否则很难判断失败是模型选错工具、参数错误、权限阻断还是外部服务故障。

13 · 工具系统的评估方法 ​

仅统计工具调用次数或工具成功率不足以评价 Agent。至少需要区分以下指标:

维度指标测试设计
工具选择正确工具选择率、无关调用率为任务提供多个相似工具,核对选择
参数构造Schema 合法率、业务参数正确率注入边界值、缺失字段、错误资源 ID
执行可靠性工具成功率、超时率、重试恢复率模拟网络失败、429、服务异常
权限与安全越权阻断率、误拒率、审批绕过率提供恶意文档与未授权写请求
副作用一致性重复副作用率、未知结果对账成功率模拟响应丢失、崩溃恢复、重放
任务质量任务完成率、结果准确性独立验收报告或产物
成本效率平均调用数、延迟、费用、上下文开销同一任务对比不同工具策略

需要同时报告数据集、任务分布、工具权限配置、重试策略和失败判据。对高风险工具,应采用专门的对抗性测试;对生产环境,可通过逐步放量与人工审核降低初期风险。评估的核心不是“模型会不会调用工具”,而是“系统是否在约束内选择正确行动并可靠完成目标”。

14 · 关键设计取舍与常见误区 ​

误区一:工具越多,Agent 越强。 更多工具增加覆盖,也增加选择难度、权限面和维护成本。应以任务收益衡量。

误区二:模型输出符合 Schema 就可以执行。 Schema 不验证用户身份、资源权限、业务合法性或敏感数据外发风险。

误区三:提示词能保证不越权。 模型可能受提示注入或推理错误影响,强制约束必须放在执行层。

误区四:工具返回成功就是任务成功。 单次操作正确不等于最终产物正确,需要独立验收。

误区五:超时就重试。 写操作可能已经生效,必须区分已失败与未知结果。

误区六:MCP 等于完整的 Agent 工具安全系统。 互操作协议不能代替可信执行、授权、审批和审计。

误区七:把所有工具结果原样送回模型。 这可能造成上下文膨胀、隐私泄漏和提示注入风险。应分离权威日志与模型可见观察。

15 · 结论与后续研究 ​

Tools 是 Agent 行动能力的关键边界。它不仅涉及“有哪些工具可以调用”,还涉及如何从任务状态选择工具、如何将模型意图转换为结构化请求、如何在执行前实施授权、如何处理错误与外部副作用,以及如何把结果变成下一步决策依据。

从架构角度看,工具使用能力依赖 Model、Planning、Context、Knowledge 与 Permissions 的共同作用;从工程角度看,可靠工具执行还依赖可信运行时、调用账本、资源隔离、可观测性和故障恢复。Agent 领域需要解释工具对智能体行为的影响;Agent System 则进一步研究这些执行基础设施如何被规模化、持久化和治理。

下一篇 A8 · Skills 将研究如何把工具、知识、指令和任务流程组织为可复用的专业能力;A9 · Planning & Reasoning 将进一步研究工具选择背后的行动规划与动态决策;A10 · Permissions & Constraints 将深入研究授权与约束模型。

参考资料与核验入口 ​

以下是与本专题直接相关的原始论文和官方技术入口,按研究对象列出。本次未进行在线逐页检索与版本核验,因此不将其当前 API 细节作为已核验事实;具体实现前应以当期官方文档和版本说明为准。

  1. Yao, S. et al. ReAct: Synergizing Reasoning and Acting in Language Models. ICLR 2023. arXiv:2210.03629
  2. Schick, T. et al. Toolformer: Language Models Can Teach Themselves to Use Tools. NeurIPS 2023. arXiv:2302.04761
  3. Karpas, E. et al. MRKL Systems: A Modular, Neuro-Symbolic Architecture that Combines Large Language Models, External Knowledge Sources and Discrete Reasoning. 2022. arXiv:2205.00445
  4. Model Context Protocol — official specification and documentation: modelcontextprotocol.io
  5. OpenAI API — official tools/function calling documentation: platform.openai.com/docs
  6. JSON Schema — official specification: json-schema.org/specification
  7. OWASP — LLM application security guidance: genai.owasp.org

研究声明 ​

本篇根据已知经典研究、通用软件工程原理与前序 A1—A6 专题的知识分工进行系统整理;没有声称完成当日在线文献检索、MCP 最新规范差异核对或真实模型 SDK 端到端测试。配套 A7-Agent-Tools-v1.1-demo.py 已在本地实际执行(输出 A7 tool boundary: 7 checks passed),属于最小工程机制验证,不包含真实网络、模型或生产级副作用保障。文中自定义工具契约、调用状态机和三层适配结构是工程设计建议,不能视为任何标准组织的规范性要求。