重复内容怎么来的
重复来自多版本文档、多来源转载与重复导入。检索侧用内容指纹与向量相似度把近重复识别出来,入库侧用唯一键与版本替换规则防止重复写入。重复不清理会挤占上下文预算,让同一段内容在候选里出现多次,等于放大这条内容的权重,答案也更容易被旧版本带偏。
基本信息
| 识别手段 | 内容指纹(归一化后哈希)与向量相似度聚类 |
|---|---|
| 去重层次 | 文件级、切片级与段落级,通常切片级最有性价比 |
| 保留规则 | 版本最新、来源权威、结构完整,规则要事先写清 |
| 审计要求 | 删除动作记入日志,可追溯也能回滚 |
典型使用场景
- 多版本手册:旧版与新版同时入库,需要按版本替换而不是并存
- 转载治理:同一篇文章被多个渠道抓取,入库时合并成一条
- 重复导入排查:同步任务失败重跑后产生重复切片,需要幂等清理
- 上下文预算优化:把重复片段腾出的位置留给其他候选
- 排序质量提升:去掉近重复后,重排阶段的候选更具多样性
入库指纹去重
入库指纹去重
import hashlib
def fingerprint(text):
normalized = " ".join(text.split()) # 先归一化空白与换行
return hashlib.sha256(normalized.encode("utf-8")).hexdigest()[:16]
# 写入前查询指纹表:已存在则更新元数据或直接跳过
# 归一化规则要固定,否则同一段文本会算出不同指纹
近重复清理
近重复清理
dup_groups = cluster_by_similarity(chunks, threshold=0.95) # 阈值需评测
for g in dup_groups:
keep = pick_newest(g) # 保留最新版本,也可改用来源权威度
for c in g:
if c.id != keep.id:
store.delete(c.id, reason="near-duplicate") # 删除要留痕
去重层次
| 层次 | 方法 | 注意 |
|---|---|---|
| 文件级 | 按文件名与修改时间判断 | 内容相同但改名后仍会重复入库 |
| 切片级 | 内容指纹或高相似度聚类 | 阈值过高漏判,过低误删 |
| 段落级 | 按段落哈希比对 | 段落被轻微改写就识别不出来 |
| 语义级 | 向量相似度聚类 | 计算成本最高,适合定期批处理 |
去重保留哪一份要有明确规则(版本新、来源权威、结构完整),并把删除动作记入审计日志,避免误删后无法追溯。
去重不能只做一次:新语料持续进入,重复会再次累积,建议把指纹检查放进写入流程,把语义级聚类做成周期性任务。