如何通过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 的语义。
阅读全文