切片重叠是什么
重叠(overlap)让相邻切片共享边界处的一段文本,作用是兜住恰好被切在切口处的句子与条款:某个答案横跨两块时,至少有一块包含完整表述。经验取值是块长的 10% 到 20%,超过这个区间收益递减而重复率上升——检索会返回多条内容高度相似的片段,既浪费候选位也挤占上下文预算。重叠只是缓解手段,让切片对齐句子或段落边界才是根治办法。
基本信息
| 参数含义 | 相邻切片共享的字符数 |
|---|---|
| 常用取值 | 块长的 10%~20%(如 size=500 取 50~100) |
| 硬约束 | overlap 必须小于 chunk_size,否则步长非正 |
| 副作用 | 切片总数与索引体积增加,重复内容变多 |
| 更优替代 | 按句子、段落、标题边界对齐切分 |
典型使用场景
- 条款类文档:一条规定横跨切口时,重叠能保住完整表述
- 固定长度基线调参:观察不同重叠下召回率与切片数量的变化
- 评估重复度:统计检索结果中相似片段占比,判断重叠是否过激
- 混合策略:结构化文档先按标题切,只在长段落内部用重叠兜底
- 成本核算:按重叠比例估算索引体积与向量化费用的增幅
不同重叠的切片数量
不同重叠的切片数量
def chunk(text, size, overlap):
step = size - overlap # 步长必须为正
return [text[i:i + size] for i in range(0, len(text), step)]
text = open('doc.txt', encoding='utf-8').read()
print('无重叠:', len(chunk(text, 500, 0)))
print('10% 重叠:', len(chunk(text, 500, 50)))
print('20% 重叠:', len(chunk(text, 500, 100))) # 条数与成本同步上升重叠比例的取舍
| 比例 | 效果 | 代价 |
|---|---|---|
| 0% | 切口处内容可能被拆开 | 成本最低 |
| 10% | 多数跨块句子可被兜住 | 索引体积小幅增加 |
| 20% | 边界更稳 | 重复片段开始变多 |
| >30% | 收益趋缓 | 检索结果高度冗余,占用上下文预算 |
重叠会让同一个答案在三、四条候选里重复出现:去重与按父文档聚合选代表块,是配合重叠使用的必要动作。