01-01 Chat Template 解决「数据长什么样」;本篇解决「哪些样本该进训练集」。脏数据会直接表现为:loss 虚低、invalid 率高、某类 F1 崩盘或模型学到错误格式。
段末注释:PII(Personally Identifiable Information,个人可识别信息)指姓名、电话、身份证等敏感字段;微调数据入库前应脱敏或剔除。
系列索引:微调技术路线导读
一、清洗在流水线中的位置
1 | 原始语料 / 标注导出 |
原则:清洗规则一旦确定,训练与评估 parse 规则必须同源,否则 Invalid 率 与 F1 不可信。
二、去重
| 层级 | 方法 | 适用 |
|---|---|---|
| 样本级 | (prompt_hash, label) 完全一致去重 |
分类、QA |
| 内容级 | MinHash / SimHash / embedding 近邻 | 开放对话、CPT 语料 |
| 近重复 | 编辑距离 / n-gram Jaccard > 阈值 | 防止模板化样本刷屏 |
1 | def dedupe_by_prompt_completion(ds, key_fn=lambda x: (x["prompt"], x["completion"])): |
注意:多轮 messages 去重应对完整对话哈希,而非单条 user 句。
三、长度与格式过滤
| 检查项 | 典型规则 | 原因 |
|---|---|---|
| 空字段 | user/completion 非空 | 无监督信号 |
| 超长 | token 数 < max_length 的 95% 分位 |
避免大量截断丢 label |
| 超短 | completion 仅 1 字符且无意义 | 噪声 |
| 角色顺序 | system → user → assistant 合法 | template 报错 |
| 固定输出集 | label ∈ 允许集合 | 分类任务必备 |
1 | ALLOWED = {"sadness", "joy", "love", "anger", "fear", "surprise"} |
与 01-01 §五 检查清单 配合使用。
四、标签与输出规范化
| 问题 | 处理 |
|---|---|
| 大小写不一致 | 统一 lower() 或保留 canonical 形 |
| 多余标点/换行 | strip();分类任务禁止句号后缀 |
| 同义标签 | 映射表:{"happy": "joy", "高兴": "joy"} |
| 多标签 / 拒答 | 明确策略:丢弃、单选主标签或单独类 |
评估脚本必须使用同一 normalize 函数。
五、安全与合规
| 类型 | 做法 |
|---|---|
| PII | 正则 + NER 脱敏;或整段丢弃 |
| 毒性 / 违禁 | 关键词 + 分类器过滤;对齐数据尤其要审 |
| 版权长文 | CPT 语料注意授权;SFT 避免大段粘贴 |
| 泄露评估集 | train/val/test 按 ID 或实体 互斥划分 |
六、质量抽检
| 抽检方式 | 频率建议 |
|---|---|
| 随机人工读 50–200 条 | 每版数据集发布前 |
| 标签分布直方图 | 每任务必做;不平衡则加权或重采样 |
| 模板化检测 | 同一 prefix 重复 > N 次告警 |
| 与基座试生成 | 抽 20 条看是否「本来就会」 |
七、划分策略
1 | 全集 ── shuffle(seed=42) ──┬─ train 80–90% |
- test 集全程封存,不参与任何清洗参数拟合(如阈值应用 test 统计量会泄漏)。
- 微调前后评估必须同一 test 子集与同一 decode 策略。
八、常见踩坑
| 现象 | 原因 | 对策 |
|---|---|---|
| train loss 极低、test F1 差 | 训练集泄漏或近重复 | 加强去重;检查 test 污染 |
| 某类 recall 为 0 | 该类样本被洗没 | 看清洗前后 per-class 计数 |
| invalid 率训练后上升 | 训练集 label 不规范 | 清洗阶段 enforce 允许集合 |
| 模型只会拒答 | 负样本 / 「无法回答」过多 | 控制拒答比例 |
九、小结
清洗 = 去重 + 长度格式 + 标签规范 + 安全 + 可复现划分。投入 1–2 天清洗,往往比调 10 组 lr 更有效。
下一步:01-03 偏好数据构造 或进入 02-01 LoRA。