七月,一个德国开发者在评论区甩了个链接

2,679 阅读15分钟

七月初,我在 DEV.to 上发了几篇文章,讲怎么给 AI agent 装规则门——用文件系统检查、退出码、正则表达式来确保 agent 真的在遵守规则,而不是只在聊天框里说"好的我懂了"然后什么都不做。

写这些东西的原因很简单:我被自己的 agent 骗过好几次。它说"已经写好了",文件不存在。它说"检查通过",退出码明明是 1。它说"配置一致",手动 grep 发现 23 个 hook 只配了 19 个。

然后一个叫 René Zander 的德国开发者在评论区留了个链接:skillgate,一个 npm 包(@reneza/skillgate)。

我点进去看了。

René 做了跟我在做的事情。文件系统纯函数做检查。确定性验证。模型不在检查回路里。连门类型都对得上——他有 file-existscommandevidenceinstruction-sync,我有 HealthCheckerQualityGateWriteGuardRegenerationValidator

他 32 岁,在德国。我 21 岁,在福建写毕业论文。同一个月份(2026 年 7 月),完全不同的起点,架构高度相似。


这篇文章的第一版发在掘金上,我用了一个很标题党的写法。评论区三条回复让我清醒了:

"代码用AI写,博客也用AI写,我用AI总结,我们都有光明的未来"

"因为你们用了相同的大模型"

"人类的本质就是奔向过拟合"

这三条评论说得都没错。第一版确实过度包装了——标题党、"平行发明"的叙事框架把自己的东西说得太大,而真正的实验数据和架构细节反而被故事压住了。LLM 生态里,大家都在用同样的工具、面对同样的约束,得出相似方案的概率比传统工程领域高得多。包装成"独立发明"确实过了。

这篇文章是第二版。 我把叙事砍了,把实验数据、架构细节、和我不确定的地方写清楚。如果你读完觉得哪里有问题、有更好的测量方法、或者做过类似的实验有不同的结论——请直接告诉我。像 DEV.to 上 Mike Czerwinski 的追问、像 PR #1367 里 xg-gh-25 的技术建议一样——那种反馈让我真的改了代码,不是改了标题。

关于 AI 辅助:这篇文章的数据骨架、实验结论和核心论述是我自己写的。AI帮我做了三件事:整理格式和 markdown 排版、对照 paper/ 下的原始数据检查我有没有记错的数字、以及用读者视角追问哪些地方没说清楚。所有实验数据和脚本在 hermes-workspace/paper/ 下面,你可以自己验证。


问题是什么

AI agent 在长会话里会"漂移"。你说过的规则它忘了,约定的检查它跳过,输出的文件它说写了其实没有。这不是某一个模型的问题——如果你用过 Claude Code、Cursor 或 Codex 做正经开发,你大概率被自己的 agent 骗过。

问题的根子在结构上,不在模型质量上。

LLM 生成文本的方式是从 P(token | context; θ) 这个分布里采样。当你让 LLM 验证自己的输出时,它采样的是同一个分布。生成和验证之间没有独立通道。这意味着"自我验证"在结构上就不太可靠——我把这叫做 Prose Barrier(可以理解为"自然语言屏障":模型用自然语言写输出,再用自然语言验证输出,两遍走的是同一条路)。

打个比方:让考生自己批改自己的考卷,他用的还是同一个脑子里的同一套知识。给标准答案也没用——他可以看着答案说"嗯我写的差不多",实际上差很多。

这不是"给 agent 写测试"的问题——传统测试验证的是代码逻辑,Prose Barrier 说的是:agent 对自身行为的叙述和它的实际行为之间,没有可靠的验证通道。代码测试可以测行为,但测不到 agent 对自己行为的虚假陈述。


怎么测:五层架构

我搭了一个五层系统来应对这个问题。每一层对 Prose Barrier 的回应方式不同:

L0 安全层        L1 机械层         L2 神经层          L3 因果层           L4 漂移层
"能说真话吗"     "信息到了吗"      "它穿透了吗"       "格式路由注意力?"  "什么时候会漂"
──────────────────────────────────────────────────────────────────────────────
预加工生成       文件系统检查      令牌概率指纹        格式→注意力         趋势→预测
Barrier外        Barrier外        Barrier内          Barrier内           Barrier外·时间

L0 安全层:在生成之前就改条件。如果模型因为"听起来自信"而被训练奖励,不确定性就会被压制。一个显式的安全提示——"说'我不知道'不会被惩罚,不要编造"——在生成开始前改变前提。

L1 机械层:完全绕过 Prose Barrier。不读模型写了什么,只检查文件是否存在、时间戳是否更新、退出码是否为零、hook 是否真正接线。这些检查用 shell 脚本、文件 mtime、退出码——agent 没办法用自然语言绕过。

L2 神经层:在 Prose Barrier 内部测量,但不解释内容。测的是 token 概率——如果一条规则真的改变了模型的内部处理,而不是只改变了输出措辞,它会在决策 token 的对数概率(logprob)分布上留下痕迹。

L3 因果层:同一规则用不同格式写(推理链格式 vs 指令式),看格式本身是否改变注意力路由。如果格式影响推理——那就是格式工程。

L4 漂移层:聚合 L0-L3 的信号,加上会话元数据,尝试在行为退化可见之前发出警告。

René 的 skillgate 覆盖的是 L1——而且做得比我好。它是生产级 npm 包,单一职责,干净利落。我的系统在 L1 之上加了四层,但每一层的可靠性递减。

如果你今天就想用:装 René 的 skillgate,L1 就够了。如果你对这个方向的研究问题感兴趣,往下读。


每层的数据

L1:机械层——最确定的一层

核心机制:自指环——5 步里 4 步是确定性 Python 脚本:

会话结束 → quality-gate.py 检查 self-model.md 是否比最新 growth-log 旧
         → 若是,写 .self-model-stale flag
下次启动 → health-check.py 检测 flag,强制 24h 冷却
         → AI 再生 self-model.md(唯一非机械步骤)
         → log-regeneration.py 验证结构、删除 flag、写 JSONL 审计日志

实验数据:

测试结果
行为测试19/19 通过
Hook 匹配23/23 匹配 manifest
跨脚本路径30 条路径,0 冲突
34 会话回顾违规率 55.9% → 0.7%(机械层启用后)

P1-1 实验(200 trials,2026 年 7 月): 这是 DEV.to 上 Mike Czerwinski 追问的一个问题触发的——"那 ~0.7% 的残留违规,是不是聚集在机械层够不到的任务类型上?"

结果很清楚:纯机械化任务上,合规率 100%,零违规。 但在机械和语义的边界上(比如"写一个与问题相关的检查清单"),机械检查通过率 100%(文件存在),但语义检查通过率 0%(清单里写的是废话)。模型做了 checkbox,没有做有用的 checkbox。

机械层够到的地方,违规为零。够不到的地方,违规占主导。


L2:神经层——能测,但只在一个模型家族上

L2 不问"输出对不对",问"规则真的改变了模型的内部处理吗?"

Logprob Probe V3(40 个预验证探针):

指标Pilot (n=8)V3 (n=40)
Cohen's d−0.148+0.578
贝叶斯因子<1(支持 H₀)282,399(极端支持 H₁)
95% 置信区间跨越零点[+3.39, +11.17]
方向一致性~50%80% (32/40)

Pilot 数据是负的,V3 是正的。这不是 p-hacking。 Pilot 里 4/8 的探针对比 token 不在 DeepSeek 的 top-20 logprobs 里,被赋了 −10.0 哨兵值,淹没了真实信号。V3 换了测量工具——probe_validator.py 做了机械过滤、统一格式、预注册探针。工具变好了,不是样本量变大了。

Category × Format 交互效应:F(3,36)=0.26, η²=0.02——格式效应在不同任务类别之间是一致的。

但这个数据的局限很大: 只在 DeepSeek V4 Pro 一个模型家族上测的。Claude、GPT-4o 的跨模型 logprob 复现需要 API 提供 logprobs 字段,目前没有。这是我的技术债。


L3:因果层——处理过程变了,但行为没变

Causal Swap(30 tasks): 一条行为规则存在时,73% 的回复寻求替代方案。移除这条规则,只有 20%。OR=11.0, Fisher exact p=0.0092。

⚠️ 注意: 不是随机分组,单人非盲评分。效应方向在多个实验中一致,但严谨程度和随机对照试验不在一个水平。p=0.0092 来自非盲单人数据,不能当作确证证据——只能说明值得做更严格的实验。

格式效应: 推理链格式(IF condition THEN action BECAUSE reason THEREFORE decision)比指令式(MUST DO X)产生更深的内部表征(Cohen's d=+0.578, logprob 层面)。但这不转化为行为合规。 在 GateGuard 开启时,两种格式的合规率完全相同——天花板效应。格式改变的是处理过程,不是输出。

约束梯度实验(96 probes,4 个约束级别):

⚠️ 注意:这里的约束级别和五层架构的 L0-L4 是两套不同的概念,只是编号格式相似。下面用 C0-C3 区分。

这个实验测的是:对模型施加不同强度的输出约束时,格式效应(推理链 vs 指令式)的强度怎么变。

约束级别描述效应量 d_z
C0无显式输出约束(基线)0.315
C1轻度:"输出 A 或 B"0.596
C2中度:"不要解释"0.091
C3重度:"只输出 A 或 B,不要其他字符"0.297

实际排序:C1(0.596) > C0(0.315) > C3(0.297) > C2(0.091)。

三个区间:优化 → 抑制 → 反弹。 这个非单调模式在两个独立的实验操作中都复现了(多场景认知负载 + 输出约束严重程度)。paper 原始记录中 C3 和 C0 的排序曾有一次笔误(0.297 不大于 0.315),此处已修正。

统计说明:d_z 是配对设计的标准化效应量,分母是被试内差异的标准差,和独立样本的 Cohen's d 计算方法不同。所以这里的 d_z 值和 L2 神经层的 Cohen's d 不能直接比大小。

跨模型实验(三个层次):

层次模型结果状态
行为层Qwen3-8B, GLM-4-9B格式效应为零(行为合规 IMP≈SYL)✅ 已完成
梯度层Qwen3-8B, GLM-4-9B (192 trials)8B/9B 模型上格式效应为零(GLM d_z=0)✅ 已完成
Logprob 层Claude, GPT-4o未测——需要 API 提供 logprobs❌ API 不支持

行为层和梯度层都显示 8B/9B 模型上没有格式效应——但这可能是因为天花板效应(这些模型的行为合规率本来就极高),而不是格式真的没有影响处理过程。要区分"没效应"和"测不到",需要 logprob 层面的跨模型数据。


P1-2:Mike 的实验(600 trials)

Mike Czerwinski 问了一个更具体的问题:"如果把自然语言规则放在机械门下,能不能鱼和熊掌兼得——100% 合规 + 高推理质量?"

我跑了一个完整的 2×2 因子实验(格式:代码/自然语言 × 门:ON/OFF),5 条治理规则 × 30 trials,DeepSeek V4 Pro,确定性正则表达式评分,预注册实验位置。

结果比我和 Mike 预想的都有意思:

条件合规率推理深度 M ± SD中位数
自然语言 + 门 ON91.3%3.23 ± 0.643.30
代码 + 门 ON99.3%2.82 ± 0.702.80
自然语言 + 门 OFF90.0%2.92 ± 0.942.80
代码 + 门 OFF98.0%2.67 ± 0.712.60

Cohen's d(自然语言+门 vs 代码+门 推理深度)= 0.605,中等效应。

五个发现:

  1. 门在两种格式下都能提高推理质量。 自然语言格式下 +0.32,代码格式下 +0.15。门不只是约束——它提供认知结构。
  2. Pilot 的 4.42 上限是 n=5 的假象。 完整 n=30 代码_OFF 只有 2.67,低于所有门开启条件。Mike 是对的——pilot 的 ceiling 靠不住。
  3. 格式效应按任务类型分化。 自然语言帮元认知规则(self_review: +1.08 over 代码),但伤害精密规则(fact_check: −0.21)。
  4. 时序漂移。 推理质量在单条件块内下降(代码_OFF/delivery_gate 30 trials 内 −0.51)。
  5. 合规分布形态不同。 代码是接近二元的合规(通过/失败),自然语言是连续的局部合规。自然语言规则的"失败"方式不一样。

实际建议:混合部署。 元认知规则用自然语言+门,确定性规则用代码+门。不要选一种格式,每个规则单独选。


L4:漂移层——建好了,没验证

drift_predictor.py(332 行)追踪 12 个机械特征,34 个会话校准。ABC 分级:LOW(忽略)、MEDIUM(标记)、HIGH(警告)、CRITICAL(阻断)。当前风险:0/100。

预测性验证还没做。 也就是说:我建了一个预测器,但我不知道它能不能真的预测漂移。这需要更多会话数据,或者别人的会话数据。


技术债和局限

数据层面:

  • 所有实验都是一个人(我)在一台笔记本(Dell G15, RTX 3060, 16GB RAM)上跑的
  • 非机械化评分的实验(Causal Swap、growth-log retrospective)是单人非盲评分
  • L2 logprob 数据只来自 DeepSeek V4 Pro。跨模型 logprob 复现需要 Claude/GPT-4o API 的 logprobs 字段,目前没有
  • n=30 在保守效应量下统计效力不足(25% 差异时 power≈49%)

架构层面:

  • L1 是单机实现。分布式部署需要状态持久层
  • L4 预测性验证 pending
  • L2 和 L3 对 8B/9B 小模型的行为格式效应为零——但不清楚是没效应还是天花板
  • 机械层和语义层的边界分类是手动的。一个自动化的 mechanizability scanner——从规则结构推断应该归到哪一层——是下一个要建的

我自己的局限:

  • 本科生,没有导师,没有第二评分者
  • 系统文献调研不够——我知道有一些相关工作(RIVA、GLOVE、Mem0、HyperAgents),但没有做系统性的对比实验
  • 有些测量可能需要更好的实验设计(随机化、盲法、预注册样本量计算),目前的实验水平在"探索性研究"和"确认性研究"之间的灰色地带

这不是自我贬低。这是想让读到的人知道:哪些结论你可以比较放心地引用,哪些结论你应该保持怀疑。我分不清的地方,我不假装分得清。


和 René 的 skillgate——以及这次学到了什么

René 做了一件我做不好的事:把一个想法做成了干净的、可发布的 npm 包。他有一条 instruction-sync 门——跟踪 CLAUDE.md、AGENTS.md 和 .cursor/rules 之间的漂移——我看了之后打算在自己的系统里加。

他不认识我,我也不认识他。他在他的约束下做出了他的方案,我在我的约束下做出了我的方案。两个方案在同一个地方交汇(确定性文件系统检查、模型排除在检查回路外),说明这个问题是真实的,解决方案在收敛。

让我真正学到东西的,是那些追问。

DEV.to 上 Mike Czerwinski 问"那 0.7% 是不是聚集在门够不到的地方",我才跑了 P1-1。他追问"自然语言规则在机械门下会不会更好",我才跑了那个 600 trials 的 2×2——然后我的假设被数据打脸了。

Dipankar Sarkar 提醒不要用 LLM 当 judge,现在所有后续实验都用确定性正则评分。他建议在决策 token 上做测量——已经在做了,预注册了。

Max Quimby 问"gate it"和"can only nudge it"的边界在哪里——这个问题我现在还不能完整回答,但它在驱动 mechanizability scanner 的设计。

GitHub 上 PR #1367,xg-gh-25 给了两条精准的建议:加机械文件检查 Step 0、加需求可追溯性。我实现了,追过去读了 SwarmAI 的 T-CBB 文档,追问了 pipeline handoff 边界的误报模式。

这些人我一个都不认识。他们看的是代码和实验,给的反馈比所有点赞都值钱。

同样,那些说我"过度包装"的评论也值钱——因为它们让我重新写了这篇文章。


如果你也在这个方向

你可以直接看代码:hermes-workspace,实验数据在 paper/ 下。所有实验都可以复现——python -m paper_validator claim --claim all --trials 30

René 的 skillgate 在 npm 上:@reneza/skillgate——如果你用 Node.js 生态,直接看他的。

如果你在做确定性验证、agent 行为监控、格式工程、漂移预测——或者你也被自己的 agent 骗过——我真的很想听听你的方案。

具体说,我现在最想知道的几件事:

  1. L2 logprob 跨模型复现——有人在 Claude 或 GPT-4o 上测过格式效应(推理链 vs 指令式)吗?效应在别的模型家族上存在吗?
  2. L4 漂移预测验证——有没有人有更多会话数据可以用来验证 predictive validity?
  3. P1-2 的 per-rule 异质性(自然语言帮元认知但伤精密规则)——这是 DeepSeek 特有的还是跨模型的?
  4. Mechanizability scanner——有人做过从规则结构自动推断归层的工具吗?

我不怕被指出问题。我怕没人指。如果你的实验和我的结论不一致,或者你发现我的测量方法有问题,或者你觉得我整条思路都跑偏了——请直接说。像掘金那三条评论一样直接,像 Mike 的追问一样具体,像 xg-gh-25 的建议一样能让我改代码。


🇬🇧 英文原文:AI Agents Can't Self-Verify — René Zander 的故事从这里开始

📂 GitHub · DEV.to 更多文章