一个 AI 智能体做了它不该做的事。它泄露了数据,或者删错了数据库,或者发起了一次没人批准的调用。于是你做了最显然的事:去查日志,看看发生了什么。

日志干干净净。

当然干净。它们是由做这件事的同一个进程写下的。智能体报告了“成功”,格式合法,却指向了错误的目标——而你的监控系统,本是为了回答“它成功了吗?”,此时亮起了绿灯。事件的记录,是由事件的起因撰写的。

这就是整个问题令人不安的形态,也正是我想谈论它的原因:在一个 AI 系统里,证人往往就是嫌疑人。行动的那个东西,就是报告自己做了什么的东西。一旦你看到这一点,我们关于日志、审计以及“我们有一个验证步骤”的许多本能就不再站得住脚了。

但在日志之前——在那场戏剧性事件之前——有一个更安静的版本,我们每个人都早已经历过。我们就从那里开始,因为那才是真正会在一个寻常周二咬到你的部分。

那种不会自我宣告的失败

关于传统 bug,有一点是这样的:它们中的大多数失败得很大声。代码抛异常。测试变红。构建中断。失败就发生在你所在的地方,就在你看着它的那一刻,它基本上会揪住你的衣领说修好我。这很烦人,但它是一份礼物——错误和你本可以廉价捕获它的那个时刻处在同一个地方。

AI 的失败恰恰相反。它失败得很像样。

你要一个函数,得到的那个看起来完全正确——干净、合理、形状对——却在你没检查的某个情形里微妙地错了。你要一个查询,它返回一个看起来没问题的数字。你要一份摘要,它自信、结构良好,却悄悄漏掉了唯一重要的那件事。没有抛异常,没有变红,没有标记。它径直掠过了你本可以多看一眼就抓住它的那个确切时刻,因为没有任何东西提示你去看。

然后账单晚些时候到了——在最糟糕的时间,以最糟糕的代价。

你会在三周后仪表盘上某个数字微妙地不对时发现它。当某个“能用”的函数在生产环境的边缘情况下崩溃时。当你意识到数据自某个没人标记的改动以来就一直悄悄出错时。而这时线索已经冷了。你在逆向工程 AI 做了什么、何时做的、为什么做,却没有任何面包屑指回源头——而这要花上数小时,有时是数天。一个本该大声报错的错误本可以只花你几分钟。

这就是人们说 AI“节省时间”时忽略的部分。有时它确实节省了。但当它以看似合理的方式出错时,它并没有节省时间——它转移了时间。它把本应很小且即时的成本,搬到了未来,在那里它变得冰冷、叠加、昂贵。产出快,信任慢,理清起来极其痛苦。

而这正是它与日志的关联所在:当你终于去重建实际发生了什么时,你伸手去拿记录——而那份记录恰恰是由最初产出那个看似合理的错误输出的东西写下的。于是这就从生产力上的烦恼变成了真正的信任问题。

我们伸手去拿的每个工具里都藏着的假设

想想当出问题时你实际会做什么。你查看日志。你阅读审计追踪。你看监控仪表盘。你说“嗯,我们有验证步骤。”

上述每一个动作都建立在一个我们几乎从不宣之于口的假设之上:做记录的那个东西是诚实的。

这个假设过去是安全的,因为行动者和记录者通常是不同的东西。数据库记录你的代码对它做了什么。负载均衡器记录它收到的请求。记录者坐在它所记录的东西之外,所以它没有撒谎的动机。

AI 智能体瓦解了这种分离。做决定、采取行动、然后写下“这是我做的”的东西是同一个系统。所以一个被攻陷或混乱的智能体不会产出损坏的日志来提醒你。它产出的是一份干净的日志——一份看起来忠实的、关于糟糕决策的记录。而干净的日志比缺失的日志更糟,因为缺失的日志让你起疑,而干净的日志让你自信。你不再看了。这份记录完成了安抚你的任务,而那种安抚是虚假的。

所以自然的反应是:好吧,加点东西来检查这个智能体。加一个验证器。

记住这个直觉,因为它恰恰就是陷阱。

为什么你无法靠验证摆脱这个问题

假设你加了一个检查器——一个验证智能体所报告内容的第二进程。很好。但现在问一个显而易见的问题:谁来检查检查器?

检查器也只是一个进程。它的报告同样可能出错、被篡改,或者被喂了错误的输入。所以要信任它,你就需要一个验证器的验证器。然后还需要一个验证器来验证那个验证器。你并没有解决信任问题——你只是把它往上移了一层,并多加了一个盒子。这是验证器一路向下、无穷无尽。

人们在这里会想到 CI:“我们在 CI 里、在智能体之外重新运行验证。”这有帮助,但前提是CI 自己读取的是真实基准。如果 CI 信任的是智能体所报告的内容,那你什么都没摆脱——你只是得到了同一个信任问题,只不过戴着一枚 CI 徽章。这种无穷倒退不在乎你处在哪一层。

这和让学生给自己的考试打分是同一种病——而且更糟,因为你没法靠让另一个学生来打分来修复它,当第一个学生能影响第二个学生看到什么的时候。验证本身也是可能被篡改的东西,所以你无法靠堆叠更多验证来达到“可信”。那个堆叠没有底。

这意味着整个框架就是错的。“我能信任这份记录吗?”这个问题没有干净的答案,因为你要用来确认它的那个东西,恰恰可能就是那个在撒谎的东西。你必须停止试图回答它——转而问一个完全不同的问。

真正有效的做法:让篡改留下痕迹

转变在这里。别再试图让记录去证明什么是真实的。它做不到——记录者可以撒谎,而你刚刚也看到了,你没法靠验证绕开这一点。

相反,让记录去证明一件更谦逊、也更可实现的事:谁在何时声称了什么——在声称发生的那一刻就被封存,以一种之后没人能悄悄改写的方式。

注意它放弃了什么,又保留了什么。它放弃了去认证真相。它保留了顺序和归属——而且关键在于,它让这些变得可被察觉篡改。这条链并不为该声明本身是否正确背书。它为以下事实背书:这条声明是由这一方、在这个时间点提出的,并且此后未被改动。

而这已经足够了,因为它对篡改所起的作用。当你无法悄悄改写记录时,谎言就无法再产生一个干净的结果——它会产生一个洞。一次静默的绕过会表现为一个没有对应提案的批准。一个被删除的步骤会表现为链中的一个缺口。一个伪造的决策会表现为一个无法对账的序列。你不再问“这是真的吗?”(无法回答)。你在问“这个形状里有没有一个洞?”——而这在结构上是可回答的,无需信任任何人的说法。

这就是全部的核心思想,也正是终结无穷回溯的东西:你不是靠验证来抵达信任。你通过工程化设计系统,让篡改无法悄无声息地发生。让谎言留下痕迹,你就把一个不可能的问题转化成了一个可能的问题。

这在实践中是什么样子

这并非抽象——它的形态来自我最近几篇文章评论区里的一场漫长争论,而其中的机制是具体的。关键的几块:

分离写入者。提案、批准和执行不应是同一个进程在自我汇报。让它们成为三个来自三个不同参与方的事件,通过它们所指向的对象相互关联。提出某个动作的智能体,不是批准其自身决议的那一个。这样,当它们在事后出现分歧时,你有一个可读的序列而不是一个需要协商的观点——而“没有对应提案的批准”就变成了一个可见的结构性事实,而不是一个主观判断。

在写入时封存每一条声明。一个哈希链加上签名,使每个条目都与它之前的条目绑定。你并不是在证明任何声明是正确的;你是在让事后改动某条声明、或重排序列而不留下证据变得不可能。这个封存正是把一次静默编辑变成一个可见的洞的东西。

把它锚定在行为者之外。记录的完整性不能依赖于被记录的事物——这正是我们试图摆脱的原罪。一个操作者无法悄悄编辑的仅追加存储,最好带有外部锚定,这样“我改写了自己的历史”就不是一个可用的操作。

记录信念,而不仅仅是行动。数据库被清空的事件教会了这一点:智能体的行动往往是鉴于它所相信的东西,是可以辩护的——它以为自己在开发环境,它以为那是测试目标。所以要在决策时刻捕获智能体对世界的已确定看法(哪个环境、哪个身份、哪个目标),并在它行动之前封存。仅凭行动无法告诉你原因;信念才能。记录症状以及原因。

一个名字,而不是一个角色。“谁授权了这件事”必须指向一个具体的、有东西可失去的人,并被记录下来——而不是“某位审查者”,不是“系统”。否则这个权限就只是另一个匿名的、看似合理的理由事后生成。这条线是某个人划的;记录应该说明是谁。

这些部分没有一个是奇特的。它们合在一起做了一件事:它们使得当某件事出错时,失败会以一种形状呈现出来,让你看得见,而不是一份你会相信的干净报告。

诚实的局限(因为这并非魔法)

我想坦诚地说明这能给你带来什么、不能带来什么,因为过度吹捧它本身就会成为一种看似合理的谎言。

它证明工作确实发生了在一个无法被凭空捏造的身份下,以一种无法被改写的顺序。它不证明输出有任何好。智能体所做的事是否正确或明智,是一个独立的、更难的问题——机器证据廉价且可扩展;判断力昂贵且不可扩展。

它证明谁声称了什么,以及何时。它不证明批准的人是否真的理解他们所批准的东西——而一旦你有了批准疲劳、每次会话四十个橡皮图章式的提示,这就是真正未解决的那一半。

而且它让篡改可见,而非不可能。保证的是可读性,而非预防。你仍然可以做那件坏事;你只是无法悄无声息地做。

这是一个比“可信日志”更弱的承诺,而这正是重点——一旦证人变成了嫌疑人,“可信日志”就从来都不在选项之中。“谎言必须留下痕迹”是我所知道的最强的诚实底线。

我的立场

我们一直在问错误的问题。当 AI 系统行为不端时,“我能信任这份记录吗?”感觉是自然而然要问的——但在一个行动者即报告者的世界里,这是一个没有干净答案的问题,因为你要传唤的证人正是被告席上的嫌疑人。

所以别再问它了。可实现的目标从来不是一份能证明真相的记录。而是一份谎言无法保持沉默的记录——其中绕过会显现为一个洞,删除会显现为一道缺口,伪造的批准会显现为一个背后空无一物的步骤。你无法通过验证走向信任,因为每个验证者都需要一个验证者。但你可以构建一个系统,让篡改留下形状——然后问题就不再是无法回答的“这是真的吗?”,而变成了可以回答的“这个形状完整吗?”

这不会在那种似是而非的错误函数发布之前就抓住它。但它意味着,当你终于去查的时候——三周之后,线索已冷,仪表盘悄无声息地错了——记录不能冲你微笑并撒谎。至少,它必须向你展示那个洞。


这是我一直在纠结的一个问题,而且我真心希望有人能把我驳倒:你添加的每一个验证层本身都是可能被攻破的东西,所以“让篡改留下形状”在我看来就是真正的底线——而不是通往更强事物的垫脚石。有没有我遗漏的招数,能让你得到比可读性更多的东西?而对于任何正在构建这个的人:最难让它变得可见的洞是什么?