多Agent 协同 - 需要一个团队
前面我们实现了 Subagent、Background Task,为什么还需要多 Agent 协同呢?
一句话区分
- Background Task = “把这个工具调用派到后台跑,我等结果通知“
- Subagent = “派一个新 agent 干一件具体事,跑完销毁,我等摘要“
- Teammate = “派一个长期协作的队友,我们持续异步通信”
对比表
| 维度 |
Background Task |
Subagent |
Teammate |
| 被派的是什么 |
一个工具调用(bash) |
一个全新 agent(独立 LLM + messages) |
一个全新 agent |
| 谁在执行 |
工具 executor |
新一轮 LLM 调用 |
新一轮 LLM 调用 |
| 生命周期 |
短(工具一次调用结束) |
短(派一次跑完销毁) |
长(教学版限 10 轮) |
| 同步 / 异步 |
异步(daemon thread) |
同步(父等子返回) |
异步(daemon thread) |
| 父是否阻塞 |
不阻塞,立即拿 placeholder |
阻塞,等子 agent 结果 |
不阻塞,立即拿”已派出” |
| 通信方式 |
单向 — 后台→父 (<task_notification>) |
单向 — 子→父(只回 last text) |
双向 — MessageBus 文件邮箱 |
| 能否多个并行 |
是 |
否(父 spawn 时阻塞) |
是 |
| 能否互相通信 |
不能 |
不能 |
能(teammate 之间能 send) |
| 典型用途 |
慢命令(./mvnw test) |
“分析 X 模块,做完告诉我” |
“重构后端 — 多 agent 长期协作” |
| 能调用工具 |
不能(它就是工具) |
能(白名单子集) |
能(白名单 + send_message) |
人多力量大。遇到一个很大的任务时,从 Java 程序员的思路来看,可以多来几个分布式 Agent 来协同处理问题。
还有一个核心问题,多个Agent 之间怎么通信呢?
Background task 和 Subagent 都是单向通信:父向子安排工作后,子完成后单向地向父汇报结果,中间没有交互。
Teammate 之间是同事关系。双方之间通过 MessageBus 进行双向通信。
MessageBus 基于文件形式,Agent A 告诉 Agent B 应该干什么,Agent B 告诉 Agent A 我完成了。