研究想法

可执行的语义检查

日 · 2026-03-31 · Software Intelligence

当模型输出被转成代码可以执行、评分或拒绝的检查时,软件工具会更有用。近期最清晰的产品方向是面向命令式例程的验证式代码生成,以及和测试行为绑定的语义故障定位。另一个更窄的训练方向也可行:在专有任务上,先按执行行为过滤自生成代码样本,再做偏好微调。

3 个想法

面向命令式例程的按生成即验证式代码审查

代码生成工具可以在生成循环中加入验证检查点,然后只保留通过这些检查的部分。WybeCoder 给出了一个具体做法:生成命令式代码,生成不变式,运行验证条件生成,把常规义务交给 CVC5,把更难的剩余部分交给 Lean。某个证明步骤失败时,系统会要求针对性的代码或不变式修改,并通过命名不变式和确定性的目标名在多次修改之间复用已解决的子证明。

适用对象是生成安全关键代码或需要大量人工审查的代码,而且单元测试还不够。实际痛点是审查成本:论文指出,代码生成的速度快于审查,而测试和 fuzzing 仍然留有缺口。一个可落地的产品版本可以先从范围较窄的领域开始,比如循环较多的数据结构例程,或带明确前置条件和后置条件的金融内核。最便宜的第一步验证很直接:看工具是否能在已经有机器可检查规格的任务上减少审查时间,并跟踪每轮编辑解决了多少义务,而不只看最终通过率。

这里的评估细节也说明了一个真实的产品要求。WybeCoder 在加入命令式约束过滤器以去掉“函数式作弊”解时,结果明显下降,其中一个 GPT-5 设置从 75.1% 降到 51.9%。任何做命令式代码验证生成的团队,都需要在产品和内部评估里做这种基准清洗,否则系统会奖励那些在错误编程模型里满足规格的解。

测试运行器中的语义故障定位

调试助手可以把模型推理转成可执行的语义检查,再根据这些检查在通过和失败测试上的表现给可疑代码行排序。SemLoc 给出了一条具体流程:让模型为精确程序位置推断语义约束,对代码做插桩,运行测试集,构建约束-测试违规矩阵,再把得分最高的违规映射回语句。之后的反事实修复步骤可以帮助区分主因和下游破坏。

适用对象是这类 bug:通过和失败运行的覆盖率看起来一样,比如数值关系错误、缺少归一化、边界逻辑错误。在这种情况下,标准 SBFL 信号很弱,直接看 LLM 自由文本解释也很难比较。SemLoc 在 SemFault-250 上报告了 42.8% 的 Top-1 和 68.0% 的 Top-3 定位准确率,相比 SBFL-Ochiai 的 6.4% 和 13.2%,同时把检查范围缩小到可执行行的 7.6%。

第一个可交付版本不需要完整自动修复。它可以放进测试运行器或 CI 失败页面里,向开发者显示那些只在失败测试上出错的少数语义检查,以及它们锚定到的代码位置。最直接的验证标准是:工程师是否能检查更少的代码行,并在覆盖率无法区分的语义 bug 上更快找到出错语句。

按执行行为过滤的自改进代码模型训练

代码模型训练管线可以先按执行行为筛掉自生成样本,再把偏好优化的算力花在这些样本上。ConSelf 为这种场景提供了一套具体做法:团队只有问题描述和测试输入,没有可信解答,也没有测试判定器。它会采样大量候选程序,按在可用输入上的相同执行轨迹对程序聚类,在这些行为簇上计算代码语义熵,丢弃语义熵为零或过高的问题,然后按行为一致性给 DPO 配对加权。

适用对象是那些在专有任务上改进代码生成的模型团队,外部教师模型和金标准解都很少。阻碍在于噪声自训练:难题会生成很多不同的错误程序,拿这些样本训练会浪费运行次数,或者把模型推向不稳定的偏好。ConSelf 报告了相对基础模型 2.73% 到 3.95% 的提升,并认为代码语义熵比 token 级熵或负对数似然更能预测可学习性。

这最好被看作训练数据分流层,而不是一整套新的模型栈。一个实用的第一步测试可以离线完成:把语义熵和一致性过滤器跑在现有的自生成语料上,把保留下来的样本和未过滤基线做对比,看看过滤后的集合是否能在相同微调算力下带来更好的 pass@1。这里的证据比验证和调试工作流更有限,因为摘要里没有完整的基准拆分,所以首个落地场景应该保持范围小,并且以测量为主。