多代理系统通过协调专业化组件来处理复杂工作流。然而,并非每个复杂任务都需要这种方式——配备了合适(有时是动态的)工具和提示词的单个代理通常也能实现类似的效果。
为什么需要多代理?
当开发者说他们需要”多代理”时,通常是在寻找以下一种或多种能力:
- 上下文管理:在不超出模型上下文窗口限制的情况下提供专业知识。如果上下文无限且延迟为零,你可以将所有知识塞入单个提示词——但现实中做不到,因此需要一些模式来选择性地呈现相关信息。
- 分布式开发:允许不同团队独立开发和维护各自的能力,并通过清晰的边界将它们组合成更大的系统。
- 并行化:为子任务生成专业工作进程并并发执行,从而加快结果获取速度。
当单个代理拥有过多工具而难以正确选择时、当任务需要具备大量上下文的专业知识(长提示词和领域专用工具)时,或者当你需要强制执行顺序约束——只有满足特定条件后才能解锁某些能力时,多代理模式尤为有价值。
多代理设计的核心是**上下文工程**——决定每个代理能看到哪些信息。系统质量取决于确保每个代理都能访问其任务所需的正确数据。
以下是构建多代理系统的主要模式,每种模式适用于不同的使用场景:
| 模式 | 工作原理 |
|---|
| 子代理 | 主代理将子代理作为工具进行协调。所有路由都经过主代理,由其决定何时以及如何调用每个子代理。 |
| 移交 | 行为根据状态动态变化。工具调用更新状态变量,触发路由或配置变更,切换代理或调整当前代理的工具和提示词。 |
| 技能 | 按需加载专业提示词和知识。单个代理保持控制权,同时根据需要从技能中加载上下文。 |
| 路由器 | 路由步骤对输入进行分类并将其定向到一个或多个专业代理。结果被合并成综合响应。 |
| 自定义工作流 | 使用 LangGraph 构建定制化执行流,将确定性逻辑与代理行为混合使用。将其他模式作为节点嵌入工作流中。 |
选择模式
使用此表格将你的需求与合适的模式进行匹配:
| 模式 | 分布式开发 | 并行化 | 多跳 | 直接用户交互 |
|---|
| 子代理 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐ |
| 移交 | — | — | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 技能 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 路由器 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | — | ⭐⭐⭐ |
- 分布式开发:不同团队能否独立维护各自的组件?
- 并行化:多个代理能否并发执行?
- 多跳:该模式是否支持串行调用多个子代理?
- 直接用户交互:子代理能否直接与用户对话?
你可以混合使用多种模式!例如,子代理架构可以调用触发自定义工作流或路由器代理的工具。子代理甚至可以使用技能模式按需加载上下文。可能性是无穷无尽的!
可视化概览
主代理将子代理作为工具进行协调。所有路由都经过主代理。 代理通过工具调用相互转移控制权。每个代理可以将控制权移交给其他代理,也可以直接响应用户。 单个代理在保持控制权的同时按需加载专业提示词和知识。 路由步骤对输入进行分类并将其定向到专业代理。结果被合并汇总。
性能对比
不同模式具有不同的性能特征。了解这些权衡有助于你根据延迟和成本要求选择合适的模式。
关键指标:
- 模型调用次数:LLM 调用的次数。调用越多 = 延迟越高(尤其是串行时)且每次请求的 API 成本越高。
- 处理的 Token 数:所有调用中上下文窗口的总使用量。Token 越多 = 处理成本越高,且可能触及上下文限制。
单次请求
用户: “买咖啡”
专业的咖啡代理/技能可以调用 buy_coffee 工具。
| 模式 | 模型调用次数 | 最佳选择 |
|---|
| 子代理 | 4 | |
| 移交 | 3 | ✅ |
| 技能 | 3 | ✅ |
| 路由器 | 3 | ✅ |
关键洞察: 移交、技能和路由器对单个任务最为高效(各需 3 次调用)。子代理多一次额外调用,因为结果需要回流到主代理——这一开销换来的是集中化控制。
重复请求
第 1 轮: “买咖啡”
第 2 轮: “再买一次咖啡”
用户在同一对话中重复相同的请求。
再次 4 次调用 → 共 8 次
- 子代理在设计上是无状态的——每次调用都遵循相同的流程
- 主代理维护对话上下文,但子代理每次都从头开始
- 这提供了强大的上下文隔离,但会重复完整的流程
2 次调用 → 共 5 次
- 咖啡代理仍处于活跃状态(来自第 1 轮,状态持久化)
- 无需移交——代理直接调用
buy_coffee 工具(第 1 次调用)
- 代理响应用户(第 2 次调用)
- 跳过移交节省了 1 次调用
2 次调用 → 共 5 次
- 技能上下文已加载在对话历史中
- 无需重新加载——代理直接调用
buy_coffee 工具(第 1 次调用)
- 代理响应用户(第 2 次调用)
- 复用已加载技能节省了 1 次调用
再次 3 次调用 → 共 6 次
- 路由器是无状态的——每次请求都需要一次 LLM 路由调用
- 第 2 轮:路由器 LLM 调用(1)→ 咖啡代理调用 buy_coffee(2)→ 咖啡代理响应(3)
- 可通过将路由器包装为有状态代理中的工具来优化
关键洞察: 有状态模式(移交、技能)在重复请求时节省 40-50% 的调用次数。子代理的每次请求成本保持一致——这种无状态设计提供了强大的上下文隔离,但代价是重复的模型调用。
多领域
用户: “比较 Python、JavaScript 和 Rust 在 Web 开发中的应用”
每个语言代理/技能包含约 2000 个 Token 的文档。所有模式均可发起并行工具调用。
| 模式 | 模型调用次数 | 总 Token 数 | 最佳选择 |
|---|
| 子代理 | 5 | ~9K | ✅ |
| 移交 | 7+ | ~14K+ | |
| 技能 | 3 | ~15K | |
| 路由器 | 5 | ~9K | ✅ |
5 次调用,约 9K Token每个子代理在隔离环境中运行,仅访问与其相关的上下文。总计:9K Token。 7+ 次调用,约 14K+ Token移交串行执行——无法同时研究三种语言。不断增长的对话历史增加了额外开销。总计:约 14K+ Token。 3 次调用,约 15K Token加载后,每次后续调用都处理全部 6K Token 的技能文档。由于上下文隔离,子代理整体处理的 Token 减少了 67%。总计:15K Token。 5 次调用,约 9K Token路由器使用 LLM 进行路由,然后并行调用代理。与子代理类似,但有明确的路由步骤。总计:9K Token。
关键洞察: 对于多领域任务,具备并行执行能力的模式(子代理、路由器)最为高效。技能的调用次数更少,但因上下文累积而导致 Token 使用量较高。移交在此场景下效率低下——它必须串行执行,无法利用并行工具调用同时查询多个领域。
以下是三种场景下各模式的对比:
| 模式 | 单次请求 | 重复请求 | 多领域 |
|---|
| 子代理 | 4 次调用 | 8 次调用 (4+4) | 5 次调用,9K Token |
| 移交 | 3 次调用 | 5 次调用 (3+2) | 7+ 次调用,14K+ Token |
| 技能 | 3 次调用 | 5 次调用 (3+2) | 3 次调用,15K Token |
| 路由器 | 3 次调用 | 6 次调用 (3+3) | 5 次调用,9K Token |
选择模式:
| 优化目标 | 子代理 | 移交 | 技能 | 路由器 |
|---|
| 单次请求 | | ✅ | ✅ | ✅ |
| 重复请求 | | ✅ | ✅ | |
| 并行执行 | ✅ | | | ✅ |
| 大上下文领域 | ✅ | | | ✅ |
| 简单、专注的任务 | | | ✅ | |
通过 MCP 将这些文档接入 Claude、VSCode 等工具以获取实时答案。