工具调用全部成功,工作流为什么还是错的

工具调用全部成功,工作流为什么还是错的

你让 Agent 订一张机票和一间酒店,预算是 1500 欧元。

0:00 / 7:46
9 月 14 日,一篇新的预印本论文上线,题目是《当工具调用成功而工作流失败:Agent 与工具边界上的异常》,作者是 Artem Trofimov 和 Boris Novikov。论文做了一件很工程的事:先把 Agent 调用第三方工具时的「外部效应」失败定义清楚,再去数一数今天的公共工具接口到底声明了什么。1

本期听什么

  • 为什么「每个工具调用都成功」和「工作流的整体结果是对的」是两件事:一笔不可退的机票加上一笔已取消的酒店,两笔调用各自都完成了任务。1
  • 论文整理的八种外部效应异常,以及它们背后的三个来源:结果不确定、工作流结构提前释放效应、和并发或外部观察者的交互。1
  • 论文对官方 MCP 注册表做的注解普查:九万八千多个工具里,四个标准注解字段被广泛填写,却不足以表达重试、补偿、暂存和并发所需的语义。1
  • 四个黑盒调用做不到通用的保证的边界,以及论文提出的三类工具边界契约。1

论文说了什么

论文把「副作用历史」拆成两半:外部世界里真实发生的事件,和运行时对它们的观察。效应要么发生了,要么没有;而「不知道」是运行时的状态,不是世界的事实。好几个异常,就发生在运行时带着这个「不知道」继续往下走的时候。1
八种异常分成三组。第一组来自不确定:结果没确认时重发,可能把一笔付款做两次;当成成功继续提交,工作流可能在没有效应的情况下收尾;盲目补偿,可能给一笔从未发生的付款退款。第二组来自工作流结构:中止的分支留下残留效应,还没确定能否成立的效果提前外化,已提交的动作依赖了后来被取消的分支。第三组来自交互:两个执行在同一个资源上没有顺序约束地写,或者效应虽然被补偿,但外部已经有人看见它并据此行动。1

工程上的关键判断

这类失败不是「模型选错了工具」,也不是「工具坏了」,而是工具边界没有携带事务语义。数据库领域早有可补偿的长事务、多层事务管理这些机制,但它们都假设底层操作会声明效应是否发生、能否补偿、能否暂存、能否换序。通过共享接口调用的第三方工具通常什么都不声明,运行时只能自己用带外的适配层补回来。1
MCP 从 2025 年 3 月那一版开始定义了四个工具注解:只读、破坏性、幂等、开放世界。它们都是可选的布尔提示,粒度比需要的粗:幂等提示标记了属性却不提供幂等键,状态查询、补偿契约、暂存、可交换性和可见性控制都没有对应字段。可交换性尤其不同,它是两个操作在同一个资源上的关系,只能由资源声明,没法由某一个 Agent 自己保证。1
论文随附的普查覆盖官方 MCP 注册表在 2026 年 7 月 27 日的快照,保留每个服务器的最后一个版本,排除只提供本地包或标准输入输出方式的服务器,然后不带凭据地调用远端服务器的工具列表接口,从不调用任何工具。最后从 4,838 个服务器上取得 98,291 个工具,每个服务器的中位数是 11 个。2
普查的几个数字值得记住。七成四的工具至少序列化了一个注解字段,六成一七四个字段都带;但字段出现不等于有人认真选择,很多值可能来自开发包默认值或服务器模板。按四个字段组成签名,81 种可能里出现了 66 种,可是最常见的「只读、非破坏、幂等、开放世界」一种就覆盖 39.9% 的工具,排在第二的是完全没有注解,占 26.0%。破坏性这个字段出现在 65.8% 的工具上,但去掉只读工具后,真正有意义的分类只有 12.9%,明确声明破坏性操作的只有 3.1%。12
论文还给出四个黑盒调用之上的边界:没有权威结果收敛的原语,就无法在丢包的通道上既收尾工作流又保证安全;不可逆且不可交换的效应若没有中间人,就没有通用的冲突修复,只剩预防;外部世界一旦观察并反应,补偿就够不到那个反应;多个不可逆效应落在不同工具上时,工具层之上无法原子释放。1

今天的落地清单

论文把需要的边界能力收成三类契约:权威结果收敛、生命周期控制、共享资源协调。落到系统里,可以先做这六件事。
  • 每次外部写操作都带一个由工作流生成的逻辑操作号,重发时复用同一个号。
  • 状态机里保留「未知」这个明确状态,不要把结果不明的调用折叠成成功或失败。
  • 把补偿动作本身也当成一次外部写入来记录和验证,它同样会超时、会重复。
  • 标出哪些调用不可逆,把不可逆的动作尽量推到工作流接近收尾的位置。
  • 对同一个资源的并发写入,要么有顺序,要么有版本,要么有一个中间人。
  • 提前定义对外可见性:哪些动作在提交之前就不应该被工作流之外的人看到。
本期事实与数字均来自上述论文及其随附的普查产物。普查只覆盖当时可达的远端 MCP 服务器,无法连接的服务器和只能本地运行的服务器可能不同;论文也明确把语义规划错误、读侧异常、安全和策略违规放在模型之外,四个注解字段的统计描述的是接口声明,不是工具实现的行为。

This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.

Related content