Function-Aware Fill-in-the-Middle as Mid-Training for Coding Agent Foundation Models
arXiv · HuggingFace · ▲104
摘要(原文)
Coding agents must integrate external tool returns into ongoing reasoning - a capability that standard left-to-right pretraining on code exposes only in its forward direction. We observe that the action-observation-continuation loop of a coding agent is structurally isomorphic to a function call site, where a caller binds arguments, a callee returns a value computed elsewhere, and downstream code consumes that value. This conditioning structure exists at internet scale in ordinary code. We exploit it through function-aware fill-in-the-middle (FIM) mid-training: a self-supervised objective that masks functions selected via program dependency graph analysis and a complexity-inferability double criterion. We mid-train Qwen2.5-Coder-Instruct (7B/14B) and Qwen3-8B on a 2.6B-token decontaminated corpus drawn from 968 GitHub repositories, then apply existing agentic post-training pipelines. Mid-training improves SWE-Bench-Verified by +2.8/+3.0 at 7B/14B and by +3.2 on Qwen3-8B; SWE-Bench-Lite gains are +3.7/+4.0/+5.4 on the same models. The improvement holds across two post-training pipelines (R2E-Gym, SWE-Smith) and on a non-Qwen2.5 base (Qwen3-8B with SWE-Lego). Beyond in-domain gains, mid-training also mitigates the capability erosion that agentic post-training otherwise inflicts on non-agent coding (e.g., LiveCodeBench) and non-coding tool-use benchmarks (tau-bench, BFCL): although the mid-training corpus contains Python code only, the function-call inductive bias survives post-training and yields consistent gains.
摘要(中译)
编码代理必须将外部工具返回的结果整合到正在进行的推理中——这是标准代码从左到右预训练仅在其正向方向上暴露的能力。我们观察到,编码代理的动作-观察-延续循环在结构上与函数调用站点同构,其中调用者绑定参数,被调用者返回在其他地方计算的值,下游代码使用该值。这种条件结构在普通代码中以互联网规模存在。我们通过在训练中途利用函数感知的中间填充(FIM)来利用它:这是一种自监督目标,通过程序依赖图分析和复杂性可推断性双重标准选择要掩盖的函数。我们在一个从968个GitHub存储库中提取的26亿个标记的去污染语料库上对Qwen2.5-Coder-Instruct(7B/14B)和Qwen3-8B进行中途训练,然后应用现有的代理后训练管道。中途训练在7B/14B上将SWE-Bench-Verified提高了+2.8/+3.0,在Qwen3-8B上提高了+3.2;SWE-Bench-Lite在同一模型上的收益为+3.7/+4.0/+5.4。这种改进在两个后训练管道(R2E-Gym,SWE-Smith)和一个非Qwen2.5基础(具有SWE-Lego的Qwen3-8B)上都成立。除了领域内的收益外,中途训练还减轻了代理后训练对非代理编码(例如LiveCodeBench)和非编码工具使用基准(tau-bench,BFCL)造成的能力侵蚀:尽管中途训练语料库仅包含Python代码,但函数调用的归纳偏差在训练后仍然存在,并产生一致的收益。
背景剖析
背景剖析
1. 技术背景
编码代理(如解决软件工程问题的AI助手)已从实验室演示转向实际部署(例如修复代码漏洞、自动化开发任务)。这类系统需要一个核心能力:将外部工具返回的结果(如API调用输出)整合到后续推理中。例如,当代理查询代码库信息后,必须基于该结果生成下一步代码。然而,现有方法主要依赖“后训练”阶段的人工轨迹数据(模拟人类解决问题的步骤)来培养这种能力,而基础模型(如Qwen系列)在初始预训练时并未针对这种“条件结构”(即“历史-行动-观察-续写”的循环)进行优化。
2. 之前的问题
传统预训练采用“左到右”的下一个token预测,或随机跨度填充(FIM),但存在三个缺陷:
- 边界随意性:随机掩码的代码片段通常截断表达式或语句,无法反映函数级依赖关系(例如,一个函数调用可能涉及多个文件或复杂逻辑)。
- 缺乏推理监督:模型直接填充掩码,但没有中间推理过程(如“思考再行动”的逻辑链),这与代理的实际推理模式不符。
- 信号稀释:随机FIM作为预训练的一部分,其结构化知识会被后续海量无关数据覆盖,导致后训练时无法有效利用。
3. 本文的解法
论文提出“函数感知填充(FIM)中间训练”:
- 目标对齐:将函数调用视为代理的“行动-观察-续写”循环的类比(例如,函数参数对应行动,返回值对应观察,下游代码对应续写)。
- 精准掩码:通过程序依赖图分析选择函数级别的掩码目标,并结合“复杂度-可推断性”标准(确保掩码的函数既非过于简单也非无法推理)。
- 嵌入推理:在掩码的中间部分加入链式思考(CoT)理由,使模型学习“先推理再生成代码”的模式。
- 阶段聚焦:在预训练和后训练之间插入这一阶段,确保结构化知识在代理任务中发挥作用。
4. 切入角度
与以往工作相比,本文的关键差异在于:
- 从函数到代理的映射:将互联网上普遍存在的函数调用结构(而非随机片段)作为训练目标,直接对应代理的核心需求。
- 双重标准筛选:通过程序依赖图和复杂度分析选择掩码目标,而非随机选择。
- 保留推理过程:在掩码中嵌入CoT理由,使模型学习“思考-行动”的逻辑,而非直接生成代码。
- 跨任务验证:不仅验证了编码任务(如SWE-Bench)的提升,还证明了这种结构化知识能迁移到非编码任务(如LiveCodeBench),验证了其泛化性。
这种方法在不增加额外数据的情况下,通过重新利用现有代码中的结构化模式,显著提升了代理的性能和鲁棒性。






