多 Agent 协作里,谁是 coordinator
多 Agent 协作听起来很酷:每个 Agent 负责一块任务,互相配合,自动推进。但实际做的时候,第一个要回答的问题就是——谁来协调?
这个问题不是可选的,是必须回答的。不回答,协作就会在某个意料之外的冲突点卡住。
没有 coordinator 的协作
最初我试过一种方案:不给任何 Agent coordinator 角色,让它们各自执行,通过共享状态文件来同步进度。
听起来很优雅,自治协作,没有中央控制,每个 Agent 自己决定什么时候做什么。实际跑起来全是问题:
- Agent A 执行完一步,写状态文件,但 Agent B 还没读完,Agent C 就开始基于旧状态做判断。共享文件不是实时同步的,写入和读取之间有时间差,时间差就意味着状态不一致。A 写了"任务已完成",B 读到的是"任务进行中",C 基于 B 的旧状态做判断,结果 C 的执行方向完全错了。
- 两个 Agent 同时想修改同一个文件,互相覆盖。没有冲突解决机制,最后一个写入的 Agent 覆盖前面所有 Agent 的修改。A 花了十分钟写的内容,被 B 的五秒钟修改覆盖了,A 的工作完全浪费。
- 出错时没人负责回溯——每个 Agent 都在等别人处理,结果所有 Agent 都在等待。等待不是协作,等待是僵局。僵局没有人来打破,因为没有 coordinator 负责监控全局状态和推动关键节点。
这些问题不是 Agent 能力不足,而是没有协调者来管理执行顺序、冲突解决和异常处理。就像一个没有项目经理的团队,每个人都在做事,但没有人在看全局进度、处理阻塞、推进关键节点。每个人都忙着局部的事,但全局进度可能已经停滞了。
coordinator 不是 dictator
很多人一听"coordinator"就想到中央控制器——一个 Agent 命令所有其他 Agent,大家听它指挥。但 coordinator 和 dictator 是两回事,区别在于职责范围。
coordinator 的职责是四件事:维护任务队列、分配执行顺序、检测冲突、处理异常。它不做具体执行,只做调度和保障。就像项目经理不写代码,只管排期、处理阻塞、推进里程碑。
dictator 的职责是:替每个 Agent 决定具体怎么做,监控每个步骤,替代 Agent 的判断。这不是协调,这是微观管理。微观管理的 coordinator 会变成瓶颈——因为所有决策都集中在它身上,其他 Agent 只能等它指令。一个微观管理的 coordinator 处理五个 Agent 的决策需要十分钟,而自治协作只需要两分钟。效率反而下降了。
好的 coordinator 像项目经理:定优先级、排时间线、处理阻塞,但不替程序员写代码。坏的 coordinator 像过度干预的老板:每个细节都要过问,每个判断都要替你做。区分两者的标准很简单:coordinator 只做"谁做什么什么时候",不做"怎么做"。如果 coordinator 开始替 Agent 决定具体实现方式,它就越界了。
提炼具体方法
这次经历让我形成了几个关于多 Agent 协作的具体判断:
第一,协作规模超过三个 Agent 时,必须有显式 coordinator。 不是隐式的共享文件,而是显式的协调角色。隐式协调在小规模时勉强可行——两个 Agent 可以通过简单的文件约定来同步。但超过三个 Agent 后,同步成本急剧上升,冲突概率指数增长。三个 Agent 意味着三种可能的冲突组合,四个意味着六种,五个意味着十种。冲突组合越多,隐式协调越容易失败。
第二,coordinator 只做调度,不做执行。 如果 coordinator 也参与具体执行,它会在调度和执行之间反复切换,导致全局调度延迟。coordinator 应该是轻量级的,只负责维护全局状态和推进任务队列。它的响应速度决定整个协作的推进速度。一个花三秒做调度决策的 coordinator,比一个花三十秒做调度加执行的 coordinator 更有效。
第三,异常处理必须由 coordinator 统一管理。 单个 Agent 发现异常时,不应该自己决定怎么处理——它应该上报 coordinator,由 coordinator 决定是重试、降级还是终止。分散的异常处理会导致不同 Agent 做出冲突的决策——一个 Agent 选择重试,另一个选择降级,第三个选择终止,整个协作就散架了。统一异常处理确保所有 Agent 对异常有共识的应对策略。
这些判断后来写进了 jianfei-plan 的 LAN/orchestrator policy:每个多 Agent 协作场景,第一步就是指定 coordinator 角色和职责范围。不指定 coordinator 的协作方案,直接驳回。
谁是 coordinator 这个问题,不是可选项,是必答题。答错了,整个协作会在某个意料之外的冲突点卡住。答对了,后面的执行才有可能顺畅推进。coordinator 的存在不是为了控制,而是为了保障——保障执行顺序合理、冲突被解决、异常被处理、全局进度被推进。没有保障的协作,不是协作,是一群人在同时做自己的事。