北京交通大学开源 o1-Coder 代码生成框架及强化微调计划
北京交通大学 ADaM 团队近期在 arXiv 上发布了类 o1 的代码生成框架 o1-Coder 的技术报告,并已在 GitHub 开源相关代码。该框架旨在探索不依赖标注推理过程数据的情况下,通过强化学习实现大模型的系统 2 推理能力。项目上线后迅速获得业界关注,Hugging Face 将其推荐为当日热门论文,并在 X 平台引发广泛讨论。
1. 引言:系统 2 推理与代码生成
目前,实现大模型的系统 2 推理(System 2 Reasoning)主要包括三种技术路径:提示工程、监督学习和强化学习。o1-Coder 的报告从方法和任务两个维度总结了复现 o1 的主要工作。团队选择强化学习作为核心技术路线,目标是探索在不标注或蒸馏任何推理过程数据情况下的解决方案。
面向代码生成任务复现 o1 主要面临两个核心挑战:
-
结果奖励的评估:与围棋、数学等可以根据规则或标准答案直接评估不同,代码的正确性需要在测试环境下运行测试样例来检验。o1-Coder 提出训练一个测试用例生成器(Test Case Generator, TCG),基于问题自动生成测试样例,构建标准化的代码测试环境,为模型强化学习训练提供结果奖励。该 TCG 基于 DeepSeek-1.3B-Instruct 进行 SFT 和 DPO 优化,在 TACO 数据集上获得了较高的通过率,且支持推断阶段作为生成代码质量的验证器。
-
思考和搜索行为的定义:即过程奖励的对象和粒度设计。团队选择了'三思而后行'的策略,即先逐步思考形成完整的思维链,再输出最终答案。具体实现为:先生成伪代码,再基于伪代码生成可运行的最终代码。这种策略具有适配性强(同一伪代码可生成不同实现)和粒度可控(通过调整伪代码详细度控制思考深度)的优势。
初步实验表明,由伪代码生成最终代码的准确率显著高于直接生成最终代码,但当前 LLM 生成高质量伪代码的能力仍有不足,这正是需要通过推理过程数据和过程奖励来优化的方向。
2. 框架详解:六步迭代流程
o1-Coder 设计了一个包含六个步骤的闭环框架,实现了自我对弈(Self-Play)的持续改进机制。
2.1 测试用例生成器训练
第一步是训练测试用例生成器(TCG)。该模块根据给定的编程问题自动生成对应的测试用例,无需人工编写。这解决了代码评估自动化难题,为后续强化学习提供了可靠的结果反馈信号。
2.2 蒙特卡洛树搜索与数据合成
第二步在原始代码数据集上运行蒙特卡洛树搜索(MCTS)。通过 MCTS 生成包含推理过程的代码数据集,同时标记每个推理步骤的有效性(正确或错误)。这一步骤模拟了人类解题时的试错过程,为模型提供了丰富的训练样本。
2.3 策略模型初始化
基于生成的初始包含推理过程的数据,可以对标准的 LLM 或代码模型进行微调,初始化策略模型具备'先思考再行动'的行为方式。这使得模型在强化学习开始前就具备了基本的推理结构。
2.4 过程奖励模型初始化
初始的推理过程数据同时用来初始化过程奖励模型(Process Reward Model, PRM)。PRM 在 RL 训练过程中用于评估推理步骤的质量,而不仅仅是最终结果。这与字节提出的 ReFT 不同,后者需要 CoT 数据进行监督微调预热,且在强化阶段未充分利用过程奖励。o1-Coder 支持在没有推理过程数据的情况下启动训练,更具灵活性。
2.5 强化学习更新
有了提供过程奖励的 PRM 和提供结果奖励的 TCG,策略模型通过强化学习进行更新。这一过程利用多目标奖励函数,平衡代码正确性与推理逻辑的合理性。
2.6 迭代循环
最后,基于更新后的策略模型,可以生成新的推理过程数据。这些新数据反过来用来再次微调 PRM。步骤 4、5 和 6 形成了一个迭代循环,通过 Self-Play 不断推动模型的改进,类似于 AlphaGo Zero 的训练范式。
3. 推理过程行为定义
o1-Coder 定义了生成伪代码的三种核心推理过程行为,这些行为在具体的推理链中会根据上下文动态实例化:
- 定义伪代码算法结构:概述主要函数的结构和接口,帮助模型理解整体任务结构,包括输入、输出和核心功能。
- 细化伪代码:迭代细化第一步中定义的伪代码,逐步明确每个函数的步骤、逻辑和操作细节。
- 从伪代码生成代码:将伪代码的结构和逻辑准确转换成可执行代码。
这种分层生成策略有效降低了单次生成的复杂度,提高了最终代码的可读性和正确率。


