1. 先说结论:多 Agent 不是团队越大越好
两三年前我第一次做多 Agent 项目,想法非常简单粗暴:任务复杂,那就多拆几个角色,角色不够再加人。最开始是 2 个,后来到 5 个,最高峰一次上线了 12 个 Agent 协作。结果呢?延迟从 20 秒飙到三分钟,Token 消耗翻了接近十倍,最讽刺的是最终输出质量还没有单 Agent 加工具链的时候高。那次复盘给我留下了一个贯穿至今的观点:多 Agent 系统的成败,和 Agent 数量没有线性关系,真正决定体验的是协作拓扑怎么选。
这其实是不少团队的惯性误区。“多 Agent = 强能力”听着合理,但实际跑起来,多 Agent 意味着更长的推理链路、更多的上下文传递、更多的出错点位。每一个 Agent 就是一次额外的模型调用,每一次消息往返都在消耗令牌和时间。更让人头疼的是,Agent 之间会互相干扰:A 输出的中间结论可能误导 B,B 产生的内容反过来又污染 C 的上下文。这些成本在画架构图的时候是看不见的,等上了生产,账单会直接教做人。
我写这篇文章,就是想把这几年在多 Agent 协作上的真实体会整理出来。重点放在四种最常用的协作拓扑——中心化编排、流水线接力、层级分包、完全互联——以及我实际踩过的坑。如果你正在做方案选型,或者在现有方案里反复调 Agent 数量但始终找不到手感,这篇应该能给你一个相对完整的参考框架。
需要声明的是,我这里讨论的“多 Agent”,默认指大模型驱动的智能体应用,可能是接入了 RAG、工具调用和外部 API 的工程化实现。框架不限,逻辑通用,不管你是用 LangGraph、AutoGen、CrewAI,还是自己写状态机,核心的协作模式和踩坑点都逃不出下面这几类。
2. 为什么多 Agent 系统容易翻车:三个被低估的成本
2.1 沟通成本是隐性的大头
先说最直观的部分。单个 Agent 处理一个任务,只需要发起一次模型调用、处理一次输入输出,成本清晰,延迟可控。但当你把任务拆给多个 Agent,协作必然带来沟通损耗。
举个例子。我用一个“自动生成数据分析报告”的任务做过对照实验。定义良好的单 Agent,输入原始 CSV 和需求说明,加上工具调用,大约消耗 4000 个 token,用时 18 秒。同样任务我换成 3 个 Agent:一个负责解析数据、一个负责写分析结论、一个负责排版。结果 Token 消耗飙升到 15000 左右,耗时干到 47 秒。多出来的消耗并不是在“干活”,而是分布在任务理解、上下文输入、中间结果回传、以及每个 Agent 在启动前都要重新把全局信息读一遍这些环节上。
这在多 Agent 系统里有个叫法,叫“沟通开销”。而且这种开销不是线性的,Agent 数量越多,两两之间的协调路径越多。4 个 Agent 的潜在连接是 6 条,8 个 Agent 就是 28 条。每一条都可能产生消息传递、等待、重试,Token 和时间就是这么一点点烧掉的。
2.2 上下文污染比想象中严重
第二个被低估的成本是上下文污染。多 Agent 协作时,每个 Agent 的输入上下文里不只是原始任务,还包含了其他 Agent 处理过的中间结果、决策记录、系统指令。这些中间产物可能本身是“不干净”的——也许上一环节产生了轻微错误,也许某个 Agent 把需求理解偏了十几度。
一旦中间环节有偏,错误会顺着链路放大,而且极难定位。我在实际项目里遇到过非常典型的例子:流水线中负责“数据清洗”的 Agent 把某个字段的空值默认成了 0,下一个“生成图表”的 Agent 完全不知道这个处理逻辑,画出来的趋势图直接畸形,再往后的“总结” Agent 基于这张错误的图得出了一个完全相反的结论。整个链条走完,输出看起来自洽,但事实是错的。单 Agent 系统里,你还有机会在输入端把数据校验清楚;多 Agent 系统一旦跑起来,链路中的每一个 Agent 都在对上下文进行“二道加工”,你很难还原哪一步开始走了样。
2.3 系统复杂度会侵蚀所有收益
还有一个现实问题:多 Agent 的工程复杂度远高于单 Agent。单 Agent 的调试,无非是看 prompt、看输入输出、查工具调用。多 Agent 需要应对的是并发执行、消息路由、状态持久化、超时重试、角色权限、中间结果校验……每一项单独拎出来都是系统性问题。
我刚开始做多 Agent 的时候,经常在本地“跑得挺好”,一上生产就各种玄学。后来发现原因很简单:本地大多是串行调试,生产环境是并发跑,Agent 之间调用的依赖关系一旦出现竞态,结果就是不可复现的。你今天调通,明天换个输入就挂了,问题还不能稳定复现,那是真的折磨人。
所以我的结论很直接:一个任务如果单 Agent 加几个工具能解决,就不要强行拆分。多 Agent 是一门拿资源换灵活性、拿复杂度换可扩展性的生意,你得先确定这笔买卖划算。
3. 四种协作拓扑逐个拆解
3.1 中心化编排(Orchestrator-Worker)
这是目前生产中最流行、新手最容易上手的拓扑。核心思路很简单:一个中心“调度 Agent”负责理解任务、拆分步骤、把子任务分发给不同的 Worker Agent,最后收集并汇总输出。Worker 之间不直接通信,所有信息通过编排器中转。
你可以把它想象成传统软件开发里的项目经理角色:项目经理接需求、拆任务、派人干活、收活验收,执行人员不互相聊需求,只管完成分到自己头上的那部分工作。
中心化编排最适合任务边界清晰、可拆成多个互不依赖子任务的场景。典型例子是“自动生成一份市场调研报告”:编排器先决定需要哪些数据,同时派出数据抓取 Agent、竞品分析 Agent、用户反馈汇总 Agent,等它们各自完成后,再统一汇总成最终报告。Agent 数量一般控制在 3~8 个,太少没必要,太多编排器看不过来。
优点比较突出:
- 调试友好。所有通信都有明确的主线,日志集中在编排器周围,问题定位相对快。
- 权限和流程好控制。只要编排器不下指令,Worker 不会自行启动。
- Prompt 设计相对简单,每个 Worker 只需要做好自己的单一职责。
但我必须提醒几个坑。首先是单点瓶颈:编排器既是流量入口又是决策汇总点,一旦它理解错了,整个流程跟着错,且没有旁路。其次,编排器自身的上下文压力会很大,它需要同时记忆任务目标、每个 Worker 的状态、中间结果等,很容易超出模型的上下文窗口。
实践经验:给每个 Worker 定义结构化的输入输出接口,让编排器不要直接读全量中间结果,而是只读“摘要 + 关键数据结构”。这能大幅降低上下文压力。另外,一定要给编排器加一个“异常分支”,让它能判断某个子任务是否需要重试、跳过或者向用户求助,而不是硬着头皮出结果。
3.2 流水线接力(Pipeline)
流水线拓扑是另一种非常直观的模式。任务被划分成固定的阶段,Agent 排成一条链,前一个 Agent 的输出直接成为后一个 Agent 的输入。就像工厂生产线:拧螺丝的不管喷漆,喷漆的不管包装,每个岗位只对上一道工序的结果负责。
这个拓扑最适合流程固定、顺序明确的场景。比如“从原始数据到最终报告”:第一步 Agent 负责数据清洗和数据校验,第二步 Agent 做统计分析并生成图表,第三步 Agent 基于图表撰写正文,第四步 Agent 负责排版与校对。每一阶段输入输出都很清晰,改起来也方便:你只需要替换某一环的 prompt 或工具逻辑,其他环节不用动。
流水线最大的优点就是简单直接,链路短、开销相对小、可控性好。因为每一环只做一件事,上下文传递是有边界的,不会像网状拓扑那样无限膨胀。缓存和断点恢复也容易做:如果第三步挂了,前两步的结果可以缓存下来,修好后再从第三步接着跑。
但它有一个致命弱点:错误会沿着链路传导并放大。一个环节的失误,到了链条末端可能已经“面目全非”。比如第一步数据清洗错了,后面所有环节的输入都是错的,但每个 Agent 依然会自信地基于错误数据进行推理,最终输出看起来格式完美、逻辑通顺,但结论完全是错的。流水线里的 Agent 通常没有回退机制和横向纠正能力。
所以我的建议是:在流水线每个关键环节之间加校验点,用规则、正则或一个小型校验 Agent 去检查中间产物的质量。校验点不用做非常复杂的语义验证,主要查格式、查字段完整性、查明显的逻辑矛盾,这就够用了。
3.3 层级分包(Hierarchical)
层级拓扑可以理解为中心化编排的“多级版”。顶层一个总控 Agent,负责战略目标与重大决策;中间层是若干分控 Agent,各自监管一个子领域;再往下才是真正干活的末端 Agent。每层的管理权限逐级下发,信息逐层汇报。
这种结构最适合大型、多领域耦合的系统。举个例子:一个“全栈项目自动开发”系统,总控 Agent 拆解需求后,分出前端开发组、后端开发组、测试组三个二级 Agent;前端组内部再拆出页面布局 Agent、组件实现 Agent、样式美化 Agent。前后端的结果汇聚到测试组,测试发现问题再退回对应层级的负责人修复。
层级拓扑的优势在于可扩展性强,每一层只需要管好“下一层的几个直接下属”,不必知道全局细节。局部故障时可以隔离开——测试组发现问题,会直接回流给对应的开发组,而不会影响另一组的工作。
但也有明显的代价:延迟和 Token 开销都更高。每一层的汇报、审批、再分发都会产生额外通信,信息一多,多级传递很容易失真。在这里“传话游戏”效应非常常见:总控说“重点突出安全性”,传到具体的 Worker 那里可能就变成了“加一个登录页面”。所以在实际项目里我建议层级不要超过三层,超过三层大概率会越传越偏。
额外经验:每一层的管理 Agent,尽量让它输出“决策纪要”而不是“全量对话”,下一层看到的是明确定义的任务和约束条件,而不是一大堆中间讨论。这样能显著减少信息失真,也让上下文压力小很多。
3.4 完全互联(Mesh)
完全互联,也叫点对点或网状拓扑。在这种模式下,任何 Agent 之间都可以直接通信、协商、竞争,没有中心调度者。每个 Agent 既是提议者,也是执行者,也是评估者。这更像是一种“自由市场”式的协作方式。
这种拓扑适合开放性极强的任务,比如头脑风暴、创意文案、策略推演、开放域问答。因为没有一个固定答案存在,让多个 Agent 自由表达、互相挑战,往往能产生单 Agent 无法给出的综合视角。我见过有人用 3 个 Agent 互相辩论来改进产品方案,最后产出的思路比我一个人写的好得多。
但要让网状拓扑在生产环境可用,必须加一堆约束:
- 设置最大轮次上限,比如最多讨论 10 轮,到点强制收敛。
- 设置 Token 预算上限,防止讨论失控烧钱。
- 引入一个“仲裁 Agent”或更简单的“投票机制”,在讨论结束后选择最优结果。
- 所有 Agent 共享一套通信协议和状态流转约束,防止对话路径变成一团乱麻。
它是四种拓扑里最难调试、最不可控的,我的建议是只在“点子生成”这类对输出多样性要求高、错误代价可控的任务里使用,不要拿它直接处理涉及强数据一致性的业务逻辑。
4. 选型评估:一张表帮你快速落地
4.1 按任务特征快速匹配
我把四种拓扑的核心特征整理成一张对照表,你可以直接对照自己的任务类型来筛。
| 评估维度 | 中心化编排 | 流水线接力 | 层级分包 | 完全互联 |
|---|---|---|---|---|
| 任务结构 | 可拆分成并行子任务 | 顺序固定、阶段明确 | 多子域、子域内部再拆分 | 开放、无序、探索性强 |
| 通信复杂度 | 集中在编排器 | 单向链式 | 树状多层 | 全向交叉 |
| 调试难度 | 低 | 中 | 中高 | 高 |
| 成本控制 | 中 | 低 | 高 | 极高 |
| 错误容错性 | 中(编排器错误影响全局) | 低(链式放大) | 较高(可局部隔离) | 高(路径冗余) |
| 推荐 Agent 数量 | 3~8 | 3~6 | 5~20+ | 2~6 |
| 典型落地场景 | 报告生成、信息检索汇总 | 数据处理、内容生产流水线 | 多部门协作的大型项目 | 头脑风暴、策略推演 |
这张表只是帮你做第一轮筛查,后面还要结合成本、容错、工程能力综合判断。
4.2 三步筛选法
我更习惯用一个三步筛选法来落地选型决策。
第一步,画出任务依赖图。把任务拆成步骤,标注步骤之间的依赖关系。如果步骤之间大多是“并行独立”,优先看中心化编排;如果步骤是“严格先后次序”,考虑流水线;如果任务可以分成多层子域,考虑层级结构;如果任务本身没有固定结构,才考虑网状拓扑。
第二步,评估失败代价。想一下任务出错时,是会生成一份不够完美的报告,还是会导致赔钱、用户账号数据被改这类不可逆的严重后果。后果严重就用中心化或层级结构,加入人工确认或规则校验;后果较轻就可以用网状拓扑去求多样性。
第三步,看团队调试能力。如果团队对 Agent 编排框架不熟,或者没有日志链路追踪的基础设施,就别一上来就上网状或层级,先中心化编排做起,跑稳了再演进。拓扑越复杂,对可观测性的要求就越高,这个前置条件往往被人忽略。
4.3 混合式和演进式设计
说实话,真实生产系统很少是单一拓扑的。我目前维护的系统里,主流程是层级分包,数据预处理部分用流水线,创意生成模块是网状,入口处又用了编排器。拓扑是可以混用的,关键是先在纸面上把每个局部拓扑画清楚,明确它们之间的边界和接口。
一个实用的演进路径是:先用单 Agent + 工具链把流程跑通,验证业务价值;再加一个编排器,把子任务拆出去;当子任务出现明显的并行需求时,再加层级或流水线,让系统一层层“长”出来,而不是一上来就堆一个巨大的拓扑。每次演进都设置量化指标,比如延迟、Token 成本、任务成功率,用来判断这一步到底是优化了还是退化了。
5. 我的踩坑清单:这些坑你大概率也会踩
5.1 Token 预算形同虚设
我见过太多团队(包括我自己)在架构设计阶段拍脑袋定 Token 预算,常见操作是“每个 Agent 给 2000 token,10 个 Agent 就是 2 万,看起来可控”。但一跑起来,Agent 会自作主张地自我重复,或在一个工具调用上反复循环,中间结果又常被重复输入到多个上下文里。真实消耗往往是预估的 3~5 倍,账单出来的时候没法面对。
我的建议是:上线之前就把每次任务的 Token 消耗链路埋点统计做起来,按拓扑分环节统计。哪一部分消耗异常高,立刻就能看出来。预算不能只设一个总数字,要按 Agent 角色设置单次调用上限,并且设置各种终止条件,把“失控发散”这个念头提前杀死。
5.2 循环调用和内部死锁
多 Agent 里最常见的三种死循环:Agent A 把任务交给 B,B 觉得该 C 做,C 又退回给 A;两个 Agent 对同一个结论反复确认“你确定吗”“我确定”“你再看看”;递归式拆解任务,越拆越细,永远不收敛。
这三种情况我都遇到过,修复方式都一样:引入轮次上限。给每个 Agent 设置最大调用次数,超过后强制走仲裁或直接返回当前结果,并打上“未收敛”标记。不要小看这个标记的价值,它至少让你知道结果可能不可靠,而不是拿着一个“貌似完整”的输出直接拿去用。
5.3 权限边界和风险操作没划清
多 Agent 系统一旦接入工具,权限问题就变得格外尖锐。比如一个 Agent 的工具是“删除数据库记录”,另一个 Agent 在推理过程中认为需要清理旧数据,顺手就调用了删除工具。技术上说,不会有人刻意让 Agent 去执行危险操作,但推理的不确定性加上工具的开放性,“允许它访问”基本等于“允许它犯错”。
我的处理方式分三层:第一层,工具级别做白名单,每个 Agent 只能看到自己必需的工具,不相关的工具直接不给权限;第二层,在调用风险操作之前加一个“人工确认回调”,哪怕只确认一次,也能拦住绝大多数误删误改;第三层,核对审计日志,所有 Agent 的任何操作都留痕,出了问题能追溯。
5.4 没有评测指标:上线等于盲飞
我接手过一些团队的多 Agent 项目,问他们“你怎么判断这次系统改动是变好了还是变坏了”,对方往往只能回一句“感觉比以前流畅一点”。这是多 Agent 系统落地最致命的问题。没有量化指标,你在调参、改拓扑、加 Agent 时根本没有依据,全凭感觉。
最少也要从三个维度做评测:任务成功率(输出是否符合预期结果)、Token 成本(单次任务平均消耗)、端到端延迟。如果做的是内容生成类任务,再加一个人工抽样审核评分。有条件的话,建一套回归评测集——固定几十个典型任务,每次结构改动完整跑一遍,看指标涨跌。没有这套机制,你改的任何东西都可能是负优化,但你没有发现。
5.5 日志链路跟到一半就断了
多 Agent 的“黑盒”问题特别严重。Agent 之间互相调用,日志散落在一个个异步任务里,想还原一个请求的完整链路非常困难。如果你现在还在用“print 大法”调试多 Agent,相信我,系统规模稍微一大,你会想掀桌。
请提前引入全链路追踪。不需要多复杂的工具,最简单的做法是给每次会话生成一个 trace_id,所有 Agent 的输出、调用记录、工具执行结果都带这个 ID,打到同一份日志聚合里。查问题的时候,一条命令就能拉出整条链路的上下文。
5.6 踩坑速查表
| 坑 | 表现 | 根本原因 | 解决方案 |
|---|---|---|---|
| Token 飞涨 | 结算单超出预算数倍 | 重复协商、上下文重复灌入 | 按环节统计成本,设置单 Agent 调用上限 |
| 循环/死锁 | Agent 互相踢皮球,任务挂起 | 缺少收敛条件 | 设置轮次上限、引入仲裁机制 |
| 危险操作 | Agent 意外删除或修改数据 | 工具权限过大 | 工具白名单、人工确认、审计日志 |
| 无评测指标 | 改动无法评判优劣 | 缺少评测体系 | 建成功率/成本/延迟三维评测,建回归集 |
| 日志断链 | 排查问题靠猜 | 没有贯穿式链路 ID | 全局 trace_id,统一日志存储 |
6. 跑完这么一圈之后的心里话
说句实在话,多 Agent 系统并不是银弹。一个清晰、定义良好的单 Agent 加上工具和 RAG,在大多数场景下都够用,而且成本最低、稳定性最好。真正需要切换多 Agent 的时刻,是任务复杂度已经明确超出了单 Agent 的能力边界,或者多个子任务天然需要并行时。
我在实际项目里养成了一个习惯:每次部署和升级多 Agent 系统,都先问自己“这个改动是否让问题变得更可控”。多 Agent 的初衷是解决复杂问题,而不是向人展示“我们有很多智能体”。如果加了一个 Agent,却只是让它来来回回传递信息,那它实际上是在降低系统的确定性和稳定性。
最后分享一个小技巧:新项目先跑通单 Agent 基线,把指标打出来;然后再升级到中心化编排,继续测;真正有必要时再引入更复杂的拓扑。这听起来慢,但实际是踩坑最少、交付最快的路径。毕竟,多 Agent 系统是用来交付价值的,不是用来炫技的。