在AI生成代码中通过ADRs和契约强制执行不变量
本文介绍了如何使用架构决策记录(ADR)和RFC 2119关键字来强制执行AI生成代码中的不变量。它描述了如何将架构决策记录为不变量,确保AI代理在生成代码前查阅这些记录,并通过确定性检查来防止违反。
Zarar Siddiqi在2026年6月30日发表了一篇文章,探讨如何在AI生成代码中强制执行不变量。不变量源于领域驱动设计,是指系统必须始终满足的规则,以确保有效状态。然而,大型语言模型(LLM)生成的代码可能看似正确,却悄悄地违反了这些隐含约束。因此,需要将不变量编码到AI无法忽略的地方。
文章提出了两种方法:架构决策记录(ADR)和RFC 2119关键字。ADR用于记录架构决策,并将其视为不变量。为了有效使用ADR,需要识别何时记录决策、实际记录,并指导AI代理将其作为不变量对待。作者通过一个ADR自动建议技能来识别架构转折点,例如“X vs Y”比较、引入新依赖等。该技能不编写记录,而是提醒用户使用/adr命令。命令会创建包含上下文、决策、选项和后果的ADR文件,并维护索引页面。
为了强制AI代理查阅ADR,作者添加了一个确定性钩子(check-adrs.sh),在代码生成停止时运行。它会检查修改的文件是否在ADR的范围内,以及该ADR是否在会话中被打开过。如果没有,则阻止代码通过。
对于行为需求,使用RFC 2119关键字(如SHALL、MUST)结合Gherkin场景(given/when/then)来指定规则。例如,“系统在订单完成时SHALL创建履行记录,每条记录MUST有唯一标识符”。作者使用OpenSpec工具自动生成规范,并在实现偏离时重写,以保持规范与代码同步。同样,需要确保AI代理在生成代码前查阅规范。
总之,ADR和RFC 2119规范从不同角度解决相同问题:ADR固定架构决策,规范固定行为。两者都需要确定性检查来确保代理实际查阅,而不是依赖提示。这些检查是浅层的,只验证规则是否被咨询,而更深层的语义判断仍需要人工和测试。将更多不变量从文本提示转移到可强制执行的检查,可以减少对模型记忆的依赖,保持代码库的稳定状态。