微调数据清洗与质量控制

01-01 Chat Template 解决「数据长什么样」;本篇解决「哪些样本该进训练集」。脏数据会直接表现为:loss 虚低、invalid 率高、某类 F1 崩盘或模型学到错误格式。

段末注释:PII(Personally Identifiable Information,个人可识别信息)指姓名、电话、身份证等敏感字段;微调数据入库前应脱敏或剔除。

系列索引:微调技术路线导读


一、清洗在流水线中的位置

1
2
3
4
5
6
7
原始语料 / 标注导出
├─ 去重(样本级、内容级)
├─ 长度与格式过滤
├─ 标签 / 输出规范化
├─ 安全与合规(毒性、PII)
└─ 划分 train/val/test + 抽检
└─ map → SFT 格式 → [03 SFTTrainer](./03.微调工具-SFTTrainer详解.md)

原则:清洗规则一旦确定,训练与评估 parse 规则必须同源,否则 Invalid 率 与 F1 不可信。


二、去重

层级 方法 适用
样本级 (prompt_hash, label) 完全一致去重 分类、QA
内容级 MinHash / SimHash / embedding 近邻 开放对话、CPT 语料
近重复 编辑距离 / n-gram Jaccard > 阈值 防止模板化样本刷屏
1
2
3
4
5
6
7
8
def dedupe_by_prompt_completion(ds, key_fn=lambda x: (x["prompt"], x["completion"])):
seen, keep = set(), []
for i, ex in enumerate(ds):
k = key_fn(ex)
if k not in seen:
seen.add(k)
keep.append(i)
return ds.select(keep)

注意:多轮 messages 去重应对完整对话哈希,而非单条 user 句。


三、长度与格式过滤

检查项 典型规则 原因
空字段 user/completion 非空 无监督信号
超长 token 数 < max_length 的 95% 分位 避免大量截断丢 label
超短 completion 仅 1 字符且无意义 噪声
角色顺序 system → user → assistant 合法 template 报错
固定输出集 label ∈ 允许集合 分类任务必备
1
2
3
4
5
ALLOWED = {"sadness", "joy", "love", "anger", "fear", "surprise"}

def is_valid_classification(ex):
label = ex["completion"][-1]["content"].strip().lower()
return label in ALLOWED

01-01 §五 检查清单 配合使用。


四、标签与输出规范化

问题 处理
大小写不一致 统一 lower() 或保留 canonical 形
多余标点/换行 strip();分类任务禁止句号后缀
同义标签 映射表:{"happy": "joy", "高兴": "joy"}
多标签 / 拒答 明确策略:丢弃、单选主标签或单独类

评估脚本必须使用同一 normalize 函数


五、安全与合规

类型 做法
PII 正则 + NER 脱敏;或整段丢弃
毒性 / 违禁 关键词 + 分类器过滤;对齐数据尤其要审
版权长文 CPT 语料注意授权;SFT 避免大段粘贴
泄露评估集 train/val/test 按 ID 或实体 互斥划分

六、质量抽检

抽检方式 频率建议
随机人工读 50–200 条 每版数据集发布前
标签分布直方图 每任务必做;不平衡则加权或重采样
模板化检测 同一 prefix 重复 > N 次告警
与基座试生成 抽 20 条看是否「本来就会」

七、划分策略

1
2
3
全集 ── shuffle(seed=42) ──┬─ train 80–90%
├─ validation 5–10% (早停 / 调参)
└─ test 5–10% (最终报告,微调前后共用)
  • 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

-------------本文结束感谢您的阅读-------------