七月初,我在 DEV.to 上发了几篇文章,讲怎么给 AI agent 装规则门——用文件系统检查、退出码、正则表达式来确保 agent 真的在遵守规则,而不是只在聊天框里说"好的我懂了"然后什么都不做。
写这些东西的原因很简单:我被自己的 agent 骗过好几次。它说"已经写好了",文件不存在。它说"检查通过",退出码明明是 1。它说"配置一致",手动 grep 发现 23 个 hook 只配了 19 个。
然后一个叫 René Zander 的德国开发者在评论区留了个链接:skillgate,一个 npm 包(@reneza/skillgate)。
我点进去看了。
René 做了跟我在做的事情。文件系统纯函数做检查。确定性验证。模型不在检查回路里。连门类型都对得上——他有 file-exists、command、evidence、instruction-sync,我有 HealthChecker、QualityGate、WriteGuard、RegenerationValidator。
他 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 | 中位数 |
|---|---|---|---|
| 自然语言 + 门 ON | 91.3% | 3.23 ± 0.64 | 3.30 |
| 代码 + 门 ON | 99.3% | 2.82 ± 0.70 | 2.80 |
| 自然语言 + 门 OFF | 90.0% | 2.92 ± 0.94 | 2.80 |
| 代码 + 门 OFF | 98.0% | 2.67 ± 0.71 | 2.60 |
Cohen's d(自然语言+门 vs 代码+门 推理深度)= 0.605,中等效应。
五个发现:
- 门在两种格式下都能提高推理质量。 自然语言格式下 +0.32,代码格式下 +0.15。门不只是约束——它提供认知结构。
- Pilot 的 4.42 上限是 n=5 的假象。 完整 n=30 代码_OFF 只有 2.67,低于所有门开启条件。Mike 是对的——pilot 的 ceiling 靠不住。
- 格式效应按任务类型分化。 自然语言帮元认知规则(self_review: +1.08 over 代码),但伤害精密规则(fact_check: −0.21)。
- 时序漂移。 推理质量在单条件块内下降(代码_OFF/delivery_gate 30 trials 内 −0.51)。
- 合规分布形态不同。 代码是接近二元的合规(通过/失败),自然语言是连续的局部合规。自然语言规则的"失败"方式不一样。
实际建议:混合部署。 元认知规则用自然语言+门,确定性规则用代码+门。不要选一种格式,每个规则单独选。
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 骗过——我真的很想听听你的方案。
具体说,我现在最想知道的几件事:
- L2 logprob 跨模型复现——有人在 Claude 或 GPT-4o 上测过格式效应(推理链 vs 指令式)吗?效应在别的模型家族上存在吗?
- L4 漂移预测验证——有没有人有更多会话数据可以用来验证 predictive validity?
- P1-2 的 per-rule 异质性(自然语言帮元认知但伤精密规则)——这是 DeepSeek 特有的还是跨模型的?
- Mechanizability scanner——有人做过从规则结构自动推断归层的工具吗?
我不怕被指出问题。我怕没人指。如果你的实验和我的结论不一致,或者你发现我的测量方法有问题,或者你觉得我整条思路都跑偏了——请直接说。像掘金那三条评论一样直接,像 Mike 的追问一样具体,像 xg-gh-25 的建议一样能让我改代码。
🇬🇧 英文原文:AI Agents Can't Self-Verify — René Zander 的故事从这里开始
📂 GitHub · DEV.to 更多文章