大模型训练数据质量评估与自动清洗落地

日期:2026-07-31

一、项目背景

我们给一家行业客户做垂直模型微调,第一版效果拉胯。排查下来根因不在模型结构,而在数据:训练语料堆了约 4 TB,有网页抓取的乱码、跨文件重复段落、夹带的个人信息,还有一批标注和文本对不上的"错位样本"。人工清洗雇了十几个人,标准还各写各的,干了两星期只过了一成。我们意识到,行业模型的效果天花板是数据质量决定的,不把清洗流水线化,微调就是浪费算力。于是我们停了训练,先建数据质量评估与自动清洗体系。

二、落地场景

我们基于私有化底座的数据工具链做了三层流水线。第一层"质量评估":对每个样本打分,覆盖重复度、格式合规、隐私风险、标注一致性四个维度,输出可排序的质量分。第二层"自动清洗":近重复去重、隐私字段识别脱敏、格式归一(统一编码/分段/角色标记)、标注错位检测。第三层"回归校验":清洗前后对同批抽样做人工抽检,确认质量分提升且没误杀有效样本。整个流水线跑在离线批处理队列里,错峰占用 GPU,不挤占在线推理。

三、关键技术挑战与解决思路

挑战一是重复与近重复检测。完全重复好去,近重复(同义改写、小改动)才是大头。我们用"句子级 SimHash + 局部敏感哈希分桶"组合:先按文档 SimHash 粗排,再对高相似桶做句子级比对,把改写重复也捞出来,而不是只靠 MD5。

挑战二是隐私字段识别与脱敏。语料里偶尔夹带手机号、身份证片段。我们没有用正则硬匹配(漏报多),而是用轻量 NER 模型识别实体,再按策略脱敏(替换为占位符),脱敏后的样本仍保留语义结构,不影响训练。

挑战三是标注错位与格式归一。很多样本是"指令-回答"对,但部分回答张冠李戴。我们做"指令与回答一致性打分"(小模型辅助),低分样本进人工复核队列而非直接丢弃,避免误杀。格式归一统一成训练需要的对话模板,消除来源差异。

四、效果数据

流水线跑完一轮的脱敏示意值:近重复样本识别并去重约 11.3%(远高于 MD5 能抓的 2.1%);隐私字段识别拦截约 0.7% 的语料,脱敏后全部保留用于训练;标注错位样本检出约 1.9%,其中约 82% 经人工复核确认为真错位被剔除;清洗后同批抽样人工抽检一致率从约 71% 升到约 95%。下游微调在同等算力下,行业任务准确率较脏数据基线提升约 6.4 个点,相当于省了一轮全量训练。

五、可复用经验总结

做行业模型,数据清洗不是一次性的,是和训练同等重要的工程。第一,质量评估要先于清洗——不打分就清洗,你不知道在洗什么、洗掉了多少。第二,近重复靠 SimHash+分桶,MD5 只防完全重复,行业语料里改写重复才是隐性毒药。第三,隐私脱敏用 NER 而非正则,漏报少且能保结构。第四,标注错位别直接删,低分进人工队列,误杀有效样本比留一点噪声更伤。我们把这套评估—清洗—回归的流水线固化成模板,新语料进来先过一遍再进训练。

结语

这个项目给我们最大的教训是:行业模型的效果天花板是数据质量,不是模型结构。第一版拉胯时我们本能想调参、换底座,排查后才发现根子在语料——重复、乱码、隐私、错位混在一起。停掉训练先建清洗流水线,反而比硬训省了一轮全量算力,效果还更好。

质量评估要先于清洗,这句话我们反复验证。不打分就清洗,你根本不知道在洗什么、洗掉了多少有效样本。我们的质量分覆盖重复度、格式、隐私、标注一致性四个维度,清洗前后同批抽样人工抽检,确认质量分提升且误杀率可控,才敢放心进训练。

近重复检测是隐性毒药。完全重复用 MD5 就能抓,但行业语料里大量是同义改写、小改动,MD5 视而不见。我们上 SimHash 加分桶,把改写重复也捞出来,去重率从 2% 跳到 11%,下游任务准确率随之明显抬升。标注错位别直接删,低分进人工队列,误杀有效样本比留点噪声更伤模型。

这套"评估—清洗—回归"流水线我们固化成了模板,新语料进来先过一遍再进训练,已经成为行业微调的标准前置动作。数据工程不像模型那么性感,但它决定了你花的每一分算力有没有打在水面上。

回到起点,我们想说的是:行业模型拼到最后,拼的是数据工程的成熟度,不是谁底座更强。同样一套推理框架,喂干净数据和喂脏数据,效果天差地别。我们把评估、清洗、回归做成标准前置动作后,新客户接入微调的周期缩短、效果更稳定,团队也终于不用在训练失败后瞎猜是模型还是数据的问题。

案例片段(已脱敏): ```

近重复检测(伪代码节选)

doc_hash = simhash(tokenize(doc))        # 文档级 SimHash bucket = doc_hash & MASK_64              # 局部敏感分桶 for other in lsh_bucket[bucket]:    if sentence_jaccard(doc, other) > 0.85:        mark_near_dup(other, keep='higher_quality')

隐私脱敏

ents = ner_model.extract(text) text = mask_entities(text, ents,    strategy='placeholder')  # 保结构脱敏 ``` 清洗前后对同一抽样做人工抽检,确认质量分提升且误杀率可控。