多 Agent 并行:怎么不打架
前四篇把一个 Skill 从写出来、拆清楚、到处复用讲完了。现在换一个场景:手里有一件比较大的事,一个 Agent 干太慢,想叫几个 Agent 一起干。并行听起来很美好,但一动手就发现新问题:两个 Agent 改了同一处,一个 Agent 的结论被另一个 Agent 顺手改了,最后拼起来的结果对不上。
先把结论放在前面:并行能不能快,取决于任务拆得清不清楚,边界划得明不明白。 拆得好,几个 Agent 各干各的,最后拼起来就是快;拆得不好,人一多反而更乱,还不如一个一个来。
一、什么时候值得并行
不是所有事都适合并行。先问三个问题,都答“是”,再考虑叫几个 Agent 一起上:
- 任务之间有没有依赖。 A 的结果是不是 B 的输入?如果是,那就只能先 A 后 B,并行帮不上忙。反过来,几件事互相不依赖,谁先谁后都一样,才适合分开干。
- 每一份能不能独立完成。 分出去的那一份,是不是只靠自己手里的材料就能做完,不用中途回来问?需要来回问的,拆出去反而更慢。
- 结果能不能拼起来。 每一份做完,能不能按一个固定的格式交回来,拼成一份完整的?拼不起来,并行省下的时间全花在拼结果上了。
拿发文章前的检查举例:核对标题描述、检查链接图片、核对分类标签,这三件事互相不依赖,各自只看文章的一部分,做完按一张汇总表拼起来——这就是适合并行的。反过来,先改标题、再根据新标题重写描述,这种前后咬合的,就别拆。
还有一条:事太小了别并行。 三分钟就能干完的事,拆分、派发、汇总的功夫比干活本身还多,并行纯属折腾。并行是给大件准备的。
二、怎么拆:按产出拆,不按步骤拆
拆任务最容易犯的错,是按步骤拆:第一步给 A,第二步给 B,第三步给 C。步骤之间往往是连着的,前一步的中间结果后一步要用,拆开之后每个人都在等别人,实际上还是串行,只是多了来回传话的成本。
正确的是按产出拆:每一份对应一个能独立交出来的结果。还是拿发文章检查举例,拆成三份是这样:
- A 负责文字:标题有没有错别字,标题和内容对不对得上,描述有没有写、准不准确。交回来一张文字检查的结果。
- B 负责链接和图片:逐一打开文中的链接,确认图片都已上传、说明没有错位。交回来一张链接和图片的结果。
- C 负责分类和标签:分类和标签是否符合主题,有没有漏掉系列字段。交回来一张分类的结果。
每一份都有明确的输入(这篇文章)和明确的输出(一张结果表),做的时候不用互相打听,A 不知道 B 在干什么也不影响。
拆的时候还有一条纪律:每一份的边界写下来,不要只记在脑子里。 比如写清楚“A 只检查文字,不碰链接”,而不是觉得“他应该知道”。边界不写下来,两个人同时觉得某件事是自己的,或者同时觉得是对方的,打架就是从这里开始的。
三、怎么不打架:三条规矩
任务拆清楚了,并行的时候还有三条规矩,缺一条都可能乱:
- 各写各的地盘。 事先划好谁改哪个文件、谁改哪一段。A 改标题,B 改链接列表,两个人绝不写进同一个地方。只读可以重叠,写必须分开。这是最大的一条:绝大多数的“打架”,都是两个 Agent 同时改了同一处。
- 一个汇总人。 每个人做完,先把结果交到一个地方,由汇总的人拼成一份,不要互相改对方的东西。A 发现 B 的结果有问题,写进备注里告诉汇总人,不要自己上手去改 B 的那份。改来改去,最后谁也说不清哪一份是对的。
- 拿不准就停在自己手里。 做到一半发现材料不够、判断不下去,不要猜着往下做,更不要猜着去改别人的部分。停下来,把问题和已经做完的部分一起交回来,等决定。并行的时候,一个猜错的结论会顺着汇总表一路扩散,收拾起来比串行还贵。
这三条其实就是一句话:并行的时候,每个人只对自己那一份负责,交接只发生在约定的地方。 规矩越简单,越不容易乱。
四、动手:把一篇待发文章的检查并行跑一次
拿一篇准备发的文章练一次,目标是:三个 Agent 各查一块,最后拼成一张表,全程没人改别人的东西。
- 先把检查拆成三份,按上一节那个分法:A 文字、B 链接和图片、C 分类和标签。每份写清楚输入是哪篇文章、输出是一张什么样的结果表。
- 三个人同时开工,各查各的。查的过程中,谁也不看别人的进度,谁也不改别人的结果。
- 三份结果都交回来之后,由你(或者指定的汇总 Agent)拼成一张总表:哪条通过、哪条不通过、不通过的要怎么改。
- 拼完之后再回头看一遍:有没有两份结果互相矛盾?比如 A 说标题没问题,C 说分类和标题对不上。有矛盾就回到具体那一份去核对,不要在总表上直接改数字。
练完这一次,对照一下时间:三个并行加汇总,比一个人从头查到尾快了多少?如果没快多少,问题一般出在拆分上:要么拆得太碎,汇总太贵;要么边界没写清,中间返工太多。调一次拆分,再跑一次。
练一次:给你的下一件大事拆个并行方案
找一件你手头比较大的事,按下面四步拆一次,不用真的叫几个 Agent 跑,先把方案写下来:
- 写下这件事最后要交出来的东西是什么。
- 把它拆成三到四份,每份对应一个能独立交出来的结果,而不是一个步骤。
- 给每份写清楚输入、输出和边界:它看什么材料,交什么结果,不碰哪些地方。
- 指定谁来汇总,以及结果有矛盾时怎么办。
拆完之后问自己一句:如果这几份同时开工,有没有两个人会写到同一个地方?如果有,回去改拆分,直到没有为止。
下一篇,我们讲 Super-agent 架构拆解:一个常驻的 Router 怎么把活派给不同的 Worker,几个 Agent 各干各的,背后是谁在管。