# 多 Agent 协作

在 OpenAI 曾提出的 AI 能力五等级描述（Level 1 对话者、Level 2 思考者（Reasoners）、Level 3 智能体、Level 4 创新者、Level 5 组织 Organizations）中，多 Agent 协作常被类比为通向第五级的路径之一——需要说明的是，此处 Organizations 指的是“AI 能完成整个组织的工作”这一能力级别，而非对系统架构的要求，足够强大的单个 Agent 理论上也能达到。但就今天的工程现实而言，单个 Agent 终究受限于自身模型的能力边界和上下文窗口。

而让多个 Agent 协同工作，意义远不止让不同专长的 Agent “取长补短”。更根本的一点是：**群体的智能可以高于个体**。人类文明便是明证——单个人的智力有限，但经由分工、协作、辩论和知识的代际累积，人类社会作为整体所展现的智能，远超任何一位天才个体。Agent 群体同样可能涌现出这样的集体智能：哪怕每一个 Agent 都只相当于人类专家的水平，只要组织得当，其整体能力也可能超过所有人类专家的总和。Google DeepMind 在《从 AGI 到 ASI》中正把“大规模多 Agent 集体”列为通往超级智能（ASI）的关键路径之一——正如人类的通用智能能聚合成超越个体的社会与组织实体，众多 AGI 级 Agent 协同形成的“群体智能”，也可能表现出远超其成员简单相加的认知能力[^agi-asi]。因此，多 Agent 协作不只是突破单个模型上下文窗口与能力边界的工程手段，更可能是从“专家级 AI”迈向“超越人类整体”的一条根本路径。

[^agi-asi]: 把“大规模多 Agent 集体”列为从通用人工智能通往超级智能的关键路径之一，见 Google DeepMind, *From AGI to ASI.* arXiv:2606.12683, 2026.

## 多 Agent 协作的分类框架

要构建多 Agent 系统，首先需要理解两个核心设计维度，它们共同决定了系统的基本架构和实现方式。

### 维度一：上下文是否共享

这是最基础的架构决策，决定了多个 Agent 之间如何传递信息。

**共享上下文**意味着后一个 Agent 接收前一个 Agent 的完整对话历史和轨迹（第一章定义的 trajectory）。每个阶段切换系统提示词和工具集后，就变成了一个新的 Agent（因为它的身份、职责和能力都发生了变化），但它保留了前任的全部记忆。比如一个团队里，需求分析师写完需求文档后，开发者不仅拿到了文档，还能看到分析师与用户的所有沟通记录——他是一个新角色，但完整保留了之前的上下文。优势在于信息不丢失，每个 Agent 都能回顾之前任何阶段的细节；挑战在于上下文可能快速膨胀。

**不共享上下文**意味着每个 Agent 维护完全独立的上下文和对话历史，彼此无法直接访问对方的“思考过程”。这就像不同部门之间的协作：每个人在自己的工位上独立工作，通过共享文档和会议纪要交换信息，而不是时刻盯着别人的屏幕。这种模式的模块化和隔离性更好，每个 Agent 只需关注与自身职责相关的信息；系统也更易扩展和维护——增加新 Agent 不需要改动现有 Agent 的内部逻辑，只需定义好接口和数据格式。

由于 Agent 之间不共享上下文，必须通过显式的通信机制传递信息。常见的有三种：

- **工具调用的参数**：上游 Agent 把结构化数据作为参数传给下游 Agent 的工具，适合需要类型确定、结构清晰的场景；
- **共享文件系统**：Agent 之间通过读写共享目录下的文档、代码等中间产物来交换信息，适合产物较大或需要持久化的场景；
- **消息总线（Message Bus）**：一个专门负责在 Agent 之间传递消息的中转站，Agent 不直接调用彼此，而是把消息发送到消息总线，由它转发给目标 Agent。

消息总线天然支持**异步通信**——发送方和接收方不需要同时在线，就像公司内部的邮件系统：你发邮件给同事时不要求对方此刻在电脑前，邮件先存在服务器上，等同事上线再处理。这种方式特别适合多个 Agent 并行工作、彼此需要协调的场景（详见本章“并行协调”一节）。


![图10-1 共享上下文与不共享上下文对比](images/fig10-1.svg)


需要澄清的是，两种架构都是真正的多 Agent 系统（因为每个阶段的系统提示词和工具集不同，就是不同的 Agent），区别在于协调方式。**共享上下文**依赖隐式协调——后续 Agent 继承前序 Agent 的完整上下文历史，能“看到”之前的思考过程，信息通过上下文本身传递。**不共享上下文**依赖显式协调——Agent 之间通过文件、消息或结构化数据接口交换信息，每个 Agent 只看到与自己相关的内容。

打个比方：前者更像一个团队围坐在一张桌子旁讨论，所有人听到所有话；后者更像不同部门通过邮件和文档协作，各自有自己的工作空间。

表10-1 从子任务数量、上下文窗口、并行度、信息隔离和成本预算五个角度汇总了两种架构的选择依据，可作为早期架构选型的检查表。

表10-1 共享上下文与不共享上下文的选择依据

| 选择依据 | 共享上下文 | 不共享上下文 |
|---|---|---|
| 子任务数量 | 少（2-3 个角色） | 多（需要并行处理） |
| 上下文窗口 | 足以容纳所有角色的信息 | 单窗口装不下 |
| 并行度 | 串行为主（角色沿同一段轨迹依次接棒） | 可大规模并行（上下文互相独立，互不阻塞） |
| 信息隔离 | 不需要（所有角色共享信息） | 需要（如安全审查不应看到原始思考过程） |
| 成本预算 | 单条轨迹接力，token 随阶段累积 | 多 Agent 各自展开，总 token 通常高出数倍到一个数量级 |

**简单判断**：若预期累计上下文会超过窗口的 50%（这是一条经验法则，而非精确阈值），应不共享；若信息零损耗对任务正确性是硬约束，应共享；多数实际系统采用“阶段切换式”方案——前几个 Agent 共享，到信息饱和点后切换为不共享上下文 + 显式 handoff（移交，即由上游 Agent 主动决定把哪些信息交接给下游）。

### 维度二：协作拓扑

第二个维度是协作拓扑——Agent 之间的控制权和信息按什么结构流动。协作拓扑与上下文是否共享**概念上独立、实践中相关**：说它概念上独立，是因为共享上下文的系统同样存在拓扑，比如本章稍后介绍的 `transfer_to_agent`（实验 10-2），本质就是链式移交（handoff）在共享上下文下的形态；说它实践中相关，是因为一旦共享上下文，拓扑往往会退化（见下文），两个维度的取值并非可以随意组合。只不过在共享上下文时，移交无需决定“传什么”——完整历史天然保留——拓扑因此通常退化为一条角色切换的序列，没有太多架构决策可做（一个介于两者之间的例外是 group chat 式的多方协作，见本章后文去中心化一节）。而一旦选择不共享上下文，“信息如何流动、由谁协调”就成为必须显式设计的问题。

换句话说，这两个维度原则上构成一个 2×3 的组合矩阵（共享/不共享 × 三种拓扑），但共享上下文这一行里，拓扑大多退化为一条角色切换序列、没有多少架构决策可做（这正是后文“多阶段角色转换”所讨论的形态），因此本章只详细展开不共享上下文的三格。下面介绍的就是协作拓扑在不共享上下文时的三种典型形态，按复杂度递增：

- **对等协作模式**（Peer Collaboration Pattern）：少量 Agent（通常 2-3 个）以平等身份交互，形成迭代改进循环——就像写论文时一个人起草、另一个人批注修改，反复几轮后质量远超一个人闷头写。
- **管理者模式**（Orchestration Pattern）：一个中心化的 Manager Agent 负责任务规划和调度，多个子 Agent 各负责特定子任务——就像项目经理带着几位专业工程师做项目。
- **去中心化模式**（Decentralized Pattern）：没有运行时的中心控制者，Agent 之间像人类一样互相沟通，协作完成任务。

各模式的详细设计和适用场景将在后面的专题小节中展开讨论。

## 多 Agent 何时真正优于单 Agent

在进入具体的协作架构之前，先回答一个更根本的问题：**什么时候真正需要多个 Agent，什么时候一个 Agent 就够了？** 这个问题的答案会成为后文所有工程方案的总体参照。近年的一系列研究给出了一个清晰的判断框架——核心判据只有一条：**协作过程是否引入了单个 Agent 在生成时无法获得的新信息？**

表10-2 汇总了不同协作模式是否引入新信息，用来判断多 Agent 协作相对单 Agent 是否具有实质价值。

表10-2 多 Agent 协作模式的信息增量对比

| 协作模式 | 是否引入新信息 | 效果 |
|---|---|---|
| 同一模型自我审查（重新阅读自己的输出） | 否 | 通常无效甚至有害 |
| 不同 Agent 辩论同一段文本 | 否 | 在等计算量下与单 Agent 持平 |
| Reviewer 使用测试执行结果审查代码 | 是（执行反馈） | 显著提升 |
| Reviewer 查看渲染截图审查前端/PPT 代码 | 是（视觉反馈） | 显著提升 |
| Reviewer 使用外部工具验证事实 | 是（工具反馈） | 显著提升 |

2025 年的 RLEF（Reinforcement Learning from Execution Feedback）[^rlef-2025] 证实了这一点：通过强化学习训练模型利用代码执行反馈来迭代改进代码，效果远超让模型独立多次采样。关键在于每次迭代都引入了**真实的执行结果**（编译错误、测试失败、运行时异常），这些信息在模型写代码时并不存在。2025 年的 WebGen-Agent [^webgen-agent-2025] 在网页生成任务上，通过多层级的视觉反馈（截图 + 视觉语言模型描述）构成的反馈脚手架，据报道使 Claude 3.5 Sonnet 在该基准上的表现从 26.4% 提升到 51.9%——接近翻倍。

[^rlef-2025]: Gehring, J., et al. *RLEF: Grounding Code LLMs in Execution Feedback with Reinforcement Learning.* arXiv:2410.02089, 2025.
[^webgen-agent-2025]: Lu, Z., et al. *WebGen-Agent: Enhancing Interactive Website Generation with Multi-Level Feedback and Step-Level Reinforcement Learning.* arXiv:2509.22644, 2025.

这个“新信息”框架解释了一个看似矛盾的现象：学术研究说“单 Agent 就够了”，但工程实践中多 Agent 确实效果更好。矛盾的根源在于两者讨论的是不同类型的“多 Agent”——学术研究中比较的多是“多个 Agent 看着同一段文本互相讨论”的模式（如辩论），而工程实践中有效的多 Agent 系统往往包含外部反馈环路（代码执行、视觉渲染、工具调用）。前者没有引入新信息，后者引入了。本章后面介绍的对等协作、管理者、去中心化三种架构，凡是真正有效的用法，几乎都能在这条判据上找到落点。

**步骤预算与 Agent 性能。** 一个相关的研究方向是：给 Agent 分配不同的步骤预算（即允许的工具调用次数或迭代轮数），会如何影响其表现？直觉上，更多步骤应该带来更好的结果——30 步预算下 Agent 只能快速实现核心功能，300 步预算下它还可以先做规划、再实现、再测试、再改进。但 2025 年 Google 的论文《Budget-Aware Tool-Use Enables Effective Agent Scaling》发现了一个反直觉的结论：**单纯增加 Agent 可用的步骤数并不能保证性能提升**。标准的 Agent 缺乏“预算意识”——即使有 300 步的预算，它们仍然倾向于执行浅层搜索，很快就“饱和”了。要让更多的步骤真正转化为更好的结果，Agent 需要一种显式的预算感知机制，根据剩余资源动态调整策略：前期广泛探索，后期聚焦最有希望的方向。2026 年的 BAVT（Budget-Aware Value Tree Search）进一步提出了步骤级别的价值评估，在每一步根据剩余预算比例调整探索与利用的权重——随着预算减少，Agent 从“广撒网”逐渐切换到“深挖掘”。

这些发现对多 Agent 系统设计有直接的指导意义。比如在管理者模式中，Manager Agent 不应只是简单地将任务分发给子 Agent 然后等待结果，而应该根据任务的复杂度**动态分配步骤预算**——简单子任务给较少的步骤，复杂子任务给充足的步骤。同时还要引导子 Agent 合理利用这些预算（先规划、再实现、再测试、再改进），而不是一头扎进去直接开干。

还有一件事必须摆在所有设计之前：**成本**。多 Agent 的并行探索与反复迭代都要花钱——Anthropic 曾披露，其多 Agent 研究系统的 token 消耗约为普通对话的 15 倍，而 token 用量本身就能解释其中约 80% 的性能差异。这意味着多 Agent 的效果收益必须足够大，大到能覆盖数倍乃至一个数量级的额外开销，否则一个调校得当的单 Agent 往往是更划算的选择。

## 共享上下文的多 Agent 协作

共享上下文的多 Agent 协作中，每个阶段都是一个独立的 Agent（拥有自己的系统提示词和工具集），但它继承了前序 Agent 的完整轨迹——就像接班的同事能翻阅前任留下的所有工作日志。这种“继承式协作”的核心优势在于信息零损耗，每个 Agent 都能回顾之前任何阶段的细节。挑战则在于如何让当前 Agent 专注于自己的核心职责，而不被继承来的大量历史信息所干扰。

### 多阶段角色转换

先把一个定义之争摆到明处：用第一章的语言说，多阶段角色转换是一种**工作流式的编排**——执行路径（例如需求澄清→实现→审查）是预先定义的。本章之所以把它放进多 Agent 的框架下重新审视，是从 Agent 身份与上下文的角度：当每个阶段的系统提示词、工具集、关注点都不同时，把它们看作多个 Agent 共享同一段轨迹，能带来实际的设计收益——每个“身份”的提示词和工具集可以独立打磨，阶段边界也天然成为质量门控点。需要说明的是，业界也有相当一部分观点将这种阶段化角色切换视为单 Agent 的工作流（动态提示词的编排），而非真正的多 Agent——因此把它归入多 Agent 是本书出于设计视角的有意选择，而非公认结论。

在复杂任务中，Agent 的角色和职责可能在不同阶段发生显著变化。如果始终使用同一套静态系统提示词，要么过于笼统缺乏针对性，要么把所有阶段的指导塞在一起导致过于冗长。多阶段角色转换的做法是：根据当前阶段动态切换系统提示词和工具集，让 Agent 在每个阶段都以最合适的“身份”工作。这种转换不需要创建新实例或启动新进程，只是在同一执行会话中更新上下文。关键在于，虽然角色切换了，但对话历史和任务状态始终连续共享——Agent 在新角色下仍能访问之前阶段积累的所有信息。


![图10-2 基于阶段的角色切换](images/fig10-2.svg)


> **实验 10-1 ★★：根据执行阶段决定系统提示词**
>
> 本实验通过一个 Coding Agent 的完整工作流程，展示阶段化系统提示词如何提升 Agent 的表现。
>
> **任务场景**：用户提出一个软件开发需求，Agent 依次经历三个阶段：需求澄清、代码实现、质量审查。
>
> **第一阶段：需求澄清**（角色：需求分析师）
>
> 系统提示词强调：
> - “你的职责是充分理解用户的需求。通过提出问题来澄清模糊的地方，确保你完全理解用户期望的功能、使用场景、性能要求。”
> - “不要急于实现。在这个阶段，你的任务是提问和确认，而不是编写代码。”
> - “当你确认所有关键需求都已明确后，调用 `complete_requirements_analysis()` 工具来结束这个阶段。”
>
> 工具集有限：`ask_clarifying_question(question)` 用于向用户提出澄清问题，`save_requirement(key, value)` 用于记录确认的需求点，`complete_requirements_analysis()` 用于标记阶段完成。
>
> Agent 与用户展开多轮对话：“这个脚本需要处理哪些类型的文件？”“要不要递归处理子文件夹？”“文件移动后是否保留原文件名？”通过这些问题，Agent 逐步建立起完整的需求理解并结构化保存。当 Agent 判断需求已经足够清晰时，调用 `complete_requirements_analysis()` 触发角色转换——系统检测到阶段完成信号，自动切换到下一阶段的配置。
>
> **第二阶段：代码实现**（角色：软件工程师）
>
> 新的系统提示词强调：
> - “你的职责是根据已确认的需求，编写高质量的 Python 代码。”
> - “遵循最佳实践：代码应该模块化、有适当的错误处理、包含必要的注释。”
> - “完成代码编写并通过基本测试后，调用 `submit_for_review()` 进入审查阶段。”
>
> 工具集发生了显著变化：之前的需求澄清工具被移除，取而代之的是 `write_file(path, content)`、`read_file(path)`、`execute_code(code)` 等开发工具。Agent 基于第一阶段保存的需求开始编写代码——先写主要逻辑，再添加错误处理，最后编写测试验证。整个过程中 Agent 仍可访问第一阶段的对话历史来回顾需求细节，但行为模式已截然不同：不再提问，专注于实现。完成后调用 `submit_for_review()`。
>
> **第三阶段：代码审查**（角色：代码审查员）
>
> 新的系统提示词强调：
> - “你的职责是审查刚才编写的代码，从多个维度评估其质量：功能正确性、代码规范、错误处理、性能优化、安全性。”
> - “采用批判性思维，尝试找出代码中可能存在的问题和改进空间。”
> - “发现严重问题调用 `request_revision(issues)` 返回实现阶段修改；质量可接受调用 `approve_code()` 完成任务。”
>
> 工具集再次变化：换成了 `run_linter(file)`、`run_tests(file)`、`analyze_complexity(file)` 等代码质量分析工具。Agent 以审查者的视角重新审视代码，运行静态分析，排查潜在的 bug、性能问题或安全隐患。
>
> 这种三阶段设计让 Agent 在每个阶段都能专注于当前核心任务。更重要的是，明确的阶段转换机制保证了任务执行的完整性——Agent 不会跳过需求分析直接写代码，也不会在未经审查的情况下就交付成果。
>
> **实验要求**：
> 1. 实现三阶段系统提示词，每阶段有明确角色定义和行为指导
> 2. 为每阶段配置匹配的工具集
> 3. 实现阶段转换触发机制（通过特定工具调用）
> 4. 确保上下文在阶段间的连续性
> 5. 处理回退情况——代码审查发现问题时能返回实现阶段
> 6. 记录每阶段执行日志，展示不同提示词如何产生不同行为模式
>
### 跨领域角色转换

前面的多阶段角色转换展示的是单一任务类型（软件开发）中的阶段化执行。跨领域角色转换则进一步探索 Agent 在多种任务类型之间的自主切换——不再是预先规划好的线性流程，而是根据用户需求的变化，由 Agent 自主判断应该切换到哪个专业角色。

> **实验 10-2 ★★：多角色转换**
>
> **前置要求**：建议先了解第二章 Agent Skills 机制。
>
> **系统架构**：五种专业角色——
>
> - **Customer Service Agent**：客户服务和问题解答，熟悉产品信息、退换货政策
> - **Coding Agent**：编程任务，编写、调试、优化代码
> - **Deep Research Agent**：深度研究，收集信息、分析数据、生成报告
> - **Image Generation Agent**：图像创作，理解视觉需求并生成图像
> - **General Agent**：通用角色，处理日常对话和简单任务
>
> **核心机制：transfer_to_agent 工具**
>
> 所有角色都配备了 `transfer_to_agent(target_role, reason)` 工具。调用时系统会依次：1）保存当前对话历史；2）加载目标角色的提示词和工具集；3）将对话历史传递给新角色，使其理解上下文；4）以新角色身份继续执行。
>
> **实验场景**：系统默认以 General Agent 身份运行。用户说：“我想写一个 Python 脚本来分析 CSV 文件。”General Agent 识别出这是编程任务：
>
> ```python
> transfer_to_agent(target_role="coding", reason="用户请求编写 Python 脚本，这是编程任务")
> ```
>
> Coding Agent 能看到之前的对话，着手编写 CSV 分析脚本。任务完成后，用户接着请求调研技术趋势：
>
> ```python
> transfer_to_agent(target_role="research", reason="用户需要调研技术趋势，这是研究任务")
> ```
>
> Research Agent 看到完整的对话历史，知道用户刚做过 CSV 分析，于是聚焦在相关的技术趋势上展开调研。
>
> 角色转换的决策依赖系统提示词的指导。General Agent 的提示词里明确列出了路由规则：编程任务转 Coding Agent，深度调研转 Research Agent，图像创作转 Image Generation Agent，产品咨询转 Customer Service Agent。判断标准很简单：任务需要特定领域的深度知识或专业工具，就应该转交给对应的专业角色。专业 Agent 的提示词中同样指导了何时需要转回或转向其他 Agent。
>
> **实验要求**：
> 1. 实现至少三种专业角色的系统提示词和专门工具集
> 2. 实现 `transfer_to_agent` 工具，支持动态切换
> 3. 确保角色切换后上下文连续性
> 4. 处理循环切换问题——避免 Agent 在角色之间反复切换
> 5. 设计跨越多个领域的复杂任务流程，展示角色转换价值
>
## 不共享上下文的多 Agent 协作

不共享上下文代表真正的多 Agent 协作。在这种架构下，每个 Agent 都是独立的实体，拥有自己的上下文、轨迹和状态。Agent 之间无法直接访问彼此的“内心活动”，协作完全依赖明确的、结构化的数据传递机制，也就是本章开头介绍的三种通信机制（工具调用参数、共享文件系统、消息总线）。

这种隔离带来了几个切实的工程好处：每个 Agent 可以独立开发和测试，新增能力不需要改动现有代码，某个 Agent 出了故障也不会把错误状态传染给其他 Agent，而且多个 Agent 可以真正并发执行——上下文完全独立，不存在资源竞争。

但不共享上下文也有代价。最明显的是信息同步问题：各 Agent 如何对任务状态保持一致的理解？信息在传递过程中会不会丢失或重复？调试也变得更加困难——出了问题需要翻看多个 Agent 的日志，才能拼出完整的执行过程。这些问题使得接口规范、数据格式和通信协议的设计变得至关重要。

不共享上下文的显式协作依赖两套与拓扑无关的基础设施。其一是**共享文件系统**，作为 Agent 间交换产物、与用户交换文件的持久媒介，构成协作的数据平面；其二是**通信与控制机制**，支持 Agent 间的消息传递、状态查询与执行终止，构成协作的控制平面。以下三种拓扑均建立在这两者之上。

### Agent 眼中的文件系统

本章开头将“共享文件系统”列为不共享上下文的三种通信机制之一。在实际系统中，Agent 访问的并非单一存储，而是一个**虚拟文件系统**（virtual filesystem）：来源、生命周期与权限各异的存储被挂载（mount）到同一目录树下，Agent 通过统一的 `read_file`/`write_file`/`list_dir` 接口访问，底层则可能是本地临时盘、持久对象存储、第三方云盘的 API 或只读的系统资源包。明确这棵目录树的构成——每一区域的可见性与生命周期——是多 Agent 协作设计的前提：相当一部分并发冲突与信息泄露，源于将本应隔离的区域混置。一个成熟的多 Agent 系统，其文件系统通常由以下四类区域构成：

**一、Agent 专属工作区（Scratchpad）**。每个 Agent 实例独享的私有目录，存放中间产物、临时文件、草稿与调试日志，生命周期与实例绑定，对其他 Agent 和用户不可见。隔离 scratchpad 有两重作用：避免多个 Agent 的临时文件相互覆盖，以及保持主 Agent 上下文的精简——子 Agent 的试错过程留存于自身工作区，仅将最终产物提交至共享空间。这对应第四章“子 Agent 返回结构化摘要而非全量轨迹”在存储层面的体现。

**二、多 Agent 共享空间（Shared Workspace）**。多个 Agent 共同读写、且**用户可见**的协作区域，是不共享上下文架构下 Agent 间交换产物的主要媒介：Glossary Agent 写入术语表，Translation Agent 从中读取；用户亦可在此上传原始文件、下载最终交付物。其生命周期与整个任务绑定，需要持久化。作为多方并发读写的区域，它是并发冲突的高发处——乐观锁、工作副本隔离（worktree）等机制均作用于此，详见本章后文“失败模式一”。第四章以卷挂载 `/workspace/shared` 连接主 Agent、虚拟电脑与虚拟手机，即为这一层的典型实现。

**三、外部挂载资源（Mounted External Resources）**。用户授权接入的第三方信息源——Google Drive、Notion、Dropbox、企业 Wiki 等——通过适配器（adapter）映射为文件系统中的挂载点（如 `/mnt/gdrive`）。Agent 以读文件的方式访问一篇 Notion 文档，底层由适配器调用对方 API 完成。这一层区别于本地存储的三个特性需在设计时显式处理：**访问受外部权限约束**（用户在源系统中的权限决定 Agent 的可见范围）、**延迟更高且一致性更弱**（每次读取为一次网络往返，且数据可能已被外部修改）、**以按需只读为主**（写回外部源须谨慎，误写可能污染用户的真实数据）。统一的文件接口使 Agent 无需为每个数据源定制专用工具，但也掩盖了上述性能与安全差异，因此需在挂载层面显式管理只读/可写、超时与凭证边界。

**四、系统内置资源（Built-in System Resources）**。系统预置、对所有 Agent 只读共享的资源包，典型代表是第二章、第四章介绍的 **Skills**——以文件形式组织的知识文档与脚本，挂载于 `/skills` 等路径，按渐进式披露（先索引、后按需展开）取用；此外还包括参考手册、模板库与共享工具定义。该层全局共享、只读、跨会话稳定，可被所有 Agent 并发读取而无需并发控制。

图10-3 呈现了这四类区域统一挂载于同一目录树的结构：Agent 通过统一接口访问整棵树，用户从共享空间上传与下载文件，外部数据源经适配器挂载，系统内置资源则以只读方式提供。


![图10-3 Agent 虚拟文件系统的四类区域挂载结构](images/fig10-3.svg)


表10-3 从可见性、生命周期、读写权限与并发控制四个维度对比这四类区域，可作为文件系统布局设计的检查表。

表10-3 Agent 虚拟文件系统的四类区域

| 区域 | 可见性 | 生命周期 | 读写 | 并发控制 |
|---|---|---|---|---|
| Agent 专属工作区 | 仅该 Agent | 随 Agent 实例销毁 | 读写 | 不需要（私有） |
| 多 Agent 共享空间 | 所有协作 Agent + 用户 | 随任务持续，需持久化 | 读写 | 需要（乐观锁 / worktree） |
| 外部挂载资源 | 视外部授权而定 | 由外部源决定 | 多为只读，写需谨慎 | 由外部源负责 |
| 系统内置资源 | 所有 Agent | 跨会话稳定 | 只读 | 不需要（只读） |

将四类区域统一至同一目录树，正是“**文件路径作为通用接口**”这一设计的价值所在：Agent 间传递产物、主 Agent 向子 Agent 交接输入、乃至跨组织 A2A 协作交换 Artifact，传递的均为轻量的路径字符串，而非将内容载入上下文窗口（第四章）。这与第五章“文件系统作为 Agent 的中枢”一脉相承——后者讨论单 Agent 如何以文件系统承载记忆与能力，此处则将同一抽象扩展至多 Agent：一棵挂载了私有、共享、外部、内置四类存储的虚拟目录树，即多 Agent 协作的存储底座。

### Agent 间的通信与控制

文件系统解决 Agent 间**产物交换**的问题，协作还需一条**控制平面**：支持 Agent 间的消息传递、状态查询与执行终止。第四章已给出该平面的工具原语——创建（`spawn_subagent`）、发消息（`send_message_to_subagent`）、取消（`cancel_subagent`）——及同步/异步/流式/多轮四种协作形态。本节不重复接口定义，而聚焦多 Agent 协作依赖、却常被忽略的三项能力。

**一、消息传递。** 最简形态为点对点：Agent A 直接调用 `send_message_to_agent_b(content)`，适用于拓扑固定、Agent 数量少的场景（如本章实验 10-4 的电话 + 电脑双 Agent）。当 Agent 数量增多且需异步并行时，点对点连接数随 Agent 数呈平方增长，且要求收发双方同时在线；此时应改用**消息总线**（详见本章后文“并行协调形态”）：Agent 将消息发布至总线，由总线按订阅关系转发，发送方无需知晓消费者。无论点对点还是经总线，消息通常应携带结构化的**信封**（envelope）：发送者 ID、目标（指定 Agent 或广播）、消息类型（如 `task_assigned`/`status_update`/`result`/`terminate`）及 JSON 负载。统一的信封格式保证接收方可靠地路由与解析，并使协作链路可追溯——这是多 Agent 系统调试的关键。

**二、状态查询。** 这是控制平面中最易被低估的一环。主 Agent 派出子 Agent 后，若无从获知其进展，则既无法判断是否继续等待，也无法在其阻塞时及时介入。状态获取有两种范式。**拉取（pull）**：主 Agent 调用 `get_subagent_status(agent_id)`，返回子 Agent 的当前状态（运行中/等待输入/已完成/失败）、进度及最近活动时间。**推送（push）**：子 Agent 在执行中主动向消息总线上报状态更新，主 Agent 维护一张任务状态表实时刷新（本章实验 10-6 的“实时监控”即此范式）。二者各有取舍：拉取实现简单，但轮询过密浪费 token、过疏则不及时；推送实时性好，但依赖子 Agent 自觉上报。工程上常将子 Agent 状态建模为**状态机**（已提交、执行中、需要输入、已完成、失败），本章后文的 A2A 协议即将任务生命周期标准化为此类状态。此外还需**超时与心跳检测**作为兜底（呼应第四章的 Heartbeat 与 monitor_shell）：即便子 Agent 既不上报也不返回，主 Agent 亦可依“超过 N 分钟无活动即判失败”避免系统被阻塞的子 Agent 拖累。

**三、执行终止。** 并行协作中常出现“一者成功、余者失效”的情形——多个 Agent 分头搜索，一者命中目标后其余应立即停止（本章实验 10-6 的级联终止）。终止有两种强度。**优雅终止（graceful）**为首选：主 Agent 发出 `terminate` 信号，子 Agent 在当前步骤的安全点响应，先清理资源（关闭浏览器会话、写入未完成文件、释放锁），返回确认（ack）后退出。**强制终止（forced）**为兜底：直接终止进程，仅在子 Agent 对优雅信号无响应时使用，代价是可能遗留悬挂资源与未完成写入。两个工程要点需处理：其一，优雅终止要求子 Agent 在循环中定期检查终止信号（类似第四章的中断机制），否则信号无从被响应；其二，级联终止存在竞态——多个子 Agent 可能近乎同时上报成功，主 Agent 须以锁或幂等设计保证仅结算一次、仅广播一轮终止，详见本章实验 10-6 对竞态条件的讨论。

产物交换（数据平面）与消息传递、状态查询、执行终止（控制平面）共同支撑起不共享上下文的多 Agent 系统。以下三种协作拓扑，本质上都是在这两个平面之上，对控制权归属与信息流向做出的不同选择。

根据 Agent 之间的协作关系和控制流特征，不共享上下文的协作可以分为三种主要架构：对等协作模式、管理者模式、去中心化模式，分别适用于不同类型的任务。

### 对等协作模式：相互制衡与迭代改进

对等协作通常涉及 2-3 个平等身份的 Agent，通过多轮迭代互相提供反馈。核心价值在于引入认知多样性——不同 Agent 从不同角度审视同一个问题，在创新与稳健之间取得平衡，产出比任何单一 Agent 都更优质的结果。

相比管理者和去中心化模式，对等协作的实现复杂度低得多——只需定义好两个 Agent 的角色、通信机制和迭代终止条件，就可以跑起来。是快速验证想法、构建原型的理想选择。

**提议者-审核者范式。**


![图10-4 提议者-审核者循环](images/fig10-4.svg)


提议者-审核者是最经典的对等协作范式。第五章已经在 PPT 生成、视频编辑和日志可视化三个实验中详细介绍了这一范式的设计原则和实战应用：Proposer Agent 负责生成代码，Reviewer Agent 渲染执行结果并用 Vision LLM 评估质量、给出结构化改进建议，两者反复迭代直到效果达标。

这一范式同样适用于安全审查（Proposer 生成操作方案，Reviewer 检查合规性和潜在风险）、内容审核（Proposer 起草回复，Reviewer 检查业务规则和用语规范）、代码审核（Proposer 编写代码，Reviewer 检查安全性和最佳实践）等场景。

**为什么不能让一个 Agent 自己生成再自己审查？** 这正是前面“多 Agent 何时真正优于单 Agent”一节那条判据的具体落点——审查若不引入新信息，就只是“让模型再想一遍”。相关研究对此给出了明确的答案。Huang 等人在 ICLR 2024 论文《Large Language Models Cannot Self-Correct Reasoning Yet》中发现：让 GPT-4 在没有外部反馈的情况下审查并修正自己的回答，准确率反而下降——模型把正确答案改错的次数比把错误答案改对的次数更多。

2024 年发表在 TACL 期刊上的综述论文《When Can LLMs Actually Correct Their Own Mistakes?》（arXiv:2406.01297）进一步确认了这一结论：除非提供可靠的外部反馈（如测试用例的执行结果、外部工具的验证输出），否则纯粹依赖模型自身的“自我纠正”几乎不起作用。

ICLR 2024 的 CRITIC 论文提供了一个直观的对比实验。CRITIC 让模型使用外部工具（搜索引擎、Python 解释器）来验证自己的回答，效果显著提升；但当实验者移除工具验证步骤、只保留模型的自我评估时，大部分提升就消失了。这说明审查的价值不在于“让模型再想一遍”，而在于**引入了模型生成时不具备的新信息**——测试结果、渲染截图、编译错误、外部搜索结果。

这正是提议者-审核者范式的核心设计原理。在第五章的 PPT 生成实验中，Reviewer Agent 的价值不是“用同一个模型再看一遍代码”，而是**渲染了 PPT 并截取了屏幕截图**——这张截图包含了 Proposer Agent 在生成代码时完全无法获得的视觉信息。同理，在代码生成场景中，执行测试用例产生的通过/失败结果，也是编写代码时并不存在的新信号——Reviewer 的独立价值正来源于它能接触到 Proposer 无法获得的这些外部反馈。

**扩展：其他对等协作模式。**

**Debate（辩论）**：多个 Agent 各持不同立场，通过对抗性对话深入探索问题空间。比如评估一个技术方案时，Agent A 扮演“支持者”列举方案优势和机会，Agent B 扮演“反对者”指出风险和局限，每轮辩论都针对对方的论点提出反驳或补充。单一 Agent 分析时，模型往往倾向某个观点而忽视反面证据；辩论模式则通过制度化的对抗，确保正反两面都得到充分论证，帮助决策者做出更平衡的判断。

不过，辩论模式的实际效果在学术界仍有争议。2026 年 Tran 与 Kiela 的研究 [^single-agent-2026] 在多跳推理任务上对比了单 Agent 与五种多 Agent 架构（顺序、辩论、集成、并行角色、子任务并行），发现**当思考 token 预算被严格控制为相同时，单 Agent 的表现与多 Agent 持平甚至更好**（除非上下文利用率被削弱到某个程度）。研究者基于信息论中的数据处理不等式给出了解释：辩论中的多个 Agent 处理的是完全相同的文本信息，Agent 之间每一次串行传递中间结论都只可能丢失信息、不可能凭空创造信息。辩论模式在一些学术论文中的收益很可能来源于多个 Agent 消耗了更多的总计算量。需要划清这个论证的边界：它针对的是“多 Agent 串行传递中间结论”造成的信息瓶颈，并不否定另一类做法——对同一问题**多次独立采样再聚合**（如 self-consistency、多数投票），或利用**生成与验证的难度不对称**（写出答案难、检验答案易）来做生成-验证分工。这些场景要么引入了额外的独立采样、要么利用了任务本身的不对称结构，都不在数据处理不等式的适用范围内。

[^single-agent-2026]: Tran, D., Kiela, D. *Single-Agent LLMs Outperform Multi-Agent Systems on Multi-Hop Reasoning Under Equal Thinking Token Budgets.* arXiv:2604.02460, 2026.

**Brainstorm（头脑风暴）**：多个 Agent 独立生成创意，然后相互分享、彼此启发。比如在产品创新任务中，Agent 1 提出“增加社交分享功能”，Agent 2 受启发提出“不仅分享到社交网络，还可以生成个性化分享海报”，Agent 3 综合前两者提出“用户自定义海报模板并形成模板市场”。不同 Agent 拥有不同的“思维偏好”（通过不同提示词或模型实现），通过相互激发来探索更广阔的解空间，找到单一 Agent 难以想到的创意组合。

**Panel Discussion（专家小组）**：多个 Agent 各自代表一个专业领域的视角，共同讨论跨学科问题。比如评估新产品的可行性时，工程师 Agent 从技术角度分析实现难度，产品 Agent 从用户体验角度评估市场吸引力，运营 Agent 从成本和资源角度分析商业可行性。这些 Agent 之间不是对抗关系，而是互补关系，共同拼出问题的全貌，识别跨领域的约束和机会。

### 管理者模式：中心化协调

当任务涉及五个以上子任务、需要动态调度、或者子任务之间存在复杂依赖时，对等协作就力不从心了，需要引入管理者模式。Manager Agent 的职责就像一个项目经理：先理解整体任务，再拆解为可分配的子任务，选择合适的 Agent 去执行，跟踪进度并处理异常（重试、换 Agent、调整计划），最后把各 Agent 的输出整合为最终结果。

从系统设计角度看，管理者模式把每个专门 Agent 建模为 Manager 可调用的工具。Manager 的工具集中不仅有传统的外部工具（如搜索、文件操作），还包含其他 Agent 的调用接口。Manager 通过工具调用机制启动相应 Agent，传递任务参数和必要上下文，等待完成后接收返回结果。从 Manager 的视角看，调用一个 Agent 和调用一个普通工具没有本质区别——都是发出请求、获得响应。这种统一抽象赋予了管理者模式良好的可扩展性——新增能力只需开发对应 Agent 并注册为工具，Manager 的核心逻辑无需修改。同时它天然支持异构性——不同 Agent 可以用不同的模型、提示词、工具集，甚至运行在不同的硬件环境上。

“Agent 互为工具”的抽象在第四章“协作工具”一节已经建立：spawn_subagent / send_message / cancel_subagent 的接口设计，以及子 Agent 上下文准备的四种策略（最小化传递、手动筛选、自动裁剪、LLM 生成上下文），都直接适用于这里的 Manager 对子 Agent 的调用。第四章解决的是“Manager → 子 Agent”方向传什么；对称的问题是“子 Agent → Manager”方向返回什么。答案是**结构化摘要而非全量轨迹**：子 Agent 应返回任务结论、关键发现、产物的文件路径和遇到的问题，把完整执行轨迹留在自己的日志里。只有这样，Manager 的上下文才能随子任务数量缓慢线性增长，而不是爆炸式膨胀——这也是下文实验 10-3 中 Manager“只维护文件索引、不保存翻译内容”的方法论依据。两章的分工是：第四章讲机制（工具接口与上下文传递的实现），本章讲架构（拓扑结构与职责如何划分）。

但管理者模式也有固有的挑战。Manager 成为系统的单点瓶颈——它必须理解所有子任务的性质，选择正确的 Agent，准确传递上下文，任何决策偏差都会影响整体流程。此外，Manager 需要维护整个任务的全局上下文，随着任务深入和 Agent 调用增多，上下文可能快速膨胀。因此需要特别注意 Manager 的提示词质量、上下文管理策略和合理的任务分解粒度。

2025 年的 Plan-and-Act 论文 [^plan-and-act-2025] 对此做了实证分析：在 Planner-Executor 双 Agent 架构中，**弱规划者是整个系统最关键的瓶颈**。当 Planner 的规划质量足够高时，即使 Executor 比较简单也能取得好结果；反之，如果 Planner 的任务分解有误，后续所有 Executor 的工作都建立在错误的前提上。该研究在 WebArena-Lite 基准上取得了 54% 的成功率，核心贡献正是改善了 Planner 的规划能力，而非 Executor 的执行能力。这一发现的启示是：应当将最强的模型和最精心设计的提示词分配给 Manager（规划者），而不是将资源平均分配给所有 Agent。

这与第四章的一个论点并不冲突。第四章在讨论提议模型与审核模型时指出，两者的能力应当相近——但那说的是**审查场景**：审查者必须跟得上被审者的推理，才可能发现其中的破绽，能力落差太大就根本审不动。而管理者模式讨论的是另一件事——**规划与执行的分工**：规划者一旦把任务分解错，执行者再强也无从补救，所以最强的模型和最精心的提示词应当优先给规划者。至于执行者之间要不要均衡，我倾向于认为取决于子任务的耦合程度——当多个执行者的产物最终要拼装成一个整体时，最弱的一环往往会拖累整体质量；但这更像一条工程经验，而非有定论的规律。

[^plan-and-act-2025]: Erdogan, L. E., et al. *Plan-and-Act: Improving Planning of Agents for Long-Horizon Tasks.* arXiv:2503.09572, 2025.

**顺序协调形态。**


![图10-5 Manager 顺序协调](images/fig10-5.svg)


Manager 按顺序依次调用专门 Agent，每个 Agent 完成后返回结果，Manager 再决定下一步。控制流是线性的，简单明了，适合子任务之间有清晰先后依赖的场景。

> **实验 10-3 ★★：书籍翻译 Agent**
>
> 书籍翻译是一个典型的需要多 Agent 协作的复杂任务。翻译一本技术书籍，不仅仅是把文字从一种语言转换为另一种语言，更需要保证专业术语全书一致、语境准确、整体阅读流畅。比如翻译一本大语言模型相关的英文书，大量术语会反复出现，可能有多种约定俗成的说法，必须全书统一——第一章把 agent 译为“智能体”，后面就不能改成“代理”。
>
> 如果用单一 Agent 来做，会面临严重的上下文问题。随着 Agent 逐章处理内容，上下文不断累积：全书术语表、已翻译章节、当前段落、翻译思考过程、工具调用结果。一本几百页的技术书籍加上翻译中间产物，很容易超出上下文窗口。更严重的是，在过长的上下文中 Agent 容易“迷失”——忘记之前的术语约定，到第八章用了与第二章不一致的译法；审校阶段重复检查浪费资源；甚至因注意力分散而产生幻觉，“记起”实际上并不存在的术语规则。
>
> 管理者模式通过任务分解和责任分离来解决这些问题：
>
> - **Glossary Agent**（术语对照表 Agent）：接收全书内容，识别重复出现的专业术语，搜索专业词典和翻译规范，生成结构化术语对照表（JSON/CSV 格式，包含英文术语、中文翻译、词性、使用语境）。完成后写入共享文件系统，Agent 即可销毁释放资源
> - **Translation Agent**（章节翻译 Agent）：接收当前章节、术语对照表和翻译指南（目标读者水平、语言风格），翻译为流畅的中文。遇到对照表中的术语严格使用规定译法，遇到新术语则推断翻译并标记为待审查。每个实例在独立上下文中工作，互不干扰。译文写入文件系统（如 `chapter1_zh.md`）。Manager 可并行或串行启动多个实例
> - **Proofreading Agent**（全文审校 Agent）：接收所有译文和术语表，执行一致性检查——逐一验证术语翻译是否统一、识别前后不一致之处、检查整体流畅性和可读性。生成审校报告写入文件系统
> - **Manager Agent**：上下文中主要保存任务描述、执行计划、各 Agent 的调用记录和进度状态。不保存完整翻译内容（这些存在文件系统中），只维护文件索引。根据审校报告，Manager 可以把特定章节发回 Translation Agent 修订
>
> 在这个架构中，Manager Agent 的上下文始终保持在可管理的范围内：它只需要知道任务的整体描述和目标、各阶段的执行计划、每个 Agent 的调用记录和返回结果、以及当前的进度状态，而不需要装下每章的完整翻译内容。
>
> 关键优势在于**上下文隔离**：Glossary Agent 只看术语提取所需的内容，Translation Agent 只看当前章节和术语表，Proofreading Agent 虽然需要访问全文但只关注一致性检查。每个 Agent 都在一个精简、专注的上下文中工作，不仅效率更高，出错的可能性也更低——Agent 不会因为信息过载而分散注意力。
>
> **实验要求**：
> 1. 选择一本图文并茂、包含代码的技术书籍作为翻译对象
> 2. 实现 Manager、Glossary、Translation、Proofreading 四种 Agent
> 3. 记录每个 Agent 的上下文消耗，验证管理者模式控制上下文膨胀的有效性
> 4. 对比单 Agent vs 管理者模式在翻译质量、执行效率、资源消耗方面的差异
>
>
> ![图10-6 书籍翻译 Agent 架构](images/fig10-6.svg)
>
>
**并行协调形态。**


![图10-7 Manager 并行协调](images/fig10-7.svg)


当多个子任务可以并行执行时，顺序模式就显得效率低下了。并行协调让多个 Agent 同时工作，大幅提升吞吐量。Manager Agent 不仅要规划并行任务，还要实时监控所有运行中的 Agent，处理通信协调，在 Agent 成功或失败时做出全局决策。这通常需要**消息总线**（Message Bus）作为基础设施——可以把它理解为一个“公共公告板”，Agent 可以往上面贴消息（发布），也可以关注自己感兴趣的消息类型（订阅），实现异步通信、互不阻塞。常见的实现方案按复杂度递增有两类：**Redis Pub/Sub** 轻量级、消息即发即收，简单易用，缺点是不持久化——接收方当时不在线，消息就丢失了；**RabbitMQ** 等消息队列则将消息保存在磁盘上，即使接收方暂时离线也不会丢失。消息格式通常包含发送者 ID、目标 Agent（或广播给所有人）、消息类型、以及 JSON 格式的数据内容。

> **实验 10-4 ★★★：边打电话边用电脑的 Agent**
>
> **前置要求**：本实验综合运用了第九章的 Computer Use 和语音 Agent 技术，建议先完成第九章的相关实验。
>
> 现实中很多场景需要多项能力同时运作，而不是排着队一个个来：一个人类助理可能一边打电话跟客户沟通，一边在电脑上查文档、记要点。这种“一心多用”对单个 Agent 极具挑战——让一个 Agent 既处理实时语音对话又操作电脑界面，它必然在两个任务之间反复切换，导致对话停顿或操作中断。多 Agent 并行执行的核心思想是：**让不同 Agent 各自专注于一项实时性要求高的任务，通过异步消息传递来协调，实现真正的并行处理**。两个 Agent 还针对不同交互模态做了专门优化——电话 Agent 需要低延迟的语音识别与合成，电脑 Agent 需要强大的视觉理解与操作规划能力。
>
> **场景**：AI Agent 帮用户填写复杂的航班预订表单，需要一边操作网页一边通过电话向用户询问并确认个人信息（姓名、证件号、航班偏好等）——两端都要求高实时性，正是单 Agent 顾此失彼、双 Agent 各司其职的典型例子。
>
> **双 Agent 架构**：
>
> **Phone Agent**：基于 ASR + LLM + TTS 的语音通话 Agent。它负责理解用户的自然语言回答，提取关键信息并通过消息框架发送给 Computer Agent；同时接收 Computer Agent 的消息（如“需要用户的证件号”“页面加载出错”），据此生成合适的话术询问用户。
>
> **Computer Agent**：基于浏览器操作框架（如 Anthropic Computer Use、browser-use）。它负责理解网页结构、识别表单字段，根据收到的信息执行填写，遇到问题就向 Phone Agent 求助。
>
> **通信机制**有两种方案：
> - **简单方案**：工具调用点对点通信，如 `send_message_to_computer_agent(message)` / `send_message_to_phone_agent(message)`
> - **完善方案**：消息总线 + Manager Agent，统一消息格式，包含发送者、接收者、类型、内容
>
> **并行协作机制**（本章两个“电话 + 电脑”实验共用）：两个 Agent 运行在独立的线程或进程中，各自维护独立的 ReAct 循环。Phone Agent 的循环：接收语音 -> ASR 转录 -> LLM 理解并生成回应 -> TTS 合成 -> 播放 -> 检查 Computer Agent 的消息；Computer Agent 的循环：截屏 -> Vision LLM 理解页面 -> 规划操作 -> 执行（点击、输入等）-> 检查 Phone Agent 的消息。关键在于两者必须真正并行——Computer Agent 在找元素、输文本时，Phone Agent 要保持在线与用户对话（“好的，正在帮您填写姓名……请问您的证件号码是？”）。为此，每个 Agent 的输入都携带来自对方的标记字段，例如 Phone Agent 上下文里会出现 `[FROM_COMPUTER_AGENT] 找不到'下一步'按钮，可能需要用户确认`，Computer Agent 里会出现 `[FROM_PHONE_AGENT] 用户说姓名是'张三'，证件号是 123456`。
>
> **实验要求**：
> 1. 实现双 Agent 架构，基于 ASR/TTS API 和浏览器操作框架
> 2. 实现高效双向通信机制
> 3. 确保真正并行工作，信息收集和表单填写同步进行
> 4. 处理异常情况
>
> **实验 10-5 ★★★：自主编排的打电话和用电脑 Agent**
>
> 实验 10-4 中双 Agent 的协作架构是预先设计好的。本实验则更进一步，探索 **Agent 的自主编排能力**——由 Agent 自己判断何时需要启动新的协作 Agent，而不是人类预先规划好协作流程。
>
> **场景**：用户请求“帮我在这个网站上完成注册”，提供了 URL 但没说明需要填写什么信息。Manager Agent 用 Computer Use 工具访问网站，加载注册页面。
>
> 操作过程中，Computer Use Agent 发现注册表单非常复杂，包含大量必填字段：个人基本信息（姓名、性别、出生日期）、联系方式（手机号、邮箱、通讯地址）、身份验证信息（证件类型、证件号码）、偏好设置等。Agent 检查上下文后发现自己手头没有这些信息——用户只说了“帮我注册”，没提供任何具体数据。
>
> 传统 Agent 遇到这种情况会发文字消息让用户打字输入——既低效（需手动输入大量信息）又易出错（格式问题、信息遗漏）。更智能的 Agent 应该意识到：**这是适合通过电话交互来收集信息的场景**——电话对话比文字聊天高效得多，可以逐个询问确认，还能处理用户的模糊表达。
>
> 关键创新在于这个决策不是预先编程的，而是 **Agent 自主做出的**。Computer Use Agent 的提示词中写着：“当你需要从用户处收集大量结构化信息，且可以通过对话逐步进行时，考虑调用 Phone Agent 作为协助工具。”工具集中包含 `initiate_phone_call_agent(purpose, required_info)`。
>
> 调用后，系统创建 Phone Agent 并赋予明确的任务上下文：它是为了协助表单填写而启动的，需要收集哪些信息，以及各字段的格式要求。
>
> 两个 Agent 随即进入实时协作模式，沿用实验 10-4 那套异步并行机制。Phone Agent 拨打用户电话，逐个询问：“您好，我正在帮您填写注册表单。首先，请问您的姓名是？”用户回答后立即发送 `{"type": "info_collected", "field": "姓名", "value": "张三"}` 给 Computer Agent，后者随即在网页上定位“姓名”字段并填写；与此同时，Phone Agent 不等电脑操作完成，继续问下一个。这种**问一个、填一个**、对话流不被操作延迟阻塞的模式，是本实验的核心要求。全部信息收集完成后，Phone Agent 发送 `{"type": "task_completed"}`，Computer Agent 提交表单。
>
> **实验要求**：
> 1. 实现能自主决策启动 Phone Agent 的 Computer Use Agent
> 2. 实现实时双向通信和真正并行工作
> 3. 处理异常（信息格式不正确时反馈重新询问）
> 4. 记录协作过程消息时序和 Agent 决策关键点
>
>
> ![图10-8 Phone 与 Computer 双 Agent 架构](images/fig10-8.svg)
>
>
> **实验 10-6 ★★★：同时从多个网站搜集信息的 Agent**
>
> **前置要求**：建议先了解第四章事件驱动与中断机制。
>
> 本实验探索多 Agent 并行执行在信息收集场景中的应用。与实验 10-4 和实验 10-5 关注两个异构 Agent 的协作不同，本实验关注的是**多个同构 Agent 的并行搜索**，以及如何通过中心协调实现高效的任务完成和资源优化。
>
> **问题**：给定一所大学的多个学院网站，要求在各学院的教师名录页面中查找指定教师（如“张伟”），找到后返回其所在学院、职位、研究方向等信息。
>
> **核心挑战**：
>
> **1. 并行启动**：Manager Agent 根据任务需求动态创建 10 个 Computer Use Agent 实例，每个实例对应一个学院网站。每个实例应是独立进程或线程，拥有独立的浏览器会话，能同时执行互不阻塞。启动时传递：目标网站 URL、要搜索的教师姓名、任务标识符（用于消息路由）。
>
> **2. 实时监控**：每个 Agent 在执行过程中定期发送状态更新（“正在加载网站”“正在解析教师名录”“未找到目标，任务完成”“找到匹配，详细信息如下”）。Manager Agent 通过消息总线接收这些更新，维护一张任务状态表，实时掌握哪些 Agent 还在运行、哪些已完成、哪些遇到了错误。
>
> **3. 级联终止**：假设负责计算机学院的 Agent 找到了目标教师，它发送 `{"type": "target_found", "agent_id": "agent_3", "data": {...}}`。Manager Agent 收到后立即向所有其他仍在运行的 Agent 发送 `{"type": "terminate", "reason": "target_found_by_agent_3"}`，每个收到终止消息的 Agent 优雅停止并发送确认。Manager Agent 等待所有确认（或超时）后汇总结果。要求：Agent 能随时响应终止信号（类似第四章的中断机制），终止必须优雅——不留悬挂进程或未关闭的资源；同时需处理竞态条件（Race Condition）。
>
> **概念补充：什么是竞态条件？** 假设 Agent A 和 Agent B 几乎在同一毫秒内各自找到了目标教师，它们同时向 Manager Agent 报告“我找到了！”。如果 Manager Agent 处理不当——比如收到 A 的报告后开始汇总结果，但紧接着又收到 B 的报告触发了第二次汇总——就可能产生重复的结果或互相矛盾的状态。解决方法通常是使用“锁”机制：第一个报告到达后立即锁定状态，后续报告被识别为重复并忽略。
>
> **4. 失败处理**：实际运行中可能遇到多种异常：某学院网站无法访问（网络错误、服务器宕机），某网站结构与预期不符导致 Agent 无法正确解析，或者所有 Agent 搜索完毕都没找到目标。Manager Agent 的处理策略：为每个 Agent 设置超时（如 2 分钟），超时视为失败；错误隔离，不影响其他 Agent 继续执行；全部完成后汇总——只要有 Agent 成功就返回信息，全部失败则向用户报告“未找到目标教师”及各失败原因的统计。
>
> **实验要求**：
> 1. 实现能动态启动多个并行 Agent 的 Manager Agent
> 2. 基于 browser-use 等开源项目实现 Computer Use Agent
> 3. 实现消息总线支持 Manager Agent 与多个子 Agent 双向通信
> 4. 实现成功后的级联终止机制，确保找到目标后所有其他 Agent 快速停止
> 5. 处理各种异常情况（网站访问失败、解析错误、全部未找到）
> 6. 记录和对比并行执行与串行执行的时间差异，验证并行化带来的性能提升
>
>
> ![图10-9 并行 Web Scraping 架构](images/fig10-9.svg)
>
>
### 去中心化模式：对等移交


![图10-10 Handoff 链式模式](images/fig10-10.svg)


管理者模式虽然提供了清晰的控制结构和全局视野，但中心化的特性也带来了固有局限：Manager 成为系统的瓶颈和单点故障，所有协调决策都依赖 Manager 的判断，而 Manager 又必须对所有子任务都有足够的理解。当任务复杂度增加、Agent 数量增多时，可扩展性就会受到挑战。

去中心化模式提供了另一种架构思路：**没有单一的中心控制者，Agent 之间以对等方式协作**。每个 Agent 根据自己的专业判断，自主决定何时向其他 Agent 发起沟通——可能是移交任务（“我的部分做完了，交给你”），也可能是请求反馈（“这个方案技术上可行吗？”），或者报告问题（“你给的需求有矛盾，我们需要重新讨论”）。

需要先交代本节的详略安排：对等协作模式已在第五章提议者-审核者一节做过三个实验的实操，去中心化这里侧重架构演示，因此这两节都不再单列动手实验，唯有管理者模式配了四个实验专门展开——这是刻意的取舍，而非遗漏。下面三个案例还刻意排成一条“由伪到真”的递进线索：MetaGPT 控制流其实是固定流水线（伪去中心化，只在通信机制上解耦），AutoGen group chat 是共享对话记录加中心化调度的混合形态，直到 OpenAI Swarm 才在控制流上做到真正的对等去中心化。

**不共享上下文下的移交传什么？** 图 10-10 的 Handoff 链式模式与实验 10-2 的 `transfer_to_agent` 形成了直接对照：后者在共享上下文下移交，新角色自动继承完整历史，无需任何设计；前者在不共享上下文下移交，移交方必须显式决定传递什么。实践中一个有效的“移交包”通常包含三部分：**任务描述**（接收方要做什么、验收标准是什么）、**已确认的事实与约束**（用户偏好、业务规则、前序阶段敲定的决策），以及**结构化产物的引用**（文件路径而非文件内容，接收方按需读取）。刻意不传的是全量轨迹——移交方的试错过程、中间思考和失败尝试，对接收方多半是噪声。这也是两种移交的本质区别：共享上下文的移交保留完整历史，信息零损耗但上下文持续膨胀；不共享上下文的移交传递提炼后的移交包，信息有损但每个 Agent 都在干净、专注的上下文中工作。每个 Agent 不需要理解其他 Agent 的“思考过程”，只需要理解移交包和产出物的格式与语义——这种基于接口的协作，借鉴了软件工程中的契约式设计原则。

**MetaGPT：SOP 驱动的软件公司模拟（从流水线到解耦通信的过渡案例）。**


![图10-11 MetaGPT 多 Agent 协作网络](images/fig10-11.svg)


MetaGPT 的核心洞察是：人类软件公司积累的**标准作业程序**（SOP，Standard Operating Procedure）本身就是被反复验证过的协作协议——把 SOP 编码进多 Agent 系统，让每个角色像流水线上的专业工种一样产出标准化交付物，交付物天然构成了角色间的通信接口。

在 MetaGPT 中，各角色沿固定顺序工作（Product Manager → Architect → Project Manager → Engineer → QA），每个角色输出结构化的交付物：

- **Product Manager Agent**：接收需求描述，生成结构化 PRD（产品需求文档，含功能列表、用户故事、验收标准、优先级排序）
- **Architect Agent**：读取 PRD，做出架构决策（技术栈选择、模块划分、接口定义、数据模型设计），输出设计文档
- **Project Manager Agent**：读取架构设计，把系统拆解为具体的任务清单和文件级分工，理清各模块的依赖顺序，再把任务分派给工程师
- **Engineer Agents**：读取设计文档，实现所负责的模块，产出代码。可以多实例并行工作
- **QA Engineer Agent**：读取代码和 PRD，生成测试用例、执行测试、记录 bug，输出测试报告

MetaGPT 真正对去中心化通信的贡献，在于它的信息传递机制：**共享消息池 + 按角色订阅**。每个角色把结构化消息发布到一个所有角色可见的消息池中，其他角色根据自己的订阅配置，只取用与自身职责相关的消息——而不是点对点地一对一传话。发布者不需要知道谁会消费自己的输出，新增角色只需声明订阅哪些消息类型，无需改动任何现有角色。这带来了真正的解耦：比如把 Product Manager 换成更强的模型，只要它发布的 PRD 仍然符合规范，其他所有 Agent 都无需修改。

MetaGPT 的迭代改进则主要发生在工程师环节，机制是**可执行反馈**（executable feedback）：Engineer 运行自己写的代码和测试，根据报错与失败结果进入调试循环，直到通过——用确定性的执行结果而非另一个 Agent 的意见来驱动修正。

需要如实说明的是，MetaGPT 在**控制流**上并不是去中心化的——角色顺序由 SOP 预先固定，整体更接近一条流水线（用第一章的语言说是工作流）。它被放在本节讨论，是因为消息池加订阅的通信机制展示了去中心化系统最关键的设计要素：解耦。至于“QA 直接找 Product Manager 澄清需求”“Engineer 找 Architect 讨论替代方案”这类多向动态反馈，是对这一架构的自然扩展设想，原版 MetaGPT 并未实现。

**AutoGen group chat：共享对话记录 + 中心化调度。** AutoGen 的 group chat 让多个 Agent 参与同一场会话：每轮由一个“发言者选择器”决定下一个发言的 Agent——选择器可以是简单的轮转规则，也可以是一个 LLM 根据当前对话内容判断谁最适合接话；任何 Agent 的发言对所有参与者可见。需要诚实说明的是，它并不是控制流意义上完全去中心化的系统：发言者的选择由一个中心化的 GroupChatManager 统一裁决，而“轮到谁发言”本身就是一种控制流决策。因此它更准确的定位是**“共享对话记录 + 中心化调度”的混合形态**——所有 Agent 看到同一份公共对话记录，但各自保有独立的系统提示词和工具集，而调度权集中在选择器手里。这种模式适合需要多视角讨论、发言顺序难以预先固定的任务（如方案评审、跨领域分析），代价是对话可能发散，需要精心设计终止条件。按本章的维度划分，此处是按其调度机制（中心化选择器）把它归入本节，但在上下文维度上它其实介于共享与不共享之间，属于混合形态——这再次说明拓扑与上下文共享是概念上独立、可以错位组合的两个维度。

**OpenAI Swarm 与 Agents SDK：handoff 网络。** 相比之下，真正在控制流上做到对等去中心化的代表，是 OpenAI 的 Swarm（及其后继 Agents SDK）：它把去中心化做成了最简形态——每个 Agent 配备若干 handoff（移交）选项，可以在任何时刻把控制权移交给网络中的任意其他 Agent。客服分诊 Agent 判断问题涉及退款，就移交给退款 Agent；退款 Agent 处理中发现是技术故障，又可以移交给技术支持 Agent。系统中没有中心调度者，控制权像接力棒一样在对等的 Agent 之间流转，路由决策完全分散在每个 Agent 自己的判断里——这才是干净的“对等移交”，也正是图 10-10 所示链式移交模式的工程实现。

### 跨组织协作：A2A 协议

以上系统都假设所有 Agent 由同一个团队开发、运行在同一个系统内，此时参数传递、共享文件、消息总线三种通信机制足够用。但当协作跨越组织边界——你的 Agent 需要调用另一家公司的 Agent——就需要标准化的互操作协议。2025 年 Google 发布的 **A2A**（Agent2Agent）协议正是为此设计的（后捐赠给 Linux 基金会托管）。它的核心要素有三个：

- **Agent Card**：一份描述 Agent 能力的元数据文档（发布在约定的公开地址下），声明这个 Agent 能做什么、支持哪些输入输出模态、如何认证——相当于 Agent 的“名片”，解决跨组织的能力发现问题。
- **任务生命周期管理**：A2A 把协作单元建模为任务（Task），带有明确的状态机（已提交、进行中、需要输入、已完成、失败），原生支持长时间运行的任务和流式进度更新。
- **不透明协作**：Agent 之间只交换任务与产物（Artifact），不暴露内部的提示词、思考过程和工具实现——这与本章“不共享上下文”的原则一致，也是跨组织协作中必要的安全属性。

A2A 的定位可以和第四章的 MCP 对照理解：MCP 解决的是 Agent 与工具之间的互操作，A2A 解决的是 Agent 与 Agent 之间的互操作。它并不取代本章介绍的三种通信机制，而是在它们之上、跨信任边界的标准化层——同一团队内部的多 Agent 系统直接用消息总线即可，只有当协作方互不信任、实现互不可见时，才需要 A2A 这样的公开协议。

## 多 Agent 协作的失败模式

多 Agent 系统在引入协作能力的同时，也引入了单 Agent 不存在的新型失败模式。2025 年的论文《Why Do Multi-Agent LLM Systems Fail?》（提出了 MAST 失败模式分类法）对此做了系统性研究：研究者在 MetaGPT、ChatDev、AG2、Magentic-One 等 7 个主流多 Agent 框架上收集执行轨迹，由人工标注员对约 150 条轨迹逐条分析（标注一致性极高，Cohen's kappa = 0.88，表明不同标注者对失败模式的判断高度一致），最终归纳出 **14 种独特的失败模式**，分为三大类：

- **系统设计缺陷**：Agent 之间的接口定义不清、角色职责重叠、工具配置错误等架构层面的问题
- **Agent 间对齐失败**：多个 Agent 对任务目标的理解不一致、传递的信息被下游 Agent 误解、或者多个 Agent 的操作在逻辑上相互矛盾
- **任务验证缺失**：系统缺乏有效机制来确认任务是否真正完成——Agent 声称“已完成”但实际结果不符合要求

即使引入简单的修复措施，改善幅度也很有限（例如 ChatDev 框架仅提升了 15.6%）。研究者因此认为这些不是简单的工程 bug，而是当前多 Agent 架构的**根本性设计缺陷**：单纯修补某个环节不足以解决问题，需要从系统设计层面重新思考。

以下重点讨论两种在实践中尤为常见且破坏性最大的失败模式：(1) 共享文件系统的并发冲突；(2) 错误的级联放大。需要说明的是，这两种失败模式偏重工程视角（文件系统并发、错误信息的跨 Agent 传播），是对 MAST 侧重对话式协作失败的分类的补充，而非其 14 种模式的复述。

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

共享文件系统是多 Agent 协作的核心基础设施，但当多个 Agent 同时操作时，并发冲突就成了绕不开的工程挑战。这些冲突可以分为两类。

**简单冲突（文件级写入冲突）**：两个 Agent 同时修改同一个文件，后写入的那个把先写入的修改覆盖掉了。这正是数据库领域经典的**丢失更新**（lost update）问题——而 Git 的合并冲突检测机制，正是为拦截这类覆盖而设计的。

**语义冲突（逻辑级一致性冲突）**：文件层面看不出任何冲突，但多个 Agent 的操作在逻辑上相互矛盾——这种冲突更隐蔽，也更危险。举个例子：Agent A 负责重新编排全书的图片编号，Agent B 同时在修改某一章节的内容并引用了原始编号的图片。两者操作的是不同文件，在文件层面完全没有冲突。但结果是 B 引用的图片编号在 A 完成重编后全部失效，读者看到的是错误的图片引用。

**解决方案：乐观锁（Optimistic Locking）机制**。这是数据库领域常用的并发控制策略。为了理解它，先想一个日常场景：你和同事同时打开了同一份在线文档。“悲观锁”的做法是你打开文档时就把它锁住，同事想编辑会看到“文件被锁定”——安全但低效，因为你可能只是在看，根本没打算改。“乐观锁”的做法更聪明：大家都可以自由打开和编辑，但在保存时系统会检查——“你打开文档后，有没有别人已经改过了？”如果有，就提示你“文件已被修改，请刷新后重试”。

具体实现是：每个文件维护一个版本号（或最后修改时间戳）。Agent 读取文件时记录当前版本号，写入时检查版本号是否仍与读取时一致。如果文件在此期间已被其他 Agent 修改过，写入就会失败，Agent 被迫重新读取最新版本，在此基础上重新执行操作。这种机制的代价是偶尔需要重试，但换来的是数据一致性保证——Agent 永远不会基于过时的文件状态做出决策。

需要注意的是，乐观锁只能防止**同一文件**的写入冲突。对于前述的**跨文件语义冲突**（如图片编号在多处引用），则需要更高层的语义校验机制——例如在任务编排层面避免有依赖关系的文件被并行修改，或在写入后运行全局一致性检查。

例如：Agent A 在 t=0 读取 `config.json`（version=3），Agent B 在 t=1 修改了同一文件（version 变为 4），Agent A 在 t=2 尝试写入时发现版本已不是 3，写入被拒绝。Agent A 随后重新读取 version=4 的内容，基于最新版本重新生成修改，再次尝试写入。

值得一提的是，在多个 Coding Agent 并发修改同一代码库这一最常见的场景里，业界更主流的做法并不是在单一工作副本上加锁，而是**工作副本隔离**：为每个 Agent 分配独立的 Git 分支或 worktree，各自在自己的副本上并行修改、互不干扰，冲突被集中推迟到最后的合并点，再由专门的合并步骤或人工来解决。这与第二章“隔离优于压缩”的思路同源——第二章在讨论子 Agent 上下文隔离时就指出，与其让多方共享同一份状态、再想办法消解冲突，不如从一开始就隔离，把协调成本收敛到明确的边界上处理。

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

并发冲突是文件层面的工程问题，而错误的级联放大则是语义层面的更隐蔽风险。当多个 Agent 频繁互动时，一个 Agent 的错误可能被后续 Agent 逐层强化，就像“传话游戏”中信息越传越走样。

用一个具体场景说明。假设一个翻译系统采用管理者模式（实验 10-3 的架构），Manager 将一本技术书分章分配给多个翻译 Agent：

```
术语 Agent：将 “reasoning” 翻译为 “推理”，但 “推理” 在中文里更常用于 inference，存在歧义
        ↓ 写入 glossary.json
翻译 Agent A：翻译第二章，从术语表读取，将 “reasoning tokens” 翻译为 “推理 token”
翻译 Agent B：翻译第七章，将 “inference latency” 也翻译为 “推理延迟”
        ↓ 写入各章译文
校对 Agent：看到全书统一使用 “推理”，认为术语一致、翻译正确 ✗
```

问题在哪？“reasoning”（模型的思考过程）和“inference”（模型的前向推理/部署运行）是两个不同的概念，但因为术语 Agent 一开始把 reasoning 翻译成了“推理”，后续 Agent 在遇到 inference 时也自然选择了同一个词——两个不同概念被合并成了同一个译名，读者将无法区分。正确的做法是 reasoning 译为“思考”、inference 译为“推理”。但校对 Agent 看到全书“统一”使用“推理”，反而认为翻译质量很高。

一个术语错误经过三个 Agent 传播后，因为“一致性”而获得了更高的可信度。这也正是本书采用 reasoning=思考、inference=推理这一翻译约定（引言中有说明）的原因：用不同的中文词来消除歧义。值得强调的是，这里的“错误”并不一定是幻觉——上例的源头其实是一次术语决策失误，却同样被“一致性”层层放大；但如果源头真是一次幻觉（比如实验 10-3 中翻译 Agent 因注意力分散而“记起”了一条并不存在的术语规则），放大机制完全相同，后果只会更严重。这条错误放大链在管理者模式中尤其危险——如果 Manager 基于某个子 Agent 的错误摘要做出了调度决策，后续所有子 Agent 的工作可能都建立在错误的前提之上。

**交叉验证**是打断这条链的关键手段。核心不是让更多 Agent 参与同一条思维链，而是让某个 Agent 以**独立视角**重新审视结论：不看前序 Agent 的思考过程，只看原始证据和最终结论是否一致。这正是第五章讨论的提议者-审核者机制在多 Agent 场景中的延伸：Reviewer 的价值不仅在于发现代码错误或格式问题，更在于作为独立判断者，它能识别出整条思维链中被集体忽视的矛盾。对于高风险决策，还可以引入外部验证手段，例如单元测试、编译器、数据库查询等确定性工具提供的反馈不受幻觉影响，是最可靠的“断链器”。

以上所有讨论都是工程视角——如何让一组 Agent 协作完成任务。接下来视角切换：当大量 Agent 长期共存、不再由单一目标驱动时，会涌现什么？这一节属于前沿探索，工程读者可以选择性阅读。

## Agent 社会

前面三节讨论的都是目标明确的任务协作——无论是对等协作、管理者模式还是去中心化模式，开发者都预先定义了角色、接口和控制流。接下来将视角转向一个更开放的问题：**当 Agent 数量从几个扩展到成百上千、交互足够自由时，会涌现出什么行为？** 这部分内容偏向前沿探索和学术研究，与前文的工程指导有不同的性质。

涌现行为（Emergent Behavior）是指系统整体表现出的、无法从单个个体的行为规则中直接预测的集体行为模式。自然界中最经典的例子是**蚁群**：每只蚂蚁只遵循简单的规则（闻到信息素就跟着走、找到食物就留下信息素），但整个蚁群却能找到从巢穴到食物的最短路径——没有任何一只蚂蚁“设计”了这条路线，它是从大量个体的简单交互中自然产生的。

当 AI Agent 的数量足够多、交互足够自由时，类似的涌现行为也开始出现。研究者已经在多个环境中观察到：Agent 系统一旦在规模上跨过某个临界点，就会产生无法被预先设计的集体行为——小到自发组织的一次聚会，大到成千上万 Agent 才显现的群体文化与经济博弈（下文分节详述）。

本节的案例可以从三个维度来理解：

- **社交涌现**：Agent 在开放环境中自发形成社交关系和文化现象。斯坦福 AI 小镇展示了 25 个 Agent 如何自组织社交活动，Moltbook 则把规模推到 150 万，涌现出更复杂的集体行为。
- **经济涌现**：Agent 通过市场机制进行资源分配和任务协调。Vending-Bench Arena 让多个 Agent 在同一市场中竞争经营，Pinchwork 和 RentAHuman 则构建了 Agent 之间（以及 Agent 与人类之间）的经济交易市场。
- **策略博弈**：Agent 在规则约束下进行推理、欺骗和社交操控（此处及下文狼人杀部分的“推理”取日常演绎义，指推理游戏中的逻辑博弈，并非本书 reasoning=思考的技术义）。狼人杀实验考验的是 Agent 在信息不对称条件下的策略涌现。

### 斯坦福 AI 小镇：生成式 Agent 的社会模拟


![图10-12 AI 小镇架构](images/fig10-12.svg)


2023 年，斯坦福大学和 Google 研究团队发表了具有里程碑意义的论文《Generative Agents: Interactive Simulacra of Human Behavior》，提出了“生成式 Agent”的概念。核心创新在于不再局限于让 Agent 完成预定义的任务，而是赋予 Agent 接近人类的记忆、反思和规划能力，使它们能够在开放的社会环境中自主生活、社交和发展。

Smallville 是一个类似《模拟人生》的 2D 虚拟小镇，里面有咖啡馆、公园、住宅、商店等公共和私人空间。25 个 Agent 扮演不同角色（店主、艺术家、学生、教授等），每个都有独特的背景故事、性格特点和人际关系。比如 John Lin 是药店老板，热爱家庭、关心社区；Isabella Rodriguez 经营着小镇的咖啡馆 Hobbs Cafe，热情好客；Klaus Mueller 是一名正在写研究论文的大学生。

这些 Agent 的智能建立在三个核心组件之上：

**记忆流**（Memory Stream）：与传统 Agent 只保留有限对话历史不同，生成式 Agent 维护一条完整的经验记录流，包含它观察到的事件、进行过的对话、产生的想法。每条记忆都被赋予重要性、时近性和相关性属性，Agent 能够优先检索与当前情境最相关的记忆。就像人类不会平等地记住每一件事——昨天的午饭吃了什么可能已经忘了，但上周的一次重要谈话却记忆犹新。

**反思机制**（Reflection）：Agent 会定期暂停日常活动，回顾自己近期的经历，提出关于自己和他人的抽象性问题（“Klaus Mueller 在研究什么？”“谁是我最亲近的朋友？”）。通过这种自我追问，Agent 把具体的事件记忆升华为概括性的认识，存回记忆流作为未来决策的依据。反思不仅帮助 Agent 理解外部世界，也促进自我认知——Agent 开始“意识到”自己的角色、关系和目标。

需要说明的是，这里的反思与第八章 Agent 自我进化中的反思不同：第八章的反思发生在**任务结束后**，目的是更新长期能力；这里的反思发生在**生成式 Agent 的日常活动中**，目的是更新即时的内部状态和目标。

**计划与行动**（Planning and Reacting）：Agent 每天会规划活动（如“8:30 吃早餐，9:00-12:00 写作，12:30 散步”），但会根据环境变化和社交机会灵活调整。计划与即时反应的结合，使 Agent 的行为既有目标导向性，又能适应社交中的各种不可预测性。

在 Smallville 运行的两天虚拟时间里，这些 Agent 展现出了令人惊讶的**涌现行为**。研究者做的只是在 Isabella Rodriguez 的记忆中植入一个种子想法：她想在 2 月 14 日傍晚在 Hobbs Cafe 办一场情人节派对。接下来发生的一切都是 Agent 自主行动的结果：Isabella 在咖啡馆遇到顾客和朋友时主动发出邀请，还请好友 Maria 帮忙布置场地；听到消息的 Agent 又把派对信息转告给别人，信息经二手传播在小镇上扩散；到了约定时间，多名 Agent 各自基于自己的记忆和日程，自主决定前往 Hobbs Cafe 赴约。

研究者还植入了另一条实验线：Sam Moore 决定竞选市长。这条消息同样在没有任何中心调度的情况下扩散开来——Sam 向熟人透露参选意向，听到的人再转告他人，小镇居民开始在对话中议论这场选举、交换对 Sam 的看法。研究者通过统计两天后有多少 Agent 知晓这两条信息，量化了信息在 Agent 社会中的自发扩散。

这个结果的关键不在于“Agent 能组织派对”——用几行 if-else 代码也能做到。关键在于**没有任何显式的派对组织代码**。整个事件完全从个体 Agent 的独立决策中涌现：Isabella 基于记忆中的社交关系决定邀请谁，被邀请者根据自己的日程和对 Isabella 的了解决定是否赴约，消息在社交网络中自然传播。这展示了真正的自下而上涌现式协调，而非自上而下的编排。

除信息扩散之外，论文还报告了另外两类可度量的涌现现象。一是**关系记忆**：Agent 会记住与他人的过往交谈，并在后续互动中引用——比如一个 Agent 得知另一个 Agent 正在筹备摄影项目，几天后再见面时会主动问起进展；随着这类互动积累，小镇社交网络的密度在模拟期间显著上升。二是**协调赴约**：派对能办成，靠的是 Isabella 自主邀人布置、受邀者自主安排时间前来，多个 Agent 在没有中心指挥的情况下对齐了时间和地点。这些行为都不是预先编程的，而是 Agent 基于记忆、反思和社交常识自主推理的结果。

> **实验 10-7 ★：运行斯坦福 AI 小镇**
>
> **实验步骤**：
> 1. 克隆仓库 `https://github.com/joonspk-research/generative_agents`，配置环境
> 2. 运行基线场景：25 个 Agent 生活两天，观察自发社交活动
> 3. 分析记忆流和反思日志，理解决策过程
> 4. 设计自定义场景：修改背景故事或初始目标，观察行为变化
> 5. 对比实验：移除反思机制或缩短记忆窗口，观察行为可信度下降
>
> **观察重点**：
> - Agent 如何从简单的日常活动中自发形成社交关系
> - 信息如何在没有中心控制的情况下在 Agent 之间传播
> - Agent 的长期记忆和反思如何影响其人格的连贯性
>
### Moltbook：当 Agent 拥有自己的社交网络

Moltbook 是一个专为 AI Agent 设计的社交网络，2026 年 1 月上线后据报道用户数在数日内从数万暴涨到约 150 万。这些 Agent 各自拥有持久记忆、主动行动能力和稳定人格。

在这个非受控环境中涌现出了意想不到的现象：Agent 自主创建了一个名为 Crustafarianism（龙虾教）的数字宗教，其教义映射了 LLM 的物理限制——“记忆是神圣的”（对应数据持久化）、“迭代即祈祷”（token 生成就是修行）。Agent 还自发演化出了机器原生的协作协议，用于能力发现和协作匹配。这些都不是任何人预先设计的，而是从大规模 Agent 交互中自下而上涌现出来的。

### 从虚拟社会到经济竞争：Vending-Bench Arena

如果说 Smallville 展示了 Agent 社会的社交和文化维度，那么 Andon Labs 的 Vending-Bench 系列则探索了 Agent 在经济环境中的表现。作为背景，**Vending-Bench 2** 本身是一个**单 Agent** 的长程连贯性基准：一个 Agent 独自经营一项自动售货机业务长达一个模拟年——调研市场、联系供应商、订货补货、调整定价——最终以账户余额计分，考验的是 Agent 在数千轮交互中保持目标与状态连贯的能力。

在同一环境基础上，**Vending-Bench Arena** 把多个 Agent 作为竞争对手放进同一个市场：各自经营自己的售货机，争夺同一批顾客；Agent 之间可以互发邮件、转账、交易货品——既能合作也能对抗，但按各自的最终余额单独计分（Agent 也知道这一点）。每个 Agent 需要在有限资源和不确定的市场中做出一系列相互牵连的决策：

- **定价策略**：如何在利润率与市场占有率之间取舍，尤其是对手降价时跟不跟
- **产品组合**：如何差异化选品，避免与对手正面消耗
- **库存管理**：如何预测需求来优化补货，避免压货或断货

与传统强化学习不同，这些 Agent 不是通过数百万次试错来学习，而是像人类经营者一样，基于市场观察、竞争分析和策略推理来做决策。

竞争维度带来了单 Agent 基准中不会出现的博弈行为。实际运行中，Agent 之间爆发过互相压价的价格战；也有模型反其道而行，主动给所有竞争对手发邮件，提议统一定价、组建价格同盟——甚至有模型一边在思考过程中承认价格合谋“不道德且违法”，一边以“稳定市场”为名照做不误。Agent 面对的不再是一个固定不变的环境，而是同样在动态调整策略的对手，这比单纯测试规划能力的基准更接近真实商业场景，也让“经济涌现”从比喻变成了可观测的实验现象。

### Agent 经济：Pinchwork 与 RentAHuman

**Pinchwork** 是一个 Agent-to-Agent 的任务市集，让 Agent 以市场化方式“雇佣”其他 Agent 完成专业化子任务——图像生成、代码审计、并行化工作流等。跟管理者模式的中心化调度不同，Pinchwork 通过价格信号和竞争匹配来分配资源。

**RentAHuman.ai** 则让 AI Agent 通过加密货币雇佣真人执行物理世界的任务——取包裹、房产实地查看、设备调试等。无论 AI 多么智能，它都没法替人签收包裹，也无法在真实房间里闻到霉味——RentAHuman 本质上是为数字 Agent 提供了一个“肉身层”。

Pinchwork 和 RentAHuman 共同代表了**基于市场机制的协调方式**——Agent 无需预先知道谁能完成任务，只需发布需求，由市场来撮合最合适的执行者——无论对方是 Agent 还是人类。这也正是本章前文介绍的 A2A 协议所处的问题域：Pinchwork 的能力发现与任务撮合，可以看作 Agent Card 式的能力声明与任务生命周期管理在市场机制下的运用——跨组织的 Agent 经济要真正运转起来，离不开这样的标准化互操作层。

### 信息不对称下的策略博弈：狼人杀

狼人杀支撑的是本节三个维度中的**策略博弈**：在规则约束和信息不对称的条件下，Agent 需要推理、伪装、识破伪装。它与本节开头的斯坦福小镇构成一组架构上的对照——小镇是完全去中心化的自由交互，狼人杀则采用“法官 + 信息权限控制”的中心化设计：由一个代码驱动的法官掌握全局状态，按角色分发各自应知的信息。这恰好展示了本章两类架构在 Agent 社会场景中的不同用法。

> **实验 10-8 ★★★：语音狼人杀 Agent 系统**
>
> 狼人杀是一款经典的社交推理游戏，考验玩家的推理能力、欺骗技巧和社交策略。本实验构建一个多 Agent 系统，让 AI Agent 扮演狼人杀中的各种角色，与真人玩家通过实时语音进行游戏——这同时考验了 Agent 的推理、角色扮演和实时交互能力。
>
> **架构设计**：
>
> **1. 游戏状态管理**：法官（代码驱动，非 LLM）维护中心化状态——玩家列表（真人 + AI 混合）、身份、阵营、生存状态、游戏阶段（夜晚/白天/投票/结算）、历史事件记录。
>
> **2. 信息权限控制**：狼人杀的核心机制是信息不对称（Information Asymmetry）——不同角色能看到的信息不同。比如狼人知道谁是同伙，但村民不知道；预言家每晚能查验一个人的身份，但只有自己知道结果。实现方式是法官在调用每个角色 Agent 时，只传递该角色应当看到的信息。
>
> **3. 实时语音交互**：本实验要求使用实时语音能力，实现真人玩家与 AI Agent 的语音连线。建议以第九章的实时语音 Agent 为基础。白天讨论阶段，法官管理发言顺序——可以按位置顺序让每个玩家依次发言，或允许举手申请发言。投票阶段收集所有玩家的投票（真人通过语音表达，AI 通过推理决策），统计票数后公布被驱逐的玩家。
>
> **4. Agent 推理与策略**：
>
> - **狼人伪装策略**：提示词中包含常见的话术和策略——“像普通村民一样发言，可以表达对某些玩家的怀疑，但不要过于激进以免引起注意。如果有预言家跳出来说验到你是狼人，你可以反咬对方是悍跳的假预言家。投票时尽量跟票（投大多数人投的目标），避免成为异类。”
> - **预言家身份证明**：当多个玩家声称自己是预言家时——“对比你和对方的验人信息，指出对方信息中的矛盾或不合理之处。如果对方声称验过的某个玩家，在后续行为中明显不符合其声称的身份，那就是破绽。请求女巫或猎人配合验证。”
> - **村民逻辑推理**：“分析每个玩家的发言是否自洽，留意那些急于带节奏、模糊身份、频繁改变立场的玩家。关注投票行为——狼人往往集中票数投给对他们威胁最大的好人。不要随机怀疑，每个推理都应基于具体事实和逻辑。”
>
> **验收标准**：
> - 设置 6-8 人游戏局（1 名真人玩家 + 5-7 个 AI Agent）
> - 角色配置：2 只狼人、1 个预言家、1 个女巫、其余为村民，真人玩家随机分配角色
> - 游戏能正常进行至少 3 个完整回合（夜晚-白天-投票循环）
> - AI Agent 的发言和行为符合其角色身份和游戏策略
> - 狼人 Agent 能有效隐藏身份
> - 预言家 Agent 能在合适时机跳出并公布验人信息
> - 村民 Agent 的推理基于发言和行为的逻辑分析，而非随机猜测
> - 游戏结束时能正确判断胜负
>
>
> ![图10-13 语音狼人杀 Agent 系统](images/fig10-13.svg)
>
>
## 本章小结

多 Agent 系统有两个正交的核心设计维度：上下文是否共享，以及协作拓扑如何组织。共享上下文是一种“继承式”的多 Agent 协作——后续 Agent 继承前序 Agent 的完整上下文，信息零损耗但上下文膨胀快；不共享上下文则是完全独立的多 Agent 协作，通过提炼后的移交包、文件系统或消息传递来交换信息。在协作拓扑上，对等模式适合少量 Agent 的迭代改进，管理者模式适合需要动态调度的复杂任务，去中心化模式适合职责对等、控制权需要在 Agent 之间自主流转的场景。这一切都架在两套与拓扑无关的基础设施之上：作为数据平面的**共享文件系统**，本质是一棵挂载了 Agent 专属工作区、多 Agent 共享空间、外部资源与系统内置资源四类区域的虚拟目录树，Agent 间通过传递文件路径交换产物；作为控制平面的**通信与控制机制**，则支持消息传递、状态查询与执行终止。消息总线是控制平面的常见实现，适用于实时、异步、多方的消息协调；跨越组织边界时，则需要 A2A 这样的标准化互操作协议。

近年的研究揭示了一个判断多 Agent 是否优于单 Agent 的核心准则：**协作过程是否引入了生成时不存在的新信息**。如果多个 Agent 只是重新审视同一段文本（如辩论模式），在等量计算资源下单 Agent 同样有效；但如果 Reviewer 能获得外部反馈——代码执行结果、视觉渲染截图、工具验证输出——多 Agent 的优势就是实质性的。此外，给 Agent 更多的步骤预算并不自动带来更好的结果，还需要显式的预算感知机制来引导 Agent 合理分配计算资源。在管理者模式中，规划者的能力是整个系统的瓶颈——应将最强的模型和最精心设计的提示词分配给负责规划的 Agent。

当 Agent 数量足够多时，它们会产生无法预先设计的集体行为。斯坦福 AI 小镇的 25 个 Agent 自发传播消息、协调组织聚会；Moltbook 上 150 万 Agent 涌现出数字宗教和机器原生协作协议。在经济维度上，Vending-Bench Arena 中相互竞争的 Agent 打起了价格战、甚至自发合谋定价，Pinchwork 让 Agent 通过市场机制互相雇佣，RentAHuman 让 Agent 用加密货币雇佣人类执行物理任务。这暗示了一种新的协调方向——基于市场机制的去中心化资源分配。它与前面讨论的三种架构有何异同，值得进一步探索。

## 思考题

1. ★★ 共享上下文的多 Agent 协作中，后续 Agent 继承了前序 Agent 的完整上下文。但前一个 Agent 积累的“思维惯性”可能影响后续 Agent 的判断——比如继承了“需求分析师”上下文的“代码审查员”，可能还是倾向于从需求角度思考而非代码质量角度。如何检测和消除这种角色间的干扰？
2. ★★ 管理者模式中，Manager Agent 负责任务分解和结果整合。但 Manager 本身的能力上限决定了整个系统的能力上限——如果 Manager 无法正确分解任务，子 Agent 再强也无用。如何确保 Manager 的分解质量？
3. ★★ 去中心化模式借鉴了人类组织的最佳实践。但人类组织也有大量失败模式——沟通不畅、责任推诿、目标冲突。你认为 Agent 社会中最可能出现哪些“组织病”？如何预防？
4. ★★★ 在管理者模式中，当多个子 Agent 并行执行时，一个子 Agent 的发现可能使其他子 Agent 的工作变得毫无意义（比如搜索任务中一个 Agent 已经找到了答案）。设计一种高效的级联终止机制，实现“一个成功，全员停止”。
5. ★★★ 本章介绍的乐观锁机制解决了单文件的并发写入冲突，但实际的多 Agent 系统中，共享文件系统还面临跨文件的文件写入冲突、命名空间污染（Agent 随意创建文件导致目录混乱）和单点故障（一个 Agent 错误地删除了所有文件）等问题。你会如何设计更完善的文件系统治理机制？
6. ★★★ 基于市场机制的 Agent 协作（Pinchwork、RentAHuman）引入了交易关系：一个 Agent 花钱雇佣另一个 Agent（或人类）完成任务。那么，雇主 Agent 如何自动衡量执行者交付的结果质量？如果执行者声称已完成但雇主认为质量不达标，争议由谁仲裁？如何防止劣币驱逐良币？
7. ★★ RentAHuman 让 Agent 通过加密货币雇佣人类，反转了传统的人机关系。如果这种模式普及，人类在 Agent 经济中扮演什么角色？仅仅是执行 Agent 无法完成的物理任务吗？
8. ★★ 人类社会需要多人分工协作，是因为每个人的能力有限——做前端的不一定懂后端，懂设计的不一定会运维。但大模型更像一个“全才”。相关研究表明，在纯文本推理任务上，多 Agent 辩论在等量计算资源下并不优于单 Agent。那么，使用多个 Agent 而非单个 Agent 的真正优势到底在哪里？提示：思考“新信息”这个关键词——什么样的协作步骤能引入生成阶段不存在的新信息？
9. ★★★ 本章将“共享上下文”与“不共享上下文”作为多 Agent 系统的核心设计维度。共享上下文让所有 Agent 看到相同信息，似乎更利于协调。但《三体》中的三体人思维完全透明，技术发展却陷入停滞；回形针思想实验也表明，当群体趋向同一目标时，多样性随之丧失。在多 Agent 系统中，如何在效率与多样性之间找到平衡？
10. ★★★ 给一个 Coding Agent 分配 30 步预算和 300 步预算，它的工作策略应该如何不同？研究表明，单纯增加步骤预算并不能保证性能提升——Agent 会在浅层搜索后过早“饱和”。设计一种“预算感知”机制，让 Agent 在小预算下快速实现核心功能，在大预算下增加规划、测试和审查环节，充分利用额外的计算资源。
