第7章 Code Agent 训练 — SFT 与 RL
代码基座模型时间线(StarCoder/CodeLlama/DeepSeek-Coder/Qwen-Coder)、SWE-RL(Meta)、SWE-Gym(PKU)、Code-R1 等专项工作,以及与模块七 Agentic RL 的衔接
第7章 🎓 Code Agent 训练 — SFT 与 RL
一句话:调用 GPT-5 / Claude Sonnet 4.5 是用 Code Agent 的 90%路径;训练自家 Code Agent 是另外 10% 的高价值场景 —— 当你需要私有部署 / 领域特化 / 成本敏感时,本章给你完整路径。SWE-RL(Meta 2025-04)是这一方向的奠基 ——它证明了 RL with rule-based reward 能让代码 agent 自己学好。
📑 目录
- 一、为什么要专门训 Code Agent
- 二、代码基座模型时间线
- 三、SFT 阶段
- 四、SWE-RL ⭐(Meta arXiv 2504.21798)
- 五、SWE-Gym(PKU/Databricks)
- 六、Code-R1 / o1-coder 类工作
- 七、训练数据来源
- 八、训练栈选型
- 九、与模块七 Agentic RL 的衔接
一、为什么要专门训 Code Agent
直接用 Claude Sonnet 4.5 / GPT-5 的好处:最强、最方便。 但有 4 个场景必须自训:
1.1 隐私 / 合规
- 银行 / 医疗 / 政府客户的代码不能上 cloud LLM
- 必须本地部署 → 7B-70B 自家模型
1.2 成本
- 大 repo 用 Claude Sonnet 4.5 可能每个 issue 1-5 美元
- 团队 100 工程师 × 10 issue/天 × 9000/天 = $270K/月**
- 自家小模型 + RL 调优,成本可降 90%
1.3 领域特化
- 私有 SDK / 框架 / 业务系统,公开 LLM 没见过
- 自训 + 私有代码 SFT → 比 frontier LLM 强 10-30%
1.4 工作流定制
- 公司有特殊 PR 规范、code review 流程
- 通用模型遵循指令不严,自训对齐流程
现实:80% 团队应直接用商业 API(成本可控、模型最强);20% 头部企业 / AI 实验室自训。
二、代码基座模型时间线
2021-08 Codex(OpenAI) ── 12B,Copilot 引擎
2022-12 CodeGen(Salesforce) ── 16B,开源
2023-04 StarCoder(BigCode) ── 15B,开源,The Stack 数据
2023-08 CodeLlama(Meta) ── 7/13/34/70B,开源
2024-01 DeepSeek-Coder ── 1.3/6.7/33B
2024-02 StarCoder 2(BigCode) ── 3/7/15B
2024-05 Codestral(Mistral) ── 22B
2024-06 DeepSeek-Coder V2 ── 16/236B(MoE)
2024-09 Qwen2.5-Coder ⭐ ── 0.5/1.5/3/7/14/32B,SOTA 开源
2024-12 DeepSeek-V3 / V3-Coder ── 671B MoE
2025-04 SWE-RL(Meta) ── RL training 论文 ⭐
2025-09 Qwen3-Coder ── 32B / 480B-MoE,开源 SOTA
2026-01 DeepSeek-V4 ── (1M context, 推理强)
2.1 推荐使用
最强开源代码基座:
- 小型 (7B-32B):Qwen3-Coder-32B / DeepSeek-Coder-V2 16B-MoE
- 大型 (>100B):DeepSeek-V4-Coder / Qwen3-Coder-480B-MoE
最强闭源代码模型:Claude Sonnet 4.5 / GPT-5 / o3。
2.2 模型规模 vs SWE-bench Verified
| 规模 | 代表 | Verified |
|---|---|---|
| 7B-15B | StarCoder 2 / DeepSeek-Coder 7B | ~15-25% |
| 30B-70B | CodeLlama 70B / Qwen2.5-Coder 32B | ~30-40% |
| MoE 大型 | DeepSeek-V3 / Qwen3-Coder-480B | ~50-60% |
| Frontier 闭源 | Claude Sonnet 4.5 / GPT-5 | ~70-73% |
规律:开源每 18 个月追平闭源 SOTA,当前差距 ~10-15%。
三、SFT 阶段
3.1 数据准备
代码 SFT 数据的来源:
| 来源 | 量级 | 质量 |
|---|---|---|
| The Stack v2(BigCode) | 67TB,3B+ files | 全语言、多许可证 |
| StarCoder 数据集 | 1TB | 已清洗 |
| CommitPackFT(commit 数据) | 数百万 | commit message + diff |
| OSS-Instruct(合成) | 数十万 | 高质量 instruction |
| WizardCoder 数据 | 数十万 | LLM evolution 合成 |
3.2 三阶段 SFT
1. Base Pretraining
The Stack v2 + Web data
↓
2. Instruction Tuning
OSS-Instruct + Magicoder + WizardCoder data
↓
3. Agent SFT(关键!)
SWE-bench train set + 合成 trajectory
Agent SFT 阶段最关键 —— 给模型大量 “agent 解 SWE-bench” 的轨迹,让它学会正确调工具。
3.3 数据合成关键
用 strong LLM 给 weak student 造数据:
- GPT-5 跑 SWE-bench 训练集 → 拿到成功 trajectory
- 蒸馏给 7B-32B 小模型
- 小模型学会分布,而不是从零摸索
类比:学生跟着名师做题(看名师怎么思考、调工具),比自己瞎刷强得多。
四、SWE-RL ⭐(Meta arXiv 2504.21798)
论文:Wei et al., “SWE-RL: Advancing LLM Reasoning via Reinforcement Learning on Open Software Evolution”,arXiv 2504.21798,Meta 2025-04。
4.1 核心问题
SFT 教会”模仿成功 trajectory”,但不教模型”探索” ——遇到训练数据没见过的失败,模型会死循环。
RL 才能教模型从失败中学习。但 RL 需要 reward signal——代码场景下用什么?
SWE-RL 的解法:Rule-based reward + 测试通过 = 强 signal。
4.2 训练 pipeline
1. 准备数据
PR-Mix 数据集:从 PR 历史构造 (issue, repo state, patch, tests) 四元组
↓
2. SFT 冷启动
先用 SFT 让 model 学会基本 workflow
↓
3. RL 训练(GRPO)
每个 step:
a. 给 issue,生成多个 candidate patch
b. 跑测试评分:pass=+1, fail=0
c. GRPO 更新(详见模块七第3章)
↓
4. Iterative Refinement
重复 SFT → RL 多轮
4.3 关键创新
- PR-Mix 数据:把 PR 转成 RL 训练格式,规模化获得(GitHub 上有数十亿 PR)
- Rule-based reward:
- 测试通过 +1
- 编译失败 -0.5
- 不必要修改 -0.1
- 主要 reward 来自自动判定,不需要 human label
- 多 reward shaping:测试通过率 / 修改 minimal 度 / 风格一致性
4.4 实验结果
(论文 Table)
| 模型 | SWE-bench Verified |
|---|---|
| Llama 3 70B (SFT only) | 18% |
| Llama 3 70B + SWE-RL | 41% |
| +23 个百分点 ——纯靠 RL |
4.5 与模块七 Agentic RL 的关系
SWE-RL 直接复用 模块七讲的:
- GRPO(Group Relative Policy Optimization)
- RLVR(Rule-based Verifiable Reward)
- Async rollout(并行跑多个 candidate)
Code 是 RLVR 的最佳应用场景:测试通过 = 完美 verifier。
五、SWE-Gym(PKU/Databricks)
论文:Pan et al., “Training Software Engineering Agents and Verifiers with SWE-Gym”,arXiv 2412.21139,2024-12。
5.1 核心贡献
SWE-Gym = 第一个公开的、可大规模 RL 训练的 SWE 环境。
Resources 数据
- 2438 个 Python 任务 ── 来自 Pythonic OSS
- 完整 docker 环境 ── 装好依赖的镜像
- 测试 suite ── pass / fail 自动判定
- Trajectory 数据集 ── 多个 trained agent 的 success/fail trace
5.2 怎么用
import swegym
env = swegym.make('django_001')
obs = env.reset()
# obs = "issue 描述 + repo 状态"
while not done:
action = agent.act(obs)
# action = "edit_file('models.py', '42:50', '...')"
obs, reward, done, info = env.step(action)
# reward 在 done=True 时给(测试结果)
5.3 训练 verifier
SWE-Gym 论文的另一贡献:训了一个 verifier(用 7B 模型),专门判断”这个 patch 是否对”:
- 不跑测试,纯靠 LLM 判断
- 对于不可执行的子任务(如 unit test 不全),verifier 给 fallback signal
- 实验显示 verifier 加速了 RL 训练 2-3 倍
5.4 SWE-Gym vs SWE-bench
| 维度 | SWE-bench | SWE-Gym |
|---|---|---|
| 用途 | 评测 | 训练 |
| 数据 | held-out 测试集 | 训练集 + 验证集 |
| 接口 | 单次 evaluator | gym.Env 完整循环 |
| Trajectory | 没有 | 完整 |
研究者常组合用:SWE-Gym 训练 → SWE-bench Verified 评测。
六、Code-R1 / o1-coder 类工作
OpenAI o1 / DeepSeek R1 出来后,推理时间 scaling 成为新方向。学界开始研究 “Code Agent + Long CoT”。
6.1 核心 idea
Issue
↓
1. 长 CoT 推理(几千到几万 token)
"让我想想:先理解问题、再 grep 相关代码、然后..."
↓
2. Action
↓
3. 反思 → 再 CoT
6.2 代表工作
- OpenAI o3 / o3-mini:推理优化的 frontier 模型,SWE-bench Verified ~73%
- DeepSeek-R1-Coder(社区魔改):基于 R1,加 code-specific RL
- QwQ-Coder:Qwen 团队的推理 + 代码模型
6.3 trade-off
| 优势 | 劣势 |
|---|---|
| 单步质量高(更深思考) | 推理时间长(秒级 → 分钟级) |
| 复杂任务突破 | 简单任务过度思考 |
| 不需要复杂 scaffolding | 推理 token 成本高 |
业界趋势:简单任务用 fast 模型(Sonnet/Flash),复杂任务用推理模型(Opus/o3) —— 自动路由是产品化方向。Cursor / Claude Code 已经这么做。
七、训练数据来源
7.1 公开数据集
| 数据集 | 规模 | 用途 |
|---|---|---|
| The Stack v2 | 67TB | 预训练 |
| StarCoder 数据集 | 1TB | 预训练 |
| CommitPack | 4TB | commit-aware SFT |
| CommitChronicle | 数百万 commit | commit 数据 |
| PR-Mix(SWE-RL) | 千万级 PR | RL 训练 |
| SWE-Gym | 2438 task | RL 环境 |
| SWE-bench train | 1700 issue | SFT |
7.2 合成数据
随着 frontier LLM 强,用 strong LLM 合成训练数据成为标配:
- OSS-Instruct:从 GitHub 代码片段生成 instruction
- Magicoder(WizardCoder 系列):evolutionary 合成
- Self-Play:用自己的早期版本生成 trajectory,蒸馏给后续版本
7.3 隐私保护
企业自训时,code license / privacy 是大坑:
- The Stack v2 包含各种许可证 —— 商用 model 必须挑 permissive
- 自家代码训练前应去敏感(密钥、PII)
- 合规风险:GPL 代码训出的 model 可能被法务认为派生作品
八、训练栈选型
8.1 SFT 框架
| 框架 | 优势 | 劣势 |
|---|---|---|
| HuggingFace TRL | 简单,生态好 | 大模型扩展性弱 |
| DeepSpeed Chat | 大模型 OK | 复杂 |
| Megatron-LM | 极致性能 | 学习曲线陡 |
| OpenRLHF ⭐ | RL + SFT 一体 | 偏 RL 场景 |
| verl(ByteDance) ⭐ | RL 最强 | 需要 ray 集群 |
8.2 RL 训练栈
(详见模块七 Agentic RL 第 6 章)
首选:
- verl + VerlTool(适配 SWE-Gym 等环境)
- OpenRLHF + 自定义 env
8.3 评测 / 监控
- swebench-cli:自动跑 SWE-bench
- WandB / TensorBoard:训练监控
- Modal / E2B:大规模 sandbox
九、与模块七 Agentic RL 的衔接
模块七讲的所有方法,SWE-RL 都直接套用:
| 模块七主题 | SWE-RL 应用 |
|---|---|
| GRPO | SWE-RL 主算法 |
| RLVR(rule-based reward) | 测试通过 = 1.0 |
| Async rollout | 并行跑 SWE-Gym tasks |
| ToolRL | code edit tool 使用对齐 |
| Search-R1 思想 | 加 grep / search 工具 |
| Self-Improvement Flywheel | Iterative SFT → RL |
建议:学习路径上,先看模块七第 3-6 章(GRPO / RLVR / Multi-turn RL / 训练栈),再回来看本章 SWE-RL 的应用。
9.1 训练配置示例
# 类似 SWE-RL 的训练配置
algorithm: grpo
base_model: Qwen2.5-Coder-32B
reward:
type: rule_based
components:
- name: tests_pass
weight: 1.0
fn: run_pytest
- name: compile_pass
weight: 0.5
fn: type_check
- name: minimal_diff
weight: 0.1
fn: diff_size_penalty
env:
type: swegym
task_set: SWE-bench-verified-train
rollout:
num_candidates: 16
async: true
max_steps: 50
batch_size: 32
learning_rate: 1e-6
total_steps: 10000
✅ 自我检验清单
- 能说出训练 Code Agent 的 4 个动机
- 能背出 5 个主流开源代码基座模型
- 能解释 SFT → Agent SFT → RL 的三阶段流程
- 能说清 SWE-RL 的 PR-Mix 数据 + rule-based reward 设计
- 能区分 SWE-bench(评测)vs SWE-Gym(训练)
- 能说出代码 RL 训练的关键栈(verl / OpenRLHF + SWE-Gym)
- 能解释为什么 RLVR 在代码场景特别有效
📚 参考资料
核心论文
- SWE-RL (Meta arXiv 2504.21798) — 第一篇 Code Agent RL ⭐
- SWE-Gym (arXiv 2412.21139) — 训练环境奠基
- StarCoder / The Stack(BigCode 系列)
- DeepSeek-Coder V2 (arXiv 2406.11931)
- CodeLlama (arXiv 2308.12950)
- Qwen2.5-Coder (arXiv 2409.12186)
- WizardCoder (arXiv 2306.08568)
- Magicoder (arXiv 2312.02120)
官方实现 / 数据集
- The Stack v2 — https://huggingface.co/bigcode
- SWE-Gym — https://github.com/SWE-Gym/SWE-Gym
- StarCoder 数据集 — https://huggingface.co/datasets/bigcode/the-stack
训练框架
- verl — https://github.com/volcengine/verl
- OpenRLHF — https://github.com/OpenRLHF/OpenRLHF
- TRL — https://github.com/huggingface/trl
衔接
- 模块七 Agentic RL 第 3-6 章(GRPO / RLVR / Multi-turn / 训练栈)
下一章:第8章 生产部署与安全 —— Sandboxing、PR review 自动化、测试发现、Cost 控制、Failure 处理、Audit trace、Prompt injection 防御。