Dataset Curation 是一个数据准备技能,用于将原始示例(演示、偏好判断或任务提示)转换为适合监督微调和偏好训练的格式。它假设上游的 finetuning-method-selection 已经完成路由决策,因此本步骤专注于数据准备本身,而非选择微调方法。
用途
该技能面向微调工作流中的 Phase 2 数据准备阶段。输入是原始示例加上来自 finetuning-method-selection 的路由决策,输出是经过格式化、拼接(packing)、验证的 JSONL 数据集,以及一份完整的数据集卡片。数据集卡片是 /finetune 在启动训练前检查的 Phase 2 必需产物。
具体用途包括:根据目标方法选择数据格式、处理聊天模板与损失掩码、执行 packing 与拼接、制定合成数据生成规则、完成数据集卡片。
主要能力
按方法选择格式
技能按目标微调方法给出对应的数据形状:
- SFT 单轮:Instruct 格式(instruction/response 或 prompt/completion),建议约 1,000+ 行起步。
- SFT 多轮:Conversation / ChatML messages 列表,建议约 1,000+ 行起步。
- DPO / ORPO:偏好对(prompt, chosen, rejected),行数依方法而定。
- KTO:非配对格式(prompt, completion, label),行数依方法而定。
- GRPO / RLVR:仅提示(prompt + verifier metadata),行数依方法而定。
约 1,000+ 行是 SFT 的推荐下限而非目标。低于该值,少量低质量或重复示例可能主导梯度;高于该值时,质量优先于数量——更小的、经过验证和去重的数据集胜过更大的噪声数据集。
ChatML 格式示例:
{"messages": [ {"role": "user", "content": "..."}, {"role": "assistant", "content": "..."} ]}
其他四种格式及 ShareGPT 转换说明见 references/formats-and-templates.md。
聊天模板与损失掩码
在拼接或 packing 之前应用目标模型的聊天模板,绝不可事后应用——先拼接原始文本再对打包后的文本块套模板会破坏轮次边界,导致角色标记相对每个示例落在错误位置。
只在 assistant 回复上训练。对 system/user 轮次及模板自身的角色标记掩码损失(labels 张量中设为 -100)——只有 assistant 轮次的内容 token 参与损失。
模板/分词器不匹配是主要的静默失败模式之一。针对一个聊天模板训练但在推理或评估时使用另一个模板的模型会退化但不报错。需验证训练中使用的相同模板字符串在推理和评估时也被应用。
保持数据集为 messages 形状,让训练器进行模板化和掩码(当前 TRL 中为 assistant_only_loss=True)——预渲染为扁平的文本字段会破坏掩码所需的轮次边界。完整代码示例见 references/formats-and-templates.md。训练前做健全性检查——仅解码未掩码位置;预期只看到 assistant 文本:
keep = batch["labels"][0] != -100 print(tokenizer.decode(batch["input_ids"][0][keep]))
Packing
不做 packing,40–70% 的计算会花在 padding 上——变长示例按固定序列长度批处理会浪费每个示例长度与批次最大值之间的间隙。Packing 将多个示例拼接为一个序列直到最大长度,削减大部分浪费。
Packing 改变批次语义。一个打包序列可能包含多个原始示例,因此“每轮步数”和任何以示例计数为键的学习率调度在开启 packing 后都会变化——需针对打包序列数量重新计算调度里程碑。
强制要求:在扩展到完整训练前,解码并手动检查 5–10 个打包序列。确认示例边界落在预期位置、每个子示例的模板标记完好、损失掩码在每个打包序列内仍然只针对 assistant。这不是可选项——packing 缺陷是静默的(损失曲线看起来正常),只在评估质量中数小时后才显现:
for seq in packed_dataset.select(range(10)): print(tokenizer.decode(seq["input_ids"]))
合成数据规则
保持至少 25% 真实数据作为崩塌防护。在缺少真实数据下限的情况下,训练数据中模型生成数据占比不断上升,会驱动连续迭代后的质量崩塌——25% 真实数据是维持底线的下限。通用领域回放行(replay rows)计入该下限——“真实”意味着“不是由该学生模型为该任务生成的”,而非“人类撰写”。一个构造上全合成的数据集可以通过仅回放来满足 ≥25% 下限(见 references/synthetic-data.md 的 Replay-Mix Construction 配方);需在数据集卡片中说明哪些行算作“真实”,而不是让下限在结构上无法满足。
Magpie 和拒绝采样是主力方法。Magpie 从模型自身模板先验中提取提示;拒绝采样为每个提示生成多个候选,只保留通过过滤器者。两者都优于朴素的单次生成。
有针对性的、面向学生模型的生成比静态生成样本效率高 1.3–2 倍——瞄准学生模型的实际失败模式能以更少通过过滤的示例达到质量门槛。
过滤后典型接受率为 10–30%。据此规划产量——目标 10,000 行、接受率 15% 需要约 65,000+ 次原始生成。生成方法排名、过滤器漏斗、回放混合构造和蒸馏模式见 references/synthetic-data.md。
数据集卡片
每个进入训练的数据集都要有一张卡片——这是 /finetune 在启动前检查的必需 Phase 2 产物。卡片不是自由格式文档;它必须包含以下字段:
- 来源(Provenance)——每一行的出处(真实来源、合成方法或两者),可追溯到 trace-to-training-data 输出。
- 计数(Counts)——总行数,以及各切分行数(train/eval/held-out)(如果切分)。
- 合成/真实比例——测得的比例,对照上述 ≥25% 真实下限检查。
- 去重方法——精确匹配、语义(嵌入阈值)或两者;见 references/synthetic-data.md 中的过滤器漏斗。
- 所用模板——精确的聊天模板字符串/标识符,在推理和评估中保持一致——这是把 eval-harness-first 运行关联回检查点的纽带。
- Packing 配置——是否使用 packing、最大序列长度,以及确认完成了上述 5–10 个序列的手动检查。
缺少这六个字段中任何一个的数据集尚未准备好用于 /finetune——卡片是闸门,不是事后写的总结。
使用方式
- 从 finetuning-method-selection 接收路由决策。
- 根据目标方法选择数据格式。
- 在拼接前应用目标模型的聊天模板。
- 设置损失掩码,仅对 assistant 轮次计算损失。
- 如启用 packing,重新计算调度,并手动解码检查 5–10 个打包序列。
- 若使用合成数据,确保最终混合中真实数据 ≥25%,并记录哪些行算作真实。
- 完成数据集卡片,包含全部六个必需字段。
- 通过 Phase 2 退出清单自检后交接给 /finetune。
Phase 2 退出清单
在交接给 /finetune 前,确认:
- 格式与方法匹配(见上表)。
- 模板在拼接前应用。
- 损失仅掩码到 assistant 轮次。
- 解码并阅读 5–10 个打包序列。
- 最终混合中 ≥25% 真实数据。
- 数据集卡片完成——全部六个字段。
适用场景
- 将原始数据转换为训练格式。
- 将数据转换为聊天格式或打包为微调字段。
- 为微调格式化指令数据。
- 为 SFT、DPO/ORPO、KTO、GRPO/RLVR 准备数据集。
- 构建合成数据混合并防止模型崩塌。
限制
- 本技能不选择微调方法,该决策由上游 finetuning-method-selection 完成。
- 各类方法的行数下限为方法相关,具体数值需参考对应文档(如 preference-optimization、grpo-rlvr-training),本资料未给出具体数字。
- 合成数据的生成方法排名、过滤器漏斗、回放混合构造和蒸馏模式细节需查看 references/synthetic-data.md,本资料仅给出概述。
相关技能
- finetuning-method-selection 路由到此。
- lora-qlora-recipes、vision-sft 和 preference-optimization 消费本技能产出的数据集。
- trace-to-training-data 是分级轨迹数据集(graded-trajectory datasets)的来源出处。
- eval-harness-first 评估生成的检查点。