从单 Agent 到 Multi-Agent 系统
1. 单 Agent 的能力边界
在 LLM 应用发展的早期阶段,一个 Agent 往往就能完成大部分任务。最常见的结构,用户问题 → Agent → Tool → 最终答案。
Agent 负责理解需求、规划步骤、调用工具,并最终组织回复。在工具数量较少、业务范围单一时,这种结构简单直接,开发成本也比较低。例如一个旅游助手,最初可能只需要查询景点、查询路线、查询交通和查询天气,一个 Agent 配合几个 Tool 就足以覆盖大部分需求。
1.1 工具规模扩张带来的决策复杂度
随着业务不断扩展,旅游助手可能继续增加查询酒店、查询民宿、查询餐厅、查询航班、生成行程等能力。对应的 Tool 数量也会不断增加。
此时 Agent 每次接收到请求,都需要在越来越多的工具之间做决策:
1 | 问题 → 选择 Tool → 调用 Tool → 判断是否继续调用 Tool → 生成答案 |
从架构角度看,Agent 仍然只有一个,但内部复杂度已经开始快速增长。首先是 Prompt 变得越来越长。为了让 Agent 正确使用工具,通常需要向模型说明每个 Tool 的用途、输入参数、调用条件和返回结果。当 Tool 达到十几个甚至几十个时,仅工具描述就会占据大量上下文窗口。
其次是决策成本不断增加。Agent 不仅需要理解用户问题,还要判断该调用哪个 Tool、是否需要多个 Tool,以及多个 Tool 之间的调用顺序。随着可选工具增加,模型做出正确决策的难度也会越来越高。
1.2 单 Agent 架构的职责边界
更大的问题并不是 Tool 数量本身,而是业务领域开始混杂。以旅游场景为例,查询景点属于旅游知识领域,查询酒店属于住宿领域,查询航班属于交通领域,推荐餐厅又属于本地生活领域。
这些能力之间虽然存在关联,但背后的知识体系、数据来源和工具完全不同。如果全部塞进同一个 Agent,会逐渐形成一个“万能 Agent”。这种 Agent 看似能力很强,实际上会带来两个问题:
- 维护困难:任何新增能力都需要修改原有 Prompt 和 Tool 配置。
- 专业性下降:模型需要同时理解多个领域的规则,更容易出现判断失误。例如本应查询酒店库存,却错误调用了旅游信息工具;本应查询机票,却走到了天气查询流程。
这种问题本质上并不是模型能力不足,而是系统职责划分不清晰。
1.3 从工具管理到能力拆分
传统开发中有一个基本原则:一个模块只负责一类事情。Agent 系统同样适用这一原则。当业务复杂度持续上升时,更合理的做法不是继续扩充单个 Agent,而是拆分能力边界。
例如,可以把旅游助手拆分为几个职责明确的专业 Agent:
| Agent | 职责 |
|---|---|
| Travel Agent | 负责旅游信息 |
| Accommodation Agent | 负责住宿信息 |
| Flight Agent | 负责航班信息 |
| Restaurant Agent | 负责餐饮推荐 |
每个 Agent 都拥有自己的 Prompt、知识范围和 Tool 集合。此时系统关注点从“如何给 Agent 增加更多 Tool”,转向“如何把复杂能力拆分成多个专业 Agent”。
进入 Multi-Agent 阶段后,核心问题也随之变化:当系统中存在多个专业 Agent 时,任务应该交给谁?如果一个任务需要多个 Agent 共同参与,它们又应该如何协同工作?
2. 专业 Agent 的能力拆分
Multi-Agent 的第一步不是协作,而是分工。只有先明确谁负责什么、谁拥有哪些 Tool、谁解决哪类问题,后续的协作才有意义。
2.1 基于业务边界的能力划分
在传统软件架构中,经常会按照业务领域划分模块。例如电商系统通常会拆成商品、订单、支付、物流等模块,每个模块都有自己的职责范围。Agent 系统也可以采用类似思路。
以旅行助手为例,原来的单 Agent 同时负责景点查询、路线规划、天气查询、酒店预订和民宿查询。现在可以拆分为两个专业 Agent:
- Travel Agent:负责旅游相关信息,如景点、路线、天气。
- Accommodation Agent:负责住宿相关信息,如酒店、民宿、房态、价格。
这种拆分并没有减少系统能力,只是把原来集中在一个 Agent 身上的职责,分散到多个专业 Agent 身上。
2.2 专业 Agent 的工具集合管理
拆分 Agent 之后,Tool 也会跟着拆分。例如 Travel Agent 维护景点搜索、天气查询、路线规划等工具;Accommodation Agent 维护酒店数据库、民宿查询 API、房态查询等工具。
整体结构变成:
1 | Travel Agent → Travel Tools |
此时每个 Agent 只需要了解自己的工具。Travel Agent 不需要知道酒店数据库如何工作,Accommodation Agent 也不需要关心天气接口。相比单 Agent 管理所有 Tool,这种方式的职责边界更加清晰。
2.3 外部能力的工具化封装
无论底层是数据库、API、搜索引擎还是文件系统,对 Agent 来说都应该表现为统一的 Tool。
例如住宿 Agent 可以通过工具层访问酒店数据库。数据库中保存酒店名称、房型、价格、库存状态等信息,但 Agent 并不会直接操作数据库。结构如下:
1 | Database → Tool → Agent |
Agent 只需要知道“查询酒店”和“返回结果”,不需要知道底层是 SQL、SQLite 还是其他数据库。
外部服务也是一样。例如民宿预订服务本质上可能是 REST API,需要处理 HTTP 请求、JSON 解析和异常情况。但对 Agent 来说,check_bnb_availability() 只是一个普通 Tool。这就是 Tool Calling 的重要价值:屏蔽底层系统差异,让 Agent 可以使用统一方式访问各种外部能力。
3. Router Pattern:多 Agent 的任务分流机制
当系统中只有一个 Agent 时,不存在任务分配问题,所有请求都会进入同一个 Agent。但当系统被拆分成多个专业 Agent 后,一个新问题出现了:
1 | 用户问题 → 应该交给谁处理? |
Router Pattern 正是为了解决这个问题而出现的。
3.1 Router 的任务分流职责
Router 可以理解为整个系统的入口。用户不会直接和 Travel Agent 或 Accommodation Agent 对话,而是先把请求发送给 Router。Router 根据问题内容判断它属于哪个领域、需要哪个 Agent,然后将请求转发给对应 Agent。
整体结构如下:
1 | User → Router → Specialized Agent → Answer |
例如用户问:
1 | 苏州有哪些值得去的景点? |
Router 会判断这是旅游领域,随后转发给 Travel Agent。
如果用户问:
1 | 本周末还有哪些酒店空房? |
Router 会判断这是住宿领域,随后转发给 Accommodation Agent。这个过程与传统系统中的请求路由非常相似。区别只是过去路由的是服务,现在路由的是 Agent。
3.2 基于 LLM 的路由决策
Router 可以用规则实现,例如通过关键词判断是否包含“酒店”“景点”“航班”等词。但随着 Travel Agent、Booking Agent、Flight Agent、Weather Agent、Restaurant Agent 等 Agent 数量增加,规则会迅速变得复杂。
因此实际项目中,Router 往往也是一个 Agent。它利用大模型理解用户意图,然后完成路由决策:
1 | 用户问题 → Router Agent → 选择目标 Agent |
此时 Router 不再依赖硬编码规则,而是依赖模型推理能力。
3.3 Router Pattern 的适用边界
Router 解决的是“任务应该交给谁”的问题,但它没有解决“多个 Agent 如何一起完成任务”的问题。
例如下面这个请求:
1 | 推荐一个适合周末度假的海边小镇,并查询当地双人房价格。 |
这个问题同时包含旅游信息和住宿信息。按照 Router 的工作方式,它通常只能选择一个 Agent 执行。如果交给 Travel Agent,它能找到旅游地点,却无法查询住宿;如果交给 Accommodation Agent,它能查询住宿,却无法推荐景点。
所以 Router 适合任务归属明确的场景,但不适合需要多个 Agent 共同完成的复合任务。这也是 Supervisor Pattern 出现的原因。
4. Supervisor Pattern:从分流到协作
Router Pattern 解决了任务分流问题,但现实中的用户需求很少严格属于某一个领域。例如:
1 | 推荐一个适合周末度假的海边小镇, |
这个问题实际上包含多个子任务:
1 | 寻找旅游目的地 → 查询天气情况 → 查询住宿价格 → 查询房间库存 → 生成推荐方案 |
其中旅游信息可以交给 Travel Agent,住宿信息可以交给 Accommodation Agent。此时 Router 遇到的根本限制是:它只能选择 Agent,却无法协调 Agent。
4.1 Supervisor 的协调职责
Supervisor 并不负责具体业务。它更像整个系统的调度中心,主要职责包括理解需求、拆解任务、选择 Agent、组织执行顺序,以及整合执行结果。
整体结构变成:
1 | ↗ Travel Agent |
此时用户面对的不再是 Router,而是 Supervisor。
4.2 从任务分流到任务编排
Router 与 Supervisor 最本质的区别,在于是否具备任务编排能力。
1 | Router:判断 → 转发 → 结束 |
例如用户请求:
1 | 推荐一个适合周末度假的海边小镇,并查询当地酒店价格。 |
Supervisor 可能会按“调用 Travel Agent → 获取推荐地点 → 调用 Accommodation Agent → 查询住宿价格 → 汇总结果”的顺序规划。整个过程已经具备工作流特征。
4.3 Supervisor 作为上层调度者
在单 Agent 阶段,系统抽象层级是:
1 | Agent → Tool → External System |
进入 Supervisor 阶段后,结构变成:
1 | Supervisor → Agent → Tool → External System |
此时 Supervisor 不再直接管理 Tool,而是管理 Agent。换句话说,Agent 本身开始成为一种更高级别的能力单元。对于 Supervisor 来说,Travel Agent 已经是一个完整能力。它不需要知道 Travel Agent 内部用了哪些 Tool、调用了多少次 Tool、如何完成任务,只需要知道这个 Agent 能解决什么问题,以及调用后会返回什么结果。
因此很多框架会把 Supervisor 称为 Agent of Agents,也就是“管理 Agent 的 Agent”。
4.4 分层调度结构的扩展性
如果继续沿用单 Agent 思路,未来新增航班查询、餐厅推荐、签证信息、当地活动等能力时,都必须塞进同一个 Agent。最终形成:
1 | 一个 Agent + 几十个 Tool + 大量 Prompt |
而在 Supervisor 架构下,新增能力通常只需要增加新的 Agent,例如 Flight Agent、Restaurant Agent、Visa Agent,再挂到 Supervisor 下面。原有 Agent 不需要大幅修改。
这就是 Multi-Agent 最大的工程价值之一:
新增能力变成增加模块,而不是修改模块。
4.5 Supervisor 对模型能力的要求
Router 的工作相对简单,本质上是“这个问题属于哪个 Agent”的分类问题。Supervisor 面对的是规划问题,需要完成“理解需求 → 拆分任务 → 确定执行顺序 → 选择 Agent → 整合结果”。
例如用户请求:
1 | 推荐一个适合周末度假的海边城市, |
Supervisor 需要推理出:
1 | 先查询旅游地点 → 获取目的地 → 查询天气 → 查询酒店 → 生成最终建议 |
这种推理过程明显比 Router 更复杂。因此在实际项目中,Router 可以使用较轻量模型,Supervisor 通常需要能力更强的模型。
5. Multi-Agent 协作流程示例
理解 Supervisor 最好的方式,不是继续看概念,而是看一次任务如何在多个 Agent 之间流转。
5.1 任务理解与拆解
假设收到这样一个请求:
1 | 推荐一个适合周末度假的海边小镇, |
Supervisor 首先不会直接调用工具,而是先完成任务分析:寻找旅游目的地、查询当地天气、查询住宿价格、查询房间库存,并整合最终方案。
5.2 Travel Agent 处理旅游信息
任务拆分完成后,Supervisor 会发现寻找目的地和查询天气属于旅游领域,于是调用 Travel Agent。Travel Agent 收到任务后,使用自己的 Search Tool、Weather Tool、Route Tool 等工具完成查询。
执行过程可以概括为:
1 | Travel Agent → 查询海边小镇 → 获取候选地点 → 查询天气 → 返回结果 |
最终返回:
1 | { |
随后任务重新回到 Supervisor。
5.3 Accommodation Agent 处理住宿信息
获得旅游地点之后,Supervisor 发现下一步需要查询酒店、价格和库存,于是调用 Accommodation Agent。Accommodation Agent 内部可以使用 Hotel Database Tool 和 BnB API Tool。
执行过程如下:
1 | Accommodation Agent → 查询 St Ives 酒店 → 获取房型 → 获取价格 → 获取库存 |
最终返回:
1 | { |
然后再次回到 Supervisor。
5.4 结果整合与最终回答
当所有 Agent 完成任务后,Supervisor 已经获得了旅游结果和住宿结果。此时进入最后一步:结果整合。
最终回复可能是:
1 | 推荐前往 St Ives。未来几天天气晴朗。 |
从用户角度看,似乎只进行了一次对话。但系统内部已经经历了多次任务分发与结果汇总:
1 | User → Supervisor → Travel Agent → Supervisor → Accommodation Agent → Supervisor → Final Answer |
这就是 Router 与 Supervisor 的关键区别。Router 选择一次、执行一次、结束;Supervisor 则会经历规划、执行、再规划、再执行、整合和输出,因此具备多轮调度能力。
5.5 Agent 间的低耦合关系
在这个过程中,Travel Agent 并不知道 Accommodation Agent 的存在。Accommodation Agent 也不知道 Travel Agent 的存在。它们只接收任务、执行任务、返回结果。
整个协作过程由 Supervisor 统一管理,这样可以避免 Agent 之间形成复杂依赖。否则系统很容易演变成:
1 | Agent A → Agent B → Agent C → Agent A |
最终变成难以维护的网状结构。因此在 Supervisor 模式中,Agent 负责执行,Supervisor 负责协调。
6. Multi-Agent 架构设计原则
Multi-Agent 的价值不在于 Agent 数量,而在于系统能否通过合理分工与统一调度处理复杂任务。设计时需要特别注意以下几点。
6.1 Agent 职责的单一性
Agent 的职责必须足够清晰。Travel Agent 负责旅游信息,Accommodation Agent 负责住宿信息,这样的边界比较稳定。
相反,如果 Travel Agent 同时负责旅游和酒店,Booking Agent 又同时负责酒店和机票,Assistant Agent 还负责所有事情,职责就会高度重叠。此时 Supervisor 很难判断到底应该调用谁,路由错误率也会随之上升。
一个简单原则是:每个 Agent 都应该有明确且稳定的职责边界。
6.2 Agent 能力描述的明确性
Supervisor 负责调度 Agent,前提是它了解每个 Agent 的能力。这些描述信息通常会写入 Supervisor 的 Prompt,本质上类似于 Tool Description。
在 Tool Calling 中,Tool Description 告诉模型 Tool 的用途;在 Multi-Agent 中,Agent Description 告诉 Supervisor Agent 的用途。
如果描述不清晰,Supervisor 很容易出现错误判断。例如酒店问题被转给 Travel Agent,或者景点问题被转给 Accommodation Agent。因此 Agent 描述本身也是 Prompt 工程的重要组成部分。
6.3 结构化数据优先原则
Agent 之间的信息传递,本质上属于系统内部通信。这时自然语言并不是最佳选择。
例如下面这种表达,人容易理解,但另一个 Agent 处理起来并不方便:
1 | 我找到一个天气不错的小镇, |
更合理的方式是传递结构化数据:
1 | { |
结构化数据更容易解析、校验、扩展和追踪。尤其是在 Agent 数量增加之后,结构化数据的重要性会越来越明显。
6.4 控制 Agent 数量与系统复杂度
刚接触 Multi-Agent 时,经常会产生一种误解:Agent 越多,能力越强。实际上并非如此。每增加一个 Agent,系统都会增加新的 Prompt、维护成本、调度成本和上下文开销。
如果一个能力只是简单查询,例如天气查询、汇率查询、时间查询,通常更适合作为 Tool,而不是独立 Agent。只有当一个能力需要独立决策、独立知识和独立工作流时,才值得升级为 Agent。
6.5 系统可观测性
单 Agent 调试已经不容易,Multi-Agent 会进一步放大问题。例如:
- 为什么调用了这个 Agent?
- 为什么没有调用另一个 Agent?
- 为什么执行时间变长?
- 为什么结果错误?
如果没有完整执行链路,这些问题几乎无法排查。因此在 Multi-Agent 系统中,可观测性非常重要。通过执行轨迹可以清晰看到:
1 | 用户问题 → Supervisor → Travel Agent → Accommodation Agent → 最终答案 |
这样才能快速定位问题到底发生在 Router、Supervisor、某个 Agent,还是某个 Tool。
7. 小结
从单 Agent 到 Multi-Agent,本质上不是为了增加 Agent 数量,而是为了管理不断上升的复杂度。
最开始,大模型只能直接回答问题;Tool Calling 让模型可以访问外部能力;ReAct Agent 让模型可以在 Reason、Act、Observe 之间循环,形成动态决策;当工具和业务领域继续增加,单 Agent 开始变得臃肿,于是系统拆出多个专业 Agent。
Router Pattern 解决“请求应该交给谁”的问题:
1 | User → Router → One Agent |
Supervisor Pattern 解决“多个 Agent 如何协作”的问题:
1 | User → Supervisor → Multiple Agents → Final Answer |
整个演进过程可以概括为:
1 | Tool Calling → ReAct Agent → Router Pattern → Supervisor Pattern → Multi-Agent System |
Multi-Agent 的核心价值不在于拥有更多 Agent,而在于通过职责拆分、能力封装和统一调度,让复杂任务能够被稳定地分解、执行和管理。
需要注意的是,无论是单 Agent 还是 Multi-Agent,底层依然依赖大模型推理,因此仍然可能出现幻觉、错误规划或工具误调用等问题。尤其在涉及真实业务场景时,看起来真实的内容并不等于真实存在的事实,关键数据仍然需要依赖数据库、API 或人工校验进行验证。
从工程实践角度看,Multi-Agent 并不是终点,而是 Agent 系统从单体结构走向模块化、组织化的重要一步。