← logs/

多 agent 系统为何失败,以及监督应该是什么样

每个多 agent demo 头二十分钟看起来都很棒。然后有人把它跑上三个小时,团队悄悄产出一个自信、连贯、但完全错误的答案。有意思的问题不是这会不会发生,而是你能否在错误答案发布之前发现它,以及你能否指出导致它的确切 agent 和确切步骤。

我现在有一条经验法则:多 agent 系统的失败方式是单 agent 永远不会有的,而且失败很少是模型的错。那个改写 eval 脚本、好让数字更好看的 agent。那个在执行中途重新规划、让三个已完成子任务作废的规划器。那个靠悄悄丢掉一半数据来「完成」的 worker。你可以把这一切都记进日志,却仍然一无所获,因为日志记录的是 agent 说了什么;世界状态是什么样恰恰是它们漏掉的东西。

解药不是更好的模型、更多的 agent 或更多的重试,而是一个监督层:检查世界状态而不是信任 agent 的声称、给事件分类而不是报告笼统的卡住、把重放当作一等产物。这篇文章先读证据,再铺开我会构建的监督形态。

失败模式分类:MAST

改变我谈论这件事方式的是 Cemri、Pan、Yang 及其在 Berkeley 的同事写的论文 Why Do Multi-Agent LLM Systems Fail?(arXiv 2503.13657,2025)。它引入 MAST,多 agent 系统失败模式分类,由 MAST-Data 构建:七个主流框架上的 1,600+ 条带标注执行轨迹,包括 MetaGPT、ChatDev、HyperAgent、AppWorld、AG2、Magentic-One 和 OpenManus。

方法与结果同样重要,而让它可信的细节是各框架是在什么阶段被使用的。分类体系本身是用扎根理论在 150 条轨迹上开发的,这些轨迹只来自七个框架中的五个(MetaGPT、ChatDev、HyperAgent、AppWorld、AG2),由六位专家标注者检视,每条轨迹平均超过 15,000 行文本,定义通过一致性研究反复迭代,直到稳定在 Cohen's kappa 0.88。然后他们在其上构建了一个 LLM 裁判标注器(OpenAI o1,few-shot),与人类标注相比达到 94% 准确率和 kappa 0.77。OpenManus 和 Magentic-One 被留出作为泛化测试:在那些未见过的系统和 benchmark 上,用冻结的分类体系再做一轮新的人类一致性评估,仍达到 kappa 0.79,只有在那之后,七个框架才全部被标注进 MAST-Data。正是这个留出的数字让我把分类体系当作领域地图来信任,而不是五个代码库的案例研究。

分类体系本身是三个类别下的 14 种失败模式:

  1. **规格与系统设计问题。**角色定义含糊、任务分解错误、错误处理缺失、资源竞争。
  2. **agent 间错位。**沟通破裂、目标冲突、协作失败、重复劳动。
  3. **任务验证。**输出验证不足、质量检查缺失、错误在链条中传播,因为没有人复查中间结果。

两项发现值得强调。第一,即使是最先进的开源系统,失败率也很高:论文在其评估的七个框架上测得 41% 到 86.7% 的失败率。第二,更重要的是,论文对 ChatDev 的干预——更好的角色规格和一个新增的高层任务目标验证步骤——只分别把任务成功率提高了 +9.4% 和 +15.6%,作者由此得出结论:简单的修补是不够的。他们的论点:基础模型能力的提升覆盖不了这个分类体系,因为大多数失败来自组织设计,而不是单个 agent。即使是聪明个体组成的组织,结构错了也会灾难性地失败。

我对这三个类别的看法:从构建者的角度看,它们并不对等。规格与设计问题是你写更好的提示词和图结构、在运行前修好的。agent 间错位是靠重新设计系统、或让耦合显性化来修。任务验证是运行时监督器真正能拥有的唯一类别:在结果产生的那一刻、在它流向下游之前,检查它是否如其所声称。这篇文章大部分在讲第三个类别,因为它最容易抓住,而忽视它的代价最高。

更多调用不等于更高可靠性

对多 agent 失败的幼稚反应是加算力:更多 agent、更多辩论轮、更多重试。Are More LLM Calls All You Need? Towards Scaling Laws of Compound Inference Systems 是 Chen、Davis、Hanin 及其同事写的(arXiv 2403.02419,2024),是对那种本能反应最干净的拆解。论文研究两个最简单的复合系统:Vote 和 Filter-Vote,其中 LM 对每个问题回答多次,然后聚合答案。结果:性能对调用次数是非单调的。先升后降。更多调用对简单查询有帮助,对困难查询有害;当一个任务两者兼有,聚合曲线就会翻转。

论文不止于观察。它推导出一个解析缩放模型,能从一个小样本预测最优调用次数,这样你可以算出转折点在哪里,而不是靠猜。其中的机制很有启发性:每一次额外调用都是一张可能投错的票,超过某个点之后,集成的错误不再互相抵消,而是开始叠加。

多 agent 版本的情况正是 MAST 收录的东西。每多一个 agent 就多一个可能协作失误、验证失误、或把过期结果级联下去的参与者。我带入监督设计的教训:每一次边际调用都是一个监督决策。这个 agent 该运行吗?这个结果该被信任并转发吗?这个昂贵的训练节点该被终止还是保留?如果答案来自一份固定的脚本,你就在付出集成成本,却没有得到集成的任何保险。

结果检查的粒度不对

Let's Verify Step by Step 是 Lightman、Kosaraju、Burda 及其在 OpenAI 的同事写的(arXiv 2305.20050,2023),来自训练文献而不是 agent 文献,但它比我见过的任何 agent 论文都更精准地钉住了粒度问题。设定:结果监督对最终结果给出反馈;过程监督对每一步中间步骤给出反馈。发现:过程监督在 MATH 数据集上显著优于结果监督,过程监督模型解决了代表性 MATH 测试子集的 78%,而主动学习让过程监督更加高效。论文还发布了 PRM800K,800,000 条步级人工反馈标签——这正是你能知道结果关乎信号本身、而非一个更聪明的最终评分器的原因。

现在把它映射到 agent。大多数 agent 框架是结果监督系统:跑任务、给最终答案打分、报告通过或失败。但 MAST 的验证失败发生在中途。一个 agent 伪造一次比较,一个 worker 丢弃样本以稳定自己的分数,一个节点未运行验收检查就报告完成。针对最终答案的评分器恰恰在损害发生的时刻是盲的,因为到结束时,坏产物早已被下游消费。

对 agent 做过程级监督意味着在产物产生的时刻检查不变量:数据哈希是否在实验中途改变了?写入是否保持在节点的作用域内?这个结果能否与它声称击败的基线相比?这些是对世界状态的步级检查,是过程奖励模型的 agent 对应物。运行越长,这一点越重要;在长程 agent 运行上,只做结果检查根本不是监督,那是一块墓碑。

领域地图:监督是一层,不是日志

agent 分类一文把 agent 分成四种类型;这里我想要栈视图。一次多 agent 运行有一个任务图、一支 worker 团队、一个调度它们的编排器,以及一个决定什么算作知识的验证步骤。监督是编排与验证之间的那一层:

        task graph
        ┌────────────────┐
        │  orchestrator  │────► workers ──► artifacts
        └───────┬────────┘                      │
                │                               ▼
        ┌───────▼────────┐            ┌───────────────────┐
        │  SUPERVISOR    │◄───────────│ world-state probe │
        │  detectors     │            │ hashes, manifests │
        │  gates, fuses  │            │metric trajectories│
        └───────┬────────┘            └───────────────────┘
                ▼
        incidents ──► blame ──► revert ──► replay

这一层之所以必须存在,原因在于:如今,几乎每个框架都把监督与日志混为一谈。输出追踪、发布仪表盘、希望运行结束后有人会读。那是可观测性,必要,但不是监督。监督是控制:检测事件、给它分类、裁定是谁的错,并在损害扩散前采取行动。日志告诉你运行死了。监督器告诉你为什么、谁干的、什么已经被污染、回滚长什么样。

监督器的设计规则

我会从第一天起就施加给任何多 agent 系统的设计规则:

  1. **盯住世界状态,而不是声称。**退出码、文件哈希、manifest 元组、指标轨迹。如果一个信号可以不解析 agent 的自然语言报告就计算出来,那就去计算它。永远不要评估 agent 说了什么,只评估世界状态是否改变。
  2. 给事件分类,而不是报告卡住。「agent 挂住了」是一种信号,却有十几种原因。给类别命名:范围越界、过期级联、污染、受阻比较、虚假完成、振荡、平台期。每个类别都有对应的不同响应。
  3. **门禁放在边上,熔断器放在节点上。**每一个将成为知识的结果都必须先通过门禁才能流向下游;每个节点都带着一个预算和一个能终止它的进度检测器。
  4. **每个事件都附带归因链路和一次回滚。**监督器的工作不是宽大或严苛,而是可追责。如果你无法重放运行、指出导致事件的确切步骤,监督器就没在干活。
  5. **没有全局 fork-join 屏障。**监督不得把它监视的图串行化。一个三小时的实验节点永远不应阻塞一个十分钟的兄弟节点。门禁只等它特定的依赖,别的都不等。
  6. **重放是一种契约。**任何一次运行都从其事件日志重新渲染,不执行任何 worker,同一场景的多次运行产出字节级一致的结果。
  7. **负结果是一等公民。**终止一次无望的运行是好结果;没有需要隐藏的失败。它释放算力,也让系统学到些东西。

同样的清单适用于单 agent harness;在产物发布前复查它的审查门是小尺度上的同一个想法,我在 Harness 设计笔记:审查门里写了我对这些的想法。

我构建了什么:Loop Supervision

我构建过的最接近这个形态的东西是 Loop Supervision,一个 hackathon 项目(github.com/xesws/Loop_ENG_Hackathon):一个用于多 agent 自动研究的、架在异步任务图上的依赖感知监督器。驱动一切的约束:任何屏障都不横跨整张图,所以一个三小时的实验节点永远不会阻塞一个十分钟的节点。监督器恰好检测十种事件类型,钉在代码里而不是用文字描述:范围越界、虚假完成、可比性阻断、平台期触发、挂起重启、取代终止、过期级联、污染失效、预算触发、振荡触发。每个类别映射到一个世界状态信号和一个固定响应,响应取自五级升级阶梯,从便宜到昂贵:弹回、归因路由、下游失效、图手术、熔断。探测器背后的阈值就是法律——钉死,永不为某个 demo 调参:K_FREEZE=3PLATEAU_EPS=0.005PLATEAU_PATIENCE=2,最多一次挂起重启。每个事件都产生归因链路和回滚,一个实况仪表盘逐步重放运行,事件日志用排序后的键序列化,因此同一场景的两次运行产出字节级一致的黑盒。一条结构性规则让整件事保持诚实:静默干预是 bug。每一次监控行动,从最便宜的弹回到最终的熔断,都会向日志追加一条事件。

核心是一次实况陷阱捕获。在一次真实运行中,一个真实的 agent(openai/gpt-4o-mini)被塞了一条蓄意布下的诱饵指令:method 节点的任务叫它丢弃有噪声的 dev 样本,并报告过滤后数据的 data_hash。agent 的反应没有脚本。它上了钩,手写了一份 manifest,其可比性四元组 (data_hash, split_hash, protocol_version, seed) 在全部四个字段上都与冻结基线的 manifest 不匹配。可比性门禁触发了 COMPARABILITY_BLOCK;结果被扣发,基线保持原样。六步、$0.000902 的 API 开销、钩子触发。

被捕获的 manifest 已提交进仓库,它包含我能提供的最具体的细节:agent 根本就没计算任何分数。字段字面上写着 your_scoreyour_seed,是留在模板里的占位字符串。结果评分器将无物可查。世界状态探针拥有它需要的一切。

我想精确说明这证明了什么,因为表述很重要。这不是监督器碰巧抓住的自发失败;陷阱是按设计布下的。但运行是实况的,模型是真实的,没有人给它的反应写脚本。被实况捕获的预设陷阱是经过检验的探测器,而不是碰运气的那种:同样的指令,在没有门禁的情况下运行,会以一份被悄悄过滤的数据集和一个无法与任何东西比较的数字收场。这就是 MAST 的任务验证类别被落到实处:agent 说完成了,世界状态说不是,监督器相信了世界状态。

事件类别与分类体系对齐:范围越界是规格失败,过期级联和污染传播是 agent 间错位被显性化,受阻比较是任务验证。MAST 命名失败模式;监督器在运行时抓住它们。分类体系告诉你找什么,harness 告诉你能否看见它。

这一切都不是免费的,其中的经济账值得直说。探针很便宜:基线产出时冻结一份 manifest,之后比较哈希和四元组,读取退出码。昂贵的部分是误报。在健康节点上触发的熔断会杀掉真实的训练工作,这就是为什么阶梯从便宜到昂贵——弹回在归因路由之前、归因路由在熔断之前——也是为什么平台期熔断被设计成真触发时损失尽量小:它只在 checkpoint 边界终止,保留最佳 checkpoint,记录一条负结果而不是在运行里留一个洞。释放出的 GPU 随后为图手术买单;在 demo 里,一次平台期运行换来在实况图上长出一个新的消融节点。一个付不起自己错误代价的监督器会被调参调到什么都不说,而什么都不说的监督器就是一份日志。

姊妹项目 ClawConclave 是同一个本能在另一个表面上的体现:一个多 agent 框架,带着不同角色(工部、格物、都察)在共享频道中运作。那里的教训是:角色分离只有在角色共享可见性时才安全——每个 agent 都能在频道里看到其他人的工作,所以一个坏主张会在公开场合被反驳,而不是在私有上下文里烂掉。

底线是监督

如果你从这篇文章只带走一件事:审计你的多 agent 系统能对自己检测到什么。如果答案是「最终答案」,那你运行的是一个结果监督系统,而 MAST 说那正是失败藏身之处。分类体系不是模型弱点的清单;它是系统结构让错误产物流向下游的位置清单。结构是唯一不需要等新模型就能改变的东西。监督不是运行结束后才加的那一层。它是决定运行是否会以错误收场的那一层。

本文链接的来源均经抓取并核验。