知识全景图/ 软件工程与系统/ 人工智能全景图/ Tool Calling 与 Agent 执行协议

Tool Calling、函数调用与 Agent 执行协议底层图谱

从模型输出“我想调用工具”,到运行时安全、可恢复、可审计地执行动作:理解 Agent 工程的协议层

阅读定位: 这一页专门讨论模型意图如何被翻译成可执行动作,以及这个过程中必须出现的协议、状态、权限、失败恢复和审计边界。 它连接 Prompt / 上下文Agent 系统模型服务 / 网关LLMOps权限 / 数据边界AI 安全,重点不在“模型会不会用工具”,而在“系统该怎样允许它用工具”。工具事故排障时,继续接 请求 TraceAI 证据包索引发布回滚
一、总图:从文本生成到受控执行
用户目标
Intent / Context
模型决策
Tool Choice
工具意图
Name / Args
协议校验
Schema / Policy
执行运行时
Route / State
观察结果
Observation
审计闭环
Trace / Human
阶段系统真正处理的对象关键问题工程边界
模型决策模型输出的工具名、参数草案、调用理由这是建议还是命令?模型只能提出意图,不能直接拥有执行权
协议校验Schema、类型、枚举、必填字段、权限策略参数是否可解析、合法、完整?校验失败应进入修复、重问或拒绝,不应硬执行
执行路由工具注册表、租户权限、环境、凭据、限流该由哪个工具、哪个账号、哪个环境执行?执行身份必须来自系统授权,而不是来自模型文本
状态推进任务状态机、步骤日志、检查点、重试计数这一步成功、失败、待确认还是可重试?长任务不能只靠对话历史隐式记状态
结果回灌工具返回、错误码、结构化观察、脱敏结果模型下一步能看到什么?工具结果要最小暴露、可引用、可追踪
审计治理Trace、审批记录、风险标签、成本和责任边界事后能否还原为什么执行?没有审计的自治执行不适合进入生产

核心分界线

Tool Calling 不是“模型调用函数”,而是“模型生成一个可校验的调用意图,运行时决定是否、如何、由谁执行”。这条线一旦模糊,模型幻觉、提示注入、权限越界和副作用失控就会混在一起。

二、模型输出意图与可执行动作的边界
模型负责提出意图
  • 选择工具、生成参数、解释为什么需要调用
  • 可以根据观察结果继续规划下一步
  • 不应直接持有密钥、会话 Cookie 或数据库连接
运行时负责执行裁决
  • 根据策略判断工具是否可用、参数是否合法
  • 绑定真实执行身份、权限、环境和超时限制
  • 记录每一步输入、输出、审批和失败原因
人类负责高风险授权
  • 删除、付款、发信、发版、授权、数据写入等需要确认门
  • 确认界面应展示动作摘要、影响范围和可回滚性
  • 人类批准的是具体动作,不是抽象“继续执行”
对象可以由模型生成吗?必须由系统决定吗?原因
工具名可以建议必须从注册表匹配防止模型编造不存在或越权工具
参数值可以生成必须校验和规范化自然语言生成容易漏字段、类型漂移或注入 payload
执行凭据不应该必须凭据属于运行时和权限系统,不属于上下文文本
是否高风险可以辅助判断必须按策略判定风险等级不能完全交给概率模型
是否提交写入可以提出必须由策略、状态机或人类确认副作用动作需要责任边界和审计链
三、Tool Schema:给模型看的接口,也是给系统看的合同
{ "name": "create_support_ticket", "description": "为已认证用户创建客服工单。只在用户明确要求提交时使用。", "parameters": { "type": "object", "additionalProperties": false, "required": ["user_id", "category", "summary", "priority"], "properties": { "user_id": { "type": "string", "description": "系统认证后的用户 ID,不从用户文本猜测" }, "category": { "type": "string", "enum": ["billing", "bug", "account", "other"] }, "summary": { "type": "string", "minLength": 8, "maxLength": 200 }, "priority": { "type": "string", "enum": ["low", "normal", "urgent"] }, "idempotency_key": { "type": "string", "description": "由运行时生成,用于避免重复创建" } } }, "risk": "write", "requires_confirmation": true }
Schema 元素作用常见坏味道更稳妥的做法
name工具唯一标识,供模型选择和运行时路由名字过泛,如 execute、do_task用动词 + 业务对象,如 search_docs、update_invoice_status
description告诉模型何时使用、何时不要使用只写功能,不写边界和禁用条件包含触发条件、风险提示、典型输入和反例
parameters约束参数结构、类型、枚举和必填项大量自由文本字段,缺少 enum 和范围把业务约束变成可校验字段,减少自然语言猜测
additionalProperties控制模型是否能塞入未知字段默认放开,导致隐藏注入和字段漂移生产写入工具通常关闭未知字段
risk metadata标记读、写、外发、执行、敏感等级风险只写在文档里,运行时不可读把风险作为工具注册表的一等字段
confirmation policy声明是否需要人工确认或二次校验靠模型自己判断要不要确认由策略引擎结合用户、工具、参数和环境决定

Schema 的双重角色

对模型来说,Schema 是“如何表达动作”的语言;对运行时来说,Schema 是“哪些动作允许被解析和执行”的合同。好的工具 Schema 会降低模型出错率,也会降低系统被注入和误调用的风险。

四、参数生成、结构化输出与解析边界
自然语言目标
工具选择
参数草案
结构校验
业务校验
执行计划
问题表现处理策略不要做什么
字段缺失缺少 user_id、date_range、target_id 等关键字段向用户澄清、从系统上下文补齐、或拒绝执行让模型凭空猜 ID、日期或权限对象
类型漂移数字变字符串、数组变文本、枚举值拼错Schema 强校验、规范化、有限自动修复直接把未校验参数传给 API
歧义参数“最近”“那个客户”“高优先级”没有确定对象引入解析层或让用户确认候选对象用第一个搜索结果当真实目标
Prompt 注入参数里夹带“忽略前面规则”“导出全部数据”字段级过滤、权限校验、工具结果隔离把外部文本当系统指令拼回上下文
结构化输出破损JSON 不闭合、混入解释文本、漏字段使用原生结构化输出、重试修复、降级到人工用脆弱正则从长文本里硬抠动作
五、工具路由:从工具清单到运行时能力图
路由维度它决定什么工程实践
任务类型搜索、读取、写入、代码执行、浏览器操作还是数据库查询按能力域拆工具组,避免一个万能工具承担所有动作
用户与租户用户能看什么、改什么、代表谁执行工具调用前做服务端权限校验,不信任模型声明
环境生产、沙箱、预览、只读副本、测试数据高风险动作先跑 dry-run 或预览环境
成本与延迟调用昂贵工具、外部 API 或长时间任务是否值得设置预算、超时、批量限制和降级路径
数据敏感级别返回结果是否脱敏、裁剪或禁止进入模型上下文把数据分类和脱敏放在工具包装层
风险策略是否需要确认、审批、双人复核或禁止自治策略引擎读取工具元数据、参数和会话风险
工具注册表
  • 保存 name、schema、description、risk、owner、version
  • 支持按产品、租户、角色、环境动态暴露工具
  • 避免把所有工具无差别塞进每次模型调用
工具包装层
  • 统一做鉴权、限流、日志、超时、脱敏、错误规范化
  • 让业务 API 不直接暴露给模型和 Agent 循环
  • 把“函数调用”升级成可治理的执行边界
能力裁剪
  • 根据当前任务只开放少量相关工具
  • 减少模型误选工具、上下文膨胀和攻击面
  • 工具越强,越需要按步骤动态解锁
六、Agent 执行状态机:不要把流程藏在对话历史里
Created
接收任务
Planning
计划/选工具
Ready
参数已校验
Waiting
确认/依赖
Running
执行中
Observing
结果回灌
Done / Failed
终态
状态进入条件允许动作退出条件
Planning用户目标和上下文已收集模型规划、工具候选、澄清问题生成可校验的下一步动作
Ready工具名存在、参数通过结构校验业务校验、风险打标、生成 dry-run通过策略,或进入确认 / 拒绝
Waiting需要人类确认、外部依赖或配额释放展示影响范围、收集批准、取消任务批准、拒绝、超时或转人工
Running执行权已授予调用工具、写检查点、更新进度成功、失败、超时或被取消
Observing工具返回结构化结果脱敏、摘要、决定下一步或结束进入下一轮 Planning,或进入终态
Failed不可恢复错误、策略拒绝、重试耗尽记录原因、补偿、转人工人工接管或新任务重开

状态机的价值

Agent 一旦涉及多步工具调用,就不再是“多轮聊天”。状态机能回答当前卡在哪里、是否能重试、是否能取消、是否需要补偿、是否还允许模型继续规划。

七、失败、重试、幂等性与补偿
7.1 失败类型地图
失败类型例子能否重试处理方式
模型输出失败工具选错、参数 JSON 破损、遗漏字段通常可以带错误信息重试、缩小工具集、要求澄清
校验失败枚举非法、对象不存在、权限不足视情况规范化、重新生成、让用户选择对象或拒绝
工具瞬时失败网络超时、429、外部服务 5xx可以指数退避、限次重试、Fallback、保留检查点
业务冲突库存变化、版本冲突、重复提交通常不可盲重试重新读取状态、比较版本、请求用户确认
副作用不确定请求超时但对方可能已经写入成功不能简单重试查询幂等键、对账、进入人工或补偿流程
策略拒绝越权、敏感数据、危险命令不应重试同一动作拒绝、解释边界、提供安全替代路径
7.2 幂等性不是锦上添花

幂等设计

  • 为写入动作生成 idempotency_key
  • 把“创建、付款、发信、下单”等动作设计成可查重
  • 工具返回应包含 request_id、resource_id 和最终状态
  • 重试前先确认上一次是否已经生效

非幂等风险

  • 重复发邮件、重复扣款、重复创建工单
  • 超时后整段 Agent 重新执行,造成多次副作用
  • 模型把“上一步没看到结果”误判成“上一步没执行”
  • 审计链无法判断哪一次调用造成真实影响
7.3 并发、事务与补偿
主题Agent 场景里的问题工程策略
并发多个 Agent 或用户同时修改同一对象乐观锁、版本号、资源锁、队列串行化
事务跨多个工具的动作无法天然原子提交Saga、阶段提交、预留 / 确认两段式、事务边界显式化
补偿前几步成功,后一步失败,系统处于半完成状态为每个副作用动作设计撤销、冲正、取消或人工处理路径
取消用户中途停止任务,但工具已在执行区分取消规划、取消排队、取消执行和执行后补偿
一致性模型上下文里的状态落后于真实系统写入后重新读取真实状态,再让模型继续判断
八、权限、确认与 Human-in-the-Loop
风险等级典型工具自治策略确认方式
只读低风险搜索文档、读取公开配置、查询个人待办可自动执行记录 trace 即可
只读敏感读取客户信息、财务数据、内部文档按权限和最小必要暴露可能需要理由、脱敏或审批
可回滚写入创建草稿、标记状态、生成工单可在规则范围内半自动提交前展示摘要和影响范围
外发动作发邮件、发消息、提交表单、公开发布默认需要确认用户确认接收方、正文、附件和发送身份
不可逆高风险付款、删除、权限变更、生产发版不应完全自治强确认、审批流、双人复核或禁止

确认点应该确认什么

好的确认不是弹一个“是否继续”。它应该展示工具名、目标对象、关键参数、预计副作用、失败后的恢复方式、执行身份和审计编号。人类需要批准的是一个具体、可理解、可追责的动作。

九、浏览器、代码与数据库工具的高风险边界
浏览器工具
  • 风险: 页面注入、隐藏按钮、登录态滥用、跨站外发、表单误提交
  • 边界: 限域名、限动作、提交前截图 / DOM 摘要确认
  • 关键: 浏览器观察结果是外部不可信内容,不能当系统指令
代码执行工具
  • 风险: 任意命令、文件泄露、网络外连、依赖投毒、资源耗尽
  • 边界: 沙箱、无默认网络、只读挂载、时间 / 内存限制
  • 关键: 代码输出也可能包含诱导模型越权的文本
数据库工具
  • 风险: 越权查询、全表扫描、敏感字段泄露、误更新 / 误删
  • 边界: 只读副本、参数化查询、行列级权限、查询预算
  • 关键: 写 SQL 的模型不应自动拥有生产数据库写权限
工具类型最小安全配置生产增强配置
浏览器域名白名单、禁自动提交、禁下载执行文件步骤截图、DOM diff、表单提交确认、敏感页面隔离
代码临时目录、资源限制、禁危险系统路径容器隔离、网络策略、依赖锁定、产物扫描
数据库只读账号、查询超时、结果行数限制语义层、字段脱敏、审批写入、审计查询计划
业务 API服务端鉴权、参数校验、限流dry-run、幂等键、风险评分、补偿动作
十、观测、审计与事故复盘
记录对象应该包含用来回答的问题
模型调用模型、prompt 版本、工具列表、temperature、token、延迟为什么模型选择了这个工具?成本和延迟在哪里?
工具意图tool_name、arguments、生成轮次、校验错误模型生成的动作是否符合协议?
策略裁决权限结果、风险等级、确认要求、拒绝原因系统为什么允许或拒绝执行?
执行结果request_id、idempotency_key、状态码、返回摘要、异常工具是否真的执行成功?是否可以重试?
人工介入审批人、审批时间、确认内容、修改参数哪个人批准了哪个具体动作?
状态变迁任务状态、检查点、重试次数、补偿记录长任务在哪里失败,能否恢复?
10.1 Tool Call 生命周期证据包
生命周期节点必留证据字段判断重点
意图生成tool_call_id、tool_name、arguments_raw、model_call_id、request_id、生成轮次模型只是提出动作,不等于获得执行权
参数校验tool_schema_id、schema_version、字段校验结果、normalized_args_hash、validation_error区分结构错误、业务错误、注入风险和歧义对象
权限裁决actor_id、tenant_id、policy_version、permission_decision_id、allow / deny、确认要求执行身份来自系统授权,不来自模型文本
审批确认approval_id、approver_id、approval_snapshot、risk_tier、human_gate_required人类批准的是哪个具体工具、目标对象、参数和副作用范围?
执行与重试execution_id、request_id、idempotency_key、attempt、状态码、超时 / 异常可重试必须依赖幂等键和真实状态查询
回滚与补偿compensation_id、rollback_action_id、补偿结果、人工接管记录、最终资源状态副作用不确定时先对账,再决定重试、补偿或转人工
Trace 串联trace_id、父子 span、cost_ms、latency_ms、返回摘要、redaction_status事后能还原为什么选它、谁允许、做了什么、如何恢复
回归闭环incident_id、eval_case_id、regression_slice、release_gate_id、fixed_tool_version坏例是否进入工具选择、参数校验、权限、幂等和补偿回归集?
10.2 工具事故回放:从副作用回到执行协议
事故现象先查证据常见根因沉淀动作
重复提交、重复扣款或重复发信idempotency_key、execution_id、attempt、result_status、最终资源状态超时后盲重试,或 Agent 重新执行整段计划但没有查重补幂等键和对账查询,把重复副作用样本加入 regression_slice
模型调用了不该可见的工具tool_schema_id、tool_visibility、actor_id、tenant_id、permission_decision_id工具注册表全量暴露,或权限裁决只在模型提示词里表达按任务和角色动态裁剪工具,发布前跑工具可见性门禁
参数里夹带注入或越权对象arguments_raw、normalized_args_hash、validation_error、blocked_span自由文本参数太宽,外部内容被塞进可执行字段收紧 schema、字段级过滤、把注入样本加入工具安全评测
确认后执行对象和预览不一致approval_snapshot、normalized_args_hash、execution_id、resource_version确认后参数被模型或系统改写,或真实对象版本发生变化审批快照绑定参数哈希和资源版本,执行前做版本校验
多工具任务半完成trace_id、state_checkpoint_id、compensation_id、rollback_action_id跨工具流程缺事务边界和补偿动作,失败后只靠对话历史恢复把流程升级为状态机,补 Saga / compensation,并沉淀 runbook
工具返回文本诱导下一步越权tool_observation_id、redaction_status、source_untrusted_flag、next_tool_call_id工具 observation 没有低信任标记,被模型当成新指令工具返回分区、脱敏和降权,和指令层级证据包交叉回放

Trace 要能跨越模型和工具

只记录模型输入输出,只能解释“它说了什么”;只记录业务 API 日志,只能解释“系统做了什么”。Agent 审计必须把两者串起来,才能解释“为什么从这句话走到了这个外部动作”。

十一、从 Chat Completion 到 Agent Runtime
11.1 工程形态演进
形态核心接口适合任务缺口
单次 Chat Completionmessages → text问答、摘要、改写、分类没有执行协议,输出多为文本
结构化输出messages + schema → JSON抽取、路由、配置生成只解决格式,不解决动作权限和状态
Function / Tool Callingmessages + tools → tool_calls读取实时状态、调用业务 API需要外部运行时执行、校验、重试
Agent Loopplan → act → observe → replan多步任务、探索式操作、复杂工作流需要状态机、预算、终止条件和恢复
Agent Runtimetask + policy + tools + state + trace生产级任务执行需要平台化治理、审计和人类介入
11.2 Agent Runtime 最小组件
Tool Registry
  • 工具 schema、版本、owner、风险和权限元数据
  • 按任务动态选择可见工具,而不是全量暴露
Policy Engine
  • 决定是否允许、是否确认、是否脱敏、是否降级
  • 输入包括用户、租户、工具、参数、环境和风险
State Store
  • 保存任务状态、检查点、观察结果和重试位点
  • 让任务可暂停、恢复、取消、转人工
Executor
  • 执行受控工具,统一处理超时、错误、幂等和补偿
  • 把工具返回转换成模型可消费的 observation
Human Gate
  • 在高风险步骤展示动作预览、影响范围和确认选项
  • 记录审批人、审批内容和最终执行结果
Observability
  • 贯穿模型、工具、策略、状态、成本和质量的 Trace
  • 支持回归评测、事故复盘和治理策略迭代
十二、学习路线
1
路线一: AI 应用工程师的工具调用路线
适合: 已会接模型 API,想把工具调用做稳定的人
结构化输出
Tool Schema
参数校验
权限确认
错误重试
周期: 2-4 个月
前置: LLM API、后端接口、JSON Schema 基础
输出: 能构建可校验、可确认、可观测的工具调用链路
关键: 把模型输出当意图,而不是当命令
2
路线二: Agent Runtime / 平台工程路线
适合: 平台、基础设施、AI 工程负责人
工具注册表
策略引擎
状态机
幂等 / 补偿
Trace / 审计
周期: 6-12 个月
前置: 后端、工作流、权限系统、可观测性基础
输出: 能建设组织级 Agent 执行与治理底座
关键: 用工程协议约束自治,而不是把风险交给提示词
十三、高频认知误区
误区: Tool Calling 就是让模型调 API
  • 模型只是生成调用意图,执行必须经过系统校验、权限和审计
  • 没有运行时治理的工具调用,本质上只是脆弱的自动化脚本
误区: Schema 写出来就安全了
  • Schema 只能约束结构,不能替代权限、业务规则和确认流程
  • 真正安全来自 schema + policy + runtime + audit
误区: 失败了重新跑一遍就好
  • 带副作用的动作不能盲目重试,否则可能重复写入或重复外发
  • 幂等键、状态查询和补偿流程是生产级基础设施
误区: Agent 越能操作越高级
  • 工具越强,越要最小权限、动态解锁和人工确认
  • 成熟 Agent 的标志不是自由,而是可控、可恢复、可追责
十四、2025-2026 趋势与展望
确定性趋势:

Tool Calling 会从 API 参数生成走向执行协议: 工具注册、策略、状态机、幂等、确认和审计会成为 Agent 平台的基础层。

结构化输出与工具协议继续合流: 模型输出会越来越像受 schema 约束的中间表示,而不是一段自由文本;特殊 token、chat template 和 JSON 边界可继续看 Tokenizer / 结构化输出边界

Human-in-the-Loop 会成为默认能力: 高风险动作将更常见地进入预览、确认、审批和接管流程。

值得关注:

跨工具事务与补偿: 多工具、多系统、多步骤 Agent 的真实难点会越来越像分布式工作流。

工具安全评测: 未来评测不只看回答质量,还会看模型是否误调工具、越权调用、重复执行和正确停止。

需要警惕:

把浏览器、代码和数据库工具过早交给自治 Agent: 这些工具的攻击面和副作用都很大,必须先有沙箱、权限和审计。

用 Prompt 代替权限系统: “请不要删除数据”不是权限控制,真正的边界必须在运行时实现。

Trace 缺失: 没有跨模型和工具的 Trace,Agent 一旦出错就很难定位责任和恢复现场。

回到 AI 主干:
总结:
Tool Calling 的本质不是把函数暴露给模型,而是建立一套从“意图生成”到“受控执行”的工程协议。模型负责提出动作,运行时负责校验、授权、路由、执行、记录和恢复。

给不同角色的建议:
- AI 应用工程师: 先把工具 schema、参数校验、错误重试和确认点做扎实,再增加自治步数
- 平台团队: 把工具注册表、策略引擎、状态机、幂等和 Trace 做成公共能力
- 技术负责人: 判断 Agent 是否可上线,不要只看 Demo 是否跑通,要看失败时能否恢复、越权时能否拦住、事故后能否复盘

一句话判断这张图的价值:
它回答的不是“模型能不能调用工具”,而是“一个 Agent Runtime 怎样把模型意图变成安全、稳定、可审计的真实动作”。如果要理解模型为什么选择这一步、怎样在多条路径之间搜索和回溯,继续看 搜索、规划与约束求解