0%

多Agent系统的设计与评估

“任务越复杂越该用多Agent”——听起来好像没毛病,但这句话背后藏着一个巨大的陷阱。很多人一拍脑袋就上多Agent,结果延迟爆表、成本失控、日志一团浆糊,最后发现单Agent加个工具调用就能搞定。上一篇我们聊了 Multi-Agent 系统的设计原理,今天换个角度:什么时候该用多Agent?用完之后,怎么评判这套设计到底好不好?


一、先破一个误区:复杂度不是决策标准

很多人一听到”多Agent”,脑子里的画面是这样的:一个主控 Agent 坐镇中央,下面挂着写代码的、做测试的、写文档的,各司其职,特别壮观。

但壮观不等于好用。

复杂度从来不是选择多Agent的理由。 真正的决策标准只有两个维度:并发收益上下文约束

用一张表说清楚:

场景特征 单Agent够用吗 要不要上多Agent
步骤严格串行,后一步依赖前一步结果 够用 不要,纯浪费
多个子任务互相独立,可以同时跑 不够 要,并行收益明显
单个任务的上下文撑爆模型窗口 不够 要,必须切分
子任务之间需要频繁交换中间状态 勉强 谨慎,通信开销可能吃掉收益

但这张表太粗了,真实决策远比这复杂。下面我们拆开来讲。


二、决策框架:四把尺子量出答案

2.1 第一把尺子:任务依赖图是线性的还是扇出的?

这是最核心的判断依据。

线性依赖是指任务之间有严格的先后顺序:A 的输出是 B 的输入,B 的输出是 C 的输入。比如用户问”我的退款到哪一步了”——先识别意图,再查订单库,最后组织回复。这三步必须串行,中间插不进任何并行操作。

扇出依赖是指一个任务可以拆成多个互不相关的子任务同时执行。比如”帮我审查这个代码仓库的安全性”——注入漏洞扫描、内存泄漏检测、代码风格检查,这三件事之间没有任何数据依赖,完全可以同时开工。

画成图就是这样的区别:

1
2
3
4
5
6
7
8
线性依赖(单Agent):
意图识别 → 查数据库 → 组织回复
A → B → C

扇出依赖(多Agent):
┌→ 安全检测 ──┐
主控规划 ──→├→ 性能分析 ──├→ 汇总合并
└→ 规范检查 ──┘

判断标准:如果你的任务依赖图画出来是一条直线,用单Agent。如果画出来像一把扇子,考虑多Agent。

2.2 第二把尺子:上下文窗口是不是硬瓶颈?

有些任务看起来是线性的,但数据量大到单个模型根本吃不下。这时候即使任务是串行的,你也得想办法切分。

举个例子:给你一个 50 万行的代码仓库,要求生成完整的 API 文档。这不是并行任务——你需要理解全局架构才能写好文档。但问题是,50 万行代码塞不进任何模型的上下文窗口。

这时候多Agent的价值不是并行加速,而是上下文切片

1
2
3
4
Agent-1:扫描 controller 层,提取接口定义
Agent-2:扫描 service 层,提取业务逻辑
Agent-3:扫描 entity 层,提取数据模型
主控 Agent:拿到三份切片报告,合并生成文档

每个 Agent 只需要处理自己那一层的代码,上下文压力骤降。最后主控 Agent 拿到的是三份精炼过的报告,而不是几十万行原始代码。

判断标准:估算一下任务需要的上下文 token 量。如果超过模型窗口的 60%,就要考虑切分了。留 40% 的余量给系统 Prompt、工具调用和中间推理。

2.3 第三把尺子:延迟预算够不够?

这是最容易被忽略的一把尺子。

多Agent系统的延迟公式非常残酷:

1
总延迟 = max(各子Agent延迟) + 主控规划延迟 + 主控汇总延迟 + 通信开销

注意这里用的是 max 不是 sum——因为子 Agent 是并行的,总延迟取决于最慢的那个。听起来不错对吧?但别忘了后面还有三项固定开销。

在真实的线上环境里,大模型的一次调用延迟通常在 2-8 秒。一个三层架构的多Agent系统,光是规划和汇总就要各调一次模型,加上子 Agent 的执行时间,端到端延迟很容易突破 15 秒。

对比一下单Agent方案:

1
2
单Agent:意图识别(2s) → 工具调用(1s) → 总结回复(2s) = 5s
多Agent:规划(3s) + max(子Agent×3)(4s) + 汇总(3s) + 通信(1s) = 11s

判断标准:如果你的场景是面向用户的实时交互(聊天机器人、客服系统),延迟预算通常在 5 秒以内。这种场景下多Agent几乎一定会超时,单Agent + 工具调用是更务实的选择。如果是后台批处理任务(代码审计、报告生成),延迟预算宽松,多Agent才有发挥空间。

2.4 第四把尺子:Token 预算能不能扛得住?

多Agent系统的 Token 消耗不是线性增长,而是阶梯式跳涨

每一次 Agent 调用,你都要支付:

  • 系统 Prompt(每次都一样,但每次都要算钱)
  • 上下文注入(任务描述、历史信息)
  • 模型推理(输出 token)

假设你有一个主控 Agent + 5 个子 Agent,每个 Agent 的系统 Prompt 是 2000 token,任务描述平均 1000 token,输出平均 1500 token。那么一轮完整执行的 Token 消耗大约是:

1
2
3
4
主控:2000 + 1000 + 1500 = 4500
子Agent×5:(2000 + 1000 + 1500) × 5 = 22500
汇总:2000 + 3000(子Agent结果) + 2000 = 7000
总计:约 34000 token

而单Agent完成同样任务,可能只需要 5000-8000 token。

判断标准:如果你的系统要处理高并发请求(比如每秒几百个),Token 成本的差异会被放大几百倍。在做架构选型时,先算一笔账:多Agent方案的 Token 成本是单Agent的几倍?这个倍数你的预算扛不扛得住?


三、四个典型场景的决策推演

光讲理论不过瘾,我们拿四个真实场景来跑一遍决策流程。

3.1 场景一:智能客服(结论:单Agent)

用户问:”我的订单 #12345 退款到哪一步了?”

依赖图分析:识别意图 → 查订单 → 回复。严格线性,没有并行空间。

上下文分析:一次对话的上下文很小,远不到窗口极限。

延迟分析:用户在等回复,延迟预算 3 秒。

Token 分析:高并发场景(成千上万用户同时咨询),成本敏感。

四把尺子量完,全部指向单Agent。上多Agent就是过度设计。

3.2 场景二:企业级代码安全审计(结论:多Agent)

需求:扫描一个 10 万行代码仓库,输出安全漏洞报告。

依赖图分析:注入扫描、内存泄漏检测、依赖漏洞检查、代码规范审查——四个子任务完全独立。

上下文分析:10 万行代码远超单模型窗口,必须切片。

延迟分析:后台批处理,用户可以等几分钟,延迟预算宽松。

Token 分析:低并发(一天可能就跑几次),成本可控。

四把尺子量完,全部指向多Agent。

3.3 场景三:长文档摘要生成(结论:伪多Agent / 单Agent + 分段策略)

需求:把一份 200 页的技术文档浓缩成 5 页摘要。

乍一看,200 页文档肯定塞不进上下文,应该用多Agent切分对吧?

但仔细想想:文档摘要是有全局连贯性要求的。你不能让 Agent-A 总结第 1-50 页、Agent-B 总结第 51-100 页,然后拼在一起——这样出来的摘要会有大量重复、遗漏和逻辑断裂。

更好的方案是单Agent + 分段迭代策略

1
2
3
4
第一轮:单Agent处理第1-50页,产出中间摘要A
第二轮:单Agent带着摘要A处理第51-100页,产出中间摘要B
第三轮:单Agent带着摘要B处理第101-150页,产出中间摘要C
第四轮:单Agent带着摘要C处理第151-200页,产出最终摘要

每一轮都保留了前序上下文的精华,保证了连贯性。这比多Agent并行切分效果好得多。

教训:上下文超限不等于必须上多Agent。有时候串行分段 + 状态传递比并行切分更适合有连贯性要求的任务。

3.4 场景四:多语言翻译流水线(结论:看情况)

需求:把一份技术文档翻译成英、日、韩三种语言。

表面分析:三种语言互不依赖,可以并行——看起来应该用多Agent。

深层分析:翻译的前置步骤(术语提取、风格统一)是共享的。如果三个 Agent 各自提取术语,出来的译文风格会不一致。

最优方案:混合架构。

1
2
3
阶段一(单Agent):提取术语表 + 定义翻译风格指南
阶段二(多Agent并行):三个Agent分别翻译三种语言,共享术语表
阶段三(单Agent):审校三份译文的一致性

教训:很多任务不是纯粹的”该用”或”不该用”多Agent,而是在流水线的某些阶段用、某些阶段不用。混合架构才是最常见的生产形态。


四、怎么评估一个多Agent系统设计得好不好?

选对了场景只是第一步。就算你决策正确,多Agent系统仍然可能设计得很烂。下面是一套评估框架,从五个维度给系统打分。

4.1 评估维度一:任务分解的合理性

这是最基础也最关键的维度。分解不合理,后面的一切都是空中楼阁。

好的分解有三个特征:

特征 说明 反例
子任务之间低耦合 每个子Agent能独立完成自己的工作,不需要等别人的结果 Agent-A 需要 Agent-B 的输出才能开始
子任务粒度适中 不太粗(一个Agent干不完)也不太细(拆太碎通信开销吃掉收益) 把”查数据库”拆成”建立连接””发送SQL””解析结果”三个Agent
子任务边界清晰 每个Agent的职责范围明确,不会出现两个Agent干同一件事 安全Agent和性能Agent都在扫描同一段代码的同一个函数

快速检验法:拿一张纸,把每个子Agent的任务写下来。如果你发现两个子Agent的任务描述有超过 30% 的重叠,分解就有问题。

4.2 评估维度二:通信开销占比

多Agent系统的总成本 = 计算成本 + 通信成本。

通信成本包括:

  • 主控 Agent 向子 Agent 传递任务描述的 Token
  • 子 Agent 向主控 Agent 返回结果的 Token
  • 主控 Agent 汇总所有结果的 Token
  • 如果子 Agent 之间需要通信(不推荐),还有交叉通信的 Token

健康的系统:通信开销占总 Token 消耗的 20% 以内。

有问题的系统:通信开销超过 40%。这意味着你在花大量 Token 让 Agent 之间”传纸条”,而不是干实事。

计算公式:

1
通信开销占比 = (任务传递Token + 结果回传Token + 汇总Token) / 总Token消耗 × 100%

如果你算出来这个比例很高,说明要么子任务拆得太碎(太多小Agent在传话),要么结果压缩做得不好(子Agent带回来的信息太冗余)。

4.3 评估维度三:并行效率

多Agent的核心价值是并行。如果并行效率低,用多Agent就没有意义。

并行效率的定义:

1
并行效率 = 单Agent串行完成时间 / 多Agent并行完成时间

理论上,N 个 Agent 并行,效率应该接近 N。但实际上很难达到,因为:

  • 子 Agent 的任务量不均衡(最慢的那个决定了总时间)
  • 主控 Agent 的规划和汇总有固定延迟
  • 通信有网络开销
并行效率 评价 建议
> 2.0x 优秀 多Agent方案值得投入
1.5x - 2.0x 一般 看场景,如果成本敏感可以考虑单Agent
< 1.5x 多Agent带来的收益不够覆盖额外开销,回退单Agent

提升并行效率的关键:让每个子 Agent 的工作量尽量均衡。如果一个子 Agent 1 秒就跑完了,另一个要跑 10 秒,那你的并行效率就被拖后腿了。

4.4 评估维度四:容错与可观测性

这是工程落地时最容易翻车的维度。

容错能力评估清单:

  • 一个子 Agent 超时或失败了,系统会怎样?是直接整体失败,还是能降级处理?
  • 子 Agent 返回了错误结果(幻觉),主控 Agent 能不能识别出来?
  • 有没有设置最大重试次数?重试的 Token 成本有没有上限?

可观测性评估清单:

  • 出了问题,你能在日志里定位到是哪个 Agent 在哪个环节出错的吗?
  • 每个 Agent 的输入输出有没有完整记录?
  • 你能不能回放一次完整的执行过程来做 Debug?

一个残酷的现实:大部分多Agent系统的日志都是一团浆糊。主控 Agent 调了 5 个子 Agent,每个子 Agent 又调了若干工具,出了问题你只能看到一个笼统的”执行失败”,根本不知道是哪一步在胡说八道。

好的设计:给每个 Agent 执行分配一个唯一的 trace ID,所有日志都带上这个 ID,方便链路追踪。

4.5 评估维度五:边际收益递减点

这是最需要工程直觉的一个维度。

多Agent系统的子 Agent 数量不是越多越好。存在一个边际收益递减点——超过这个点,增加 Agent 带来的并行收益小于增加的通信开销和协调成本。

1
2
3
4
5
6
7
8
9
10
    收益

│ ╭───────── 收益曲线
│ ╱
│ ╱
│ ╱
│╱
├──────────────────→ Agent数量

边际收益递减点

经验值:在大部分场景下,子 Agent 数量控制在 3-8 个是比较合理的区间。超过 10 个,协调成本会急剧上升。

怎么找到这个点? 最靠谱的方法是跑基准测试:

  1. 从 2 个子 Agent 开始,记录执行时间和 Token 消耗
  2. 逐步增加到 3、4、5… 个
  3. 画出”Agent数量 vs 端到端延迟”和”Agent数量 vs Token成本”两条曲线
  4. 找到延迟不再显著下降、但 Token 成本还在上升的那个拐点

那个拐点就是你的最优 Agent 数量。


五、一个完整的评估 Checklist

把上面五个维度浓缩成一份可执行的检查清单。拿到任何一套多Agent系统设计方案,对照这张表打分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
任务分解合理性                          □ 通过  □ 不通过
├─ 子任务之间是否低耦合? □ 是 □ 否
├─ 粒度是否适中? □ 是 □ 否
└─ 边界是否清晰? □ 是 □ 否

通信开销占比 □ 通过 □ 不通过
├─ 通信Token占比 < 20%? □ 是 □ 否
└─ 子Agent结果是否经过压缩? □ 是 □ 否

并行效率 □ 通过 □ 不通过
├─ 并行加速比 > 1.5x? □ 是 □ 否
└─ 子Agent工作量是否均衡? □ 是 □ 否

容错与可观测性 □ 通过 □ 不通过
├─ 子Agent失败是否可降级? □ 是 □ 否
├─ 每个Agent是否有trace ID? □ 是 □ 否
└─ 能否回放完整执行过程? □ 是 □ 否

边际收益 □ 通过 □ 不通过
├─ 子Agent数量是否在合理区间(3-8)? □ 是 □ 否
└─ 是否做过基准测试找最优解? □ 是 □ 否

5 个维度全部通过,这是一套合格的多Agent系统设计。有 1-2 个不通过,需要针对性优化。3 个以上不通过——回去重新考虑一下,这个场景是不是真的需要多Agent。


六、总结

回到文章开头的问题:什么场景下用多Agent系统?

答案不是”任务越复杂越好”,而是当你同时撞上了两个天花板时

  1. 单一模型的上下文天花板——数据量大到一个模型吃不下
  2. 串行执行的延迟天花板——子任务之间没有依赖,串行跑太慢

只撞上第一个天花板,用单Agent + 分段策略就能解决。只撞上第二个天花板,用单Agent + 异步并发工具调用也能凑合。两个同时撞上,才是多Agent真正不可替代的场景。

而在评估一套多Agent系统设计时,不要只看架构图好不好看,要拿数据说话:通信开销占比多少?并行效率多少?边际收益递减点在哪?

用工程的刚性去约束架构的浪漫,这才是做系统设计的正确姿势。