函数感知中间填充训练提升编程智能体基础模型
速览
该研究提出函数感知中间填充(FIM)中期训练方法,利用代码中函数调用的结构同构性,通过程序依赖图分析和复杂度-可推断性双准则选择函数进行掩码训练。在Qwen2.5-Coder-Instruct(7B/14B)和Qwen3-8B上使用26亿token去污染语料进行中期训练后,SWE-Bench-Verified提升+2.8/+3.0/+3.2,SWE-Bench-Lite提升+3.7/+4.0/+5.4。该方法还能缓解智能体后训练对非智能体编码和工具使用基准的能力侵蚀。
AI 深度解读
背景
当前代码大语言模型(Code LLM)的预训练通常采用标准的从左到右的因果语言建模(left-to-right autoregressive pretraining)。虽然这种训练方式能让模型理解代码的语法与局部语义,但面对「编码代理」(coding agent)场景时,模型需要具备一个关键能力:将外部工具(如运行时环境、测试框架、API 调用)的返回结果无缝集成到持续的推理链中。标准预训练仅在正向方向上暴露这种结构,无法有效学习「观察-行动-延续」的循环模式。研究者发现,编码代理的 action–observation–continuation 循环在结构上完全同构于常规代码中的一个函数调用站点(function call site):调用方传入参数(绑定 arguments),被调用函数返回在别处计算的值(返回值),后续代码消费该值。这种条件化结构(conditioning structure)在互联网规模的普通代码中以函数调用形式普遍存在,但以往模型并未专门从中提取可泛化的归纳偏置(inductive bias)。
核心内容
本文提出一种名为「函数感知的填充中间」(Function-Aware Fill-in-the-Middle, FIM)的中训练(mid-training)方法,作为构建编码代理基础模型的关键中间阶段。
具体方法如下:
- 自监督目标:在预训练与最终的后训练(post-training)之间插入一个中训练阶段。该目标不是随机遮蔽 token,而是通过程序依赖图分析(program dependency graph analysis),并结合「复杂性–可推断性」双准则(complexity–inferability double criterion),筛选出代码中具有代表性的函数(函数体或调用边界),然后对其进行遮蔽。
- 训练数据:从 968 个 GitHub 仓库中收集了一个 26 亿 token 的去污染语料(decontaminated corpus),仅包含 Python 代码。他们在此语料上对三个模型进行中训练:Qwen2.5-Coder-Instruct (7B 与 14B) 以及 Qwen3-8B。
- 后训练:中训练完成后,再应用现成的编码代理后训练管线(existing agentic post-training pipelines),包括 R2E-Gym 和 SWE-Smith,以及对于 Qwen3-8B 使用的 SWE-Lego。
- 评估基准:主要评估在 SWE-Bench-Verified 和 SWE-Bench-Lite 上,同时为了检测能力侵蚀(capability erosion),还评估了非代理编码任务(LiveCodeBench)以及非编码工具使用任务(tau-bench, BFCL)。
实验结果显示:
- SWE-Bench-Verified 上,7B 模型提升 2.8%,14B 提升 3.0%,Qwen3-8B 提升 3.2%。
- SWE-Bench-Lite 上,三个模型分别提升 3.7%、4.0% 和 5.4%。
- 这种提升在两个不同的后训练管线(R2E-Gym, SWE-Smith)以及非 Qwen2.5 基座(Qwen3-8B + SWE-Lego)上均成立,说明方法具有跨基座、跨管线的泛化性。
- 更重要的是,中训练显著缓解了代理后训练所导致的非代理编码能力退化。通常情况下,代理后训练虽然能提升 SWE-bench 等智能体任务性能,但会对 LiveCodeBench 等传统代码生成任务以及 tau-bench、BFCL 等工具使用基准造成能力侵蚀(capability erosion)。而经过函数感知 FIM 中训练的模型,在后续代理后训练中几乎未出现这种侵蚀,甚至在某些任务上还有小幅提升。尽管中训练语料仅包含 Python 代码,但函数调用的归纳偏置(function-call inductive bias)能有效在后训练中存活,并带来一致的收益。
关键要点
- 结构同构性发现:编码代理的 action–observation–continuation 循环在结构上等价于普通代码中的函数调用站点,这为利用自监督学习从海量代码中提取相关模式提供了理论基础。
- 函数感知的 FIM 中训练:基于程序依赖图分析和双准则(复杂性–可推断性)筛选出关键函数进行遮蔽,使得模型学习「调用–返回–消费」的三段式条件概率分布。
- 显著提升编码代理任务:在 SWE-Bench-Verified/Lite 上,所有测试模型均获得 2.8%–5.4% 的绝对提升,且效果跨后训练管线与模型基座稳定。
- 缓解后训练的能力侵蚀:传统代理后训练会导致模型丧失原生的代码生成与工具调用能力,而函数感知 FIM 中训练有效抵抗了这种退化(mitigates capability erosion),保证了代理能力与通用能力的双赢。
- 纯 Python 语料的跨任务泛化:尽管中训练语料仅含 Python,但学到的函数调用归纳偏置能推广到其他编程语言和工具使用场景(tau-bench、BFCL)。
- 简单高效的附加阶段:中训练只增加一个自监督阶段,无需人工标注,且数据量仅 2.6B token,远小于预训练语料,却带来显著且鲁棒的收益。
意义与影响
- 对编码代理基础模型训练范式的启示:本文展示了如何通过一项精心设计的自监督中训练,将互联网代码中蕴含的结构知识(函数调用逻辑)高效地迁移到编码代理场景,从而弥补标准预训练与最终后训练之间的鸿沟。这一范式可能成为未来编码代理基础模型的标准组件。
- 能力侵蚀问题的实用解决方案:过去,代理后训练(如基于环境反馈的强化学习)往往导致模型在非代理任务上的性能下降。函数感知 FIM 中训练提供了一种轻量的对抗手段,使得模型既能适应复杂的交互式任务,又不损失作为通用代码模型的底线能力,这对于实际部署至关重要。
- 跨任务泛化证据:仅基于 Python 的中训练就能改善非 Python 场景(如 tau-bench 和 BFCL 上的工具使用),表明函数调用的抽象结构在不同语言和域间共享,强化了从代码中学习推理结构的可迁移性。
- 对研究社区的贡献:开源了去污染语料(通过关联 968 个 GitHub 仓库)、中训练方法与配置,便于其他研究者复现和扩展。作者也将模型权重公开(在 Hugging Face 上),推动了代码 LLM 领域的基础设施建设。
- 局限性提示:实验规模限于 7B–14B 参数和纯 Python,未来需验证更大模型、更多语言以及更复杂的代理环境中的表现。此外,双准则的筛选策略可能还有优化空间。但无论从方法论创新还是实际效果来看,该工作都提供了有价值的新思路。
