难度
进阶
从任务定义、样本模板、数据清洗、多样性设计到评测回流,建立一套可落地的指令微调数据工程方法。
难度
进阶
阅读时长
约 110 分钟
更新日期
2026/03/24
主题
SFT / 数据工程 / 训练工程 / 指令数据
读完这篇文章后,你应该能:
如果说 大模型训练流水线总览 讲的是整体地图,那么这篇文章关注的是 SFT 这一步最容易被低估的地基。
SFT 的目标,是把“会续写”的基础模型变成“会按产品要求回答”的模型。这个阶段真正想学的是:
这些行为大多不是靠堆更多参数学来的,而是靠高质量样本塑造出来的。于是你会发现:
所以 SFT 数据质量,常常比“学习率调了多少次”更影响最终体验。
很多团队做 SFT 时,最大的错误是“什么都想让模型会一点”。结果就是:
一个更健康的做法,是先把任务压缩成清晰的场景。例如:
任务越明确,你越容易回答这些关键问题:
一份 SFT 样本最重要的是结构一致。以对话样本为例,常见格式如下:
{
"messages": [
{ "role": "system", "content": "你是一个严谨的中文技术助手。" },
{ "role": "user", "content": "请比较 FlashAttention 和普通 Attention 的主要区别。" },
{ "role": "assistant", "content": "## 核心区别\n...\n\n## 适用场景\n..." }
],
"metadata": {
"task_type": "tech_qa",
"source": "human_written",
"difficulty": "medium"
}
}
这里有两个层次:
messagesmetadata后者不会直接被模型消费,但它对数据工程很重要。因为当你发现某类样本总是出问题时,只有保留元信息,才方便回溯。
“高质量”如果没有被写成规则,就会沦为空话。一个实用的标注规范,至少要写清以下维度:
| 维度 | 需要回答的问题 |
|---|---|
| 正确性 | 事实是否准确,是否有明显幻觉 |
| 完整性 | 是否覆盖了任务要求的关键点 |
| 风格一致性 | 语气、结构、长度是否符合产品要求 |
| 可执行性 | 如果是步骤型任务,读者能否直接照着做 |
| 风险边界 | 面对敏感问题时,是否有恰当拒答或降级策略 |
当标注者之间出现分歧时,优先修规范,而不是只要求“多做几遍”。规范不清,返工会无限发生。
SFT 数据常见来源包括:
这些来源都能用,但风险不一样:
优点是可控、风格稳定;缺点是成本高、覆盖面有限。
优点是真实;缺点是噪声重、格式不统一,且常带隐私与合规风险。
优点是速度快;缺点是容易把强模型的偏见、幻觉和模板腔一起复制下来。
优点是最贴近真实需求;缺点是如果筛选不好,模型会不断学习用户噪声与异常模式。
最务实的做法通常是混合来源,但必须为不同来源设置不同的抽检强度和采样权重。
SFT 数据最容易掉进的两种坑,分别是:
所以真正要追求的是“有边界的多样性”。你可以在下面几个维度上做适度扩展:
但有些维度应该尽量稳:
换句话说,用户的表达可以多样,模型的行为规则不能漂。
一套最小可行的数据清洗流程,通常包括:
如果你跳过第 5 步,只靠自动脚本,常会出现一个危险现象:
数据看起来更干净了,但真正有价值的复杂样本也被一起清掉了。
所以清洗不是“越严格越好”,而是“更接近产品目标”。
为了避免“一刀切”,你可以把数据按质量分层,而不是简单保留 / 删除:
这样做的好处是:
很多成熟团队并不是数据天生质量高,而是他们有明确的分层和回修机制。
SFT 数据的质量不能只通过训练 loss 判断。更可靠的方法是单独构建评测集,并显式覆盖以下类型:
例如,你做的是技术问答助手,那么评测至少要检查:
如果模型在训练集风格下表现很好,但一遇到改写问题就崩,说明你缺的不是更多同模板样本,而是分布覆盖。
训练前的数据质量很重要,但真正让 SFT 持续升级的,往往是上线后的失败样本回流。一个简单闭环可以这样建立:
这个过程的重点不是“每天都重训”,而是让每次数据新增都对应一个明确问题。
强模型输出常常可读性很好,但不代表事实一定对。蒸馏数据一样需要抽检。
在 SFT 阶段,低质量海量数据非常容易稀释高质量行为模式。很多时候 2 千条高质量样本,比 20 万条脏数据更有价值。
真实产品里,模型什么时候不该答、怎么优雅降级,同样是核心行为。
如果每次都直接覆盖数据集,你会很难知道模型变好或变坏到底是由哪批样本造成的。
从相近主题继续深入,建立连续学习链路。