如何通过SDD强化代码审查,有效约束AI的幻觉生成?
摘要:在 Spec-Driven Development(SDD)工作流中,AI 既是 spec 的执行者,也可能是幻觉的制造者。 使用SDD开发已经有一段时间,我发现在上下文被打爆的情况下,rules很容易被稀释,导致最后脱离原来的spec规范
在 Spec-Driven Development(SDD)工作流中,AI 既是 spec 的执行者,也可能是幻觉的制造者。
使用SDD开发已经有一段时间,我发现在上下文被打爆的情况下,rules很容易被稀释,导致最后脱离原来的spec规范。当然最后肯定会有verify检查,但因为介入环节较晚,最后需要多轮的修复才能回到正轨,这导致当前Session烧了更多的Token。
我们也知道历史消息不断累积,占用窗口空间,越到后面越容易"忘记"早期内容,所以更早环节介入代码与spec的对齐审查,在当前Session非常接近或者已经超出上下文窗口的情况下,对减少AI幻觉是非常有必要的
基于这个想法参考superpowers提炼了个self-code-review.skills,提升OpenSpec开发代码质量
本文介绍self-code-review.skills如何通过多重审核机制,在代码实现阶段强制验证 spec 合规性,让 AI 写完代码后"不信任自己",从而显著提高交付质量。
一、问题:AI 编码中的"自我说服"陷阱
当我们用 AI 辅助编码时,一个常见的问题是:AI 在生成代码后,倾向于"自我说服"代码是正确的。
这种"自我说服"体现在几个方面:
幻觉(Hallucination):编造不存在的 API、类名、配置项,看起来合理但实际不存在
过度实现(Overbuilding):实现了 spec 中未要求的功能,引入不必要的复杂性
遗漏实现(Missing):跳过了 spec 中某些不起眼但重要的场景
语义偏差(Drift):代码"大致正确"但与 spec 的精确语义存在微妙差异
编译通过只能证明语法正确,无法证明语义正确——即代码是否真正做了 spec 说它应该做的事。
二、解法:两阶段自审查机制
借鉴 Superpowers 的 Subagent-Driven Development 两阶段审查思想,我们设计了一套Self Code Review机制:让 AI 在完成实现后,强制切换到"审查者"角色,通过结构化 Checklist 逐条验证。
核心设计原则:
原则说明
不信任自己
刚写完代码时最容易自我说服"没问题",必须假设代码可能有错
角色隔离
审查时切换到"审查者"视角,不为"实现者"辩护
证据驱动
每个判断必须引用具体的file:line或 spec 条目,禁止主观臆断
顺序不可颠倒
先确认"做对了",再看"做好了"
整体流程
实现完成 + 编译通过
│
▼
┌─────────────────────────────┐
│ 阶段 1:Spec 合规性审查 │ ← 对照 spec.md
│ "做对了吗?" │
│ │
│ ✅ 通过 → 进入阶段 2 │
│ ❌ 问题 → 修复 → 重新阶段 1 │
└─────────────────────────────┘
│ ✅
▼
┌─────────────────────────────┐
│ 阶段 2:代码质量审查 │ ← 对照 design.md + 编码规则
│ "做好了吗?" │
│ │
│ ✅ 通过 → 标记 task 完成 │
│ ❌ 问题 → 修复 → 重新阶段 2 │
└─────────────────────────────┘
│ ✅
▼
✅ 输出审查报告,标记完成
关键约束:阶段 2 必须在阶段 1 通过后才能开始。如果代码做的事情本身就不对,审查代码质量没有意义。
三、阶段 1:Spec 合规性审查——"做对了吗?"
这是约束 AI 幻觉的核心防线。审查者角色设定:
你现在是Spec Compliance Reviewer。你的工作是验证实现是否与 spec 一致。不要为实现者辩护,不要信任实现者的自述。只看代码,只对照 spec。
3.1 四维检查清单
① 需求覆盖(Requirement Coverage)
逐条对照 spec 中的每个 Requirement,确认是否有对应的代码实现,且实现完整覆盖了 Requirement 的语义。
