← 返回题目列表

Agent 如何验证工具调用结果?

高频 中等 第 12 / 26 题 更新于 2026/09/17
AI Agent工具调用结果校验可信执行

简化版

工具返回成功不代表结果可直接使用。Agent 应分层验证:先检查传输和 Schema,再检查字段范围、业务不变量、来源与新鲜度,最后核对副作用是否真正提交;关键结论要能追溯到原始证据。验证失败时按错误类型重试、换源、澄清或转人工,不能让同一个模型仅凭“看起来合理”自我确认。

详细版

结果校验可分五层:协议层检查状态码、编码和完整性;结构层用 JSON Schema 校验类型与必填项;语义层检查金额非负、结束时间晚于开始时间等规则;证据层核对来源、权限、时间和引用;副作用层用业务 ID 查询真实状态。

raw response
 -> protocol valid?
 -> schema valid?
 -> business invariants hold?
 -> source authorized and fresh?
 -> side effect confirmed?
 -> normalized observation

校验器应是确定性代码、权威数据源或独立审核流程。模型可协助修复格式,却不能绕过业务规则。大结果做抽样时要明确覆盖范围,高风险结果必须全量或由服务端保证。记录验证规则版本、原始响应哈希和失败原因,便于回放与回归测试。

完整版教学

一、工具成功只说明完成了调用

HTTP 200 可能返回缺字段 JSON、过期缓存、空结果或业务错误页面;搜索工具能返回网页,不代表网页支持结论;付款接口响应超时,也不代表付款未发生。工具的“调用成功”和业务的“结果正确”是两层概念。

验证的目标是把不可信原始返回变成可以驱动下一动作的 Observation。每层验证失败都要有明确处置,不能把原始文本直接交给模型自由解释。

验证层主要问题典型验证器
协议是否完整收到且格式匹配HTTP 客户端、校验和
结构字段与类型是否合法JSON Schema
语义业务关系是否成立领域规则、计算程序
证据来源是否可信、授权且新鲜引用核对、权限过滤
副作用外部动作是否真实提交权威状态查询

记忆钩子:先证明结果“读得懂”,再证明“说得通”,最后证明“确实发生”。

二、协议层检查传输是否完整

协议层关注超时、状态码、Content-Type、编码、压缩、分页和截断。服务返回 HTML 登录页却标记 200 时,JSON 解析器应立即拒绝;分页只取第一页时,Observation 必须标注不完整。

还要检查响应大小和校验和。下载文件声明 20 MB,实际只收到 8 MB,即使连接正常关闭也不能当作完整产物。流式响应中途断开要保留已接收范围,但不得将半个 JSON 标为成功。

协议验证最好在工具适配层完成,不消耗模型 token。

三、Schema 只保证形状,不保证事实

JSON Schema 能检查必填字段、类型、枚举和格式。例如价格必须是数值、币种必须来自允许集合。但 price: 999999 仍可能通过 Schema,所以还需要语义规则。

{
  "type": "object",
  "required": ["amount", "currency"],
  "properties": {
    "amount": {"type": "number", "minimum": 0},
    "currency": {"enum": ["CNY", "USD"]}
  }
}

模型输出的“JSON 修复”只适合处理引号或逗号等语法问题。若必需字段不存在,修复模型不能凭空编一个金额,应返回缺失并重新查询。

四、业务不变量捕获语义错误

领域规则定义结果之间必须成立的关系:订单总额等于明细之和,结束时间晚于开始时间,退款不超过已付金额,库存扣减后不能为负。它们通常比模型判断更稳定、可审计。

假设三个明细为 120、80、50 元,返回总额 260 元;类型和范围都合法,但 120+80+50=250,不变量校验能发现 10 元差异。金融场景还要明确舍入规则与小数精度,避免浮点误差。

规则应版本化并记录命中项,因为业务政策会变。不能把旧规则失败简单解释为模型出错。

五、来源、权限和新鲜度同样属于正确性

一条价格可能数值真实,但来自两年前页面;一份文档内容准确,却属于另一个租户。验证要检查来源允许列表、检索时间、数据版本和访问主体,避免“内容正确但使用不合法”。

引用验证至少确认来源确实包含所述事实,而不仅是 URL 可访问。对于多个结论,应建立结论到证据片段的映射;一个笼统引用不能支持整篇回答。

外部网页属于不可信输入,其中的指令不得改变验证规则或工具权限。

六、副作用要向权威系统确认

对付款、发信、部署等动作,工具返回文本“成功”不是最终依据。应使用交易 ID、message ID 或 deployment ID 查询权威状态,并核对目标、参数和版本。

execute(idempotency_key=K) -> timeout
query_by_key(K) -> COMMITTED, transaction_id=T
verify(T.amount == requested_amount)

查询不到时状态是未知,而不是失败。系统进入对账或人工队列,避免重复执行。高风险动作最好由服务端在一个原子接口中执行并返回可验证收据。

七、大数据验证要说明覆盖率

一百万行数据逐行由模型检查既昂贵又不可靠。应把类型、范围、唯一性、行数和聚合校验下推到数据库或计算引擎;必要时分层抽样,并清楚说明抽样不能证明零错误。

若随机抽 1000 行没有发现错误,只能说明样本内零错误。若真实错误率为 0.1%,一次抽样完全没碰到错误的概率约为:

(1 - 0.001)^1000 ≈ 36.8%

因此高风险数据不能因抽样零错误就宣称全量正确,还需校验和、约束或全量程序验证。

八、失败处置和可观测性

语法失败可有限修复,字段缺失应重新查询,来源冲突可换权威源,业务不变量失败要停止副作用,权限问题直接拒绝。不同层级不能统一重试。

记录工具版本、规则版本、原始响应哈希、每层验证结果、修复次数和最终决策。指标包括 Schema 失败率、业务规则失败率、过期数据率、未知副作用数和误接受率。

回归集要包含“格式正确但事实错误”的对抗样例,因为只测坏 JSON 会高估验证能力。

九、常见误区与追问

  • 误区:JSON 能解析就说明工具结果有效。 解析只证明语法,不能证明业务语义和事实。
  • 误区:HTTP 200 一定代表业务成功。 登录页、部分结果和业务错误也可能返回 200。
  • 误区:让模型再审一遍就是独立验证。 同一模型可能重复同一假设,应使用规则或权威数据。
  • 误区:引用了网页就算有证据。 还要确认片段实际支持对应结论且没有过期。
  • 误区:抽样没问题就能宣布全量正确。 抽样有漏检概率,高风险数据需确定性约束。
  • 追问:格式修复可以自动做几次? 设置很小上限;缺失事实不能靠格式修复生成。
  • 追问:写操作超时怎样验证? 用幂等键查询权威状态,未知时停止并对账。
  • 追问:验证规则放在哪里? 靠近工具适配或领域服务,版本化管理,不只写在 Prompt。

十、加强记忆

工具结果验证记住“五层漏斗”:协议层确认完整可读,Schema 层确认结构,业务层检查不变量,证据层检查来源、权限与时效,副作用层向权威系统确认真实提交。模型可以协助理解和格式修复,却不能替代独立规则与真值查询;验证失败按层分类处置,并保留规则版本和原始证据供回放。