夜雨聆风学习资料网

ARTICLE · 1090048

模板给多了Agent反而更笨:长任务、多Agent、验收这三个死结,我换了一套打法

模板给多了Agent反而更笨:长任务、多Agent、验收这三个死结,我换了一套打法

做Agent这两年多,真正折磨我的从来不是模型不够聪明。是三件很具体的事。

任务一长就跑偏。跑到第四十分钟,模型已经忘了自己最初要干什么,开始在一个无关紧要的报错上反复打转。Agent一多就内耗,四个子Agent各写各的,两个改了同一个文件,一个把另一个还没验证的结论当成了输入,最后合出来的东西谁也不敢用。结果出来了没法验收,模型说已完成,所有测试通过,我点进去一看,测试是它自己顺手改成assert True的。

这三件事,我之前一律靠把prompt写得更长来对付。最长的一版系统提示词写到八百多行,规则、模板、反例、注意事项一层层往上堆。效果是模型越来越像一个被条条框框捆住手脚的实习生,什么都照做,什么都做不好。

最近两周我把思路彻底换掉了。触发点有两个。一个是Anthropic连着放出的两个科研案例,一个是单Agent跑了一周量级的计算没出错,一个是九百多个Agent会话在二十来个小时里没打架,还顺手做出了一个生物学发现。另一个是我自己在几个内部任务上反复对比给模板和给目标,结果跟我原来的直觉是反的。

先说那个让我不舒服的发现。

上个月我在清一批爬回来的图文对数据,准备喂给多模态模型做微调,大概三十多万条。这活我以前用规则加人工抽检做过好几轮,很清楚坑在哪,所以第一版prompt写得很满,十二步模板,去重怎么算、caption长度阈值、语言检测、图片损坏怎么处理、每一步输入什么输出什么、异常写到哪个文件。第二版是我不太情愿写的对照组,只有三段话,这批数据要拿去训什么模型、什么样的样本算干净、哪些操作绝对不允许(不许删原始文件、不许改字段名、不许在没抽样看过之前批量删)。

用去年的模型跑,第一版明显更稳,第二版会漏步骤。换成现在的前沿模型,结果反过来了。第二版跑到一半自己停下来跟我说,有大约两万条caption其实是电商详情页的alt文本,全是点击查看大图和商品图片 3这种东西,问我要不要单独归一类。这类脏数据我十二步模板里压根没有,第一版老老实实按模板走完,把这两万条当成正常短文本留下了。它没做错任何一步,但结果是错的。

后来查资料,发现这不是我的个例。做约束编程Agent的CP-Agent那篇论文,作者给模型的领域知识只有不到五十行,在CP-Bench的一百零一道题上全对,他们的结论写得很直接,最小引导优于详细的过程脚手架。几家做模型接入的团队在Opus 5、GPT 5.5的使用指南里也说了类似的话,给强模型一步步的操作指令,它会变差,因为你在用弱模型的补丁去限制强模型的推理。

道理不复杂。模板是我基于我对任务的理解写的,我的理解有盲区,模板就把盲区固化下来了。模型比我看得多,但被模板锁死了只能走我的路。

那是不是给目标不给模板就对了?我一开始也这么想,后来发现这个说法太粗。探索性的任务,比如看看这批日志里有没有异常模式和帮我评估这三个方案,给目标和边界确实就够了,你要的是模型的判断力,不是它的服从性。可重复性、生产性的任务完全是另一回事。每天跑一遍的报表、批量的代码迁移、固定格式的结构化抽取,一致性比创造性重要一万倍,这种任务不给模板,模型每次都自由发挥出一个略有不同的格式,下游直接炸。

所以模板不是不要,是不能放在prompt里。

放在prompt里的模板是许愿。我希望你输出这个格式,我希望你别改测试文件,我希望你每步都验证。模型大部分时候会听,但大部分在长任务里等于一定会出事。放在harness里的模板是闸门。输出必须过JSON Schema校验,不过就打回;测试目录只读,改不了;每次提交前hook自动跑lint和类型检查,不过就不允许下一步。这时候模板不再是给模型看的文字,而是模型绕不过去的环境。

Mitchell Hashimoto今年二月那篇讲自己AI采用历程的文章里,把这件事说成一句话,每次发现Agent犯了一个错,就花时间工程化一个解决方案,让它永远犯不了这个错。他给了两种形式,一种是改AGENTS.md这类隐式提示,一种是写真正的程序化工具,比如截屏脚本、过滤过的测试命令。他Ghostty项目的AGENTS.md每一行都对应一次真实的坏行为。注意他说的重点是改环境,不是把prompt再写长一点。

Thoughtworks的Birgitta Böckeler四月在Martin Fowler网站上那篇文章,把这些闸门分得更细。事前的叫guides,预判模型的行为、在它动手前引导它;事后的叫sensors,观察结果、让它自我纠正。两种各有计算型和推理型两种实现,计算型是测试、linter、类型检查、结构分析,毫秒到秒级出结果,确定、便宜;推理型是让另一个模型来评审,慢、贵、非确定。她还提了一个我很认同的观点,以后选技术栈的时候,好不好harness应该成为正式的考量维度。类型系统强、模块边界清晰、错误信息友好的技术栈,Agent就更好管。

这就是我理解的Harness Engineering的核心。把你应该怎么做从模型嘴边挪走,换成你做完了我怎么检查,你做不对会发生什么。模型的自由度反而更大,因为它不用再遵守一堆它可能已经比我更懂的规矩,它只需要通过闸门。

有了这个视角,再回头看那三个死结,每一个都能找到落点。

先看长任务。物理学家Matt von Hippel之前在博客上发过一个挑战,算出N=4超杨-米尔斯理论六粒子振幅的第九圈。这是他老本行散射振幅领域一个明确的前沿难题,之前最高做到八圈,而且八圈还是借一个叫形状因子的相关对象绕路做出来的。Anthropic两个物理学家用Fable 5.1在Claude Science这个harness里接了这个挑战。

给模型的任务描述就一句话:计算平面N=4SYM中六粒子振幅的九圈结果。之后人类给出的全部监督,原文级别是:我要去睡了,接下来几个小时不在。你继续做直到我叫停,每四到六小时给我一次进度。

模型用Python和SymPy从零重写了全套计算代码,沿两条独立的技术路线各算了一遍,结果由SLAC的Lance Dixon独立验证。成本上,bootstrap那条路线的纯计算约一百美元,相当于九十六个CPU跑一周;每条路线的总花费一到两千美元,大头是模型长时间挂着的推理费。Dixon的评价是这套计算极其脆弱,任何一个小错都会让整件事像失败的舒芙蕾一样塌掉。von Hippel自己说,如果是他来跑这一周的计算,几乎一定要跑两遍,因为第一遍必然搞砸点什么。

这个案例对我最大的冲击不是模型能算物理,而是一周量级的长任务,监督只有继续,还一次跑通。它靠什么不跑偏?

第一件事,终点是可检查的。九圈的答案对不对,有一整套已知的约束条件可以验,bootstrap方法本身就是列出所有可能,用已知规则一个个划掉,模型自己就能判断做完没有。长任务能跑,前提永远是做完有一个机器可判定的定义。你的任务如果连这个都没有,别指望模型跑八小时不歪。

第二件事,状态在外面,不在上下文里。一周的任务不可能塞进任何一个上下文窗口,中间结果、代码、检查点都落盘,上下文丢了可以从文件重建。Addy Osmani六月那篇《Loop Engineering》里有句话我很喜欢,模型会忘,仓库不会。我现在做长任务的第一条规则就是,任何超过一小时的任务,进度必须写在文件里,模型每轮先读文件再干活,而不是靠聊天记录记着自己做到哪了。

第三件事,两条独立路线互相印证。这一条比任何过程监督都硬。你盯着模型看每一步,看不出它哪一步的假设错了;两条路线殊途同归,错在同一处的概率极低。

还有一件我最近才想明白的事,计算预算该花在哪。

Anthropic的Thariq Shihipar前两天写了篇分析effort档位的文章,把 Terminal-Bench 3.0上每一次失败都分了类。Fable 5.1从最低档到最高档,三百七十次尝试里通过数从一百四十涨到二百一十四,自己的测试没测出来的 bug从四十次降到十四次。但有一类失败反着走,对题意选了错误的解读从二十五次涨到了四十七次。想得更久,模型在一个错误的理解上就扎得更深。作者的总结是,提高effort主要减少的是漏边界情况,对方向本身错了几乎没帮助。

他举的例子很典型。一个HTML净化器任务,低effort大概两分钟写完就交,只测了一个手写页面;高effort跑了三十三分钟,对第一版做对抗性审查、去读解析器源码找bug、跑标准XSS测试集,最后还写了一个随机文档fuzzer,从五次一过变成五次全过。

翻译成工程语言,token应该花在验证上,不该花在想得更周全上。方向对不对,是人在任务定义阶段解决的事;做得对不对,是模型在验证阶段用算力解决的事。这两个别混。我现在的节奏基本变成了先让模型访谈我,把需求里的模糊点问出来;低effort快速实现;我看一眼大方向;高effort跑验证。快的地方快,慢的地方慢。

长任务讲的是一个Agent跑很久。ART讲的是另一个极端,一堆Agent同时跑。

任务是从一个包含十九亿个蛋白簇的宏基因组数据库里找新的逆转录酶系统。Anthropic给的是一份研究简报,之后没有人介入。最后跑了一百一十九个任务、九百四十九个Agent会话、两亿一千五百六十万token,二十一个半小时墙钟时间,产出了一个此前没人描述过的酶系统,一个逆转录酶,旁边一个搭档基因,再加一长串间隔均匀的DNA重复序列,结构像CRISPR阵列。发现它的那个Agent在读原始DNA序列时写下的原话是,这段DNA太漂亮了,我肉眼就能看出一个串联重复阵列……这是一个CRISPR样的重复阵列?!

这套harness的组织方式,我读论文方法部分的时候几乎每一段都想抄。

每个任务由一对Agent完成。worker出方案、干活、提交书面总结和代码数据;supervisor只负责审,审计划、审总结、审改过的文件,要么接受,要么打回修改。一百一十九个任务里有四十九个至少被打回过一次。supervisor在审的过程中发现新线索,可以直接开一个新任务,进入一个分流队列,由harness放行或者附上书面理由拒绝。整个战役一开始只有五个阶段任务和十六个深挖任务,剩下九十八个全是这样自己长出来的。结束条件是,队列里再没有可以派发的任务。

这一条我以前做反了。今年上半年我搭过一套跑消融实验的多Agent,想法很朴素,一个planner读实验方案,把要跑的配置组合全拆出来;四个worker并行改配置、起训练、收指标;最后一个merger把结果汇成表。第一次真跑就出了开头说的那两件事。两个worker同时改了同一个configs/base.yaml,后写的覆盖了先写的,其中一组实验实际跑的根本不是它报告的配置。另一个worker在等自己训练的时候,去读了旁边worker还没跑完的中间日志,把一个epoch三的指标当成最终结果写进了自己的分析里。merger最后合出来一张漂亮的表,我盯了两天才发现有两行数字对应不上任何真实跑过的实验。

问题很清楚,planner在开头把活全拆完,中途冒出来的问题没人接;worker之间没有任何制衡,一个跑偏了没人拦,只能等最后合并时撞出来。后来我把它改成配对,每个worker配一个只负责审的supervisor,改配置前先审改动、报指标前先核日志来源,最直接的变化是跑偏被就地拦下,不再攒到最后。Osmani那篇文章把这一点说成一句话,让写的人和查的人分开,写代码的模型给自己的作业打分时太宽容了。

所有计划、结果、评审都写进一个版本控制的公共记录,每个Agent都能读。每个任务完成后,一个curator角色读一遍任务简报和worker的总结,把发现录进共享知识库,相关条目会出现在后续worker和supervisor的prompt里。九百四十九个会话不是九百四十九个互相看不见的平行宇宙,而是一个有共同记忆的系统。这跟长任务里状态在外面是同一个原则,只是从单Agent扩到了多Agent。

收敛这件事,他们交给了机制而不是人。十九份成果报告先做锦标赛式两两评比,每一对报告都比一场,一共三百四十二场,由一个裁判模型按影响力、新颖性、可靠性、可操作性打分,可靠性低于某个分数直接判负,最后用Bradley-Terry模型拟合排名,人只看头部。更狠的是,十七个候选发现里有十四个被Agent自己证伪或搁置,最后确认的只有三个。高产出、自清洗,人不用在垃圾堆里翻。

而且并行度并不高。七十七个Agent小时压进二十一个半小时,大约三点六倍。这套系统的吞吐不来自预先铺开一堆worker,来自supervisor按需开任务。多Agent不是越多越好,是该分的时候分,该收的时候收。

还有一个细节值得单独说。整个战役被harness划成五个阶段,输入组装、数据库扫描、分类、邻域普查、深挖,每个阶段由脚本化的完成检查关闭,前一阶段不完成,后一阶段的任务不开。阶段之间是硬闸门,阶段之内worker完全自由。那些用于筛选候选的阈值,是负责普查的worker在跑普查之前自己定下来的,相当于Agent给自己做了预注册。这就是模板放在 harness 里的一个完整样本:过程稀疏,约束充分。

Osmani那篇文章里还有一件事跟这里对得上,就是隔离。他把生产环境的循环拆成五个原语加一份外部记忆,自动触发、worktree、skills、连接器、子Agent,其中worktree是多Agent不互相踩文件的物理保障,一个Agent一个工作目录一个分支,合并是显式动作而不是默认状态。消融实验那次之后,我所有并行Agent的任务都强制worktree,每个worker在自己的checkout里改配置、跑实验,结果以PR的形式回来,不再让它们共享一个目录。上面那种后写覆盖先写的事,从机制上就没法再发生了。

写到这里,验收这件事其实已经绕不开了。前面每一段都在说验证,但最难的部分我还没说。

ART论文里藏着一个对所有用工具的Agent都成立的发现。作者把整个战役原样重跑了十次,那个关键发现十次全漏。几乎每次都采样到了ART的基因位点,有两次worker甚至专门去研究了这个谱系,但没有一次去读逆转录酶上游的DNA序列。他们于是搭了一组固定输入的benchmark,把同样的序列要么直接放进上下文,要么放进文件系统配上工具,让模型描述这个系统。结果是,直接放进上下文时,头部几个模型至少九成的尝试能准确描述那个重复阵列;换成文件加工具的设置,最低掉到三成二。查transcript发现,有工具的情况下三成九的尝试从来没读过两百个核苷酸以上的连续原始序列,也就是从来没看到过超过一个重复单元。它选择写脚本、跑统计、看摘要,唯独没亲眼看。一旦读入,识别率高出十六到三十二个百分点,而且读得越多越高,Mythos 5最高到九成六。

工具给了模型不看的自由,而异常只在原始数据里。

这条对我做数据类Agent的影响是直接的。凡是任务依赖注意到预期之外的东西,必须把关键原始数据读进上下文就是harness的硬约束,不是模型的自由裁量。它是一个典型的模板应该出现的地方,因为它规定的不是模型怎么分析,而是模型在分析前必须看什么。

回到验收本身,我现在用的是三层结构,本质上就是Böckeler那套计算型和推理型控制按成本排个序。

确定性检查每一轮都跑。测试、类型、lint、输出Schema、文件只读边界。能用代码判定的,绝不让模型自评。Osmani有一句话我记得很牢:做完了是一个声明,不是一个证明。Claude Code和Codex现在都有 /goal 这个原语,你给它一个可验证的停止条件,比如test/auth下所有测试通过且 lint 干净,每一轮结束后由一个独立的小模型来判断是否达成,而不是让写代码的那个模型自己宣布完成。

模型评审在关键节点跑。一个跟worker隔离的reviewer,看不到worker的思考过程,只看产出。ART里supervisor对worker的那种关系就是这个。LangChain那篇讲循环的文章里把这一层叫grader,可以是确定性的,也可以是另一个模型,代价是每次运行的延迟和成本都会上去,他们的判断是当质量比速度重要时值得,而这几乎是所有生产场景。

独立路线交叉验证加人类终验,只在交付前。九圈用了两条数学路线,ART用了十四个候选被自己证伪。这一层最贵,所以放最后,但它是唯一能兜住方向错了的层。前两层兜不住:测试通过、reviewer满意,方向照样可能是错的。Böckeler那篇文章里有句话说得很实在,如果人一开始就没说清楚自己要什么,正确性就不在任何传感器的职责范围内。

还有两个小的但很实用的机制。一个是停滞熔断,检测Agent是不是在几个相同状态之间来回打转,是就强制中断。ART那一百一十九个任务里有两个是这么停掉的,一个改了十轮,一个十次完成检查没过。我在这上面交过学费。有一次让Agent在一台新机器上把训练环境跑起来,它遇到torch和CUDA版本不匹配,就开始换torch版本,换完发现torchvision不兼容,再换torchvision,然后torch又不对了。它在三个版本组合之间绕了大概四十分钟,每一轮的报错都跟前面某一轮一模一样,但它每次都很有信心地说找到问题了。等我回来看,token已经烧掉了平时一整天的量。现在我的长任务都带一个停滞检测,连续两轮的报错签名相同就强制中断,把状态交给我。另一个是迭代上限从低起步,新的循环一律先设五轮,看它在哪一轮开始退化,确认稳定了再慢慢放开。

模板从prompt挪进harness,循环替人发prompt,那人干什么?

我最近读到一篇文章挺触动的。作者做了一款以计划模式为核心的AI编程工具,融资、上线,然后失败了。他的复盘是,他把规划和计划文档搞混了。规划是必要的,但把规划固化成一份AI生成的长文档给人看,没人看。AI生成的文本有一种特殊的节奏和过度结构化,人眼会自动滑过去。而且随着模型变强,模型能自己可靠决定的每一件事,都是少一件需要拉人来决定的事。他的结论是,以前的循环是计划、批准、执行,现在的循环是理解、行动、检查、澄清、调整、再行动,规划仍然大量存在,只是不再以一份叫计划的文档出现。

我的体会一致。人的注意力应该集中在三个位置。任务开头,定义目标和做完的机器可判定条件,这是唯一能纠正方向的时刻。闸门本身,每一次模型犯错去改环境而不是改prompt,这个工作是累积的,一个团队的harness会越来越厚,这才是真正的资产。任务结尾,终验。不是过程监督。九圈的验证是Dixon做的,ART的头部报告是人看的,两个案例里人都没盯过程。Anthropic生物团队在博客里还提了一件事,他们现在把哪些候选值得去实验室验、哪些直接搁置这个判断本身当研究对象,把学到的东西写回给Claude的指令里,让它学他们的科学品味。这就是harness在长的过程。

Claude Code负责人Boris Cherny有一句被广泛引用的话:我已经不 prompt Claude了。我有一堆循环在跑,是它们在prompt Claude并决定下一步做什么。我的工作是写循环。这句话我一开始觉得有点装,后来发现他讲的就是上面这三个位置。

最后泼几句冷水。

成本是第一个。Agent循环的模型调用是单次prompt的十到一百倍,这是圈内的经验数字。九圈一到两千美元、ART两亿多token,放在科研里是便宜,放在一个日常业务任务上未必。一次性任务,开一个交互会话手动盯着,往往比设计一个循环更快。循环划算的前提是任务重复、长时间运行、或者需要无人值守,并且做完能被检查。四个条件缺一个,就别上循环。

成功里仍然有掷骰子的成分,这是第二个。ART的发现十次重跑十次丢,作者自己归因于搜索空间太大和harness的非确定性;九圈的流程一碰就塌。这两个案例说明能力已经够到前沿门槛,但可靠性还没有。同一张考卷,ART那个benchmark测了七个模型,头部四个和后面三个之间是断崖,模型选型选错,harness再好也白搭。所以harness设计得回答三个问题:关键步骤能不能强制复现,模型选型有没有benchmark背书,失败了能不能归因。

第三个,harness有一天可能会消失。Cherny也说过harness will disappear,意思是很多今天靠外部脚手架做的事会被吸进模型里。我的看法是,闸门会往模型里移,但什么算做完和什么绝对不能做这两件事永远得有人定。Osmani那篇文章的结尾我很喜欢,两个人可以搭出一模一样的循环,一个用它在自己深刻理解的领域跑得更快,另一个用它逃避理解。循环分不出这两者,你分得出。杠杆点挪了,责任没挪。

所以回到开头那三个死结。长任务不跑偏,靠外部状态、可判定的终点和把token花在验证上,不靠更长的prompt。多Agent不内耗,靠配对制衡、共享记忆、按需派生和机制收敛,不靠更聪明的planner。结果能验收,靠三层闸门和独立路线交叉验证,不靠模型自己说已完成。

模板该给还是要给,只是从prompt里搬进harness里。给模型自由的是怎么做,锁死的是什么算做完、什么不能碰。

相关学习资料