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