设计工程师 James Coombs 的经验:生成者 Agent 有「承诺偏见」,不适合审核自己产出;应让一个从未见过原文的独立 Agent 来证伪,而非问原 Agent 是否正确。
James Coombs 是一名设计工程师,负责构建在产物发布前检查其他 Agent 输出的审核 Agent。他不断重新认识到一点:给你一个验证器更多错误的上下文,它的表现反而会更差。
当我不AI辅助完成一项工作时,我不会问它做得对不对——它一定会说它做对了。我把产物交给第二个 Agent,这个 Agent 从未见过第一个 Agent 的工作过程,我只给它工作必须达到的标准,然后让它证明这个东西是错的。上一次我这么做时,这个全新的审核员标记出了一个我曾坚信可靠的基准数字——它没有可复现的来源。
这与通常的建议背道而驰——通常的建议是给模型更多上下文,这样它就能做得更好。对于生成来说,这个建议是对的。但对于验证,有些上下文是燃料,有些是毒药,两者很容易混淆。
生成某个产物的 Agent 不是它的好评判者,因为它对自己刚做出来的东西有既定的承诺。当问它"这个正确吗?"它会重新运行产生这个东西的推理过程,得到相同的结论,然后报告自信。它没有撒谎。它是在捍卫自己的输出,而从这种立场出发的自我审核不过是一场表演。我们对此是认可的;对于人类来说,我们不会在未经审核的情况下合并自己的 Pull Request。
这里存在两种失败模式,而把它们混为一谈正是人们构建弱验证器的方式。一种是锚定效应:一个见证了工作完成过程的 Agent 会继承作者的心智框架。另一种是单纯的顺从性:语言模型几乎被给予任何东西时,都倾向于说它看起来没问题。全新的审核员可以解决第一种问题。只有对抗性的任务(找出错误并证明它)加上严格的证据规则才能解决第二种问题。你需要两者兼备,但大多数人在同一个对话中问同一个 Agent"这个看起来对吗?",结果两个都得不到。
"上下文"这个词掩盖了以下区别。一种是关于产物如何被制造出来的上下文、作者的推理、运行中的意图、上一个审核员的裁定。另一种是关于产物必须满足什么的上下文:规格说明、规范、跨文件的约束条件。第一种是污染物:它将作者的自信转移给了审核员。第二种是基本事实,而让审核员缺少它并不会锐化审核,反而会使其失明。
所以规则不是"什么都不给审核员",而是隐藏故事,提供标准。没有规格说明的盲目审核员会漏掉那些只在系统层面才存在的缺陷:重复的工具类、违反的边界、在孤立情况下正确但在这个代码库中错误的变更。如果正确性依赖于产物本身无法携带的不变量,那个不变量就作为基本事实输入,从规格说明或测试中提取,而非来自作者的声称。绝不应该输入的是这个东西是如何产生的。
三个机制随之而来,每个都涉及审核员看到什么,以及何时看到。
从无来源开始。 审核员是一个全新的 Agent,对工作如何产生没有记忆。它的任务很明确:你对这东西是如何被制造出来的没有任何历史,根据它所说的和来源显示的内容来判断。独立性不是作为良好行为来要求的;而是通过从一开始就保持盲目来制造的。
隐藏上一轮。 当需要第二轮时,审核员看到的是修改后的产物和 diff,而不是第一轮的结果或严重级别标签。向审核员展示上一轮认为关键的内容,它就会根据那个判定结果进行模式匹配,而不是形成自己的判断。这就是字面意义上的锚定效应,解决方法是让第二轮和第一轮一样保持盲目。
先查来源,再看推理。 在问论点是否成立之前,先检查支撑它的 facts 是否真实可复现。一个无法重新建立来源的主张本身就是一个问题,通常是幻觉,必须在基于它构建的任何东西被判断之前就抓住它。一个基于虚构数字的合理论证仍然是错误的。这个顺序是大多数设置都跳过的地方,而这里正是全新的审核员发挥作用的地方。
作者会回应,但有一条规则保持回应的诚实:对于关于事实或来源的问题,反驳必须是任何人都能打开的文件及其内容,而不是解释为什么审核员误解了的论证。文件和能解决这个问题的行可以被第三方检查。这是我为一般审核提出的规则,主张输给产物,指向作者。
推理层面的分歧、文件无法解决的分歧、无法发生的竞态、上游发生的检查——这些都不会被忽视;而是交给人类。还有工具不被允许单独行动的判定:如果审核员说"重新思考方法",它就停下来,把决定权交出去,而不是悄悄地重写计划。循环有上限,通常一轮,有时两轮,很少三轮;两轮不收敛通常意味着这个单元太大,无法整体审核,或者标准本身模糊,多轮盲目审核也解决不了。
如果你读过关于循环正确性模式的文章,这与之相关。那些模式使一个 Agent 的循环值得信赖:生成、记录、根据基本事实检查、根据差异行动。它们假设一个循环,第二个 Agent 也不是什么新想法。关键的操作是你拒绝给它什么:你已有的来源,这会让审核变得更容易但毫无用处。
最初的版本给了审核员更多信息,基于上下文有帮助的理论。我把作者的推理喂给它,让它理解意图。它理解了意图并采纳了。模式在多次运行中保持一致:审核员知道得越多,它就越顺从。
第二个错误是让作者就地修复自己被标记的问题。每次修复都会悄悄重新引入全新审核员已经消除的偏见,因为同一个有既定承诺的 Agent 在决定"修复"是什么意思。取代它的规则是:审核员报告,作者修改,新的盲目审核判断结果。没有人评判自己的修复。
下次你让一个 Agent 检查自己的工作时,别这么做——它会让自己通过。把产物交给一个从未见过它被制造出来的东西,把标准给它而不是故事,让每个事实反驳都指向任何人都能打开的文件。你放弃的是一个总说工作完成的 Agent。相反,你得到的是能够告诉你工作何时未完成的东西。
在你读到这篇文章之前,我用它跑了这个流程。盲审核让我删掉了一个我很喜欢的说法,并敲定了"上下文"这个词,我之前一直用它来表示三种不同的东西。这不是第一次了,我开始记录这些发现。每一条都是我已经读过并通过的版本。这是最终回来的版本。