Flutter改码对照:整文件生成比逐步diff通过率高40到45个百分点

Diffs vs. Whole Files: An Empirical Comparison of Iterative Edit-Based and Direct Generation for Flutter/Dart Code Models

Andrej Andrejev

cs.SE, cs.AI

2026-09-05

同一套Flutter任务上,从零训的100M模型和微调的Qwen2.5-Coder-0.5B都显示整文件生成全面好于逐步search/replace,静态分析通过率分别高45.5和39.9个百分点。

这篇在解决什么

代码模型改一个已有文件,输出格式有两条路。一条是直接吐出整份改完的文件。另一条是迭代地吐search/replace,应用一步再想下一步,直到模型说停或步数用尽。生产里的编码Agent和IDE插件几乎都走第二条:diff更短、更像PR、理论上少生成很多token。作为训练目标,这条直觉有没有站住,还没人在同一数据、同一模型上把两种regime跑穿。

独立研究者Andrej Andrejev在Flutter/Dart改码上做了这个对照。两条backbone:从零训的Rainbow-Pony-100M,以及微调的Qwen2.5-Coder-0.5B。每种backbone各训direct和steps,共四臂,共享任务池、分词管线和评测脚手架。

方法

底库是14,600条手写Flutter任务,goal、初始代码、终态代码,36类、三档难度。direct微调直接吃这些全文,约500万token、5,000步。steps把同一例子拆成search/replace轨迹,思路接近LintSeq,微调吃约5,000万token、43,000步,大约10倍token。步预算20。应用规则是精确匹配;搜索片段出现多次时,用「第一次出现」启发式消歧,作者自己标这是会静默改错位置的补丁。

评测约1,790条留出任务,贪心解码。主指标是dart analyze是否通过;另外记bits-per-byte、字符级相似、steps的停止原因。gpt-4.1做盲评,打目标完成、正确性、代码质量1到5分,不告知模型名、模式和是否编译通过,四臂共7,161条。

结果

整文件全面压过逐步diff。

模型模式dartpassbits/byte相似度
Rainbow-Pony-100Mdirect80.2%0.1070.511
Rainbow-Pony-100Msteps34.7%0.1800.439
Qwen2.5-Coder-0.5Bdirect90.0%0.0880.568
Qwen2.5-Coder-0.5Bsteps50.1%0.1420.493

差距45.5和39.9个百分点,置信区间不重叠。81%到85%的steps轨迹是正常done,并不是步数耗尽或解析失败。Rainbow-Pony约84%、Qwen约70%的失败发生在「正常走完」的轨迹里:内容被静默改坏。

fallback是大头。done轨迹里,没用过消歧的dartpass是57.0%和80.0%,用过的掉到12.3%和17.5%。

把「正常完成、无fallback、未撞20步」的干净子集拿出来,和同一ID的direct比,差距更大:Rainbow-Pony 57.2%对82.1%,差24.9分;Qwen 80.0%对92.4%,差12.4分。两边都编译通过的子集上,盲评仍偏向direct,六项差异p<0.001。Rainbow-Pony在目标完成上是3.44对3.89,Qwen是4.36对4.72。

steps也不是全输。dartpass上它赢的行只有3.5%到4.8%,集中在短轨迹:裁判多数维获胜的平均步数是5.54和6.65,其余行是8.94和9.02。重构和错误处理/边界修复是唯二在两个架构上都超额的类别,也是九类里平均步数最低的,重构4.14和4.49。作者把这根轴叫task locality:改动在空间上够窄、够自洽,diff才有竞争力。

为什么重要

对小模型、无编译反馈的改码训练,默认整文件更稳。Aider那类「diff省token」的推理期结论,不能直接当成训练目标。LintSeq在从空白合成程序时让编辑序列有用,这里是改一份已经能跑的文件,一步消歧错了就会把原来对的代码弄坏,机制不一样。

更可操作的推论是按编辑选格式,不要按模型锁死一种。短、局部的重构和补边可以走diff,跨多处的改动走整文件。这和Cheng et al. 2026的自适应格式主张同向。

局限与存疑

steps吃了10倍token仍然输,方向上不利于「steps没训够」的解释,但更长轨迹可能在steps集里被稀释,task locality结论还需要token对齐的复现。只有Flutter/Dart,贪心单样本,steps中间没有编译或测试反馈,不能外推到SWE-bench那种带工具的修复环。第一次出现的消歧本身会制造静默错误,更严的apply规则可能缩小差距。裁判没有人类一致性抽检。qwen-direct的学习率调度写错了,衰减几乎没发生,它却仍是四臂最强,作者选择按实际checkpoint报告。

术语

原文与代码

相关论文

全部论文解读