我作为一名非开发人员为医院构建内部工具,这意味着大部分代码都是由 AI 编写的。所以我当然做了负责任的事情:我让 AI 也审查了它。
不是随随便便地审查。我设置了不同的角色——一个代理负责实现,另一个运行测试,另一个专门读取代码寻找安全问题。不同的指令、不同的关注点、对同一工作进行不同的审视。这感觉就像一个审查流程。几个月来,安全审查员几乎没有标记任何问题。
我当时以为这是好消息。
然后,在这个网站上,三天之内,陌生人在同一个系统中发现了八个真正的缺陷。其中没有一个来自我的审查员。
让我停下来的数字
这是那段时间的真实统计。一个检查断言某种东西被检测到了,而不是它应该检测到的特定东西。一个排除守卫验证了某个模式可以识别一个文件夹,但从未验证过实际的发布运行是否排除了它——这已经悄无声息地错误地评分了六个干净的文件好几周了。一个相反方向的盲点,扩大同一个模式可能会吞掉真实代码并产生一个完全绿色的"零问题"。一个打印在报告中并被完全排除在通过/失败之外的例外列表。一个我几个月前手动执行过的演练,其结果已经悄无声息地过期了。一个应该每天运行所有这些的计划任务根本就没有被注册。
大约八个,取决于你怎么数。每一个都是外部的人发现的,通常在评论中,通常针对我刚刚自豪地写过的内容。
我的审查员代理已经在阅读相同的代码几个月了。它从未提到过其中任何一个。
我理解错误的部分
我的第一反应是审查员需要更好的指令。这是一个舒适的结论,因为它可以通过提示来修复。
然后线程中的某人说出了真正解释它的话:两个模型达成一致往往是一个具有两种特征的失败模式。
我一直将角色分离视为独立性。事实并非如此。我的实现者和我的审查员在底层是同一个模型,只是被分配了不同的工作。不同的帽子,同一个先验。无论实现者在结构上无法注意到什么,审查员也无法注意到,原因完全相同——不是因为它粗心,而是因为它共享了盲点的形状。要求它检查工作就是在要求同一个头脑重新考虑自己的假设,而这是头脑最不擅长的事情。
还有第二层,更糟糕的一层。我的代理不在关于我的系统的对话之外。它们就是对话本身。它们持有我给它们的上下文、我选择的框架、我用于自己工具的词汇。阅读我帖子的陌生人没有这些。他们并不更聪明——他们只是站在我无法站立的地方,我简要介绍过的任何东西也无法站立。
人类等价物是两个一起工作多年的同事:仍然是两个人,仍然是两种特征,但他们的分歧已经解决成了一种共享的看待方式。同样的陷阱。AI 只是通过构建在第一天就立即到达了那里。
我误读的沉默
这是刺痛的地方,因为我已经用不同的伪装写过两篇关于这个确切错误的帖子。
一个没有发现任何问题的审查员和一个没有真正查看的审查员产生相同的输出:什么都没有。我知道这一点。我已经基于这个原则构建了死人开关——检查在缺乏新鲜信号时报警,正是因为从外部看,沉默和健康看起来是一样的。而我仍然将审查员数月的安静解读为代码干净的证据。
我从未给它播种过。我从未交给它一个带有已知植入缺陷的文件来确认它仍然能看到。我对我的自动化扫描器做过完全相同的事情——植入了十个已知的坏模式,发现它捕获了七个——但我从未想过对审查员做同样的事情,因为审查员感觉更像一个同事而不是一个工具。这就是整个错误用一句话来说。它是一个工具。我只是从未在它下面点燃过火柴。
我建造的塔楼
回顾过去,这个月我建造的一切都是对不信任前一层沉默的纪念。
我不再信任自己对代码的判断,所以让 AI 审查它。我不再信任审查,所以我用明确的规则构建了一个机械扫描器。我不再信任扫描器的绿灯,所以我植入了已知的坏装置来证明它能看到。我不再信任那些装置仍然意味着什么,所以我构建了一个演练,特意破坏每个守卫并确认它因为自己的原因变红。然后我不再信任演练,因为事实证明没有任何东西在检查演练本身是否仍在运行——所以一台单独的机器,按照单独的时间表,现在在监视它的生命证明。
五层。每一层之所以存在,是因为它下面的那一层可以在不告诉我的情况下安静下来。
而我无法摆脱的事情是:所有这些层都是由我设计并由同一个 AI 编写的。它们以不同的方式失败,这确实有帮助——规则回归、死门和停止的调度器不会在同一天因为同样的原因发生。但失败模式的多样性不是起源的独立性。整个塔楼共享一个作者。
真正站在外面的东西
在这个整个设置中,唯一真正可靠地站在外面的就是其他人。
不是因为他们比我的代理更好的工程师——几个最尖锐的纠正来自一个从未见过我代码的人的三句话。他们起作用是因为他们在假设被提出时不在房间里。他们阅读了我感到满意的内容,而满意原来是未充分测试的可靠标志。
所以我最终采用的做法,简单地说:
房间内的同意不是证据。如果第二个意见来自同一个模型、同一个会话或我提供的同一个框架,那就是一个意见带有两种特征。它对于捕获失误很有用。对于捕获假设毫无价值。
任何只能保持沉默的东西都不是检查。包括审查员。给它播种,或者承认你将它的安静解读为它从未声称的某种东西的证据。
真正的外部检查必须花费一些代价才能获得。陌生人的关注、已发布的错误、邀请人们针对你最佳工作的帖子。它不扩展,不每晚运行,而且它是我拥有的唯一不源于我自己假设的层。
这是一个对于整个工具包都是 AI 构建的人来说不舒服的结论。我不会假装它能整齐地解决。但五层自动化检查,发现实时错误的东西是一个有五分钟空闲时间且不关心我是否正确的陌生人。
考虑一下我交回来的围栏。如果你正在使用 AI 构建并让 AI 检查工作:你的审查员最后一次告诉你你不想听到的事情是什么时候?如果答案是"它并没有真正发现太多"——那就是我花了几个月时间解读为好消息的同样沉默。
这是 Stolen from the Feed 的一部分——一个非开发人员从 dev.to 带回家并实际构建的内容。From Zero to Ship 的姊妹系列。
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.