文章

验证螺旋

当 AI 几分钟就能生成上千行代码时,人类审查的精力却并未随之缩减。本文从“胡扯不对称原则”出发,探讨我们在面对海量 AI 产出时陷入的审查困境与失控感。

验证螺旋

互联网上存在一个布兰多里尼定律(Brandolini’s law),或者叫胡扯不对称原则(the bullshit asymmetry principle),大意是,反驳胡说八道所需的精力,远大于制造胡说八道所需的精力。

The amount of energy needed to refute bullshit is an order of magnitude bigger than that needed to produce it.(反驳废话所需的能量,比产生废话所需的能量大一个数量级。)

– Alberto Brandolini

针对这个现象,中文圈有一个很精确的描述:“造谣一张嘴,辟谣跑断腿”。

这个原则让我意识到,内容验证与内容生成所需要的精力是不一样的。而且我发现,AI 降低了内容生成的门槛以及时间成本。

生成式 AI 的冲击

生成式 AI(generative AI)把内容生成变成了一种工具。人们只需要输入一段提示词,就可以生成文章、图片、播客、音乐、视频。

在 AI Agent 出现之后,AI 可以理解目标、感知上下文、调用工具、在真实的环境中执行任务。这大大拓宽了内容的内涵:代码、UI 设计稿、报告讲稿、Flashcard、PPT……

制造内容的门槛大幅下降,所需要的时间也显著缩短。在 AI Agent 帮助下,写作新手能在几分钟内写出一篇不错的文章,刚入职的程序员也能在几小时内完成包含大量变更的 PR。

AI 能让人快速产出大量内容,但人依旧需要花大量时间与精力去理解和验证。

以我所在的软件工程行业为例。

在 Agent 的帮助下,对方可能花半天提交了一个 PR。这个 PR 包含上千行代码,变更涉及多个子系统,并且附上大量的测试,宣称自己已经完成某个功能。

而你需要花几天才能理解这些变更,检查它们有没有漏洞、设计是否符合历史原则、代码是否遵守项目规范。

当你给出建议后,对方只需把建议丢给 Agent,可能一小时就能改完。但这些修改可能把原有代码改得面目全非,你又要花好几天才能理解新变更……

验证螺旋

有人可能会说,我用 AI 来帮我理解内容、验证内容不就行了?别人用 AI 生成了大量代码,提交了一个 PR,我直接用 AI 来帮我理解这些代码、或者直接让 AI review。这样做不是不行,但问题是:AI 的理解、AI 的 review 本身也是一种需要被验证的内容。

为了验证上一个 AI 的输出,我们可能需要引入新的 AI,这就变成了一个无限套娃的游戏:AI 产出内容 -> 人无法确定这些内容对不对,用 AI 来验证 -> 人无法确定 AI 的验证对不对,用另一个 AI 来验证 -> ……

到了最后,会出现两种情况:要么你亲自阅读内容,因为只有这样,你才能判断 AI 说的对不对;要么你把理解内容、验证内容托付给 AI,相信 AI 给出的结果。

或许,这是一个信仰问题1

两种选择

如果你选择亲自阅读内容,由于你的理解速度远远跟不上生成速度,你的大脑会被 AI 生产的内容淹没。如果完全相信 AI,你会失去对内容的真正理解和掌控感。

还是以软件工程行业为例。

如果你选择读代码、理解每个 PR 的变更,就会出现上面描述过的场景:别人只需要几小时就能提交包含大量变更的 PR,而你需要好几天才能理解这些变更为什么存在,是不是正确的。一个 PR 可能还好,经过几个 PR 之后,人的精力和耐心会被耗尽。

行业内已经出现了一些案例。

Turso 是一个开源的数据库。它有一个赏金计划,给每一个发现会导致数据损坏的漏洞的人支付 1000 美元。

项目管理者在今年 5 月 12 日宣布关闭赏金计划,因为在 AI Agent 出现之后,出现了大量由 AI 生成的漏洞提交,每一个提交都声称自己找到了漏洞。这些提交让项目维护者感到精疲力尽,他们需要花大量时间来阅读、理解、审查这些提交,反复确认这是否是一个真正的漏洞。最终他们不得不放弃这个赏金计划。

他们在博客中写道:

The main problem of course is that it costs the slopmaker perhaps a minute to generate their submission. But it costs us hours to read, understand, and engage with them. And they can be generated at a semi-infinite pace. It is possible to set up automated systems to gatekeep this, but with a non-negligible dollar value attached to it, the incentive is just too great for the AIs to just keep arguing, reopening the same PR, etc.(核心问题在于,垃圾内容制造者可能仅需要一分钟就能生成他们的提交,而我们却需要耗费数小时去阅读、理解并且处理它们。而且,他们生成这种垃圾内容的速度几乎是无穷无尽的。尽管我们可以建立自动化系统来拦截把关,但由于这牵涉到不可忽视的金钱利益(赏金),在巨大的诱惑下,AI 会无休止地进行争辩、反复重开同一个 PR 等操作。)

– Glauber Costa

如果把代码审查完全交给 AI,你就不知道这部分代码为什么要这么写,系统为什么要这么设计。即使测试跑通了,如果不去逐行阅读测试代码,你就无从得知这些测试测了什么、有没有覆盖到核心逻辑。甚至在很多时候,这些测试本身也是 AI 的产物。

经过几个 PR 之后,项目会慢慢变成一个黑盒:没人知道系统内部代码如何运作,某个功能如何实现,会不会有 bug。最终,团队会失去对系统的掌控。

系统正常运转时,一切安好;当出现 bug 时,没人知道该如何排查,只能寄希望于 AI;当需要新功能时,也没人知道该如何下手,只能寄希望于 AI。

有一个词叫认知债(cognitive debt),还挺贴切的。

一些个人感受

我个人更倾向于前者:我会仔细检查 AI 的输出,确保它的输出符合我的要求。如果不符合,我会亲自下场修改。

我知道 AI 会产生幻觉,没有全局视野,会有上下文污染;我知道 AI 常常写出局部能工作但会影响全局架构的代码;我知道 AI 喜欢过度抽象,喜欢写没有必要的辅助函数,让代码变得难以理解。或许,还有身而为人的主体性吧。

但这个选择让我感到深深的倦怠。

我确实用 AI 完成比过去多得多的任务,但我感觉自己变成了 AI 的调度器,像 CPU 那样,不断地下达指令、分配任务、在不同的任务之间切换,开几个窗口同时跑不同的任务。AI 完成任务之后,我还要审查输出结果、纠错。

在审查的过程中,自己指挥下的 Agent 还好,至少我知道为什么要这么改,有哪些改动是不必要的,而且我能控制变更的大小。

但如果是审查别人提交的 PR,即使有 PR message,我也很难立刻理解为什么要这么改。而且,有一些 AI 喜欢在做新功能时“优化”旧代码,带来很多不必要的变更(点名批评 GPT)。只读 diff,我看到的是大量的测试(不知道在测什么)、没必要的辅助函数(明明库里有,但就是不复用)、以及意义不明的变更(不知道为什么要动这段旧代码)。


脚注

  1. 当你把“内容生成”替换成“执行任务”,这个问题就更有趣了:你多大程度上愿意相信 AI 的选择、判断,多大程度上愿意把任务全权交给 AI?万一,AI 做出你无法理解但其实是正确的选择呢?(比如,AlphaGo 在与李世石的对弈中下出的第 37 手,令许多职业棋手以及解说感到不可思议。而事后证明,这是神之一手。) ↩︎

本文由作者按照 CC BY 4.0 进行授权