Back to blog

Seed-Coder: Let the Code Model Curate Data for Itself

模型驱动的代码预训练数据构建方法,最小化人工干预

Seed-Coder: Let the Code Model Curate Data for Itself

一、论文概述

项目内容
标题Seed-Coder: Let the Code Model Curate Data for Itself
作者ByteDance Seed, Yuyu Zhang, Jing Su, Yifan Sun, Chenguang Xi, Xia Xiao, Shen Zheng, Anxiang Zhang, Kaibo Liu, Daoguang Zan, Tao Sun, Jinhua Zhu, Shulin Xin, Dong Huang, Yetao Bai, Lixin Dong, Chao Li 等
机构ByteDance Seed
论文arXiv:2506.03524
代码GitHub
主页Homepage
发布2025年6月4日 (v1), 2025年6月5日 (v2)
领域cs.CL, cs.AI, cs.LG

二、核心思想

问题定义

代码数据在大语言模型(LLM)预训练中至关重要,不仅对代码相关任务有益,还能增强LLM的通用智能。然而,当前开源LLM在构建代码预训练数据时面临严重挑战:

  1. 人工规则的局限性:

    • 手工过滤规则针对特定编程语言定制,扩展性和维护成本高
    • 人工标注数据训练质量过滤器,存在主观偏差
    • 规则之间容易冲突,难以全面评估代码质量
  2. 可扩展性问题:

    • 跨编程语言扩展成本高
    • 人工评估难以处理大规模数据
    • 代码质量标准难以量化
  3. 质量评估困难:

    • 看似结构良好的代码可能包含隐藏的逻辑错误
    • 短小的API调用代码可能被错误过滤
    • 需要全面上下文才能准确评估代码质量

解决方案概述

本文提出Seed-Coder,一系列8B规模的开源LLM(包括base、instruct和reasoning模型),通过模型驱动的数据管道最小化人工干预:

核心思想:让代码模型自己管理数据,用LLM替代手工规则进行代码数据评分和过滤。

关键创新:

  1. 模型驱动数据管道:主要利用LLM对代码数据进行评分和过滤
  2. 多阶段预训练:常规预训练 + 持续预训练(高质量数据 + 长上下文)
  3. 指令微调:合成数据生成 + 沙盒自纠正
  4. 推理模型:LongCoT强化学习提升多步推理能力

核心成果:

  • 在相似规模的开源模型中达到最先进水平
  • 甚至超越一些更大的模型
  • 支持代码生成、补全、编辑、推理和软件工程任务

三、技术架构

整体框架图

数据处理管道

Figure 2: 预训练数据处理管道。从GitHub和web archives收集数据,处理为四类:文件级代码(黄色)、仓库级代码(蓝色)、GitHub commits(红色)和代码相关web数据(绿色)。

质量评分器管道

Figure 5: 数据质量评分器管道。

核心公式

数据质量评分

评分标准(4个维度):

  • 可读性(Readability):合理的注释、一致的命名、遵循格式规范
  • 模块化(Modularity):良好的结构、避免过度复杂、清晰的功能分离
  • 清晰度(Clarity):最小化冗余、清晰传达意图
  • 可复用性(Reusability):无语法/逻辑错误、避免硬编码、易于集成

评分公式: score=fLLM(code,prompt)∈[0,10]\text{score} = f_{\text{LLM}}(\text{code}, \text{prompt}) \in [0, 10]

过滤策略: filtered_data={x∈data∣score(x)>θ}\text{filtered\_data} = \{x \in \text{data} | \text{score}(x) > \theta\}

其中 θ\theta 为阈值,过滤底部约10%的文件。

Fill-in-the-Middle (FIM)

SPM格式(Suffix-Prefix-Middle): input=⟨fim-suffix⟩SUFFIX⟨fim-prefix⟩PREFIX⟨fim-middle⟩MIDDLE\text{input} = \langle\text{fim-suffix}\rangle \text{SUFFIX} \langle\text{fim-prefix}\rangle \text{PREFIX} \langle\text{fim-middle}\rangle \text{MIDDLE}

FIM比率:

  • 常规预训练:0.5
  • 持续预训练:0.1

GRPO训练

GRPO(Group Relative Policy Optimization): LGRPO=E(x,y)∼D[min⁡(πθ(y∣x)πref(y∣x)A(x,y),clip(πθ(y∣x)πref(y∣x),1−ϵ,1+ϵ)A(x,y))]\mathcal{L}_{\text{GRPO}} = \mathbb{E}_{(x,y) \sim \mathcal{D}} \left[ \min \left( \frac{\pi_\theta(y|x)}{\pi_{\text{ref}}(y|x)} A(x,y), \text{clip}\left(\frac{\pi_\theta(y|x)}{\pi_{\text{ref}}(y|x)}, 1-\epsilon, 1+\epsilon\right) A(x,y) \right) \right]

训练配置:

  • Batch size: 128
  • 学习率: 1×10−61 \times 10^{-6}
  • 温度: 0.6
  • Clip ratio: 0.28
  • 移除KL损失

模型组件

组件说明关键参数
基础架构Llama 3结构8.2B参数,36层
隐藏大小Hidden size4,096
中间大小Intermediate size14,336
注意力机制Grouped Query Attention32查询头,8键值头
上下文长度Context length8K → 32K

训练流程

预训练阶段:

  1. 常规预训练(5T tokens):

    • 前1T tokens:代码相关web数据 + 数学数据,学习率 3×10−43 \times 10^{-4}
    • 后4T tokens:精选代码数据
  2. 持续预训练(1T tokens):

    • 第一阶段:学习率降低10倍,400B tokens
    • 第二阶段:学习率 3×10−53 \times 10^{-5},600B tokens
    • 高质量数据 + 长上下文数据(32K)

指令微调阶段:

  1. SFT(监督微调):

    • 约300万高质量指令-响应对
    • 学习率 2×10−52 \times 10^{-5},3个epoch
    • 难度感知采样
  2. DPO(直接偏好优化):

    • 约20,000个高质量偏好对
    • 专注于代码生成和推理

推理模型训练:

  1. LongCoT预热:

    • 从base模型开始(而非instruct模型)
    • 学习率 2×10−52 \times 10^{-5}
    • 少量蒸馏数据,保留探索空间
  2. GRPO强化学习:

    • 渐进式探索策略:16K → 32K序列长度
    • 优化课程学习:过滤简单问题(正确率>87.5%)
    • 总计250步

数据管道

四类数据:

  1. 文件级代码:GitHub单个代码文件

    • 精确去重 + MinHash近似去重
    • Tree-sitter语法检查
    • LLM质量评分(1.3B回归模型)
  2. 仓库级代码:保持项目结构的代码

    • 基于文件质量分数选择高质量仓库
    • 拓扑连接(Python, Java, C)或随机连接(HTML, SQL, Shell)
  3. GitHub Commits:代码变更数据

    • 74M commits,来自140K高质量仓库
    • 代码变更预测任务格式
    • BM25检索相关文件
  4. 代码相关Web数据:Common Crawl中的代码内容

    • fastText召回(99%召回率,45%精确率)
    • LLM质量过滤
    • 类别特定过滤协议

高质量数据构建:

  • 迭代训练fastText模型(2-3轮)
  • 硬负样本:高分但无注释的代码、fastText召回但LLM低分的代码
  • 最终约130B tokens高质量数据

算法流程

Algorithm 1: Seed-Coder训练流程

输入: GitHub数据, Web数据, 训练配置
输出: Seed-Coder-8B-Base, Instruct, Reasoning

// 预训练阶段
1. 数据预处理
   - 去重(精确 + MinHash)
   - 语法检查(Tree-sitter)
   - 基本过滤

2. LLM质量过滤
   - 训练1.3B回归模型作为评分器
   - 过滤底部10%代码文件

3. 两阶段预训练
   - 阶段1: 5T tokens (代码 + 数学)
   - 阶段2: 1T tokens (高质量 + 长上下文)

// 指令微调阶段
4. SFT数据构建
   - 合成指令生成(种子代码 + 风格增强)
   - 质量过滤(规则 + 模型)
   - 难度过滤(难度分数 < 3 过滤)
   - 沙盒自纠正

5. SFT训练
   - 3M指令-响应对
   - 3 epochs, lr=2e-5

6. DPO训练
   - 20K偏好对
   - 代码生成和推理任务

// 推理模型训练
7. LongCoT预热
   - 从base模型开始
   - 少量蒸馏数据

8. GRPO强化学习
   - 渐进式探索(16K → 32K)
   - 优化课程学习
   - 250步训练

四、核心创新

创新点说明理论/实验依据
模型驱动数据管道用LLM替代手工规则进行代码质量过滤比规则过滤更准确,可扩展
四维度评分标准可读性、模块化、清晰度、可复用性全面评估代码质量
渐进式FIM训练SPM格式,字符级随机分割比PSM略优,减少位置偏差
沙盒自纠正迭代生成+单元测试+修正保留更多高难度样本
优化课程学习过滤简单问题(正确率>87.5%)鼓励更高效的思考token利用
渐进式探索策略序列长度和rollout数量逐步扩展提高训练效率

与人工规则对比

方法优势劣势
手工规则可控、可解释扩展性差、主观偏差、维护成本高
LLM过滤模糊标准、可扩展、一致计算成本高、需要训练评分器

关键发现

  1. LLM过滤有效性:

    • 预训练过程中性能持续提升
    • 与最小规则过滤相比,LLM过滤显著提高基准性能
  2. SPM vs PSM:

    • SPM在训练中略优于PSM
    • 原因:注意力机制的位置偏差
  3. 从Base模型开始RL:

    • Instruct模型在RL中容易退化到SFT模式
    • Base模型保留更多探索空间

五、实验结果

基准测试

实验环境:

  • 模型规模:8B参数
  • 预训练数据:6T tokens
  • 上下文长度:32K

Base模型评估

HumanEval(+)和MBPP(+):

模型大小HumanEvalHE+MBPPMBPP+
StarCoder2-7B7B35.429.954.445.6
DeepSeek-Coder-6.7B6.7B47.639.670.256.6
Qwen2.5-Coder-7B7B72.067.179.468.3
Seed-Coder-8B-Base8B77.468.382.069.0
Qwen2.5-Coder-14B14B83.575.683.669.8

MultiPL-E(多语言代码生成):

模型大小PythonC++Java平均
Qwen2.5-Coder-7B7B72.062.153.258.8
Seed-Coder-8B-Base8B77.469.672.867.6
Qwen2.5-Coder-14B14B83.569.646.862.3

CrossCodeEval(代码补全):

模型大小PythonJavaTypeScript平均
Qwen2.5-Coder-7B7B42.448.146.849.3
Seed-Coder-8B-Base8B49.552.650.553.7
Qwen2.5-Coder-14B14B47.754.752.955.4

CRUXEval(代码推理):

模型大小Input-CoTOutput-CoT
Qwen2.5-Coder-7B7B56.556.0
Seed-Coder-8B-Base8B52.054.8
Qwen2.5-Coder-14B14B60.666.4

长上下文能力:

  • “Needle in the Code”压力测试:32K上下文长度下100%准确率

Instruct模型评估

代码生成:

模型大小HumanEvalHE+MBPPMBPP+LiveCodeBench
Qwen2.5-Coder-7B7B88.484.183.571.717.3
Qwen3-8B8B84.880.577.067.223.5
Seed-Coder-8B-Instruct8B84.878.785.271.224.7
Qwen2.5-Coder-14B14B89.687.286.272.819.3

MBXP(多语言指令跟随):

模型大小PythonJavaC++平均
Qwen2.5-Coder-7B7B83.570.574.172.9
Qwen3-8B8B77.069.072.869.3
Seed-Coder-8B-Instruct8B85.272.777.075.3
Qwen2.5-Coder-14B14B89.676.277.377.4

推理模型评估

推理模型性能

Figure 1: Seed-Coder-8B Instruct和Reasoning变体的基准性能。

IOI’2024和Codeforces:

  • Seed-Coder-8B-Reasoning在竞赛编程任务上表现出色
  • 与更大规模的推理模型竞争

关键发现

  1. Base模型:

    • 在8B规模中达到最先进水平
    • 在7/8编程语言上超越相似规模模型
    • 甚至超越一些13B+模型
  2. Instruct模型:

    • 在LiveCodeBench上表现最佳(24.7)
    • 多语言能力突出(MBXP平均75.3)
  3. 推理模型:

    • RL训练显著提升复杂推理能力
    • 渐进式探索策略提高训练效率

六、相关工作

代码LLM

  • StarCoder/StarCoder2:经典代码LLM,基于The Stack数据
  • CodeLlama:基于Llama 2的代码LLM
  • DeepSeek-Coder:项目级代码预训练
  • Qwen2.5-Coder:多规模代码LLM系列
  • OpenCoder:开源代码LLM,130+手工过滤规则

数据过滤方法

  • 规则过滤:手工规则、Tree-sitter语法检查
  • 模型过滤:fastText、回归模型、分类器
  • 混合方法:规则 + 模型组合

强化学习

  • GRPO:Group Relative Policy Optimization
  • DAPO:避免熵崩溃的Clip-Higher技术
  • LongCoT:长链推理强化学习

七、总结

核心贡献

  1. 模型驱动数据管道:

    • 用LLM替代手工规则进行代码质量过滤
    • 四维度评分标准:可读性、模块化、清晰度、可复用性
    • 1.3B回归模型作为质量评分器
  2. Seed-Coder模型系列:

    • Base模型:6T tokens预训练
    • Instruct模型:SFT + DPO
    • Reasoning模型:LongCoT + GRPO RL
  3. 训练技术创新:

    • 渐进式FIM训练(SPM格式)
    • 沙盒自纠正机制
    • 优化课程学习
    • 渐进式探索策略
  4. 开源贡献:

    • 8B规模,支持研究和部署
    • 在多个基准测试上达到最先进水平

技术影响

  • 数据构建范式:从人工规则到模型驱动的转变
  • 代码LLM发展:8B规模的高性能代码模型
  • 训练方法:LongCoT RL在代码推理中的应用
  • 开源生态:提供可复现的训练流程

局限性

  1. 模型规模:主要在8B验证,更大规模的适用性待探索
  2. 计算成本:LLM过滤需要大量计算资源
  3. 评分器依赖:需要训练专门的质量评分模型
  4. 语言覆盖:虽然支持89种语言,但某些小众语言可能数据不足

未来工作

  1. 更大规模模型(14B-70B)的扩展
  2. 更高效的数据过滤方法
  3. 多模态代码理解
  4. 更长上下文支持(64K+)

八、参考资源

引用

@article{seed2025coder,
  title={Seed-Coder: Let the Code Model Curate Data for Itself},
  author={ByteDance Seed and Zhang, Yuyu and Su, Jing and Sun, Yifan and Xi, Chenguang and Xiao, Xia and Zheng, Shen and Zhang, Anxiang and Liu, Kaibo and Zan, Daoguang and Sun, Tao and Zhu, Jinhua and Xin, Shulin and Huang, Dong and Bai, Yetao and Dong, Lixin and Li, Chao and others},
  journal={arXiv preprint arXiv:2506.03524},
  year={2025}
}