多 Agent 协作系统怎么设计?8 个核心问题拆解
多 Agent 协作系统设计有 8 个核心问题,一次讲透。
- 角色拆分:决策 / 协调 / 执行三层,权限等级分开
- 上下文传递:选择性注入 + 笔记本模式,避开上下文膨胀
- 冲突仲裁:分类 + 证据链验证 + 置信度加权升级
- 死循环破解:状态机 + 令牌桶 + 仲裁 agent
- 共享记忆:共识 / 私有分层 + 命名空间隔离
- 可观测性:监控 + 追踪 + 日志 + 全链路 trace
- 效果评估:完成度 / 效率 / 经济性,必须 AB 对标
- 错误恢复:澄清 → 规划校验 → 反思 → 仲裁兜底
多 Agent 不是 1+1>2,先看值不值再上。
1. 角色怎么拆:别按工种拆,按层级拆
最常见的错误是按工种拆角色——数据采集 agent、数据分析 agent、报告生成 agent。看起来分工明确,实际跑起来全是扯皮。
正确的拆法是按 层级 拆:
每个 agent 只能管两三个相关工具,做到高内聚低耦合。一个 agent 什么都干,能力看起来强,实际上没法做权限控制——你也不知道它下一步会调什么工具、动什么数据。
加分项是 权限等级:核心能力(写库、调支付)、辅助能力(搜索、读库)、工具能力(计算、转换)分开。权限一样,所有 agent 都能改核心数据,出问题根本定位不到是 谁干的。
2. 上下文怎么传:别全量传,选着传
最朴素也最贵的做法是"把上家所有上下文都塞给下家"。几个 agent 串下来,prompt 撑爆,token 成本线性上涨。
更好的姿势是 选择性注入:
- 关键结论放在最前面,让下家第一眼看到
- 用检索器动态筛选真正相关的信息
- 大量原始数据只在需要的时候才加载
跨窗口(多个 agent 跨多轮)场景,笔记本模式 几乎是必备:
- 遇到需要长期保留的关键信息,先写进外部存储(KV、向量库、文件)
- 后面的 agent 按需去查,不塞 prompt
- 既不丢信息,又把 token 省下来
说白了,把 agent 的"短期记忆"和"长期记忆"分开管理,别让短期记忆膨胀成长期负担。
3. agent 结论冲突了怎么办:先分类,再验证证据
两个 agent 给出相反的结论,第一反应不应该是投票。投票看起来民主,实际上是让多数人的意见碾压少数人的事实。
专业的做法是三步走:
- 分类冲突:是强分歧(结论互斥)、弱分歧(细节不一致)还是沉默冲突(一个 agent 没说话)
- 证据链验证:不看谁声音大,核对双方各自的证据来源——数据哪来的、推理路径对不对
- 置信度加权 + 升级:两边置信度差得大、又是关键决策,自动升级给人类判断
这一步听着麻烦,但是区分"会跑多 agent"和"会设计多 agent"的分水岭。只做投票的方案,碰上对抗样本立刻崩。
4. 死循环怎么防:状态机 + 令牌桶 + 仲裁 agent
多 agent 互相调用的死循环是经典坑。基础解法:
- 状态机检测调用图:A→B→A 直接环、A→B→C→A 间接环,发现即熔断
- 迭代 / 转交 / 重试次数硬上限:所有可能递归的计数器都设上限
- 令牌桶限流:每次调用消耗一个令牌,用完就停
进阶做法是 配一个独立的仲裁 agent,专门实时监控调用关系图:
仲裁 agent 不参与业务,只看"谁在调谁、调了多少次、是不是形成了环"。一旦发现异常,立刻熔断、改路由。这条思路我之前在 Agent 死循环怎么办? 里讲过单 agent 场景,多 agent 只是把环从"工具调用"升级到"agent 调用"。
5. 共享记忆怎么管:分层 + 命名空间 + 过期
所有 agent 共享一份记忆,认知污染 几乎是必然——agent A 写一条临时笔记,agent B 把它当事实用,整个系统开始胡说八道。
记忆至少分两层:
| 层级 | 读权限 | 写权限 | 用途 |
|---|---|---|---|
| 共识层 | 所有 agent | 需仲裁通过 | 跨 agent 共享的事实 |
| 私有层 | 仅 owner | 仅 owner | agent 内部状态、临时笔记 |
更进一步:
- 命名空间隔离:用权限矩阵控制"谁能写、谁能读",别让所有 agent 都能改共享区
- 版本控制:记忆有版本号,被覆盖可回滚
- 信息衰减:记忆有 TTL,过期自动失效,需要时重新验证再用
详细的多层记忆设计可以参考 AI Agent 的记忆系统,本文不展开。