上下文去重与修剪是什么
检索回来的片段不能直接全部塞进上下文,进模型之前要做两件事:跨片段去重,同一段内容常被切成多块同时命中;冗余修剪,只保留与问题最相关的句子或段落。修剪后的片段必须保留来源锚点,否则引用无法回溯。这通常是提升答案质量最划算的一步——上下文更干净,模型的注意力也更集中,成本还同时下降。
基本信息
| 两件事 | 跨片段去重与冗余修剪 |
|---|---|
| 去重手段 | 相似度阈值(如 Jaccard)或内容哈希 |
| 修剪手段 | 按句子与问题的相关性筛选 |
| 硬性要求 | 保留来源锚点与原文范围 |
| 前置治理 | 索引中的多版本片段先清理 |
| 观测指标 | 进上下文前后的片段数、去重命中率 |
典型使用场景
- 同一文档的多个分块命中同一段内容
- 增量索引未替换旧版本,新旧片段同时被召回
- 上下文预算紧张时优先保留最相关的句子
- 精排之后仍有大量重复,需在进模型前再洗一遍
- 多路召回融合后出现高度相似的片段
简单有效的去重
简单有效的去重
def dedupe(chunks, threshold=0.9):
kept = []
for c in chunks:
if any(jaccard(c.text, k.text) > threshold for k in kept):
continue # 与已保留片段高度相似,丢弃
kept.append(c)
return kept
# 去重只做删减,不改写内容:改写会让引用与原文对不上问题与处置
| 问题 | 表现 | 处置 |
|---|---|---|
| 重复片段 | 同一内容被多次命中 | 阈值去重或按来源合并 |
| 旧版本混入 | 新旧版本片段同时被召回 | 先治理索引,再做去重 |
| 长片段冗余 | 片段大部分内容与问题无关 | 句子级修剪,保留锚点 |
| 锚点丢失 | 引用出来的段落不完整 | 修剪后同步更新锚点范围 |
增量索引没做版本替换时,同一文档的多版本片段会同时命中;去重前先把索引治理干净,否则只是掩盖问题。
去重与修剪都只能删减、不能改写:一旦改写了片段内容,引用就对不上原文,溯源自此失效。