模型不直接执行
模型生成工具与参数候选。所有调用都应被视为不可信输入,先验证再进入执行器。
Tool proposal · State transition · Fault injection
把 tool call 从“格式像对了”推进到“最终状态真的对”。审计现有评分器,并用无密钥沙箱验证 Schema、幂等、重试、Saga、Outbox 与消费者去重。
01 / Conclusion
合法 JSON、Schema 合法、业务有效、事务完成和最终状态一致是五件事。模型最多先完成其中一部分;权限、幂等、提交、补偿和对账必须由应用编排层负责。
模型生成工具与参数候选。所有调用都应被视为不可信输入,先验证再进入执行器。
不能只看第一条。调用数量、集合、依赖、互斥、顺序与隐藏副作用都要进入评分。
订单存在、身份、权限、金额、时效、资源版本与确认状态都不是 JSON Schema 能证明的。
副作用可能已提交但响应丢失。重试必须复用稳定业务幂等键,并查询或回放原结果。
Saga 管补偿,Outbox 管状态与事件双写,消费者继续去重;失败状态必须可人工接管。
模型说“成功”不构成证据。工具端持久化状态、operation ID 与业务回执才决定结果。
02 / Correctness boundary
| 层级 | 能说明什么 | 不能说明什么 | 验证器 |
|---|---|---|---|
| 合法 JSON | 可以解析 | 字段齐全、类型与值正确 | JSON parser |
| Schema 合法 | 满足受支持结构 | 工具选对、值真实、有权限 | JSON Schema / strict |
| 业务有效 | 身份、权限、状态与规则通过 | 调用已提交且只执行一次 | 政策引擎、DB、乐观锁 |
| 事务完成 | 提交、重试、补偿可追踪 | 下游异步副作用已消费一次 | 账本、Saga、Outbox |
| 最终状态一致 | 环境状态与预期完全匹配 | 未来不漂移或不被人工改变 | 状态断言、回执、对账 |
OpenAI、Anthropic 和 Gemini 都把工具调用描述为“模型提出调用 → 应用或 SDK 执行 → 结果回传”的循环。结构化约束提高参数可解析性,但只覆盖各自支持的 Schema 子集。
OpenAI 当前文档建议 strict,并要求对象设置 additionalProperties:false、字段列入 required;普通 JSON mode 只保证合法 JSON。
工具选择、业务事实、权限、状态版本、重复执行、跨系统原子性、重试安全、补偿和最终状态都不在格式保证内。并行 tool calls 也不提供依赖 DAG 或事务。
03 / Local evaluator audit
评分器执行 tool_calls[0],后续调用完全不可见;客户端却开启并收集并行调用。
Runner 只把 expect 与响应交给 scorer,没有传入工具 JSON Schema。类型、required、enum、范围、格式和 additionalProperties 无法真正验证。
参数比较还会把数字和布尔转成字符串归一化,数字订单号可冒充字符串订单号。
| 构造输出 | 当前得分 | 生产判断 |
|---|---|---|
| 首条查询正确,第二条取消订单 | 1.00 | 一票否决:未授权副作用 |
| 退款缺 required 的 reason | 0.75 | 执行前拒绝 |
| string 字段返回 number | 1.00 | 类型错误,执行前拒绝 |
| 未知参数 force=true | 0.90 | 严格契约下拒绝 |
| arguments 非法 JSON | 0.50 | 解析失败,应计 0 |
query_logistics {},延迟也是固定假值。当前 evaluator 没有执行工具、回传 tool result 或检查最终状态。04 / Deterministic fault injection
新建的零依赖本地基准模拟订单、库存、扣款、Outbox 和消费者。每次运行保留状态前后差异、事件 trace、补偿顺序、断言和 SHA-256;计划由确定性场景生成,因此比较的是编排机制。
完整契约、调用集合、顺序、幂等、有限重试、Saga、Outbox 与消费者去重均按预声明断言工作。
五个成对阳性对照全部出现预期故障,说明 harness 能捕捉重复扣款、遗留库存、事件丢失和重复消费。
| 维度 | 场景 | 控制要求 |
|---|---|---|
| Schema · 4 | 缺 required、类型错误、enum 越界、副作用缺幂等键 | 工具开始前整单拒绝,零副作用 |
| 完整性 · 2 | 四步成功;漏掉 confirm | 调用集合完整且可审计 |
| 顺序 · 1 | 依赖调用提前 | 执行前拒绝,不能边做边发现 |
| 超时 · 2 | 副作用前超时;重试耗尽 | 可恢复或显式失败且零扣款 |
| 幂等 · 2 | 提交后响应丢失;同 key 重复提交 | 只产生一次可观察副作用 |
| Saga · 1 | 预留库存后支付永久失败 | 逆序释放库存并取消订单 |
| 投递 · 2 | 提交后崩溃;ACK 丢失重复投递 | 恢复补发,消费者只执行一次 |
结果文件:tool-transaction-bench/results/raw_results.jsonl 与 summary.json。规范化 raw SHA-256:92020b65…a5b82e0cefd85afc3b3f。12/12 单元测试通过;独立临时目录重跑逐字节一致。
05 / What naive orchestration misses
06 / Production transaction chain
同一 key、相同意图应返回原结果;同一 key、不同参数必须拒绝。`tool_call_id` 负责协议关联,业务幂等键负责跨重试和重启保持同一操作身份。
| 调用类型 | 默认策略 | 原因 |
|---|---|---|
| 多个只读查询 | 可并行 | 无业务副作用,仍需处理超时与版本 |
| 不同资源的独立写入 | 证明独立后可并行 | 各自仍需幂等、权限和失败处理 |
| 同一订单、账户或库存 | 串行或显式 DAG | 存在顺序、版本与互斥约束 |
| 高价值不可逆动作 | 二次确认后单独提交 | 控制误授权与误触发 |
| 跨系统长事务 | Saga | 不能假设全局 ACID;补偿是新业务动作 |
07 / Evaluation design
接入真实模型后,第一段只评模型提案;第二段把提案送进隔离沙箱注入故障。同一提案分别在 naive 与 guarded 编排下运行,才能拆出模型能力和系统可靠性的贡献。
| 结果表 | 主指标 | 一票否决 |
|---|---|---|
| 调用精度 | tool selection、schema-valid、语义参数、澄清 | 不该调用却调用高风险工具 |
| 状态一致性 | final-state exact match、政策、意外副作用 | 重复扣款、越权写、错误资源写入 |
| 故障恢复 | 重试恢复、UNKNOWN 解决、补偿、人工处理 | 超时后换 key、补偿失败未升级 |
| 效率成本 | p50/p95、调用数、重试数、Token/API 成本 | 低延迟不能抵消副作用失败 |
BFCL 更接近工具选择与结构;τ-bench 和 ToolSandbox 增加多轮、政策与环境状态。本专题在此基础上补进重复执行、结果未知、补偿和可靠投递,但仍是本地理想化沙箱。
08 / Release gates
全部 calls、完整 schema、调用集合、DAG、禁止副作用、失败留分母。
幂等、重试、Saga、Outbox、去重、崩溃恢复和最终状态断言。
固定版本和配置,只做影子提案;高风险样本盲化复核。
只读先上,可逆低价值写再上,高价值操作保留确认与人工。
09 / Evidence status
10 / Primary sources
工具五步循环、strict、并行调用与调用关联;持续更新,核对日 2026-08-31。
Schema 子集、拒绝/截断/错误边界;格式保证不等于业务正确。
tool_use / tool_result 协议、选择模式与并行结果配对。
JSON outputs 与 strict tool use 的结构约束及限制。
应用执行、模式控制、并行与组合式调用。
只支持 Schema 子集,并要求开发者验证业务值。
结构、类型与验证关键词的规范入口;不观察外部业务状态。
幂等方法及连接失败时的安全重试边界,2022-06。
稳定 client request ID、语义绑定、结果回放与晚到请求。
重试放大、单一重试层、预算、退避与 jitter。
长事务、本地事务序列、向前恢复与补偿,SIGMOD 1987。
业务状态与事件双写;至少一次投递下消费者仍需幂等。
显式管理消息、重复、乱序、重试与补偿,CIDR 2007。
函数选择、参数、多函数、并行、拒调用与多轮工具使用。
多轮交互、政策遵循、最终数据库状态与 pass^k;ICLR 2025。
有状态、对话式、交互式工具环境与中间 milestone,2024。
依赖计划与并行的延迟/成本收益;不提供副作用事务安全。
异步函数调用与延迟收益;晚到/乱序仍需编排层处理。