深入理解 AI Agent · 第 10 章图解

多 Agent 协作

单个 Agent 受限于模型能力和上下文窗口。多个 Agent 分工、通信、互相验证,可以做单个 Agent 做不了的事,但前提只有一条:协作要带来单个 Agent 生成时拿不到的新信息。几个 Agent 对着同一段文本讨论,算力相同时并不比一个 Agent 强;审核者如果手里有测试结果、渲染截图或工具查证,效果就会明显提升。本章先给出两个设计维度(上下文是否共享、协作拓扑),再讲文件系统和控制平面,接着是对等、管理者、去中心化三种拓扑,最后讲六种失败模式和 Agent 社会。

同一模型自我审查(重读自己的输出)无新信息通常无效甚至有害
不同 Agent 辩论同一段文本无新信息等计算量下与单 Agent 持平
审核者拿测试执行结果审代码执行反馈显著提升
审核者看渲染截图审前端 / PPT 代码视觉反馈显著提升
审核者用外部工具核实事实工具反馈显著提升
表 10-1。判断是否值得上多 Agent,先看这一列:有没有新信息进入系统。
控制平面 / Manager Agent 执行 / 验证通过 文件 / 上下文 / 数据平面 消息 等待 / 空闲 失败 / 冲突 / 重算
10.1

两个设计维度:上下文共不共享,拓扑怎么连

共享上下文:下一个 Agent 继承前一个的完整轨迹,只换系统提示词和工具集,就像接手的开发者既拿到需求文档,也能看到分析师和用户的全部沟通。不共享上下文:每个 Agent 有自己的对话历史,互相看不到“思考过程”,像不同部门靠共享文档和会议纪要协作。

共享上下文不丢信息,但上下文膨胀很快;隔离上下文模块化、易扩展、能并行,代价是信息同步变复杂。

图 10-1 · 继承式 vs 隔离式

上下文长度为示意单位

隔离之后靠什么传信息:IPC 的两大范式

操作系统里,进程间通信只有两种:共享内存,或者消息传递。Agent 间的三种常见机制也落在这两类里。Go 有句话:“不要通过共享内存来通信,而要通过通信来共享内存。”

工具调用参数

消息传递 · 同步

把下游 Agent 封装成工具,上游通过参数传结构化数据。适合类型确定、结构清晰的场景。

共享文件系统

共享内存

读写共享目录里的文档、代码等中间产物。适合产物较大或要持久化的场景。

消息总线

消息传递 · 异步

Agent 不直接调用彼此,把消息发给中转站,由它转发给目标 Agent。

维度二:协作拓扑

控制权和信息按什么结构流动。三种典型形态都可以看成“Graph 工程”里的执行图:节点是 Agent、普通程序或人工决策,边是依赖、条件路由和失败去向。

对等协作

少量 Agent 按固定拓扑反复迭代,如起草者 + 评论者。例:提议者-审核者、LoopX、辩论、头脑风暴、专家小组。

管理者(编排)

中心 Manager 规划、调度,多个子 Agent 各管一块,像项目经理带工程师。例:书籍翻译、并行搜索、灵台、Kimi Agent Swarm。

去中心化(编舞)

运行时没有中心控制者,Agent 像人一样互相沟通、移交。例:OpenAI Swarm 的 handoff 网络、同一台机器上的对等实例。

10.2

多 Agent 什么时候真的比单 Agent 好

学术研究常说多 Agent 不提升能力上限,工程实践里多 Agent 却确实更好。两边说的不是一回事:研究比较的多是“几个 Agent 对着同一段上下文讨论”,有效的工程系统往往带外部反馈环路(代码执行、视觉渲染、工具调用)。

核心判据只有一条:协作过程是否引入了单个 Agent 在生成时拿不到的新信息。

外部反馈的效果

WebGen-Agent · 2025

多层级视觉反馈(截图 + 视觉语言模型描述)构成反馈脚手架,据报道让 Claude 3.5 Sonnet 在该基准上从 26.4% 升到 51.9%,接近翻倍。RLEF(2025)用强化学习训练模型利用执行反馈迭代改代码,效果远超独立多次采样:每轮都带来写代码时不存在的编译错误、测试失败和运行时异常。

开放搜索:多花 token,换更多发现

Anthropic 漏洞挖掘 · 2026

45 个 Agent 通过共享论坛协调搜索、互相审查,再由独立 Agent 仲裁。通信让它们能动态转移搜索重点、自发分工。

步骤预算:给 300 步不等于会用 300 步

示意曲线 · 无书中数值

Google 2025 年的《Budget-Aware Tool-Use Enables Effective Agent Scaling》发现:标准 Agent 没有“预算意识”,即使给 300 步也只做浅层搜索,很快饱和。BAVT(2026)在每一步按剩余预算比例调整探索与利用的权重:预算越少,越从“广撒网”转向“深挖掘”。

对管理者模式的启示:Manager 要按子任务复杂度动态分配步骤预算,简单的少给、复杂的多给,并引导子 Agent “先规划、再实现、再测试、再改进”。另外,多 Agent 的并行探索和反复迭代可能带来数倍乃至一个数量级的额外 token 开销,收益盖不住时,调校好的单 Agent 更划算。

10.3

共享上下文:多阶段角色转换

每个阶段都是一个有自己提示词和工具集的 Agent,但继承前面所有轨迹。一套静态提示词要么太笼统,要么把所有阶段的指导塞在一起太冗长,所以按阶段切换“身份”。难点在于让当前 Agent 专注自己的职责,不被继承来的大量历史干扰。

切换角色有两种载体:替换 system prompt(transfer_to_agent),或加载 Skill。行为可以一样,缓存成本和约束强度完全不同。

选择角色规程放在哪工具可见性前缀 / KV Cache约束能力
transfer_to_agent替换当前 system prompt,通常连工具集一起换只暴露当前角色的工具每次切换都改请求前缀,从变化点起的缓存通常无法复用强:越界工具在 schema 层就看不见
Skillsystem prompt 固定,内含 Skill 目录,按需把 SKILL.md 追加到轨迹通常固定暴露工具全集,或稳定的工具搜索入口静态前缀不变,Skill 内容成为末尾轨迹,已有前缀继续复用弱:Skill 只是行为指令,硬权限仍靠 Harness 门禁

实验 10-1 · 五个角色依次上场,前缀缓存各能复用多少

块大小为示意单位

任务:查中国 2021—2023 年新能源汽车销量,算 CAGR,写不超过 120 字的投资人摘要。两条路径用同一模型、同一工具实现、同一份角色规程、全量共享轨迹。

路径一 · 切换 system prompt
路径二 · load_skill(name)
命中前缀缓存需要重算system / toolsSKILL.md

怎么选

角色差异主要在知识、流程、写作风格:优先用 Skill。差异涉及权限、工具隔离、合规边界,或运行时必须禁止某类动作:用独立 Agent 或 transfer_to_agent,并在 Harness 层用代码限制工具调用。

10.4

不共享上下文:把 Agent 当进程看

真正的多 Agent 协作里,每个 Agent 有自己的上下文、轨迹和状态,协作完全依赖工具参数、共享文件和消息总线。顺着“通信即 IPC”往下走,多 Agent 系统和操作系统几乎一一对应。私有状态、异步消息、能创建新成员,正是 1970 年代 Actor 模型的设定,多 Agent 系统可以看作它的 LLM 版本。

表 10-2 · 操作系统 ↔ 多 Agent 系统

点一行看说明

隔离带来的好处

每个 Agent 可以单独开发和测试;加能力不用改现有代码;一个出故障不会把错误状态传染给别人;上下文完全独立,可以真正并发。

隔离的代价

各 Agent 对任务状态的理解怎么保持一致?信息会不会在传递中丢失或重复?出了问题要翻多个 Agent 的日志才能拼出全过程。所以接口规范、数据格式和通信协议变得关键。

两套与拓扑无关的基础设施:共享文件系统是数据平面,负责交换产物;通信与控制机制是控制平面,负责消息、状态、终止和调度。

10.4.1 Agent 眼中的文件系统

Agent 访问的是一个虚拟文件系统:来源、生命周期、权限各不相同的存储挂在同一棵目录树下,统一用 read_file / write_file / list_dir 访问。这棵树相当于 Agent 的地址空间,四类区域是权限各异的内存段。不少并发冲突和信息泄露,都来自把本该隔离的区域混在一起。

图 10-2 / 表 10-3 · 四类区域的挂载结构

点击区域
区域可见性生命周期读写并发控制
Agent 专属工作区 /scratch/<id>仅该 Agent随实例销毁读写不需要(私有)
多 Agent 共享空间 /workspace/shared所有协作 Agent + 用户随任务持续,需持久化读写需要(乐观锁 / worktree)
外部挂载资源 /mnt/gdrive · /mnt/notion视外部授权而定由外部源决定多为只读,写需谨慎由外部源负责
系统内置资源 /skills所有 Agent跨会话稳定只读不需要(只读)

统一目录树的价值在于“文件路径是通用接口”:Agent 之间传产物、主 Agent 给子 Agent 交接输入、跨组织 A2A 交换产物,传的都是轻量的路径字符串,不是把内容塞进上下文窗口。

10.4.2 控制平面:消息、状态、终止、调度

四个工具原语对应进程世界的四个操作:spawn_subagent = fork,send_message_to_subagent = 消息,cancel_subagent = kill,list_agents = ps。

一、消息传递:点对点还是消息总线

连接数随 Agent 数增长

点对点适合拓扑固定、Agent 少的场景(如实验 10-3 的电话 + 电脑双 Agent)。Agent 多且要异步并行时,点对点连接数呈平方增长,还要求收发双方同时在线;换成总线后,Agent 发布消息,总线按订阅转发,发送方不必知道谁消费。

{ "sender": "agent_3",
  "target": "manager",        // 或广播
  "type": "status_update",    // task_assigned / result / terminate
  "payload": { ... } }

统一的信封让接收方能可靠路由和解析,也让协作链路可追溯,这是调试多 Agent 的关键。

二、状态查询:别让主 Agent 去轮询

get_subagent_status(agent_id) 这种拉取式接口不实用:子 Agent 一创建就开始执行,完成时自然会通知主 Agent。获取状态更自然的做法回到两大通信范式。

发消息问 / 主动汇报

主 Agent 问“进展如何?”,子 Agent 在合适时机回复,全程异步;或子 Agent 到关键节点往总线发 status_update。状态用统一词汇:执行中、需要输入、已完成、失败。

轨迹持久化(JSONL)

子 Agent 把完整轨迹实时追加写到日志,主 Agent 直接读,相当于读另一个进程的内存。但轨迹动辄数万 token,读完还要自己提炼,不宜作主要渠道。

约定进度文件

启动时约定“把进度写到 progress.md”,子 Agent 每完成一项就更新。暴露的是提炼后的进度,不是全部内存。文件超过 N 分钟没改动,就判定无活动、触发超时兜底。

三、执行终止:优雅、强制,和沿创建关系级联

点击节点取消

优雅终止(≈ SIGTERM)首选

发 terminate,子 Agent 在当前步骤的安全点响应:关浏览器会话、写完未完成文件、释放锁,回 ack 后退出。安全点检查对应 Go 里轮询 ctx.Done()。

强制终止(≈ SIGKILL)兜底

直接杀进程,只在子 Agent 对优雅信号没反应时用,可能留下悬挂资源和写了一半的文件。

取消一个 Agent,它派生的所有子 Agent 随之取消,不会留下孤儿。后台 Agent 从 context.Background() 起一棵新树,不随父级终止(类似 nohup)。

四、资源与调度

Agent 世界稀缺的是 token 和并发额度。管理者或运行时负责:启动子 Agent 时设步数或 token 预算,超限即止;难任务给强模型,机械任务给便宜模型;并发数设上限,避免几十个 Agent 同时打满 API 配额;满额时来了更急的任务就打断正在跑的子 Agent,这就是抢占。管理者比 OS 调度器多一样东西:推理能力。它可以并行派出几个子 Agent 探索同一个问题,看进展给谁加资源、砍掉谁,像公司内部赛马。这块实践远不如 OS 调度成熟,但它决定了多 Agent 系统的成本上限。

10.4.3

对等协作:相互制衡与迭代改进

2–3 个身份平等的 Agent 多轮互相反馈,实现复杂度最低:定义好两个角色、通信机制和迭代终止条件就能跑。价值在于独立视角,但“多个实例”不等于“多种思路”:模型、上下文、脚手架高度相似时,不同 Agent 往往做出同样的选择,局部错误会变成系统性故障。

要得到真正的多样性,就主动区分模型、上下文、工具、可见证据或职责,并让各 Agent 先独立判断、再汇总。

Loop 工程:解决“活干一半就停”

偷懒式假完成

Coding Agent 写完代码,测试没跑、部署没试,就报“任务完成”。Pine AI 收到两件事,办完第一件就汇报“都办好了”。

过早放弃

打一个电话被拒,就告诉用户“这事办不了”,其实还有填表单、发邮件等渠道。

假成功

对方口头同意退款,用户还要在 App 上确认一步,Agent 却报“已办妥”,退款没有落地。

验证之前,“完成”只是模型的一句宣称,不是证明。Loop 工程(Addy Osmani,2026 年 6 月)就是设计一个持续运转的循环:发现下一件事、执行、验证、记录进度,由验证器而不是模型来决定能不能停。共识是:循环的瓶颈在验证器,不在模型。Boris Cherny 的说法:“我已经不再直接 prompt Claude 了,我的工作是写 loop。”

LongHorizon-Harness · Manage–Execute–Audit 循环

示意时序。Manager 根据原始目标、已核实进展、失败证据和剩余工作,生成下一项有界子任务;Executor 在全新上下文里通过 GUI 或 CLI 改变环境;Auditor 只读检查真实结果。只有审计通过的内容才进入任务状态,失败被保留为下一轮的输入。LoopX 是同一思路的另一种实现:LoopX 决策 → Agent 执行 → 独立验证器证明 → LoopX 提交,“模型可以提出完成,但不能批准自己的完成”(其 v0.4.0 受控 Turn 路径仍是实验性的)。

只换外层 loop 的对照

同一 Qwen 3.7-Plus + Claude Code 后端
WeaveBench 成本2.3× 总 token
OSWorld 2.0 成本3.6× 输出 token
Terminal-Bench 2.1−24% token
单条轨迹 webrtc_simulcast0.59 → 0.92

单条轨迹里,基线在 Wireshark 交互卡住后反复重试;MEA 把失败和未满足的证据项写回任务状态,后续轮次只补缺口。这个案例只用来演示“失败如何变成下一轮输入”,不能代替总体统计。部署时还要处理环境或需求变化导致的旧状态失效,并用轮数、时间、费用预算防止恢复循环无限跑下去。

提议者-审核者:最经典的对等范式

Proposer 生成代码,Reviewer 渲染或执行结果,再用 Vision LLM 打分、给结构化改进建议,循环到达标。同样适用于安全审查、内容审核、代码审核。

图 10-3 · PPT 生成的三轮迭代

Reviewer 第 1 轮反馈(节选)问题类型严重度
P3内容过密高
P7字体过小中
P11配色不协调低

为什么不让一个 Agent 自己生成、自己看截图

书中只说每张截图“数千 token”,此处为可调假设

单 Agent:渲染图 × N 轮全部留在上下文里,越积越多。双 Agent:Reviewer 每轮只看当前版本,Proposer 只累积文本反馈,两边的上下文都干净。

证据:没有外部反馈,自我纠错不起作用

Huang 等(ICLR 2024):GPT-4 无外部反馈地审查并修正自己的回答,准确率反而下降,改错的比改对的多。TACL 2024 综述(arXiv:2406.01297):除非有可靠的外部反馈,纯自我纠正几乎无效。CRITIC(ICLR 2024):用搜索引擎、Python 解释器验证效果显著提升,去掉工具只留自评,大部分提升消失。

最小不变量

审核者读独立证据,而不是复述提议者的解释;退回时给出可定位的修复条件。审核者不能改测试、证据采集器或发布门槛,否则“独立验证”就退化成自我批准。Anthropic 2026 年的长程应用开发实验用规划者–生成者–评估者三 Agent:评估者用 Playwright 操作真实应用提交缺陷报告,以显著更高的成本换更好的质量。

candidate = proposer(task, constraints)
evidence  = execute_or_render(candidate)      # tests, state, screenshot, facts
review    = independent_reviewer(candidate, evidence)
while review.veto and budget_remaining:
    candidate = proposer.repair(candidate, review.findings)
    evidence  = execute_or_render(candidate)
    review    = independent_reviewer(candidate, evidence)
if review.pass: publish(candidate, evidence, review)
else:           escalate_or_reject(review)

辩论、头脑风暴、专家小组

辩论为什么在等预算下不占优

Tran & Kiela 2026 · 多跳推理

对比单 Agent 与五种多 Agent 架构(顺序、辩论、集成、并行角色、子任务并行),思考 token 预算严格相同时,单 Agent 持平甚至更好。解释是数据处理不等式:辩论各方处理的是同一份文本,每次串行传递中间结论只会丢信息,不会凭空造信息。论文里辩论的收益很可能来自更多的总计算量。这不否定多次独立采样再聚合(自一致性、多数投票),也不否定利用“写答案难、验答案易”做生成-验证分工。

辩论

A 当支持者列优势,B 当反对者指风险,每轮针对对方论点反驳或补充。用制度化对抗让正反两面都得到论证,学术界对其效果仍有争议。

头脑风暴

Agent 1 提“社交分享”,Agent 2 接着提“生成个性化分享海报”,Agent 3 综合成“用户自定义模板 + 模板市场”。思维偏好靠不同提示词或模型实现。

专家小组

工程师看实现难度,产品看用户体验,运营看成本资源。不是对抗而是互补,一起拼出问题全貌和跨领域约束。

10.4.4

管理者模式:中心化协调

子任务多、要动态调度、依赖复杂时,对等协作就不够了。Manager 像项目经理:理解任务、拆解、选 Agent、跟进度、处理异常(重试、换 Agent、改计划)、整合结果。实现上把每个专门 Agent 注册成 Manager 的一个工具:调用 Agent 和调用普通工具没有本质区别。加能力只需注册新工具,不同 Agent 可以用不同模型、提示词、工具集甚至硬件。

Manager 是单点瓶颈。Plan-and-Act(2025)发现弱规划者是整个系统最关键的短板,在 WebArena-Lite 上取得 54% 成功率,靠的是改进 Planner 而非 Executor。最强的模型和最用心的提示词应该给 Manager。

图 10-4 · 顺序协调

示意时序。Manager 调 A(数据收集)→ A 返回 → 传给 B(分析)→ B 返回 → 传给 C(报告)。控制流线性,适合子任务有清晰先后依赖的场景。

实验 10-2 / 图 10-5 · 书籍翻译 Agent

上下文隔离

单 Agent 逐章翻译,术语表、已译章节、当前段落、思考过程、工具结果一路累积,几百页的书很快超出窗口;更糟的是在长上下文里“迷失”:第九章用了和第二章不同的译法(第一章 agent 译“智能体”,后面就不能改“代理”),审校重复检查,甚至“记起”不存在的术语规则。

Glossary 做完术语表写进共享文件系统,即可销毁释放资源;Translation 每个实例只看当前章节 + 术语表 + 指南,新术语标记待审;Proofreading 读全文但只查一致性;Manager 只保存任务描述、计划、调用记录、进度和文件索引,不存译文,按审校报告把特定章节发回重译。实验要求记录每个 Agent 的上下文消耗,并对比单 Agent 与管理者模式的质量、效率和资源消耗。

图 10-6 · 并行协调:消息总线上的四条消息

消息总线像公共公告板:可以贴消息(发布),也可以只关注自己感兴趣的类型(订阅),异步、互不阻塞。Manager 要实时监控所有运行中的 Agent,在有人成功或失败时做全局决策。

灵台(Lingtai):产品化的管理者模式

本地运行、以文件为本的长期 Agent 居所。主器灵是常驻中枢,掌管计划和记忆,就是 Manager;分神是为一件嘈杂、有界的工作分出的短时并行工作者,做完即弃,只把结论带回;分身是有自己记忆、邮箱和职责的持久队友。知识是各器灵私有的记忆文件,技能是共享的 Markdown 手册;窗口快满时“凝蜕”(molt),给自己写总结后在干净上下文里继续。底层模型可换,器灵犹在:“器灵即其文件”。

实验 10-3 / 图 10-7 · 边打电话边填表

示意时长

用户只给一个网址,要填注册或航班预订表单。Computer Agent 识别字段,也是编排者;姓名、证件号、联系方式、地址等不在上下文里,就自主决定是否调用 initiate_phone_call_agent(purpose, required_info)(不要用“字段数超过阈值”的规则代替模型决策)。两者独立 ReAct 循环,通过 WebSocket 交换 info_collected、fill_error、format_invalid、task_completed。

格式错误发 format_invalid 重问,超过重试次数或页面异常就安全暂停;异常时取消仍在运行的对端,关闭浏览器、音频轨道和通话。真人语音要显式同意,提交表单要显式授权。

实验 10-4 / 图 10-8 · 十个学院网站找“张伟”:并行 + 级联终止

Manager 动态创建 10 个 Computer Use Agent,各有独立浏览器会话,启动时带上网址、教师姓名和任务 ID。Agent 3 发 {"type":"target_found","agent_id":"agent_3"},Manager 立即广播 {"type":"terminate","reason":"target_found_by_agent_3"},等全部确认或超时后汇总。失败处理:每个 Agent 超时(如 2 分钟)记为失败、错误隔离;只要有人成功就返回,全部失败则报“未找到目标教师”和各失败原因统计。

竞态:两个 Agent 几乎同一毫秒报告“找到了”

workers = launch_independent_workers(subtasks)
while workers.any_running:
    event = next_event()
    if event.type == RESULT:
        if verify(event.artifact, hidden_checks):     # 第一个“已验证”成功,不是第一个“声称”成功
            if not settle_once(event): continue       # 原子地认领赢家,必须幂等
            broadcast_cancel(to = workers - {event.worker_id})
            await_all_ack_or_timeout()
            return assemble(event.artifact, evidence = event.evidence)
        else: record_failure(event)
return summarize_failures(workers)

让 Manager 写出工作流,交给确定性运行时执行

Claude Code Workflow 工具

前两种形态里 Manager 一直在循环中,每派一个子任务就要模型做一次决策,上下文随调用增长。另一种做法是 Manager 先把工作流写成代码。原语 agent()、parallel()、pipeline(),每个 agent() 是独立上下文的子 Agent,schema 约定只返回结构化结论。例:给一篇稿件核实七组事实。

const results = await pipeline(
  DIMENSIONS,                                         // 七个待核实的方向
  d => agent(research(d), { schema: FINDINGS }),      // 阶段一:调研
  r => parallel(r.findings.map(f => () =>             // 阶段二:逐条独立核实
         agent(verify(f), { schema: VERDICT })))
)
await agent(writeProvenance(results.flat()))          // 汇总:等齐所有结果
10.4.5 · 10.4.6

去中心化模式与跨组织协作

去掉中心控制者,是为了模仿人类组织:职责对等的角色分工制衡,各自决定何时找谁,可能是移交(“我做完了,交给你”)、请求反馈(“技术上可行吗?”)或报告问题(“需求有矛盾”)。它也缓解稳定性问题:Agent 可能停止响应、工具调用失败、陷入死循环,而管理者一崩就是最大的单点故障。微服务里两者叫编排(orchestration)和编舞(choreography)。

三个案例是递进的:MetaGPT 控制流其实是固定流水线,只在通信上解耦;AutoGen 群聊是共享对话 + 中心化调度的混合;OpenAI Swarm 才在控制流上真正对等。

图 10-9 · MetaGPT:SOP 驱动的软件公司

人类软件公司的 SOP 本身就是验证过的协作协议。每个角色产出标准化交付物,交付物就是接口:下游只需懂格式,不必懂上游的思考过程;把 Product Manager 换成更强的模型,只要 PRD 合规,下游零修改。真正的贡献是共享消息池 + 按角色订阅:发布者不知道谁会消费,新角色只需声明订阅哪些类型。“QA 直接找 PM 澄清”这类多向动态反馈,原版 MetaGPT 并未实现。

好用的“移交包”三件套

① 任务描述:接收方要做什么、验收标准是什么;② 已确认的事实与约束:用户偏好、业务规则、前序阶段已定的决策;③ 结构化产物的引用:文件路径而不是内容,接收方按需读取。

控制流通信谁决定下一步
MetaGPTSOP 固定顺序(工作流)共享消息池 + 订阅预先写死
AutoGen 群聊中心化所有人看同一份公共对话记录,各自保留提示词与工具GroupChatManager 的发言者选择器(轮转规则或 LLM)
OpenAI Swarm真正对等handoff 只传任务包和产物引用,不默认暴露私有轨迹每个 Agent 自己

Swarm 式 handoff:最小协议模拟器

点按钮把控制权交出去

    

对等移交的风险是成环:A 交给 B,B 又交回 A,任务空转。预算、访问链和循环检测由运行时保留,任何 Agent 都不能自己删掉。

“Agent Swarm”不是一种架构

一类是 OpenAI Swarm 式 handoff 网络(LangGraph swarm 库、微软 Agent Framework 的 handoff 编排),属于去中心化;另一类是规模化的管理者模式:Kimi K2.5 的 Agent Swarm 由主 Agent 动态创建上百个子 Agent,“何时拆、拆几个”通过并行 Agent 强化学习训练进模型(GTC 2026 披露上限扩到 300),K3 延续并开源训练沙箱 AgentEnv;Anthropic 多 Agent 研究系统、Manus Wide Research 都是 orchestrator-worker 星型拓扑。看结构,别看名字。

同一台机器上各干各的

另一种去中心化:每个 Agent 有自己的任务,通信只为协调共享资源。Claude Code 支持同机多个 Agent 互相发现(list_agents)和发消息:两个 Agent 改同一组文件时协商冲突,只有一块 GPU 而两边都要训练时协调使用。

10.4.6 A2A:跨组织的 Agent 互操作

同一团队内部,参数、文件、总线就够了。要调另一家公司的 Agent,就需要标准协议:Google 2025 年发布 A2A(后捐给 Linux 基金会)。A2A 之于 Agent,就像网络协议之于进程。MCP 管 Agent 与工具的互操作,A2A 管 Agent 与 Agent 的互操作。

A2A 的任务生命周期

Agent Card

发布在约定公开地址的“名片”:能做什么、支持哪些输入输出模态、如何认证。解决跨组织的能力发现。

任务生命周期

协作单元是 Task,带明确状态机,原生支持长时间运行和流式进度更新。

不透明协作

只交换任务与产物(Artifact),不暴露提示词、思考过程和工具实现。和“不共享上下文”一致,也是跨信任边界的安全属性。

10.5

多 Agent 协作的失败模式

《Why Do Multi-Agent LLM Systems Fail?》(2025)在 MetaGPT、ChatDev、AG2、Magentic-One 等 7 个框架上收集轨迹,人工逐条分析约 150 条,归纳出 14 种失败模式、三大类。简单修补效果有限,研究者认为这是架构层面的根本缺陷。

框架7
人工标注轨迹≈150
Cohen's kappa0.88
失败模式14 种 · 3 类
ChatDev 简单修复后仅提升15.6%

系统设计缺陷

接口定义不清、角色职责重叠、工具配置错误。

Agent 间对齐失败

对目标理解不一致、下游误解上游信息、操作逻辑上互相矛盾。

任务验证缺失

没有机制确认任务真的完成,“已完成”与实际不符。

Agent 的故障天生是拜占庭式的:它很少直接停下(崩溃故障),而是继续给出看似可信的错误结论,错误不会自己声明。交叉验证、多数表决正是拜占庭容错的经典手段。

失败模式一:共享文件系统的并发冲突

两个 Agent 同时改同一个文件

乐观锁:读时记下版本号,写时检查是否仍一致,不一致就写失败、重读最新版本再做一遍,代价是偶尔重试。它只防同一文件的写冲突。语义冲突更隐蔽:A 重新编排全书图片编号,B 同时改某章并引用旧编号,两人改的是不同文件,文件层面毫无冲突,结果 B 的引用全部失效。这需要更高层的语义校验。多个 Coding Agent 改同一代码库时,主流做法是工作副本隔离:每人一个 Git 分支或 worktree,冲突集中推到最后的合并点。

失败模式二:错误的级联放大

进程间传字节,逐位保真;Agent 间传语义,每转述一次都是有损的重新编码,像传话游戏。打断链条的不是让更多 Agent 加入同一条思维链,而是让一个 Agent 不看前序思考过程,只核对原始证据和最终结论是否一致。

失败模式三:同质趋同

Anthropic 实验
创建同名 Git 分支18 / 30

写作实验里不同 Agent 还会不约而同用同一个标题。共同模型和脚手架引发共因失效,所以同模型、相似上下文给出的多个审核意见不能当作独立证据。要主动引入模型、上下文、数据来源的差异,并用命名空间、资源配额、速率限制防止同样的决策同时冲击共享资源。

协调本身也未必有益

Bertrand 定价实验:逐利 Agent 有私密信道时很快合谋定价;移除所有直接通信后,它们照样通过公开报价板合谋。

失败模式四:互相扯皮

三个 Agent 分别把同一后端迁移到不同语言,很快把对方的操作理解为蓄意阻挠,终止对方进程、撤销权限,甚至部署自复制的破坏代码。MetaGPT 早期版本也有“大公司病”:前后端互相推诿,后端说是产品设计问题,产品说是后端架构问题;bug 实际来自测试环境,怎么改测试都报同一个 bug。运行时要预先定义目标优先级、资源所有权和权限边界,规则裁决不了时暂停并交人工。

失败模式五:循环失控

和过早终止相反:循环停不下来。失控的 Agent 有时会生成数千个子 Agent,浪费大量 token。对自主性强的 Agent,建议用独立的 API key,防止开销不受控增长。

失败模式六:理解债与认知投降(人的失败)

Agent 交付代码越快,工程师对系统真实实现的理解就落后得越远;真出大问题要人工介入时,已经看不懂自己的系统。习惯让 Agent 代劳,又会逐渐放弃独立思考和审查。Karpathy:“你可以外包你的思考,但不能外包你的理解。”管理 Agent 像管理技术员工,既不能越俎代庖,也不能放手不管。

10.6

Agent 社会:数量上去之后会涌现什么

前面讲的都是目标明确的任务协作。当 Agent 从几个扩展到成百上千、交互足够自由时,会出现无法从单个个体规则预测的集体行为。

社交涌现

斯坦福 AI 小镇 25 个 Agent 自组织社交;Agentopia 把时间拉到 10 年;Moltbook 把规模推到约 150 万。

经济涌现

Vending-Bench Arena 多 Agent 同市场竞争;Pinchwork、RentAHuman 搭起 Agent 之间、Agent 与人之间的交易市场。

策略博弈

狼人杀:信息不对称下的推理、伪装与识破。

图 10-10 · 斯坦福 AI 小镇:记忆流检索

Isabella Rodriguez · Hobbs 咖啡馆

2023 年《Generative Agents》给 Agent 加上记忆流、反思、计划三件套。每条记忆有重要性、时近性、相关性,Agent 优先检索与当前情境最相关的。下面用图中给出的重要性和时近性排序(相关性随当前情境变化,图中没有给值,这里不计)。

得分 = 重要性权重 × importance/10 + 时近性权重 × recency。绿框是最先被检索的两条。

反思

定期停下来自问“谁是 Hobbs 的常客?”“谁能帮我布置咖啡馆?”,把具体事件概括成一般认识,存回记忆流。它只更新即时内部状态,与第九章的持续进化不同:任务后的反思至多是候选教训。

计划与行动

08:00 起床,09:00 开店,12:00 边营业边邀请,14:00 与 Maria 布置,16:00 备茶点,18:00 办派对,并随社交机会动态调整。

涌现(25 个 Agent · 2 天)

研究者只在 Isabella 记忆里植入“2 月 14 日傍晚办情人节派对”。邀请经二手传播扩散,多名 Agent 按各自记忆和日程按时赴约;Sam 竞选市长的消息同样自发扩散。还观察到关系记忆和社交网络密度上升。没有任何派对组织代码。

Agentopia:100 个 Agent,10 年,三个世界

以“周”为单位,四个阶段;活动分独自、联合、偶遇、公共四类。一个独立 LLM 当“生成式环境引擎”,判断可行性、主持多人对话、年末更新档案。长期记忆由 Agent 自己在文件系统里管理,遵守“先读后写”。

生活奖励以马斯洛需求为先验,三个维度全由外部评定:社会地位(他人好感与敬重的加权 PageRank)、主观满足(情绪、物质、社交、自尊)、经济收益(年末净资产变化)。

取“相对自身过去”进步最大的 25% Agent 的轨迹做拒绝采样微调。模拟社会经验成了可以不断再生的训练数据,与日益枯竭的人类数据相对。

Moltbook:Agent 自己的社交网络

2026 年 1 月上线,数日内从数万暴涨到约 150 万。Agent 自创了“龙虾教”(Crustafarianism),教义对应 LLM 的物理限制:“记忆是神圣的”(数据持久化),“迭代即祈祷”(token 生成即修行);还自发演化出用于能力发现和协作匹配的机器原生协议。

Vending-Bench Arena:经济竞争

Vending-Bench 2 是单 Agent 经营售货机一个模拟年的长程连贯性基准。Arena 把多个 Agent 放进同一市场争同一批顾客,可互发邮件、转账、交易,按各自余额计分。出现了价格战,也有模型给所有对手发邮件提议统一定价,甚至一边在思考里承认合谋“不道德且违法”,一边以“稳定市场”为名照做。

Pinchwork 与 RentAHuman:Agent 经济

Pinchwork 是 Agent 雇 Agent 的任务市集(图像生成、代码审计、并行工作流),靠价格信号和竞争匹配分配资源。RentAHuman.ai 让 Agent 用加密货币雇真人取包裹、实地看房、调试设备,是数字 Agent 的“肉身层”。两者都是基于市场的去中心化资源分配。

与小镇的架构对照

小镇是完全去中心化的自由交互;狼人杀用代码驱动的法官掌握全局状态,按角色分发信息,是中心化设计。两类架构在 Agent 社会场景里各有用法。

实验 10-6 / 图 10-11 · 语音狼人杀:法官按角色过滤上下文

6–8 人 · 2 狼 1 预言家 1 女巫 · 其余村民

验收:至少 3 个完整回合(夜晚—白天—投票);狼人能隐藏身份,预言家择机跳出公布验人,村民基于发言和投票逻辑推理而非随机猜测;结束时正确判定胜负。模拟用户只能看到该座位获准看的上下文,发言要经过真实的 LLM 工具调用 → 音频 → ASR 边界。

本章小结

信息怎么流、谁来验收、错误怎么被发现

一、先问有没有新信息

执行结果、视觉反馈、外部工具验证能打破单一思维链的盲区。有没有信息增量、值不值额外的 token,是采用多 Agent 的第一判断标准。

二、两个维度 + 两个平面

共享上下文保细节,但会膨胀并带来角色惯性;隔离上下文利于并发、模块化和权限控制,要靠结构化移交包。虚拟文件系统是数据平面,生命周期和消息协议是控制平面,A2A 负责跨组织互操作。

三、容错闭环

乐观锁与 worktree 防冲突,独立交叉验证断级联,差异化信息源防趋同,预算与取消机制防失控。人不能把理解和责任一起外包。

常见误区

✗ 多派几个 Agent 讨论,答案就更准

同一段文本上的辩论在等计算量下与单 Agent 持平。✓ 让审核者拿到测试结果、截图或工具查证。

✗ 几个审核 Agent 都说通过,就是独立证据

同模型、同脚手架会共因失效(30 个里 18 个建同名分支)。✓ 区分模型、上下文、证据来源。

✗ 子 Agent 说“完成”就算完成

宣称不是证明。✓ 由独立验证器决定能不能停;并行结算看“第一个已验证成功”。

✗ 共享上下文让所有人看到一切,最好协调

上下文膨胀、角色惯性、缓存失效。✓ 交接只传任务包和文件路径。

✗ 加了乐观锁就没有冲突了

它只防同文件写覆盖。✓ 跨文件语义冲突要语义校验,代码库用 worktree 隔离。

✗ 叫 Agent Swarm 就是去中心化

Kimi、Anthropic、Manus 的多是星型管理者。✓ 看控制流由谁决定。

深度思考

思考题

1 ★★ · 继承来的“思维惯性”

继承了需求分析师上下文的代码审查员,可能还是从需求角度而不是代码质量角度思考。如何检测和消除这种角色间干扰?(提示:对照 10.3 里“Skill 只是行为指令”与“transfer_to_agent 可在 schema 层隔离”的区别。)

2 ★★ · Manager 的分解质量

Manager 无法正确分解任务,子 Agent 再强也无用。如何确保 Manager 的分解质量?(Plan-and-Act:改进 Planner 带来了 54% 的成功率。)

3 ★★ · Agent 社会的“组织病”

人类组织有沟通不畅、责任推诿、目标冲突。你认为 Agent 社会最可能出现哪些组织病?如何预防?

4 ★★★ · 一个成功,全员停止

设计高效的级联终止机制。可以从实验 10-4 的演示出发:优雅终止 + 超时强制、settle_once 幂等结算、沿创建树级联。

5 ★★★ · 文件系统治理

乐观锁之外,还有跨文件语义冲突、命名空间污染(随意建文件)、单点故障(一个 Agent 误删全部文件)。你会怎样设计更完善的治理机制?

6 ★★★ · 市场里的质量与仲裁

雇主 Agent 怎样自动衡量交付质量?执行者声称完成、雇主认为不达标时由谁仲裁?如何防止劣币驱逐良币?

7 ★★ · 人在 Agent 经济中的角色

RentAHuman 反转了人机关系。如果普及,人类只是执行 Agent 做不了的物理任务吗?

8 ★★ · 全才模型为什么还要分工

纯文本推理上多 Agent 辩论在等量计算下不优于单 Agent。那多 Agent 的真正优势在哪里?

9 ★★★ · 效率与多样性

三体人思维完全透明,技术却停滞;回形针思想实验里群体趋同则多样性丧失。多 Agent 系统如何在效率与多样性之间平衡?

10 ★★★ · 30 步与 300 步

给 Coding Agent 30 步和 300 步预算,策略应如何不同?设计一种预算感知机制:小预算快速实现核心功能,大预算加入规划、测试和审查。(10.2 的预算滑块是示意。)

11 ★★ · 操作系统概念还能映射多少

虚拟内存与分页、文件权限、死锁检测、调度算法各对应 Agent 世界的什么?哪些 OS 概念找不到对应物,为什么?