字节Seed:Seed-Coder,model-centric的领域模型训练

《Seed-Coder: Let the Code Model Curate Data for Itself》 这篇论文的核心启发在于提出了一种最小化人工参与、以模型为中心的数据构建管线pipeline来生产大语言模型(LLM)的代码预训练数据。关键做法是利用LLM本身进行代码数据的评分和筛选,而不是依赖大量人工制定的、针对特定语言的过滤规则或人工标注数据。基于此,他们推出了Seed-Coder系列8B模型(基础、指令、推理),并通过监督微调、偏好优化(DPO)以及长链思维(LongCoT)强化学习来进一步提升指令遵循和多步代码推理能力,展示了这种数据策略在提升模型代码相关任务(生成、补全、编辑、推理、软件工程)上的卓越表现。 引言部分强调了现有开源代码LLM在预训练数据构建上对人工的重度依赖(如手工规则过滤)所带来的局限性,包括可扩展性差、主观偏见和维护成本高。最具启发性的一点是作者引用“The Bitter Lesson”来说明AI领域的发展趋势:依赖大规模计算和数据的通用方法最终会胜过依赖人类知识的复杂方法。Seed-Coder正是基于这一理念,倡导使用LLM来自动化代码数据的筛选和评估,从而克服人工方法的瓶颈,并构建了一个包含6万亿token的预训练语料库。 预训练: 数据管线 (Data Pipeline): 启发性在于其解耦的并行设计,允许各个处理模块(如去重、基础过滤、LLM高级质量过滤)独立运行,便于增量扩展和灵活调整,避免了重新运行整个冗长流程。数据被分为文件级代码、仓库级代码、提交记录和代码相关的网页数据四类,并针对不同预训练阶段(常规预训练和持续预训练)进行组合。 数据成分 (Data Ingredients): GitHub数据: 关键做法是构建一个LLM驱动的文件级质量评分模型。他们随机抽取代码文件,让一个“神谕”模型(DeepSeek-V2-Chat)从可读性、模块化、清晰度和可复用性四个维度打分,然后用这些评分数据微调一个13B的Llama 2模型作为高效的质量评估器,过滤掉低质量文件。这比传统基于规则的过滤更能捕捉代码质量的细微差别且可扩展性强。 提交数据 (Commits Data): 做法是将GitHub提交记录格式化为代码变更预测任务,利用提交信息和上下文(包括README、目录结构和BM25检索的相关文件)预测修改的文件和代码补丁,从而让模型学习真实世界的代码演化模式。 代码相关的网页数据: 亮点在于一个优化的两阶段提取框架:首先通过规则提取和fastText模型进行大规模召回(在标注数据上训练,实现高召回率),初步筛选出代码相关内容;然后使用LLM质量过滤器进行精细评估和筛选,并特别注意缓解不同网站类型(如电商、文档、论坛)带来的打分偏见。 用于持续预训练的高质量数据: 关键在于迭代训练fastText模型。先基于特定特征(如质量分、语言、注释率)构建小的种子数据集作为正样本,并精心设计难负样本(如高分但无注释的代码,或第一轮fastText召回但质量分低的数据),以提升fastText模型的判别能力,通过2-3轮迭代扩展高质量数据集。 用于持续预训练的长上下文数据: 通过支持高达32K的序列长度进行长上下文训练。文件级数据通过LLM过滤,而仓库级数据则针对主流语言(Python, Java, C)实施了基于文件依赖关系的拓扑拼接,对于HTML, SQL, Shell等则使用随机拼接,大型仓库则分解为子图,以在保持逻辑连贯性的同时适应上下文窗口。 Fill-in-the-Middle (FIM): 实践中发现SPM(Suffix-Prefix-Middle)模式比PSM模式略好,可能与注意力机制的位置偏见有关。采用字符级随机分割,并在常规和持续预训练阶段设置不同FIM比例。 预训练策略 (Pretraining Policy): 采用了Llama 3架构,82亿参数,分阶段进行预训练,从混合数据开始,然后是大量代码数据,最后在持续预训练阶段转向高质量和长上下文数据,并相应调整学习率。 后训练: 后训练部分展示了如何从预训练好的基础模型进一步打造出强大的指令模型和推理模型。 指令模型 (Instruct Model): 数据构建:多样性 (Data Construction: Diversity): 核心是合成数据生成,强调种子片段多样性(来自高质量GitHub、OSS-Instruct、Markdown/Jupyter/StackExchange等代码-文本混合数据以模拟真实交互)和风格多样性(构建元风格集并随机混合风格,再结合WildChat数据)。 数据过滤:质量与难度 (Data Filtering: Quality and Difficulty): 结合规则(Tree-sitter去语法错误)和模型(LLM评估正确性)进行质量过滤;通过主题分类和模型评估难度来筛选出过于简单的实例。 沙盒验证的自我修正 (Self-Correction with Sandbox Verification): 这是一个非常实用的做法。为了保留高难度样本(它们通常错误率也高),模型被提示生成解决方案和单元测试,在沙盒中评估,并对失败的方案进行迭代修正,直到测试通过或达到最大尝试次数。 ...

May 11, 2025 · 小茄墩