当前位置: 首页 > news >正文

关于 Multi-Agent,我目前的一些思考

最近在做一个多 Agent 协同的项目,目前还在构思阶段。趁这个机会,梳理一下我对多agent协同的思考。


一、为什么需要 Multi-Agent

我个人认为,需要引入 Multi-Agent 主要有以下几点原因。

并行完成任务。多个 Agent 同时工作,可以最大程度地利用时间,提高执行效率。

上下文隔离。对于某些模式的 Agent 来说,上下文隔离本身就是一个很重要的优势。通过让每个 Agent 拥有更干净的上下文,可以做出质量更高的任务输出。

应对复杂任务。如果做到了以上两点,就可以比较高效地完成那些对单个 Agent 来说相对吃力的复杂任务。

实现长程 Agent。Multi-Agent 也让长程 Agent 的实现变得更加可能。长程 Agent 系统里,有两个维度在同时发挥作用:一是串行的 handoff——当某个 Agent 的上下文接近上限时,通过 handoff 机制把任务传递给下一个 Agent,让它接力继续完成;二是不同领域 Agent 的并行——各自负责不同职责的 Agent 同时推进,共同支撑整个任务的进展。串行保证了任务在时间轴上的延续,并行保证了任务在同一时间段内的深度和广度。两者结合,才让运行时间较长、复杂度较高的任务真正变得可行。

值得补充的一点是:使用 Multi-Agent 的理由,并不只是"单个 Agent 完成不了"。很多时候,单个 Agent 也能完成任务,但对于庞大且复杂的任务,Multi-Agent 之间"上下文隔离"的特性,往往能同时带来效率和质量上的提升。你能用更少的时间,得到质量更高的产出。这是我认为 Multi-Agent 真正有价值的地方。


二、Multi-Agent 的协作方式

在具体讨论协作方式之前,我想先梳理一下目前常见的几种 Multi-Agent 架构模式。这里主要参考了 Claude Code 的源码架构分析,以及 Anthropic 的一篇关于多 Agent 协调模式的博客。

几种常见模式

Generator-Verifier(生成器-验证器)最简单也是部署最广泛的模式之一。一个 Agent 负责生成输出,另一个负责验证,验证不通过则将反馈返回给生成器,循环迭代直到通过或达到最大次数。适合有明确评估标准的质量关键型任务,比如代码生成、合规验证等。

Orchestrator-Subagent(编排器-子 Agent)由一个主 Agent 负责规划和调度,子 Agent 各自承担具体工作并返回结果,主 Agent 负责综合。Claude Code 就采用了这种模式——主 Agent 自己写代码、编辑文件,同时在后台派发子 Agent 去搜索代码库或调查独立问题,子 Agent 返回提炼后的发现,主 Agent 的上下文始终聚焦在主任务上。这个模式适合任务分解清晰、子任务边界明确的场景。

Agent Teams(Agent 团队)与 Orchestrator-Subagent 的核心区别在于 Worker 的持久性。子 Agent 不是用完即丢,而是会跨多个任务保持活跃,在过程中积累上下文和领域专注度。适合并行、独立、长期运行的子任务——比如把一个大型代码库从一个框架迁移到另一个,可以让每个 Agent 负责一个独立的服务模块,自主完成迁移全流程。

Message Bus(消息总线)Shared State(共享状态)这两种模式适合更复杂的场景。消息总线适合事件驱动的管道,工作流从事件中涌现而非预先确定;共享状态则适合多个 Agent 需要实时共享彼此发现的协作研究类场景,Agent 之间通过读写同一个持久化存储来协调,不需要中央协调器的介入。

我的判断

这几种模式各有适用场景,Orchestrator-Subagent 是其中最通用的起点,能以最低的协调开销覆盖最广泛的问题。我个人也认为,在大多数实际场景里,编排器与子 Agent 这样的主从结构会是更常见的选择。

对于 Agent Teams,我目前还没有想到非常适合它的场景。根据 Anthropic 那篇博客的描述,它要求子任务具有相当高的独立性且颗粒度非常细。一旦各个 Agent 的工作之间存在交叉,就容易产生冲突,而且 Agent 之间没有直接通信,中间发现的信息只能通过协调器路由,这本质上又退回了 Orchestrator 模式的逻辑。


三、Orchestrator-Subagent 的设计挑战

由于我目前在做的项目采用的就是 Orchestrator-Subagent 这种组合形式,我的思路是:Orchestrator 仅负责发布命令、执行调度,不直接参与具体实施;Sub-agent 负责具体执行,汇报进度并拿到反馈,然后继续完成任务。

这种设计在通信上相对 Agent Teams 没有那么复杂,但它也带来了几个我目前还在思考的问题。

权限控制与沙盒

如果 Orchestrator 只负责调度,那它是否需要拥有一定的权限,可以自行审批 Sub-agent 的某些操作请求?这实际上要求 Orchestrator 具备相当强的判断力——知道哪些事情可以放行,哪些需要上报人类。

在实际使用中,我觉得很多命令其实不需要人类逐一审批。但放宽权限的代价是:一旦出错,带来的影响也会更不可控。我理想中的状态,是 Orchestrator 能对 Sub-agent 进行及时的纠偏和命令审批,让人类可以尽量少地介入到系统运行的中间过程里。要实现这一点,核心在于一个足够可靠的沙盒环境——它能在 Agent 操作出问题时提供兜底,而不是让人类不得不时刻盯着每一步。

并行冲突与 Git Worktree

当多个 Sub-agent 同时在同一个代码仓库上工作时,读写冲突是一个绕不开的问题。

这里先简单说一下 git worktree 的原理。通常我们用git clonegit init创建的仓库,只有一个工作目录。而 git worktree 允许在同一个仓库的基础上,额外创建若干个"链接工作树"——它们是独立的物理目录,每一个可以检出不同的分支,但共享同一套底层的 git 对象库,不会重复占用磁盘。具体操作是用git worktree add <路径> -b <新分支名>在指定路径创建新的工作目录并检出独立分支;完成后用git worktree remove清理即可。

Claude Code 的 AgentTool 支持isolation: 'worktree'隔离模式,原理就是给每个 Sub-agent 分配一个独立的 git worktree,让它在自己专属的工作目录和分支上进行操作。这样在物理层面上,多个 Agent 同时写文件时操作的是各自的目录,不会产生直接的文件写入冲突。

但 worktree 解决的本质上是文件系统层面的冲突,解决不了语义层面的冲突。比如两个 Agent 分别在自己的 worktree 上修改了同一个模块的接口,各自提交完之后,当这些分支需要合并时,冲突依然会暴露出来。worktree 只是把冲突从"同时写"推迟到了"合并时",并没有消除冲突本身。

因此,就算引入了 worktree 隔离,任务拆解时仍然需要尽量保证各个 Sub-agent 的工作边界在逻辑上是清晰且不重叠的。如果发现任务在设计上必然会产生交叉,那就需要强制串行处理——但一旦串行,效率相对并行就会更低。这个串并行的判断本身,也是对 Orchestrator 能力的一个考验。

上下文管理与结构化摘要

Orchestrator 的另一个核心挑战是上下文管理。

Sub-agent 把信息传回时,摘要的粒度很难拿捏。信息太少,Orchestrator 对全局的掌控就会变弱,容易做出偏差较大的调度决策;信息太多,又会大量占用 Orchestrator 的上下文窗口,让它陷入细节,反而模糊了对整体任务进度的判断。

我目前倾向于让 Sub-agent 输出结构化文本来缓解这个问题。大概的思路是:不让 Sub-agent 自由叙述完成了什么,而是要求它按照固定格式输出几个字段,比如任务状态、关键发现、阻塞点、建议的下一步操作。这样 Orchestrator 在读取的时候,不需要从一大段叙述性文字里自己提炼关键信息,而是可以直接定位到它做决策时真正需要的那几个维度。

这个方法能奏效的前提,是你对"Sub-agent 要汇报什么"和"Orchestrator 需要什么来做决策"事先有比较清晰的设计。如果格式设计得不好,结构化输出反而可能截断掉一些重要的上下文。具体怎么设计这个格式,我打算在做到 Multi-Agent 协作这块的时候,通过实际跑起来的效果来迭代——这种事情在纸面上想清楚,和在实践里跑通,之间还是有不小的距离的。

对 Orchestrator 能力的要求

综合以上这些问题可以看出,Orchestrator 其实需要承担相当多的职责:

  • 任务分配与决策:如何合理拆解和分配任务,如何根据 Sub-agent 汇报的信息决定下一步操作
  • 资源调配:相对简单的任务可以指派给调用成本更低的 Agent,要求较高的任务才调用更强的模型,实现动态的成本与能力配比
  • 全局把控:始终对整体任务进度有清晰的认知,不被细节淹没
  • 纠偏与审批:对 Sub-agent 的操作进行及时的判断,既不让整个系统频繁等待人类审批,也能在关键时刻介入纠正

这对 Orchestrator 的建模和提示词设计都提出了比较高的要求。


四、我对 Multi-Agent 适用场景的判断

其实以前我对 Multi-Agent 的想法是相对保守的——如果一个任务能靠单个 Agent 解决,就尽量不去开启 Sub-agent。

我最早认为,需要多 Agent 协同、尤其是主从结构的场景,通常是这样的:给了一个非常大的代码仓库,希望了解它的具体实现。这时派出一批 Agent 去并行探索并传回摘要,是一个很经典的协作模式——原因很直接:高效读取(并行执行只读不写的工作),以及节省主 Agent 的上下文(代码内容不会过度挤占主线程)。主 Agent 通过读取摘要,对整个仓库有全局了解,然后据此写文档或做进一步分析。

这种主从结构的一个特点就是:Sub-agent 之间互相不通信。我认为这个设计比较合理。如果让 Sub-agent 也互相通信,既有主从之间的通信,也有同级子 Agent 之间的讨论,上下文很快会变得混乱——那些 Agent 之间的讨论未必真正有意义,但却占用了宝贵的上下文空间。

现在,我的判断有了一些调整。需要使用 Multi-Agent 的场景,通常具备以下特点:任务庞大且复杂,需要比较长的时间才能完成。在这样的场景下,虽然使用单个 Agent 接力也可以完成任务,但引入 Multi-Agent,往往能用更少的时间得到质量更高的产出——因为上下文隔离带来的并行效率和输出质量的提升,在庞大且复杂的任务上体现得最为明显。

但我仍然认为,这种模式不适合对质量要求极高的精细任务。比如,想让多个 Agent 协作完成一个复杂系统的编写,并且希望人类尽可能少地介入其中——这目前还是一个比较理想化的场景,仅在少数任务边界足够清晰的情况下才真正可行。对于多数复杂场景,人类的介入仍然是必要的。

在我看来,Multi-Agent 比较理想的实施方式是:人类只在"发布任务"和"验收结果"这两端出现,中间的过程完全由 Orchestrator 掌控。但要真正做到这一点,对 Orchestrator 的调度能力、沙盒的可靠性,以及任务边界的设计,都有相当高的要求。

这不是对 Multi-Agent 能力的否定,而更像是一个当前阶段的现实判断:Multi-Agent 能做很多事,但要让它在复杂任务上真正做得好,可靠的沙盒、合理的任务边界设计、以及 Orchestrator 足够强的调度能力,缺一不可。


大概下个星期会正式做到 Multi-Agent 协作这一块,到时候依靠实践来验证和迭代这些想法吧。


参考资料

  • Claude Code 多 Agent 架构分析. 基于 Claude Code 源代码.

  • Anthropic. (2025).Multi-agent coordination patterns: Five approaches and when to use them. Retrieved from https://claude.com/blog/multi-agent-coordination-patterns

http://www.cnnetsun.cn/news/2550697.html

相关文章:

  • 告别刻录盘!用Rufus 4.5把旧U盘秒变Win10安装神器(保姆级图文)
  • C#模拟Windows双击的底层原理与跨DPI安全实现
  • 别再为乱码头疼了!Linux离线安装LibreOffice 7.5完整指南:从RPM包到完美中文显示
  • 多模态融合与预训练语言模型在死因自动分类中的应用
  • Chiseling算法:交互式假设检验在因果亚组发现中的应用
  • 机器学习加速等离子体仿真:从初始条件预测到PIC计算效率提升
  • DVWA与Pikachu双靶场协同部署:宝塔+PHPStudy双环境实战指南
  • MinatoLoader:解决PyTorch数据预处理瓶颈的智能调度器
  • 机器人异常检测实战:基于系统日志的LR、SVM与自编码器模型对比
  • tvbox 2026年5月更新配置源
  • 位置编码提升机器人自碰撞检测精度:MLP与NeRF架构实战解析
  • Java NIO 状态守卫:AlreadyBoundException 源码深度剖析与网络通道绑定契约
  • Kali NetHunter移动渗透实战:Magisk模块化部署与外设适配
  • C++ 智能指针简介
  • 量子噪声模拟:从原理到NISQ时代的实践优化
  • 从零开始:用Python和Simulink复现经典倒立摆建模与控制(附代码)
  • 从Windows秒切OpenEuler:双系统安装与数据迁移避坑指南
  • 别再为Win11家庭版发愁了!用这个CMD脚本,5分钟搞定Hyper-V虚拟机环境
  • Arm Compiler 5到6迁移:Cortex-M测试套件适配指南
  • 告别高分屏适配烦恼:从开发者视角详解Win10/Win11程序属性中的DPI设置原理
  • 别只懂泊松分布了!用Python+伽马分布预测牙科诊所排队时间(附完整代码)
  • 保姆级教程:用Godot 4.2从零做一个躲避类2D小游戏(附完整源码)
  • Trace Gadgets:用静态模拟与程序切片为机器学习模型雕刻漏洞上下文
  • 别再乱用StopCoroutine了!Unity协程(IEnumerator)正确停止的3种姿势与避坑指南
  • Java C# C++ 运行时契约深度对比:内存、ABI、异常与线程的本质差异
  • 机器学习代理模型在太赫兹超材料设计中的基准测试与应用
  • ARM SVE存储指令ST1H与ST1W详解与优化实践
  • Unity安卓构建底层原理与真机崩溃排查指南
  • 告别卡顿!深度调优UE像素流送:MinQP、MaxFPS参数详解与网页端性能实战
  • Unity导入原神模型的七步校准与动画系统实战指南