聊大模型的时候,参数量总是主角,语料像一场不动声色的背景板。但模型能接触哪些语言、知识、文风乃至偏见,第一步就由数据圈定——数据不是训练前的杂务,它本身就是模型行为的一部分。
清洗流程的每一步都在改写分布
一条常规流水线:来源登记、格式解析、语言识别、质量过滤、近重复检测、隐私处理、切分、Token 化。看起来是纯工程步骤,实际上每一步都在调整数据分布:网页去噪会顺手删掉表格上下文,去重会误伤合法的模板文本,质量分类器天然偏向某种文体。所以清洗的目标不是"看起来干净",而是让训练集适配预期用途,并且能解释它的来源、限制与处理方式。
四个进场前必须回答的问题
- 来源与权限:数据从哪来、授权是什么、能否用于训练;
- 覆盖与代表性:哪些语言、领域、文体被过度或不足代表;
- 重复与污染:内容重复度多高、评测题有没有漏进训练集;
- 隐私与敏感信息:个人信息如何发现、最小化、处理。
这四问的价值不在问卷本身,而在逼着团队把"数据决策"当成产品决策来管理。
增量:去重的工程做法与验证命令
近重复检测不是模糊概念,落地上主流路线是 MinHash + LSH:对文档取 shingle(n-gram 特征),用多个哈希函数生成最小哈希签名,分桶后只比对同桶候选,把 O(n²) 的两两比较压到近似线性。开源工具里 text-dedup 和 Google 出的 deduplicate-text-datasets 都能直接用:
# text-dedup:MinHash 近重复检测示例
python dedup.py \
--path data/corpus.jsonl --output data/corpus_dedup.jsonl \
--method minhash --threshold 0.8
# 验证:统计删除比例,并人工抽查 50 条被删样本
wc -l data/corpus.jsonl data/corpus_dedup.jsonl
shuf -n 50 data/dropped.jsonl | head
判定标准给两条:全网抓取类语料的重复率常见在 30%~60% 区间,明显低于 10% 通常说明阈值过松或分桶参数错了;抽查被删样本里"合法保留内容"(如同一规范的不同版本)占比超过 20%,就该回调阈值——版本之间的差异可能恰恰是模型要学的。
评测污染的检查同样有成熟做法:对每条评测题提取 13-gram,与训练语料做精确匹配(GPT-3 论文同款方法),命中的评测题要么剔除要么单独报告"受污染分数"。一个实用经验:模型在某评测集上分数异常高、但换个措辞的同能力题分数掉一截,先查污染再谈能力。
增量:质量过滤的反面案例与修复
质量分类器是最容易"好心办坏事"的一环。公开复现里反复出现过一个坑:基于规则或分类器的过滤会系统性淘汰方言、专业术语密集文本和低资源语言——平均分涨了,少数任务悄悄退化。修复办法是把验证做成分层闭环:
- 过滤前后各抽 2000 条,按语言和领域分层统计保留率;
- 任一层保留率跌幅超过 30%,视为该层被过度清洗,回调该层阈值;
- 用同一份小规模训练配置跑过滤前/后两版语料,对比分层评测而非总分。
隐私与版本化:不能只靠正则
姓名、电话、身份证号能靠模式匹配抓大头,但上下文里的身份线索、内部项目代号、组合信息(科室+工号+疾病名)正则无能为力,需要 NER 加人工复核兜底。拿不准能否使用的材料,不能因为"网上能搜到"就默认可以训练。
版本化是最后一道保险:数据版本、过滤规则、抽样样本一起存档。语料不大可以直接 git + git-lfs,几百 GB 起步就上 DVC 或对象存储清单文件。能力退化时才有得回溯:是分布变了、过滤规则变了,还是训练配置变了。给每条数据留来源、许可证、处理时间和过滤原因,不是为了应付审计,是为了三个月后能定位"模型突然不认识某类术语"到底是语料缺失还是规则误删。
模型学到什么,不只由目标函数决定,也由哪些材料被允许进入目标函数决定——这句话值得贴在每条数据管线的入口。

评论0