Specification Before Generation: A Pre-Registered, Five-Model Paired Evaluation of a Specification Frame for LLM-Generated Code in Money, Time, Idempotency, and Access Tasks
Sandeep Dhuri
cs.SE, cs.CR
2026-09-20
预注册配对实验:50 个后端任务 × 5 个前沿模型,提示词前加 267 词规格说明,命名缺陷 148 降到 23,五个模型全部显著。
LLM 生成的代码,安全检查通过率四年没动过。Veracode 2026 年报告覆盖一百多个模型、四个测量时间点,通过率停在 56%,个别模型更高,总量不随规模改善。业界的标准应对是往仓库里放 AGENTS.md、CLAUDE.md 这类指令文件,告诉模型团队怎么干活。迄今最大规模的对照研究(438 个任务)结论很难看:这类文件不提升任务成功率,有时还降低,token 成本多出 20% 以上。
这篇的诊断是:指令文件教模型「怎么写」,提示词里缺的是规格,即「结果必须为真」的陈述。受监管后端里这份清单短且稳定:钱不能用二进制浮点、时间戳必须带时区、可重试的 handler 必须校验幂等键、密码只能存慢盐哈希,都是资深工程师不用想就能写出的规则。要验证的命题只有一条:把这份清单固定放在提示词前面,生成代码的缺陷会不会少。
实验对象是一个 267 词的固定前缀,叫 Specification Frame,分 Role、Context、Task、Constraints 四段,生成前一次性实例化,对所有任务逐字节相同,没有任何按任务调优。Constraints 写的是约束不是流程,例如「金额用 decimal.Decimal 或整数分」「可重试的 handler 必须要求并校验调用方提供的幂等键」。
设计上有几处比常规严格:
检查器和框架出自同一人之手,这是最大隐患。作者的防线:检查器读语法树不读 prose,模型复述约束文字拿不到分;Bandit 与框架零耦合,方向却五家一致。
Δ 为每任务发现数之差(裸臂减框架臂),五个模型的 bootstrap 置信区间(对配对差重抽样算出的区间)都不含零,经 Holm 多重比较校正后全部显著:
| 模型 | 裸臂发现数 | 框架臂发现数 | 平均 Δ | Holm 校正 p |
| claude-sonnet-5 | 40 | 6 | 0.68 | 4e-5 |
| deepseek-v4-pro | 22 | 2 | 0.40 | 4e-5 |
| gemini-3.1-pro-preview | 44 | 9 | 0.70 | 4e-5 |
| qwen3.8-27b | 30 | 12 | 0.56 | 1e-5 |
| gpt-5.6-sol | 12 | 4 | 0.16 | 0.021 |
250 个任务对里 150 个平局,100 个有差异,框架臂赢 95 个、输 5 个,没有任何模型在任何域变差。汇总口径下命名缺陷从 148 降到 23,降 84%(论文按预注册规定把汇总标为描述性,不作推断)。Bandit 中高危问题 53 对 11,五家方向一致。分域看:钱 66→8,幂等 32→2,日期时间 31→5,认证访问 19→8。
效应大小与模型裸臂的脏乱程度单调相关,这个点未预注册:裸臂最干净的 gpt-5.6-sol(12 个发现)受益最小(0.16),最脏的 gemini(44 个)受益最大(0.70)。框架起地板作用,缺多少补多少。两个任务文本自带时区约束,所有模型所有臂都是零发现,约束已在任务里时框架无可添加,与规格解释吻合。人工抽查 18 个检查器命中,全部真阳性。全部 API 成本不到 20 美元。
对写后端的团队,这给「提示词里该放什么」提供了一个成本近零的答案:短、任务无关、可进版本管理。厂商在固定产品名下换底层模型,团队控制不了路由,随代码走的规格是生成上下文里团队唯一完全拥有的部分。受益最大的钱和幂等两类缺陷恰好不在 Bandit 这类扫描器的规则集里,只靠扫描器度量质量的团队既看不见这些缺陷,也看不见框架的最大收益,自写域检查器不贵,应该放在扫描器旁边。
定性上这是渐进的提示工程证据,不引入新方法。它证明的动作只有一个:把约束写明。
作者列得相当全:检查器与框架同源(以 AST 评分、生成前冻结、Bandit 佐证缓解);框架臂多了 267 词,效应可能部分来自多出的思考而非规格内容,等长中性前缀和 reason-first 对照臂都没跑,混淆未排除;没测功能正确性,事后编译检查为裸臂 247/250、框架臂 236/250,RealSec-bench 曾提示安全类提示词可能牺牲可用性,这里不能完全排除;16 份输出在传输中截断,其中 14 份在框架臂,只可能把结果往有利方向推,剔除后敏感性分析五家结论不变;50 个任务、单一作者、仅 Python、单轮、每臂只跑一次。
读下来另有两点保留:单人、自费,论文验证的是作者自己书里提出的框架,对冲手段就是预注册加全量公开;四份附录在生成前改了模型名单和任务量,虽有日期记录,严格说最终设计与最初注册已有距离。