给大模型的训练语料去重,通常分两档:精确查重和模糊查重。精确查重找完全相同的副本,模糊查重找高度相似的洗稿内容。两档的算法成本差一个量级,用法上是先精确后模糊,层层收紧,这是数据去重的标准打法。
精确查重怎么跑
精确查重的流程三步。进来的是文档集合,先对每篇算一个指纹,常用哈希算法把整篇内容压成一个短串。发生的是指纹比对,相同内容的指纹必然相同,用哈希表一查就是。出去的是重复组,每组保留一份,其余标记删除。
指纹算法本身也在演化。早期的整篇哈希对空格和标点敏感,一个字符不同就判不同,后来加入归一化处理,先统一大小写、压缩空白再算指纹,命中率明显提高。
文档级跑完可以下沉到段落级。把每篇切成固定长度的段落,逐段算指纹,跨文档比对。这一步能抓住整篇不同、大段雷同的洗稿初级形态。语料质量打分通常排在去重之后,避免重复副本把质量分布带偏。
模糊查重的近似思路
模糊查重要解决的是“不完全一样但几乎一样”。常用思路是局部敏感哈希:把文档切成小片段,分别算指纹,只要两篇有足够比例的片段命中,就判为近似重复。进来的是文档和阈值,发生的是分片加索引加比对,出去的是近似重复组。
阈值的选择是这档的核心矛盾。设得松,洗稿内容漏网,它们继续占用训练预算;设得紧,合理改写被误伤,多样性受损。没有万能阈值,通常按数据来源分设几套,再抽样人工抽查兜底,这也是标注规范要覆盖的判断口径。
分片大小是另一个参数。切太碎,短文档的命中数不够,统计不稳;切太整,近似能力下降。实践中常按文档长度动态调整分片长度,长文档切大段、短文档切小段。
两档之间的取舍
精确档便宜,跑全量语料也就几个小时,应当无条件先做。模糊档贵,分片和索引都是重活,超大规模语料上要算清楚性价比。折中做法是分层抽样:全量跑精确,抽样评估模糊档的命中率,再决定模糊档是否值得全量上。
两档的收益也不同。精确档主要省算力,模糊档主要治复读。如果模型生成时频繁复读固定段落,多半是模糊档没做到位。中文语料里洗稿内容多,模糊档的优先级比英语数据场景更高。
两档的成本和用处不在一个量级,什么时候上哪一档,看这张表。
| 档位 | 成本 | 解决什么 | 怎么用 |
|---|---|---|---|
| 精确查重 | 便宜,跑全量语料也就几个小时 | 省算力 | 无条件先做,全量跑 |
| 模糊查重 | 贵,分片和索引都是重活 | 治复读 | 超大规模上先算清性价比 |
| 分层抽样折中 | 只跑抽样,不全量 | 用样本估模糊档的命中率 | 全量精确加抽样评估,再定模糊档是否全量 |
规模变大后的调整
语料规模上去之后,单机跑不动,要拆。常见做法是按哈希分片,把语料切成若干桶,桶内独立查重,跨桶的重复靠分片策略兜住大部分。索引也要换更省内存的结构,牺牲一点召回换可行性。
去重结果要留档。每轮删了哪些、命中率多少,都记录下来,回滚和审计时用得上。数据团队踩过的最常见的坑,是去重脚本升级后没留记录,出问题无法追溯,只能整批重跑。
增量场景另有一套逻辑。新数据每天进来,全量重跑不现实,通常新数据先和存量建索引比对,重复的直接拦在门外。日常工具里,豆包和文心一言背后的数据管线都按增量思路运转,这也是数据质量过滤能长期维持的原因。
速查表:去重两档=精确哈希查重、模糊近似查重;顺序是先精确后模糊;阈值按来源分设;增量场景先和存量比对再入库。
关于数据去重方法,问得最多的三个
- 模糊查重会把合理引用也算重复吗?会,引用片段短、占比低,通常设最小命中比例来放过短引用。
- 去重后数据量掉多少算正常?视来源而定,聚合站点数据掉三成不稀奇,权威站点数据通常个位数百分比。
- 增量数据和存量比对要用同一套阈值吗?不用,存量已去过重,新数据只需对齐存量标准,避免重复劳动。


