第04章|量体裁衣:从 Sub-Agents 到 Multi-Agent 的工程指南

第04章|量体裁衣:从 Sub-Agents 到 Multi-Agent 的工程指南

学习目标:掌握多 Agent 系统的架构设计模式,学会根据任务特点选择合适的编排策略,构建可靠的生产级多智能体系统。


4.1 Multi-Agent 系统概述

从单兵到军团

Sub-Agent 是"一个助手",Multi-Agent 是"一支团队"。工程化的关键在于:如何让这支团队高效协作

复制代码
单 Agent:
  用户 → Claude → 结果

Multi-Agent 系统:
  用户 → 协调者 Agent
              ↓
    ┌─────────┼─────────┐
    ↓         ↓         ↓
  Agent A   Agent B   Agent C
  (分析)  (实现)  (测试)
    ↓         ↓         ↓
    └─────────┼─────────┘
              ↓
         汇总结果 → 用户

Multi-Agent 的核心价值

价值 说明
并行加速 多任务同时执行,总时间 ≈ 最长子任务时间
专业分工 每个 Agent 专注特定领域,质量更高
上下文隔离 子任务细节不污染主上下文
可扩展性 任务增加时,增加 Agent 而非扩大单个 Agent
容错性 单个 Agent 失败不影响整体

4.2 四种编排模式

模式1:主从模式(Orchestrator-Worker)

最常见的模式,一个主 Agent 协调多个工作 Agent。

复制代码
┌─────────────────────────────────────────────────────┐
│                  主从模式                            │
│                                                     │
│         ┌──────────────────┐                        │
│         │   Orchestrator   │  ← 接收用户任务         │
│         │   (协调者)      │  ← 拆分任务             │
│         │                  │  ← 汇总结果             │
│         └──────┬───────────┘                        │
│                │ 派发任务                            │
│    ┌───────────┼───────────┐                        │
│    ↓           ↓           ↓                        │
│ ┌──────┐  ┌──────┐  ┌──────┐                       │
│ │Worker│  │Worker│  │Worker│  ← 执行具体任务         │
│ │  A   │  │  B   │  │  C   │                       │
│ └──────┘  └──────┘  └──────┘                       │
└─────────────────────────────────────────────────────┘

适用场景

  • 任务可以明确拆分

  • 子任务相对独立

  • 需要统一汇总结果

    实战案例:全栈功能开发

    用户:为我们的电商系统添加"商品收藏"功能

    Orchestrator 分析并派发:

    Worker A(数据库层):
    任务:设计并创建 favorites 表,添加必要索引
    输出:migration 文件路径

    Worker B(后端 API 层):
    任务:实现收藏/取消收藏/获取收藏列表 API
    依赖:Worker A 完成后执行
    输出:API 文件路径

    Worker C(前端层):
    任务:实现收藏按钮组件和收藏列表页面
    依赖:Worker B 完成后执行
    输出:组件文件路径

    Worker D(测试层):
    任务:为 API 编写集成测试
    依赖:Worker B 完成后执行
    输出:测试文件路径

    Orchestrator 汇总:
    验证所有文件已创建
    运行测试确认功能正常
    生成 PR 描述


模式2:流水线模式(Pipeline)

任务按顺序流转,每个 Agent 处理上一个 Agent 的输出。

复制代码
┌─────────────────────────────────────────────────────┐
│                  流水线模式                          │
│                                                     │
│  输入 → [Agent A] → [Agent B] → [Agent C] → 输出   │
│          分析需求    生成代码    审查代码             │
│                                                     │
│  每个 Agent 的输出是下一个 Agent 的输入              │
└─────────────────────────────────────────────────────┘

适用场景

  • 任务有明确的处理阶段

  • 每个阶段依赖上一阶段的结果

  • 需要逐步精炼输出质量

    实战案例:代码审查流水线

    阶段1 - 需求分析 Agent:
    输入:用户需求描述
    处理:分析需求,生成技术规格文档
    输出:tech_spec.md

    阶段2 - 代码生成 Agent:
    输入:tech_spec.md
    处理:根据规格生成代码
    输出:src/ 下的代码文件

    阶段3 - 代码审查 Agent:
    输入:生成的代码文件
    处理:检查代码质量、安全性、规范性
    输出:review_comments.md

    阶段4 - 修复 Agent:
    输入:代码文件 + review_comments.md
    处理:根据审查意见修复问题
    输出:修复后的代码文件

    阶段5 - 测试 Agent:
    输入:最终代码文件
    处理:运行测试,验证功能
    输出:test_report.md


模式3:并行扇出模式(Fan-Out)

一个任务同时分发给多个 Agent,收集所有结果后合并。

复制代码
┌─────────────────────────────────────────────────────┐
│                  并行扇出模式                        │
│                                                     │
│              ┌──────────────┐                       │
│              │  分发 Agent  │                       │
│              └──────┬───────┘                       │
│         ┌───────────┼───────────┐                   │
│         ↓           ↓           ↓                   │
│    ┌─────────┐ ┌─────────┐ ┌─────────┐             │
│    │Agent A  │ │Agent B  │ │Agent C  │             │
│    │(方案1)│ │(方案2)│ │(方案3)│             │
│    └────┬────┘ └────┬────┘ └────┬────┘             │
│         └───────────┼───────────┘                   │
│                     ↓                               │
│              ┌──────────────┐                       │
│              │  汇总 Agent  │ ← 选择最优方案         │
│              └──────────────┘                       │
└─────────────────────────────────────────────────────┘

适用场景

  • 需要探索多种方案

  • 对同一问题需要多角度分析

  • 需要投票或共识机制

    实战案例:多方案技术选型

    用户:我们需要为项目选择一个消息队列方案

    分发 Agent 同时派发3个子 Agent:

    Agent A - 评估 RabbitMQ:
    分析:性能、可靠性、运维复杂度、社区支持
    输出:rabbitmq_evaluation.json

    Agent B - 评估 Kafka:
    分析:性能、可靠性、运维复杂度、社区支持
    输出:kafka_evaluation.json

    Agent C - 评估 Redis Streams:
    分析:性能、可靠性、运维复杂度、社区支持
    输出:redis_streams_evaluation.json

    汇总 Agent:
    对比三个方案的评估结果
    根据项目需求(高吞吐、低延迟、易运维)打分
    推荐最优方案并说明理由
    输出:tech_selection_report.md


模式4:反馈循环模式(Feedback Loop)

Agent 之间形成反馈循环,迭代优化直到满足质量标准。

复制代码
┌─────────────────────────────────────────────────────┐
│                  反馈循环模式                        │
│                                                     │
│  ┌──────────┐    生成    ┌──────────┐               │
│  │ 生成     │ ─────────→ │ 验证     │               │
│  │ Agent    │            │ Agent    │               │
│  │          │ ←───────── │          │               │
│  └──────────┘   反馈     └──────────┘               │
│                                                     │
│  循环直到:验证通过 或 达到最大迭代次数              │
└─────────────────────────────────────────────────────┘

适用场景

  • 需要高质量输出

  • 有明确的验收标准

  • 允许多次迭代

    实战案例:测试驱动开发

    迭代1:
    生成 Agent:根据需求生成代码
    验证 Agent:运行测试 → 3个测试失败
    反馈:将失败的测试用例和错误信息返回给生成 Agent

    迭代2:
    生成 Agent:根据反馈修复代码
    验证 Agent:运行测试 → 1个测试失败
    反馈:将剩余失败的测试返回

    迭代3:
    生成 Agent:修复最后一个问题
    验证 Agent:运行测试 → 全部通过 ✅
    循环结束,输出最终代码


4.3 任务拆分策略

拆分原则

复制代码
好的任务拆分应满足:

1. 独立性(Independence)
   每个子任务尽量不依赖其他子任务的中间结果

2. 完整性(Completeness)
   所有子任务合并后覆盖完整的原始任务

3. 明确性(Clarity)
   每个子任务的边界清晰,不重叠

4. 可验证性(Verifiability)
   每个子任务有明确的完成标准

拆分维度

按功能模块拆分
复制代码
大任务:重构整个项目的错误处理

拆分:
  子任务A:重构 API 层的错误处理
  子任务B:重构 Service 层的错误处理
  子任务C:重构 Repository 层的错误处理
  子任务D:更新错误处理文档
按文件类型拆分
复制代码
大任务:为项目添加完整的类型注解

拆分:
  子任务A:为 models/ 下的文件添加类型注解
  子任务B:为 services/ 下的文件添加类型注解
  子任务C:为 api/ 下的文件添加类型注解
  子任务D:运行 mypy 验证类型正确性
按处理阶段拆分
复制代码
大任务:从零实现用户认证系统

拆分(有依赖关系,串行执行):
  阶段1:设计数据模型
  阶段2:实现数据访问层
  阶段3:实现业务逻辑层
  阶段4:实现 API 接口
  阶段5:编写测试
  阶段6:更新 API 文档

4.4 Agent 间通信机制

通过文件传递信息

最简单可靠的通信方式:子 Agent 将结果写入文件,主 Agent 读取。

复制代码
# 子 Agent A 的输出
写入文件:/tmp/agent_a_result.json
{
  "status": "success",
  "findings": [
    {"file": "auth.py", "line": 42, "issue": "弱密码策略"},
    {"file": "auth.py", "line": 87, "issue": "JWT 过期时间过长"}
  ],
  "summary": "发现2个安全问题"
}

# 主 Agent 读取
读取文件:/tmp/agent_a_result.json
处理结果并汇总

通过返回值传递信息

子 Agent 直接在任务完成时返回结构化数据:

复制代码
主 Agent 派发任务时要求:
"完成分析后,以如下 JSON 格式返回结果:
{
  'status': 'success' | 'failed',
  'result': {...},
  'error': '错误信息(如果失败)'
}"

通过共享工作目录

多个 Agent 共享同一个工作目录,通过文件系统协作:

复制代码
工作目录结构:
.claude-workspace/
├── tasks/
│   ├── task_001.json    ← 主 Agent 写入任务
│   ├── task_002.json
│   └── task_003.json
├── results/
│   ├── result_001.json  ← 子 Agent 写入结果
│   ├── result_002.json
│   └── result_003.json
└── status/
    ├── agent_a.status   ← Agent 状态文件
    ├── agent_b.status
    └── agent_c.status

4.5 错误处理与容错设计

子 Agent 失败处理策略

复制代码
策略1:重试(Retry)
  子 Agent 失败 → 等待1秒 → 重新派发相同任务
  适用:偶发性失败(网络问题、临时错误)
  最大重试次数:3次

策略2:降级(Fallback)
  子 Agent A 失败 → 改用更简单的方法完成任务
  适用:有备选方案的场景

策略3:跳过(Skip)
  子 Agent 失败 → 记录错误 → 继续其他任务
  适用:非关键子任务

策略4:中止(Abort)
  子 Agent 失败 → 停止所有任务 → 报告错误
  适用:关键任务失败,继续无意义

实战:带容错的多 Agent 系统

复制代码
主 Agent 执行逻辑(伪代码):

results = {}
errors = {}

# 并行派发任务
for task_id, task in tasks.items():
    try:
        result = spawn_agent(task, timeout=120)
        results[task_id] = result
    except TimeoutError:
        # 超时:重试一次
        try:
            result = spawn_agent(task, timeout=180)
            results[task_id] = result
        except:
            errors[task_id] = "超时失败"
    except Exception as e:
        errors[task_id] = str(e)

# 汇总
if errors:
    print(f"警告:{len(errors)} 个子任务失败")
    print(f"失败任务:{errors}")

print(f"成功完成:{len(results)} 个子任务")
generate_report(results, errors)

4.6 性能优化

Token 成本优化

复制代码
优化1:精简子 Agent 的上下文
  ❌ 给子 Agent 传递整个项目的所有信息
  ✅ 只传递完成任务所需的最小信息

优化2:合理设置并行度
  ❌ 同时派发100个子 Agent
  ✅ 控制并发数量(建议3-5个)

优化3:复用子 Agent 结果
  ❌ 多个子 Agent 重复读取同一文件
  ✅ 主 Agent 预先读取,通过任务描述传递内容

优化4:使用 Prompt Caching
  ✅ 相同的 System Prompt 在多个子 Agent 间共享缓存

执行时间优化

复制代码
优化1:识别关键路径
  分析任务依赖图,找出最长的依赖链
  优先执行关键路径上的任务

优化2:提前启动
  不等所有准备工作完成,尽早启动可以开始的子任务

优化3:合理设置超时
  为每个子 Agent 设置合理的超时时间
  避免一个慢任务阻塞整个流程

4.7 实战案例:完整的 Multi-Agent 开发流水线

需求

用户说:"帮我实现一个完整的用户注册功能,包括后端 API、数据库迁移、单元测试和 API 文档。"

架构设计

复制代码
┌─────────────────────────────────────────────────────────┐
│                  用户注册功能开发流水线                   │
│                                                         │
│  用户输入                                               │
│     ↓                                                   │
│  [Orchestrator] 分析需求,制定计划                       │
│     ↓                                                   │
│  阶段1(串行):                                         │
│  [Agent-Schema] 设计数据模型和 API 规格                  │
│     ↓                                                   │
│  阶段2(并行):                                         │
│  ┌──────────────┬──────────────┬──────────────┐        │
│  │[Agent-DB]    │[Agent-API]   │[Agent-Doc]   │        │
│  │创建数据库迁移 │实现 API 接口  │生成 API 文档  │        │
│  └──────┬───────┴──────┬───────┴──────┬───────┘        │
│         └──────────────┼──────────────┘                 │
│                        ↓                               │
│  阶段3(串行):                                         │
│  [Agent-Test] 编写并运行单元测试                         │
│     ↓                                                   │
│  [Agent-Verify] 验证所有功能正常                         │
│     ↓                                                   │
│  [Orchestrator] 汇总结果,生成完成报告                   │
└─────────────────────────────────────────────────────────┘

各 Agent 任务描述

Agent-Schema(阶段1)

复制代码
任务:为用户注册功能设计数据模型和 API 规格

请完成:
1. 设计 User 数据模型(字段:id, email, password_hash, 
   created_at, is_active)
2. 设计注册 API 规格(请求/响应格式)
3. 将设计结果写入 docs/register_spec.json

输出格式:
{
  "model": {...},
  "api": {
    "endpoint": "POST /api/v1/auth/register",
    "request": {...},
    "response": {...},
    "errors": [...]
  }
}

Agent-DB(阶段2,并行)

复制代码
任务:根据 docs/register_spec.json 创建数据库迁移文件

请完成:
1. 读取 docs/register_spec.json 中的数据模型定义
2. 创建 Alembic 迁移文件
3. 确保包含必要的索引(email 字段唯一索引)
4. 将迁移文件路径写入 docs/register_spec.json 的 
   migration_file 字段

Agent-API(阶段2,并行)

复制代码
任务:根据 docs/register_spec.json 实现注册 API

请完成:
1. 读取 docs/register_spec.json 中的 API 规格
2. 在 src/api/auth.py 中实现注册路由
3. 在 src/services/auth_service.py 中实现注册业务逻辑
4. 在 src/repositories/user_repository.py 中实现数据访问
5. 使用 bcrypt 哈希密码
6. 遵循项目三层架构规范

Agent-Test(阶段3)

复制代码
任务:为注册功能编写单元测试

请完成:
1. 读取 src/services/auth_service.py
2. 为每个公共方法编写单元测试
3. Mock 所有外部依赖(数据库、邮件服务)
4. 测试正常流程和异常流程
5. 运行测试并确保全部通过
6. 将测试文件保存到 tests/unit/test_auth_service.py

执行结果

复制代码
✅ Agent-Schema:完成数据模型和 API 规格设计(耗时 45s)
✅ Agent-DB:创建迁移文件 migrations/20260621_add_users.py(耗时 30s)
✅ Agent-API:实现注册 API(耗时 60s)
✅ Agent-Doc:生成 API 文档 docs/api/register.md(耗时 25s)
✅ Agent-Test:编写并通过 12 个单元测试(耗时 50s)
✅ Agent-Verify:所有功能验证通过

总耗时:约 3 分钟(并行执行节省约 40% 时间)
生成文件:6 个
测试覆盖率:92%

4.8 本章小结

核心概念 要点
四种编排模式 主从、流水线、并行扇出、反馈循环
任务拆分原则 独立性、完整性、明确性、可验证性
通信机制 文件传递、返回值、共享工作目录
容错设计 重试、降级、跳过、中止
性能优化 精简上下文、控制并发、复用结果

🧪 动手练习

练习1:设计一个 Multi-Agent 系统

为以下需求设计 Multi-Agent 架构:

复制代码
需求:对一个 Node.js 项目进行全面的依赖安全审计,
      检查所有 npm 包的已知漏洞,生成修复建议报告

请设计:
1. 需要哪些 Agent?
2. 每个 Agent 的职责是什么?
3. 执行顺序(串行/并行)?
4. Agent 间如何传递信息?

练习2:实现简单的流水线

bash 复制代码
# 创建一个两阶段流水线:
# 阶段1:分析代码,找出所有 TODO 注释
# 阶段2:为每个 TODO 生成实现建议

claude -p "
第一步:读取 src/ 目录下所有文件,找出所有 TODO 注释,
        保存到 todos.json(格式:[{file, line, content}])

第二步:读取 todos.json,为每个 TODO 生成具体的实现建议,
        保存到 todo_suggestions.md
"

⬅️ 上一章:第03章 - Sub-Agents 核心概念

➡️ 下一章:第05章 - 构建只读型安全审计子代理