面向函数的中间填充作为编码智能体基础模型的中间训练
摘要
本文提出了一种面向函数的中间填充中间训练方法,用于编码智能体基础模型,利用了函数调用与智能体动作-观察循环之间的结构相似性。该方法在SWE-Bench基准测试上,针对多种模型规模和训练后流水线均提升了性能。
arXiv:2607.12463v1 公告类型:新
摘要:编码智能体必须将外部工具返回结果整合到持续推理中——这种能力在标准的从左到右代码预训练中仅在其前向方向上暴露。我们观察到,编码智能体的动作-观察-延续循环在结构上与函数调用点同构:调用者绑定参数,被调用者返回在其他地方计算的值,下游代码消费该值。这种条件结构在普通代码中以互联网规模存在。我们通过面向函数的中间填充(FIM)中间训练来利用这一点:这是一种自监督目标,通过程序依赖图分析以及复杂性与可推断性双重标准来选择要掩码的函数。我们在一个来自 968 个 GitHub 仓库的 26 亿 token 的去污染语料库上对 Qwen2.5-Coder-Instruct(7B/14B)和 Qwen3-8B 进行中间训练,然后应用现有的智能体训练后流水线。中间训练在 SWE-Bench-Verified 上提升了 7B/14B 分别 +2.8/+3.0,在 Qwen3-8B 上提升了 +3.2;在相同模型上,SWE-Bench-Lite 的提升分别为 +3.7/+4.0/+5.4。该改进在两个训练后流水线(R2E-Gym、SWE-Smith)以及非 Qwen2.5 基础(Qwen3-8B with SWE-Lego)上均成立。除了领域内收益外,中间训练还缓解了智能体训练后流水线原本会对非智能体编码(例如 LiveCodeBench)和非编码工具使用基准(tau-bench、BFCL)造成的能力退化:尽管中间训练语料库仅包含 Python 代码,但函数调用的归纳偏差在训练后得以保留并带来一致的收益。
查看缓存全文
缓存时间: 2026/07/15 04:20
# 感知函数的中间填充作为编码智能体基础模型的中间训练 来源: https://arxiv.org/html/2607.12463 Yubo Wang¹¹¹贡献相等. 通信作者: [email protected], [email protected] Jiarong Liang¹¹¹贡献相等. 通信作者: [email protected], [email protected] Yuxuan Zhang² Xuye Liu¹ Cong Wei¹,³ Yuyu Zhang⁴ Ping Nie¹ Wenhu Chen¹,⁵¹¹¹贡献相等. 通信作者: [email protected], [email protected] ¹滑铁卢大学,²不列颠哥伦比亚大学,³英伟达,⁴Verdent AI,⁵向量研究所 ###### 摘要 编码智能体必须将外部工具返回结果整合到持续的推理过程中——而标准从左到右的代码预训练只在其前向方向上暴露这种能力。我们观察到,编码智能体的`action→ observation→ continuation`循环在结构上与函数调用点同构,在函数调用点中,调用者绑定参数,被调用者返回在别处计算的值,后续代码则消费该值。这种条件结构在普通代码中以互联网规模存在。我们通过**感知函数的中间填充 (function-aware fill-in-the-middle, FIM) 中间训练**来利用它:这是一种自监督目标,通过程序依赖图分析以及一个复杂度-可推断性双标准来选择要掩码的函数。我们在一个从 968 个 GitHub 仓库中提取、经过去污处理的 26 亿 token 语料上对 Qwen2.5-Coder-Instruct (7B/14B) 和 Qwen3-8B 进行中间训练,然后应用现有的智能体后训练流程。中间训练将 SWE-Bench-Verified 在 7B/14B 上分别提高了 +2.8/+3.0,在 Qwen3-8B 上提高了 +3.2;SWE-Bench-Lite 在相同模型上分别提高了 +3.7/+4.0/+5.4。这种改进在两种后训练流程 (R2E-Gym, SWE-Smith) 以及一个非 Qwen2.5 基础模型 (Qwen3-8B with SWE-Lego) 上都成立。除了领域内的提升,中间训练还减轻了智能体后训练在其他情况下对非智能体编码 (例如 LiveCodeBench) 和非编码工具使用基准测试 (τ-bench, BFCL) 造成的能力侵蚀:尽管中间训练语料仅包含 Python 代码,但函数调用归纳偏差在后训练后依然存在并产生一致的收益。 参考图注 图 1: 左图: 一个函数调用点和一个编码智能体的单步在结构上相似,都分解为相同的四个阶段:上下文、调用/动作、返回/观察、延续。中图: 我们通过感知函数的FIM中间训练来利用这种类比。根据复杂度 (Ĥ) 和可推断性 (Î) 分数,从程序依赖图中选择一个函数 B;然后对模型进行中间训练,给定周围文件作为 FIM 格式的提示,填充 B 的函数体以及一个 CoT 推理过程。右图: 中间训练在Qwen2.5-Coder-Instruct (7B, 14B) 和 Qwen3 (8B) 的 SWE-Bench-Verified (实心条) 和 SWE-Bench-Lite (斜线条) 上均产生了持续收益。 ## 1 引言 解决真实软件工程问题的编码智能体已从研究演示发展为部署系统 (Jimenez et al., 2023; Yang et al., 2024; Wang et al., 2024)。然而,它们的进展几乎完全由后训练阶段合成智能体轨迹数据的规模驱动:诸如 SWE-Gym (Pan et al., 2024)、R2E-Gym (Jain et al., 2025) 和 SWE-Smith (Yang et al., 2025b) 等流程策划或合成模仿人类或 LLM 在问题解决任务上的行为的轨迹。这些流程所基于的基础模型通常是一个在互联网规模代码上使用下一个 token 预测 (以及在某些情况下,随机跨度 FIM) 训练的代码 LLM (Hui et al., 2024; Guo et al., 2024; Li et al., 2023)。在这两个阶段之间存在着一个训练时缺口:基础模型很少针对智能体后训练随后会要求的条件结构进行优化。 我们将这一缺口视为一个专门的**中间训练**阶段的机会,该阶段在引入智能体特定数据之前,将基础模型与智能体相关的归纳偏差对齐。我们的核心观察是,编码智能体所需的归纳偏差已经存在于普通代码中,但以从左到右的预训练系统性暴露不足的形式存在。在每一步,智能体维护历史 ht,采样动作 at ∼ π(at | ht),接收由外部过程生成的观察结果 ot+1,并在整个轨迹条件下继续。这四部分分解——上下文、动作、外部计算的返回结果、延续——正是函数调用点的分解:建立意图并绑定参数的调用前代码;调用本身;由当前作用域外部代码产生的返回值;以及消费返回值的下游代码 (图 1,左图)。一个训练为**双向**推理函数级依赖的模型必须学会从调用方上下文和下游使用情况中重建被调用方的行为,这正是根据历史记录和工具返回结果预测智能体延续所需的相同能力。这种对应关系是结构性的而非字面上的——FIM 训练以给定后缀为条件,而智能体推理则生成一个后缀——但它表明前者诱导的表征应该迁移到后者,这是一个我们在第 3 节中探讨的实证问题。 Fill-in-the-middle 目标并非新事物 (Bavarian et al., 2022);最近的代码 LLM 将随机跨度 FIM 混合到预训练中 (Hui et al., 2024; Guo et al., 2024; Li et al., 2023)。然而,随机跨度 FIM 与智能体条件化对齐不良,原因有三。*(i) 跨度边界在语法上是任意的:*大多数掩盖的跨度会切断表达式或部分语句,并且携带关于函数级依赖的弱信号。*(ii) 没有推理监督:*模型直接填充跨度,没有反映智能体“先思考后行动”模式的中间推理过程。*(iii) 目标被化解到预训练中:*到后训练开始时,任何 FIM 赋予的结构性先验已经在数万亿不相关 token 中被摊销了。 我们解决所有这三个问题:通过程序依赖图分析以及一个基础模型无关的复杂度-可推断性双标准 (第 2.3 节) 以函数粒度选择掩盖目标;将思维链推理过程嵌入到 FIM 中间跨度的**内部**,使模型产生与最终代码一致的推理 (第 2.4 节);并且该目标应用于专门的中间训练阶段,将其信号集中在智能体后训练之前。我们从稳健性的三个维度评估这种配方。*在 Qwen2.5-Coder-Instruct 系列上*,中间训练将 SWE-Bench-Verified 在 7B 和 14B 上分别提高了 +2.8 和 +3.0 个点,表明在实用部署范围内的较大预训练模型并未吸收结构性先验。*在两个后训练流程上*,中间训练在同一个 7B 基础模型上提升了 R2E-Gym 和 SWE-Smith,其中 SWE-Smith 配对在 SWE-Bench-Verified 上获得了 +5.3 个点的提升。*在一个非 Qwen2.5 的基础模型上*,中间训练迁移到 Qwen3-8B (与 SWE-Lego 配对),在 SWE-Bench-Verified 上获得 +3.2 个点的提升;这一单个比较同时改变了基础模型和后训练流程,应被解读为先验并非特定于单个 Qwen2.5-Coder + R2E-Gym/SWE-Smith 组合的证据,而非跨家族的保证。 第二组结果探究了我们动机假设。所有检查点均在完整流程后 (仅后训练,或中间训练后跟随后训练) 进行评估,因为仅 FIM 的检查点会降低指令遵循能力,并且无法与指令微调基线比较。仅智能体后训练在 14B 上显著退化非目标能力,在某些情况下将 LiveCodeBench、BFCL 和 τ-bench 降低两位数百分比;在相同的后训练之前添加中间训练则恢复了 LiveCodeBench 上的 +11.1、BFCL 上的 +2.4 以及 τ-bench 上的 +3.9。由于中间训练语料仅包含 Python 代码,没有工具使用数据,因此跨领域恢复是函数调用/工具调用同构性的直接证据。 **贡献。** (1) 将函数调用点构建为智能体“动作-观察-延续”循环的互联网规模类比,从而激发函数粒度 FIM 作为智能体能力的自监督先验。(2) 结合程序依赖图分析、基础模型无关的复杂度-可推断性双标准以及嵌入在 FIM 中间跨度内部的 CoT 推理过程的感知函数 FIM 中间训练流程。(3) 沿三个维度进行稳健性验证——两个模型大小 (Qwen2.5-Coder-Instruct 7B/14B)、两个后训练流程 (R2E-Gym、SWE-Smith) 和一个替代基础模型 (Qwen3-8B with SWE-Lego)——在所有配置中均实现一致的领域内增益。(4) 对动机假设的直接测试:相同的纯 Python 语料也在 τ-bench、BFCL 和 LiveCodeBench 上产生增益,证明函数调用归纳偏差在后训练后仍然存在并跨任务家族迁移。(5) 公开发布包含 968 个仓库的去污语料 (40 万个 FIM 样本,26 亿 token),选择流程以及中间训练检查点。 ## 2 方法 ### 2.1 动机:函数调用作为类智能体结构 编码智能体在步骤 t 采样 at ∼ π(at | ht),观察 ot+1 ∼ p(ot+1 | ht, at),然后继续。函数调用镜像了这个循环 (图 1,左图):调用前上下文、调用、返回和下游使用与历史、动作、观察和延续对齐。这种同构性激发了从代码中提取的 fill-in-the-middle (FIM) 目标。随机跨度 FIM (Hui et al., 2024; Guo et al., 2024; Li et al., 2023) 仅是偶然捕获了它;我们的**感知函数**变体通过程序结构和上下文可预测性来选择掩盖目标。 ### 2.2 数据收集与去污 我们从 GitHub 策划了一个包含 968 个 Python 仓库的语料。从约 2000 个候选集开始,这些候选集是通过结合星标数阈值和十个主题查询检索到的,我们应用人工质量过滤,并移除任何原始仓库与 SWE-Bench (Jimenez et al., 2023) 的源仓库重叠的仓库 (通过仓库名称和任何已知分叉验证)。为了消除测试时的泄漏,我们将每个仓库限制为时间戳早于 SWE-Bench-Verified 和 SWE-Bench-Lite 中使用的最早基础提交的提交。过滤后的语料产生约 40 万个 FIM 样本 (在 Qwen2.5-Coder 分词器下约 26 亿 token):32万个单函数目标,6万个对目标和2万个三重目标。完整的统计、主题类别细分和许可证清单见附录 A。 ### 2.3 感知函数的 FIM 目标选择 给定每个源文件,我们的流程产生一组掩码目标以及相应的掩码文件。每个目标是单个函数或由 2-3 个函数组成的连接组;多函数变体在第 3.4 节中研究。该流程有四个阶段:依赖图构建、复杂度评分、可推断性评分和基于阈值的选择。图 2 以一个小型运行示例——一个带有两个顶层辅助函数的 `Calculator` 类——说明了这些阶段。完整的单函数选择算法见附录 B.1,多函数扩展见附录 B.7,图 2(b) 中显示的每个数量的数值演练见附录 B.6。 参考图注 图 2: 在小型计算器示例上进行感知函数的 FIM 目标选择。(a) 从 AST 解析的程序依赖图:实线箭头是调用边 Ecall,虚线是同一类方法之间的兄弟边 Esib。(b) 堆叠条分解了用于 `Calculator.total` 的复杂度分数 Ĥ=0.40 (公式 1; LoC, CC, 深度) 和可推断性分数 Î=0.48 (公式 2; 五个上下文信号),得出 FIM ≈ 0.22 ≥ τ=0.08 (一个超参数;完整列表见附录 B)。 #### 2.3.1 程序依赖图 对于每个文件,我们解析其 AST 并提取函数节点集合 V (顶层函数和类方法,通过限定名标识)。构建两个边集:调用方和被调用方之间的**调用边** Ecall,以及同一类方法之间的**兄弟边** Esib (捕获通过共享实例状态而非直接调用流动的类内耦合)。调用解析处理常见的 Python 习语 (直接调用、类实例化、self/cls 方法调用),并针对限定名索引使用短名称回退;附录 B.2 详细说明了该过程。 #### 2.3.2 复杂度分数 Ĥ 对于每个 v ∈ V 我们定义 Ĥ(v) = wℓ φ(LoC(v), cℓ) + wc φ(CC(v), cc) + wd φ(D(v), cd), (1) 其中 LoC(v) 是代码行数,CC(v) 是 McCabe 循环复杂度,D(v) 是控制流结构的最大嵌套深度,而 φ(x, c) = min(x/c, 2) 通过软上限对每个量进行归一化。上限和权重列于附录 B.3。 #### 2.3.3 可推断性分数 Î 目标应该能从周围上下文中**恢复**。Î(v) 聚合了五个上下文派生的信号,这些信号近似于 v 的函数体与文件其余部分之间的互信息: Î(v) = α Ccaller(v) + β Ccallee(v) + γ Csig(v) + δ Cdoc(v) + ε Cclass(v). (2) 其中 Ccaller 度量调用者上下文中 v 的调用点的数量和信息量;Ccallee 度量被调用者的可推断性 (例如,其名称和签名);Csig 考虑函数签名本身的显式性;Cdoc 检查文档字符串的存在和内容密度;Cclass 度量同一类中的耦合 (对于方法)。权重和归一化细节见附录 B.4。
相似文章
我用4B参数模型构建的编码智能体在基准测试中达到87%,诀窍如下
作者构建了SmallCode,一个针对小型本地模型优化的编码智能体,通过复合工具、改进循环和令牌预算等技术,在4B参数模型上实现了87%的基准测试成功率。
内化未来:面向世界模型规划的统一智能体训练范式
提出了一种三阶段训练范式,将世界模型规划内化到LLM智能体中,使其具备前瞻性决策能力。在搜索和数学推理任务上优于基线方法。
使用 MCP 进行代码执行:构建更高效的智能体
本文来自 Anthropic,探讨了如何将代码执行与 Model Context Protocol (MCP) 相结合,以提升 AI 智能体的效率。文章分析了工具定义和中间结果导致的 token 过载等挑战,并提出代码执行作为降低延迟和成本的解决方案。
基础模型中的集体智能
本文提出了一种多智能体推理框架,其中多个基础模型通过结构化批评和聚合进行协作,表明模型异构性显著提高了逐步推理的准确性并减少了跨领域的方差。
它是否具备足够的代理能力?使用你自己的工具对开放模型进行基准测试
这篇博客文章介绍了一种基准测试方法,用于评估开放模型在代理编程任务上的表现,不仅关注准确性,还关注代理过程的效率。它提供了一个使用 pi coding agent 的可定制工具框架,并在不同模型和库版本上进行测试。