267 词规格前缀让五大前沿模型代码缺陷全降,预注册验证

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-54060.684e-5
deepseek-v4-pro2220.404e-5
gemini-3.1-pro-preview4490.704e-5
qwen3.8-27b30120.561e-5
gpt-5.6-sol1240.160.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、单轮、每臂只跑一次。

读下来另有两点保留:单人、自费,论文验证的是作者自己书里提出的框架,对冲手段就是预注册加全量公开;四份附录在生成前改了模型名单和任务量,虽有日期记录,严格说最终设计与最初注册已有距离。

术语

原文与代码

相关论文

全部论文解读