多代理系统会协调专门化组件来处理复杂工作流。不过,并非每个复杂任务都需要这种方法。一个具备合适工具(有时是动态工具)和提示词的单代理,通常也能取得类似结果。
如需内置多代理支持,请使用 Deep Agents:它是构建在 LangChain 之上的更高层运行框架,随附子代理技能、规划、虚拟文件系统和上下文管理。

为什么使用多代理?

当开发者说需要“多代理”时,通常是在寻找以下一种或多种能力:
  • 上下文管理:提供专门知识,同时不压垮模型的上下文窗口。如果上下文无限且延迟为零,你可以把所有知识都放进一个提示词;但现实并非如此,因此需要用模式来选择性地呈现相关信息。
  • 分布式开发:让不同团队独立开发和维护能力,并以清晰边界组合成更大的系统。
  • 并行化:为子任务生成专门工作单元,并并发执行以更快获得结果。
当单个代理拥有过多工具且难以正确决定使用哪一个,任务需要带大量上下文的专门知识(长提示词和领域专用工具),或者你需要强制顺序约束,只有满足特定条件后才解锁能力时,多代理模式尤其有价值。
多代理设计的核心是 context engineering,即决定每个代理看到哪些信息。系统质量取决于是否能确保每个代理都能访问完成其任务所需的正确数据。

模式

以下是构建多代理系统的主要模式,每种模式都适用于不同用例:
模式工作方式
Subagents主代理将子代理作为工具进行协调。所有路由都经过主代理,由主代理决定何时以及如何调用每个子代理。
Handoffs行为会根据状态动态变化。工具调用会更新状态变量,从而触发路由或配置变化,切换代理,或调整当前代理的工具和提示词。
Skills按需加载专门提示词和知识。单个代理保持控制权,并根据需要从技能中加载上下文。
Router路由步骤对输入分类,并将其定向到一个或多个专门代理。结果会被综合成合并响应。
Custom workflow使用 LangGraph 构建定制执行流程,混合确定性逻辑和代理式行为。将其他模式作为节点嵌入工作流。

选择模式

使用下表将需求匹配到合适模式:
模式分布式开发并行化多跳直接用户交互
Subagents⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Handoffs--⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Skills⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Router⭐⭐⭐⭐⭐⭐⭐⭐-⭐⭐⭐
  • 分布式开发:不同团队是否可以独立维护组件?
  • 并行化:多个代理是否可以并发执行?
  • 多跳:该模式是否支持串行调用多个子代理?
  • 直接用户交互:子代理是否可以直接与用户对话?
你可以混合使用多种模式。例如,subagents 架构可以调用会触发自定义工作流或 router 代理的工具。子代理甚至可以使用 skills 模式按需加载上下文。组合方式非常灵活。

可视化概览

主代理将子代理作为工具进行协调。所有路由都经过主代理。
Subagents pattern: main agent coordinates subagents as tools
使用 LangSmith 跟踪跨代理的完整协调流程。按照跟踪快速入门完成设置。建议同时设置 LangSmith Engine,它可以监控跟踪、检测问题并提出修复建议。

性能对比

不同模式具有不同性能特征。了解这些权衡有助于根据延迟和成本需求选择合适模式。 关键指标:
  • 模型调用:LLM 调用次数。调用越多,延迟越高(尤其是串行调用时),每次请求的 API 成本也越高。
  • 处理的 token:所有调用中的总上下文窗口使用量。token 越多,处理成本越高,也越可能触及上下文限制。

一次性请求

用户: “Buy coffee”
专门的咖啡代理或技能可以调用 buy_coffee 工具。
模式模型调用最适合
Subagents4
Handoffs3
Skills3
Router3
4 次模型调用:
Subagents one-shot: 4 model calls for buy coffee request
关键洞察: 对单个任务而言,Handoffs、Skills 和 Router 最高效(各 3 次调用)。Subagents 会多一次调用,因为结果需要回流到主代理,这一开销换来了集中控制。

重复请求

第 1 轮: “Buy coffee” 第 2 轮: “Buy coffee again”
用户在同一对话中重复相同请求。
模式第 2 轮调用总计(两轮)最适合
Subagents48
Handoffs25
Skills25
Router36
再次 4 次调用 → 总计 8 次
  • Subagents 设计上是无状态的,每次调用都遵循相同流程
  • 主代理维护对话上下文,但子代理每次都会从全新状态开始
  • 这提供了强上下文隔离,但会重复完整流程
关键洞察: 有状态模式(Handoffs、Skills)在重复请求中可节省 40-50% 的调用。Subagents 会维持每次请求的一致成本,这种无状态设计提供了强上下文隔离,但代价是重复模型调用。

多领域

用户: “Compare Python, JavaScript, and Rust for web development”
每个语言代理或技能都包含约 2000 个 token 的文档。所有模式都可以进行并行工具调用。
模式模型调用token 总数最适合
Subagents5~9K
Handoffs7+~14K+
Skills3~15K
Router5~9K
5 次调用,约 9K token
Subagents multi-domain: 5 calls with parallel execution
每个子代理只在相关上下文中隔离工作。总计:9K token
关键洞察: 对于多领域任务,支持并行执行的模式(Subagents、Router)最高效。Skills 调用较少,但由于上下文累积,token 使用量较高。Handoffs 在这里效率较低,因为它必须串行执行,无法利用并行工具调用同时咨询多个领域。

总结

以下是各模式在三个场景中的对比:
模式一次性请求重复请求多领域
Subagents4 次调用8 次调用(4+4)5 次调用,9K token
Handoffs3 次调用5 次调用(3+2)7+ 次调用,14K+ token
Skills3 次调用5 次调用(3+2)3 次调用,15K token
Router3 次调用6 次调用(3+3)5 次调用,9K token
选择模式:
优化目标SubagentsHandoffsSkillsRouter
单次请求
重复请求
并行执行
大上下文领域
简单、聚焦的任务