Skip to content

Multi-Agent

🎯 学习目标

  • 理解「拆 Agent 为分上下文,而非分角色扮演」
  • 设计主管-工人、Swarm 等协作模式
  • 实现消息总线或黑板式状态共享
  • 避免 Multi-Agent 带来的成本与循环调用爆炸

引言

单个 Agent 窗口塞满 RAG、工具、历史后会又慢又蠢。Multi-Agent 通过多个独立上下文分工——但拆不好会变成「多个笨蛋互相聊天」。本节讲 principled 拆分。

章节正文

第 1 步:为什么拆:上下文,不是 cosplay

错误动机:「研究员 Agent + 作家 Agent + critic Agent」角色扮演,消息里互相寒暄。

正确动机:

  • Research Agent:只读工具 + 大 RAG,窗口专用于搜集
  • Writer Agent:只收精炼结论,窗口专用于成文
  • Reviewer Agent:检查清单,小窗口

每个 Agent 工具集不同、system 不同、memory 不同

第 2 步:主管-工人(Supervisor-Worker)

typescript
async function supervisorTask(goal: string) {
  const subtasks = await supervisor.plan(goal)
  const results = []
  for (const t of subtasks) {
    results.push(await worker.run(t, { tools: toolsFor(t) }))
  }
  return supervisor.synthesize(results)
}

Supervisor 窗口保持小;Worker 可并行。Supervisor 不直接调高风险 write 工具。

第 3 步:Swarm 与汇总

多个 Worker 并行同一问题不同角度(如不同数据源),再 merge:

python
branches = await asyncio.gather(
    agent_a.run(query),
    agent_b.run(query),
    agent_c.run(query),
)
final = merger_llm.synthesize(branches)

要设去重与冲突 resolution规则,避免 merger 幻觉统一。

第 4 步:状态隔离与黑板

Agent 间不拼接全部 chat history,而是写结构化黑板

json
{
  "facts": [{"id": "f1", "text": "...", "source": "agent_a"}],
  "open_questions": ["..."],
  "artifacts": {"report_draft_v2": "..."}
}

需要细节时按 id 拉取,而非 replay 全程对话。

第 5 步:成本与终止

Multi-Agent 易 Agent×Agent 无限对话。限制:

  • 最大 delegate 深度
  • 最大总 LLM 调用次数
  • Supervisor 强制 single final call

trace 按 agent_id 分 span,便于看哪子 Agent 烧钱。

动手练习

  1. 为一个「竞品报告」任务拆 2 Worker + 1 Supervisor,写各自动态工具列表。
  2. 设计黑板 JSON schema,含 facts / artifacts / open_questions。
  3. 写 Swarm 并行后 merger 的 conflict 规则 3 条。
  4. 估算 3 Agent 各 8 步 vs 1 Agent 24 步的 Token 差(粗算即可)。
  5. 画 supervisor 调 worker 的 sequence diagram,标 max depth=2。

常见问题

Q:Multi-Agent 一定比单 Agent 好吗?

不一定。拆分与合并都有 overhead。只有单窗口出现 Rot、工具冲突或并行收益时才值得。

Q:每个 Agent 需要不同模型吗?

可按职责选:Supervisor 用强推理,Worker 检索用小模型。也可同模型不同 Prompt/tools。

Q:和 Microservices 类比合适吗?

部分合适:边界、契约、观测。但 Agent nondeterministic,更要 Harness 与 eval。

本节小结

Multi-Agent 为分上下文、分工具、并行探索;用 Supervisor/Swarm + 黑板共享结构化结论,设深度与调用上限,避免群聊式空转。