Improving Small Language Models for Code Generation with Reinforcement Learning from Verification Feedback
作者: Egor Skopin, Evgeny Kotelnikov
分类: cs.SE, cs.CL
发布日期: 2026-05-28
备注: Accepted for AINL-2026 conference
💡 一句话要点
利用验证反馈的强化学习提升小型语言模型的代码生成能力
🎯 匹配领域: 支柱二:RL算法与架构 (RL & Architecture)
关键词: 代码生成 强化学习 可验证奖励 单元测试 语言模型微调 MBPP基准 奖励塑造
📋 核心要点
- 现有代码生成模型难以直接优化功能正确性,通常依赖间接指标。
- 提出使用可验证奖励的强化学习(RLVR),利用单元测试等信号直接优化功能正确性。
- 实验表明,在MBPP基准测试中,RLVR方法在pass@1指标上提升高达13个百分点。
📝 摘要(中文)
本文研究了使用可验证奖励的强化学习(RLVR)训练语言模型,该方法利用诸如单元测试结果等程序化可检查信号,从而直接优化代码生成的功能正确性。我们使用LoRA微调在两个小型模型(Qwen3-0.6B和Llama3.2-1B)上,对MBPP基准测试进行了Python代码生成的RLVR实证研究。我们比较了基于组的策略优化变体(GRPO和GSPO)在多种奖励公式下的表现,这些奖励公式包括:仅单元测试奖励、仅通过Ruff linter进行静态分析的塑造奖励以及组合奖励。在我们的实验环境中,在提出的组合奖励配置下,RLVR在MBPP测试中将pass@1提高了高达13个百分点。然而,我们发现奖励塑造可能会导致系统性的行为转变:仅使用静态分析惩罚可能会使策略偏向于更短的补全,从而减少lint错误,但不能可靠地提高功能正确性。相比之下,组合奖励可以减轻这种退化,并在正确性和样式约束之间产生更稳定的权衡。总的来说,我们的结果表明,RLVR在代码生成方面的有效性对奖励设计和优化粒度高度敏感,并且pass@1之外的诊断,包括生成长度、Ruff严重性配置文件和执行错误类型,对于识别失败模式非常有用。
🔬 方法详解
问题定义:论文旨在解决小型语言模型在代码生成任务中,难以直接优化功能正确性的问题。现有方法通常依赖于间接的指标,例如代码的流畅度或语法正确性,而忽略了代码是否能够通过单元测试。这种间接优化方式可能导致生成的代码在语法上正确,但功能上存在缺陷。
核心思路:论文的核心思路是利用强化学习,并结合可验证的奖励信号(例如单元测试的结果),直接优化语言模型生成代码的功能正确性。通过这种方式,模型可以学习到哪些代码修改能够提高通过单元测试的概率,从而生成更可靠的代码。
技术框架:整体框架包括以下几个主要阶段:1) 使用语言模型生成代码;2) 执行生成的代码并运行单元测试;3) 根据单元测试的结果计算奖励;4) 使用强化学习算法(例如GRPO或GSPO)更新语言模型的参数。该框架通过循环迭代,不断优化语言模型的代码生成能力。
关键创新:最重要的技术创新点在于将可验证的奖励信号(例如单元测试结果)引入到强化学习的训练过程中。与传统的强化学习方法不同,该方法可以直接衡量代码的功能正确性,从而更有效地指导模型的学习。此外,论文还探索了不同的奖励函数设计,例如仅使用单元测试奖励、仅使用静态分析奖励以及组合奖励。
关键设计:论文中关键的设计包括:1) 奖励函数的设计,例如如何平衡单元测试奖励和静态分析奖励;2) 强化学习算法的选择,例如GRPO和GSPO;3) LoRA微调的使用,以高效地调整预训练语言模型的参数。此外,论文还关注了优化粒度的问题,例如如何选择合适的批大小和学习率。
🖼️ 关键图片
📊 实验亮点
实验结果表明,在MBPP基准测试中,使用组合奖励配置的RLVR方法可以将pass@1指标提高高达13个百分点。此外,研究还发现,仅使用静态分析惩罚可能会导致模型生成更短的代码,但不能可靠地提高功能正确性。组合奖励可以缓解这种退化,并在正确性和样式约束之间取得更好的平衡。
🎯 应用场景
该研究成果可应用于自动化软件开发、代码补全、代码修复等领域。通过提高代码生成模型的可靠性和功能正确性,可以显著提升开发效率,降低软件缺陷率。未来,该方法有望扩展到更复杂的代码生成任务和编程语言。
📄 摘要(原文)
Reinforcement learning with verifiable rewards (RLVR) trains language models using programmatically checkable signals such as unit-test outcomes, enabling direct optimization for functional correctness in code generation. We conduct an empirical study of RLVR for Python code generation on the MBPP benchmark using two small models (Qwen3-0.6B and Llama3.2-1B) with LoRA fine-tuning. Across multiple reward formulations such as: unit-test-only rewards, static-analysis-only shaping via the Ruff linter, and a combined reward, we compare group-based policy optimization variants (GRPO and GSPO) and evaluate both functional correctness and behavioral diagnostics. In our experimental setting, RLVR improves pass@1 on MBPP test by up to 13 percentage points under proposed combined reward configuration. However, we find that reward shaping can induce systematic behavioral shifts: using only static-analysis penalties may bias the policy toward shorter completions that reduce lint errors without reliably improving functional correctness. In contrast, combined rewards mitigate this degeneration and yield more stable trade-offs between correctness and style constraints. Overall, our results highlight that RLVR effectiveness for code generation is highly sensitive to reward design and optimization granularity, and that diagnostics beyond pass@1, including generation length, Ruff severity profiles, and execution error types are useful for identifying failure modes.