问题修复
微调数据集准备与校验:格式选择、模板掩码、packing…
在把原始数据转成 SFT/偏好训练格式、应用 chat template、配置 sequence packing、生成合成数据或写 dataset card 时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
微调数据集准备与校验:格式选择、模板掩码通用
解决思路
- 按目标方法选择数据格式:SFT 单轮用 Instruct(instruction/response 或 prompt/completion);SFT 多轮用 Conversation/ChatML 的 messages 列表;DPO/ORPO 用偏好对(prompt、chosen、rejected);KTO 用非配对(prompt、completion、label);GRPO/RLVR 用仅 prompt(prompt + verifier metadata)。
- SFT 建议至少约 1,000 行作为下限而非目标;低于此数量时少量低质或重复样本会主导梯度,高于此数量时以质量优先——更小的已验证去重集合优于更大的噪声集合。
- 在任何拼接或 packing 之前先应用目标模型的 chat template,绝不能在之后——先 pack 原始文本再对打包块套模板会破坏轮次边界,使 role marker 落在错误位置。
- 只在 assistant 回复上训练:在 system/user 轮次及模板自身的 role marker 上掩码 loss(labels tensor 中置 -100),只有 assistant 轮内容 token 参与 loss。
- 避免 template/tokenizer 不匹配这一主要静默失败模式:训练用的 chat template 必须与推理和评测时使用的一致,否则模型会无报错地退化。
- 保持数据集为 messages 形状,让 trainer 负责套模板和掩码(当前 TRL 中用 assistant_only_loss=True);预渲染成扁平文本字段会破坏掩码所需的轮次边界。
- 训练前做 sanity check:只解码未被掩码的位置,应只看到 assistant 文本,例如 keep = batch["labels"][0] != -100; print(tokenizer.decode(batch["input_ids"][0][keep]))。
- 启用 packing:不 packing 时 40–70% 算力花在 padding 上;packing 将多个样本拼接到最大长度以减少浪费。
- 注意 packing 改变 batch 语义:一个 packed 序列可能含多个原始样本,steps per epoch 和按样本数计的 LR schedule 会变化,需按 packed-sequence 数量重算 schedule 里程碑。
- 强制步骤:扩展到完整训练前,解码并人工检查 5–10 个 packed 序列,确认样本边界、每个子样本的模板标记完整、loss mask 在每个 packed 序列内仍只针对 assistant;packing bug 是静默的(loss 曲线正常),只在数小时后的评测质量中暴露,例如 for seq in packed_dataset.select(range(10)): print(tokenizer.decode(seq["input_ids"]))。
- 合成数据保留 ≥25% 真实数据作为 collapse guard;真实数据指“不是由该学生模型为该任务生成的”,通用领域 replay 行也计入该下限,全合成数据集可通过 replay 满足下限,并在 dataset card 中说明哪些行算作“真实”。
- 合成数据主力方法是 Magpie 和 rejection sampling:Magpie 从模型自身模板先验中抽取 prompt,rejection sampling 对每个 prompt 生成多个候选并只保留通过过滤器的。
- 采用针对学生模型失败模式的定向生成,比静态生成样本效率高 1.3–2 倍,能用更少过滤样本达到质量门槛。
- 按过滤后典型接受率 10–30% 规划生成量:目标 10,000 行、15% 接受率需要约 65,000+ 原始生成。
- 为每个进入训练的数据集写 dataset card,作为 /finetune 启动前检查的 Phase 2 必需产物,必须包含六个字段:Provenance(每行来源,可追溯到 trace-to-training-data 输出)、Counts(总行数及各 split 行数)、Synthetic/real ratio(实测比例并对照 ≥25% 真实下限)、Dedup method(精确匹配、语义/embedding 阈值或两者)、Template used(确切的 chat template 字符串/标识符,推理与评测保持一致)、Packing config(是否 packing、最大序列长度、确认已完成 5–10 序列人工检查)。
- 交接给 /finetune 前完成 Phase 2 退出清单:格式匹配方法、模板在拼接前应用、loss 仅掩码到 assistant 轮、解码并阅读 5–10 个 packed 序列、最终混合中 ≥25% 真实数据、dataset card 六个字段完整。
适用边界 · 注意事项
- 尚未通过 finetuning-method-selection 确定微调方法时——本技能假设已完成方法路由,下一步是准备数据而非选方法。
- 数据集缺少 dataset card 六个必需字段之一时——card 是进入 /finetune 的门禁,不是事后补写的总结。