AI 智能体做了不该做的事。它泄露了数据,或者删错了数据库,或者发起了未获授权的调用。于是你做了显而易见的事:去查日志,看看发生了什么。
日志很干净。
当然是这样。它们是由导致事件的同一进程写入的。智能体以有效格式报告了“成功”,却指向了错误的目标——而监控系统原本是用来回答“它是否成功?”的,于是亮起了绿灯。事件的记录正是由事件根源本身撰写的。
这就是这个问题的尴尬之处,也是我想谈谈它的原因:在 AI 系统中,目击者往往就是嫌疑人。 行动的主体也是报告行为的主体。一旦你看到这一点,我们对日志、审计以及“我们有验证步骤”的许多直觉就不再成立。
但在日志之前——在那起戏剧性事件之前——这种问题有一个更安静的版本,我们每个人都已经经历过。让我们从这里开始,因为正是这一点会在普通的星期二咬你。
不声张的失败
说到传统的 bug:它们大多数会 大声失败。 代码会抛出异常。测试会变红。编译会中断。失败就在你眼前发生,就在你注视它的瞬间,它基本上会抓住你的衣领说 修复我。 这虽然烦人,却是一种礼物——错误以及你能以低成本捕获它的时刻出现在同一位置。
AI 的失败则相反。它会 看似合理地失败。
你请求一个函数,得到的看起来完全正确——干净、合理、形状对——但在你未检查的情况下,它微妙地出错。你请求一个查询,它返回一个看起来没问题的数字。你请求一个摘要,它表现得自信、结构完整,却悄悄漏掉了最重要的一点。没有异常,没有红色警告,也没有标记。它就这样溜过了你本来只需再看一眼就能发现的瞬间,因为没有任何东西提醒你去查看。
随后,账单会在最不合时宜的时刻到来,代价也是最高的。
你是在三周后的
人们说 AI "节省时间" 时常忽略的就是这部分。有时候它确实能省时间。但当它以看似合理的方式出错时,它并不节省时间——它 转移 了时间。它把本来会很小且即时的成本搬到了未来,在那里变得冰冷、累积且昂贵。快速产出,却难以建立信任,难以理清。
而这里正是它与日志关联的地方:当你终于去重建实际发生的事情时,你会去查看记录——而这条记录正是最初产出那种看似合理却错误输出的东西写下的。于是,这不再只是生产力上的小烦恼,而变成了一个真正的信任问题。
每个我们伸手去用的工具背后隐藏的假设
想想当事情出错时你实际上会做什么。你会查看日志。你会读取审计追踪。你会查看监控仪表盘。你会说“好吧,我们有一个验证步骤”。
这些动作都建立在一个我们几乎 nunca 说出口的假设之上:负责记录的东西是诚实的。
过去这个假设是安全的,因为执行者和记录者通常是 不同的东西。 数据库记录了你的代码对它做了什么。负载均衡器记录了它收到的请求。报告者位于被报告对象的外部,因此它没有说谎的动机。
AI 智能体打破了这种分离。决策、行动然后写下“这就是我做的”的东西是一个系统。因此,一个被破坏或混乱的智能体不会产生一个 损坏 的日志来提醒你。它会产生一个 干净 的日志——看似忠实记录了一个错误决策。而干净的日志比缺失的日志更糟,因为缺失的日志会让你怀疑,而干净的日志会让你 确信。你就不再去查看。记录完成了让你安心的任务,而这种安心是虚假的。
于是自然而然的反应是:好吧,加点东西来检查智能体。添加一个验证器。
抓住这种直觉,因为这正是陷阱。
为什么你无法仅靠验证来摆脱这个问题
假设你添加了一个检查器 —— 一个验证智能体所报告内容的第二个进程。很好。但现在请提出显而易见的问题:谁来检查检查器?
检查器也只是一个进程。它的报告也可能出错,也可能被破坏,也可能得到错误的输入。因此,要想信任它,你需要一个验证器来验证验证器。并且还需要一个验证器来验证那个验证器。你并没有解决信任问题——你只是把问题提升了一层并加了一个框架。验证器层层叠加。
这里的转变是:停止尝试让记录证明什么是真实。 它做不到——记录者可以撒谎,而你已经看到你无法通过验证来规避这一点。
相反,让记录证明一些更谦逊且可实现的事情:谁在何时声称了什么——在声称的那一刻被封存,以一种事后无法悄悄重写的方式。
注意它放弃了什么、保留了什么。它放弃了对真实。的认证;它保留了顺序和作者身份——更重要的是,它使这些防篡改。 链条并不担保该声明的正确性。它担保的是此声明是由此方在此时间点作出的,并且此后未被更改。
这实际上已经足够,因为它对篡改的影响。当你无法悄悄重写记录时,谎言再也无法产生干净的结果——它会产生一个漏洞。 静默绕过会表现为一个没有匹配提案背后的批准。被删除的步骤会在链中表现为一个空白。被伪造的决策会表现为一个无法对账的序列。你不再追问“这是真的吗?”(无法回答)。你在问“形状中是否有漏洞?”——而这可以在结构上得到回答,无需相信任何人的说法。
这就是整个想法,也是它终结回归的方式:你不能通过验证来获得信任。你需要设计系统,使得篡改无法悄悄发生。 让谎言留下痕迹,你就把一个不可能的问题转变为了可能的问题。
实际上有效的做法:让篡改留下形状
这里的转变是:停止尝试让记录证明什么是真实。 它做不到——记录者可以撒谎,而你已经看到你无法通过验证来规避这一点。
相反,让记录证明一些更谦逊且可实现的事情:谁在何时声称了什么——在声称的那一刻被封存,以一种事后无法悄悄重写的方式。
注意它放弃了什么、保留了什么。它放弃了对真实。的认证;它保留了顺序和作者身份——更重要的是,它使这些防篡改。 链条并不担保该声明的正确性。它担保的是此声明是由此方在此时间点作出的,并且此后未被更改。
这实际上已经足够,因为它对篡改的影响。当你无法悄悄重写记录时,谎言再也无法产生干净的结果——它会产生一个漏洞。 静默绕过会表现为一个没有匹配提案背后的批准。被删除的步骤会在链中表现为一个空白。被伪造的决策会表现为一个无法对账的序列。你不再追问“这是真的吗?”(无法回答)。你在问“形状中是否有漏洞?”——而这可以在结构上得到回答,无需相信任何人的说法。
这就是整个想法,也是它终结回归的方式:你不能通过验证来获得信任。你需要设计系统,使得篡改无法悄悄发生。 让谎言留下痕迹,你就把一个不可能的问题转变为了可能的问题。
这在实践中是什么样子
这并不是抽象的概念——我想具体说明它的来源,因为主张来源应随制品同行的文章却把自己的来源埋没,这说不通。以下内容的核心是在公开场合形成的,主要出现在我关于 slopsquatting 的帖子评论中,我与 @slabb 和 @xxxn3m3s1sxxx 进行了长时间的交流:提出/批准/执行的分离,在写入时为每个声明加封,链条负责证明谁在何时提出了什么,而不是证明真相,以及“无匹配提案的批准”这一漏洞。“记录信念”和“名称而非角色”这两部分是我提出的;这一节的其余内容和大家的贡献一样,也属于他们。重要的机制如下:
分离写入方。 提出、批准和执行不应是同一个过程在为自己背书。应将它们视为来自三方的 三个 事件,以它们所指的对象为关联点。提出动作的 agent 不是批准其自身解决方案的一方。之后,若事后出现分歧,你会得到一个可供阅读的 序列,而不是需要协商的意见——于是“无匹配提案的批准”就变成了可见的结构事实,而非仅仅是判断。
在写入时为每个声明加封。 通过哈希链加签名,使每条记录都与前面的记录绑定。你并不是在证明某个声明的正确性;而是让人在事后无法篡改声明或重新排序序列而不留下痕迹。这个封印正是让悄悄的编辑变成可见漏洞的关键。
在独立流之间进行对账。 单条封印链只能证明谁在何时提出了什么——一个被干净封印的谎言会永远保持干净的验证。但两条由不同方就同一事件独立封印的流可能会出现分歧,而防篡改来源之间的分歧才是能够回馈到声明本身的唯一证据。(这一点来自 @slabb —— 他正在构建的开放对账层位于 github.com/noirebox。)
将其锚定在行为体之外。 记录的完整性不应依赖于被记录的对象——这是我们试图摆脱的原罪。理想情况下,使用外部锚定的只追加存储,使操作员无法悄然修改,这样“我重写了自己的历史”就不是可选的操作。
记录信念,而不仅仅是行为。 数据库清除事件教会我们这一点:代理的行为在其所相信的前提下往往是 可以辩护的 — — 它以为自己处于开发环境,以为那是测试目标。因此,在行为发生前,捕捉代理在决策时对世界的确定视角(哪个环境、哪个身份、哪个目标),并将其锁定。仅凭行为无法说明原因;信念才能。记录症状 以及 原因。
姓名,而非角色。 “谁授权的”必须落实到一个有切身利益的具体人物,并予以记录 — — 而非“一个审查者”或“系统”。否则,授权就只是事后生成的另一个匿名且看似合理的 为什么。界限是由某人划定的;记录应当说明是谁。
这些要素各自并不晦涩。它们共同完成一件事:当出现问题时,故障会以一种你能看到的 形状 显现出来,而不是让人轻信的干净报告。
诚实的局限(因为这并非魔法)
我想直白地说明这能带来什么、不能带来什么,因为过度宣传反而会成为一种看似合理的谎言。
它能证明工作是在 无法伪造的身份、不可篡改的序列 下进行的。它 不 能证明输出有多 好。 代理所做的事情是否正确或明智,是一个独立且更难的问题 — — 机器证据成本低且易于扩展;判断成本高且不具备此特性。
它能证明 谁在何时声称了什么。 它 不 能证明批准的人是否真的 理解 他们所批准的内容 — — 一旦出现审批疲劳,每次会议有四十份被机器橡皮章般通过的提示词,这才是真正未解决的另一半。
并且它让篡改变得 可见,而非不可能。 保证的是可读性,而非预防。你仍然可以做坏事;只是你不能 悄无声息 地做。
这比“可信日志”承诺更弱,也是重点 — — 一旦见证者成为嫌疑人,“可信日志”就不再是选项。“谎言必须留下痕迹”是我所知的最强诚实底线。
我的立场
我们一直在问错问题。“我能相信这个记录吗?”在 AI 系统失误时,这似乎是自然的提问 — — 但在行为者同时也是报告者的世界里,这个问题没有明确答案,因为你所依赖的见证者恰恰是被告席上的嫌疑人。
别再问它了。能够达到的目标从来不是一份能证明真实的记录。这是一份记录,谎言无法保持沉默——旁路表现为一个空洞,删除表现为一个缺口,伪造批准表现为一步后面什么也没有的台阶。你不能通过验证来建立信任,因为每个验证者都需要另一个验证者。但你可以构建一个系统,让篡改留下痕迹——于是问题不再是无法回答的“这真实吗?”,而变成可以回答的“痕迹完整吗?”
这无法在发货前捕捉到看似正确但其实错误的函数。但这意味着,当你终于去查看——三周后,线索冷淡,仪表盘悄然出错——记录不会对你笑而撒谎。至少,它必须向你展示那个空洞。
这是我一直卡住的一点,我也真的很希望有人能说服我改变看法:你添加的每一层验证本身就是可能被破坏的东西,所以“让篡改留下形状”在我看来就像实际的地板——而不是通向更强大事物的踏脚石。我是否遗漏了一种能比可读性带来更多收获的方法?而对于任何构建此系统的人来说:最难让人看到的空洞是什么?