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)
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:
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,而是写结构化黑板:
{
"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 烧钱。
动手练习
- 为一个「竞品报告」任务拆 2 Worker + 1 Supervisor,写各自动态工具列表。
- 设计黑板 JSON schema,含 facts / artifacts / open_questions。
- 写 Swarm 并行后 merger 的 conflict 规则 3 条。
- 估算 3 Agent 各 8 步 vs 1 Agent 24 步的 Token 差(粗算即可)。
- 画 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 + 黑板共享结构化结论,设深度与调用上限,避免群聊式空转。