关于 dataset-curation
dataset-curation 指导微调数据集的格式选择、模板处理、打包、合成数据混合和数据卡编制,适用于准备训练数据的团队。它把格式验证和数据卡作为训练启动前的检查门槛。
主要功能
- 01按微调方法选择数据格式
- 02正确应用聊天模板与损失掩码
- 03打包样本并检查序列边界
- 04控制合成数据与真实数据比例
- 05编制含来源和配置的数据卡
适用场景
- 01将指令或对话整理为训练 JSONL
- 02准备偏好优化或提示词数据
- 03训练前检查打包序列与模板
- 04记录数据来源并验证数据集是否就绪
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ wshobson/ agents --skill dataset-curation安装后在 Claude Code 中输入/dataset-curation确认已加载。
附带文件references/formats-and-templates.mdreferences/synthetic-data.md
详细介绍
数据集整理
本技能假定 finetuning-method-selection
已将流程引导至此 —— 下一步是准备
数据,而不是选择方法。以下内容涵盖:按目标方法进行格式
选择、最常见的静默训练失败背后的模板/打包
机制、在不导致模型崩溃的前提下混合合成数据的
规则,以及在训练启动前收尾 Phase 2 的数据集卡片。
输入: 原始示例(演示、偏好
判断或任务提示词)以及来自 finetuning-method-selection 的
路由决策。
输出格式: 一个已格式化、已打包、已验证的
JSONL 数据集,以及一份完整的数据集卡片 —— 即 /finetune 在启动
训练前检查的 Phase 2 产物。
格式选择
| 方法 | 形态 | 行数 |
|---|---|---|
| SFT,单轮 | Instruct(instruction/response 或 prompt/completion) | 约 1,000+ 下限 |
| SFT,多轮 | Conversation / ChatML messages 列表 | 约 1,000+ 下限 |
| DPO / ORPO | 偏好对(prompt、chosen、rejected) | 因方法而异,见 preference-optimization |
| KTO | 非配对(prompt、completion、label) | 因方法而异,见 preference-optimization |
| GRPO / RLVR | 仅提示词(prompt + 验证器元数据) | 因方法而异,见 grpo-rlvr-training |
-
约 1,000+ 行是 SFT 的推荐下限, 而非目标值。低于此值,少数低质量 或重复示例可能主导梯度; 高于此值,则质量重于数量 —— 一个更小但已验证、已去重的集合 胜过更大但嘈杂的集合。
-
以下为 ChatML 形态,供参考;其余四种 格式外加一条 ShareGPT 转换说明见
references/formats-and-templates.md:{"messages": [ {"role": "user", "content": "..."}, {"role": "assistant", "content": "..."} ]}
Chat 模板与损失掩码
在 任何拼接或打包之前应用目标模型的 chat 模板,绝不要在其后 —— 先打包原始文本再对打包后的块套用模板 会破坏轮次边界,导致角色标记 相对于每个示例出现在错误位置。
-
仅在助手回复上训练。 在系统/用户 轮次以及模板自身的角色标记上掩码 损失(labels 张量中为
-100)—— 只有 助手轮次的内容 token 参与损失计算。 -
模板/分词器不匹配是最大的静默 失败模式之一。 模型在训练时使用一个 chat 模板,但在服务或评估时使用另一个,会性能退化而不报错。验证训练时 使用的同一模板字符串在 推理和评估时也被应用。
-
将数据集保持为
messages形态,让 训练器套用模板并掩码 (当前 TRL 中为assistant_only_loss=True)—— 预渲染为扁平文本字段会破坏 掩码所需的轮次边界。完整代码示例:references/formats-and-templates.md。训练前 做健全性检查 —— 仅解码未掩码的位置; 预期只有助手文本:keep = batch["labels"][0] != -100 print(tokenizer.decode(batch["input_ids"][0][keep]))
打包
不打包时,40–70% 的算力花在 填充上 —— 变长示例在固定序列长度下批处理,浪费了每个 示例长度与批次最大值之间的间隙。打包将多个示例 拼接为一个序列,直至最大长度,消除了大部分浪费。
-
打包改变批次语义。 一个打包 序列可能包含多个原始示例,因此 一旦启用打包,“每 epoch 步数”以及任何以 示例数量为基准的 LR 调度都会变化 —— 需针对打包后序列数量 重新计算调度里程碑。
-
强制要求:在扩展到完整运行前,解码并人工检查 5–10 个打包序列。 确认示例边界落在预期位置、 模板标记在每个子示例中完好无损,且 损失掩码在每个打包序列内仍仅针对助手。这不是可选项 —— 打包 bug 是静默的(损失曲线看起来正常),只会在 数小时后通过评估质量暴露:
for seq in packed_dataset.select(range(10)): print(tokenizer.decode(seq["input_ids"]))
合成数据规则
- 保留 ≥25% 真实数据作为崩溃防护。
在缺乏真实数据下限的情况下,用不断增加的
模型生成数据比例进行训练,会随着代际迭代
导致可测量的质量崩溃 —
25% 真实数据是守住底线的下限。
通用领域的回放样本
计入这一下限 —
“真实”意味着“并非为该任务
由该学生模型生成”,
而不是“由人类撰写”。
一个在构造上完全合成的
数据集,可以仅通过回放
满足 ≥25% 的下限(参见
references/synthetic-data.md中的 回放混合构造配方); 在数据集卡片中说明哪些样本 计为“真实”,而不是 让该下限在结构上 无法达成。 - Magpie 和拒绝采样是 主力方法。 Magpie 从 模型自身的模板先验中提取提示词;拒绝采样 为每个提示词生成多个候选项,只保留 通过过滤器的那些。两者都优于朴素的 单次生成。
- 有针对性的、感知学生模型的生成,其样本效率 比静态生成高 1.3–2 倍 — 针对 学生模型实际的失败模式,能用更少的 过滤后样本达到质量门槛。
- 过滤后的典型接受率为 10–30%。 据此规划数据量 — 一个 10,000 行的 目标在 15% 接受率下需要约 65,000+ 次原始生成。
- 生成方法排名、过滤器漏斗、回放
混合构造以及蒸馏模式:
references/synthetic-data.md。
数据集卡片
每个进入训练的数据集都要有一张卡片 —
这是必需的 Phase 2 产物,/finetune 会在
启动前检查。卡片不是自由形式的文档;
它必须包含以下字段:
- 来源 — 每一行来自哪里(真实
来源、合成方法,或两者兼有),
可追溯到
trace-to-training-data的输出。 - 计数 — 总行数,以及每个划分 (训练/评估/留出)的行数(如果有划分)。
- 合成/真实比例 — 实测比例, 对照上文的 ≥25% 真实数据下限检查。
- 去重方法 — 精确匹配、语义
(嵌入阈值),或两者兼有;参见
references/synthetic-data.md中的过滤器 漏斗。 - 使用的模板 — 确切的聊天模板
字符串/标识符,在推理和评估过程中保持一致 —
这正是将
eval-harness-first运行 关联回检查点的依据。 - 打包配置 — 是否使用了打包、 最大序列长度,以及确认已完成 上述 5–10 条序列的人工检查。
缺少这六个字段中任何一个的数据集都不
能进入 /finetune — 卡片是一道关卡,而不是
事后补写的总结。
Phase 2 退出检查清单
在移交给 /finetune 之前,请确认:
- 格式与方法匹配(见上表)。
- 模板在拼接之前应用。
- 损失仅对助手回合进行掩码。
- 解码并阅读了 5–10 条打包序列。
- 最终混合中真实数据 ≥25%。
- 数据集卡片完整 — 包含全部六个字段。
参考资料
references/formats-and-templates.md— 每种格式的 JSONL 示例、当前 TRL 掩码代码, 以及 ShareGPT 转换说明。references/synthetic-data.md— 生成方法 排名、过滤器漏斗、回放混合构造, 以及教师→学生蒸馏模式。
相关技能:finetuning-method-selection 会路由到
此处;lora-qlora-recipes、vision-sft 和
preference-optimization 会使用本技能
产出的数据集;trace-to-training-data 是评分轨迹数据集的
来源;eval-harness-first 会对产出的检查点进行评分。