RAG 切块为什么需要 overlap?如何设置?
简化版
Overlap 用于保护跨切块边界的句子、定义与条件,避免查询命中半段证据;但重叠过大会制造重复向量、挤占 Top-k 和上下文预算。应优先按标题、段落、句子或代码函数等语义边界切块,再用小幅 overlap 兜底,并通过 evidence recall、重复率、索引大小和答案质量选值。
详细版
固定窗口中,chunk 长度 C、步长 S,则 overlap O=C-S;C=500 Token、S=400 时 overlap=100,即 20%。若文档长 10000 Token,块数约 ceil((N-C)/S)+1=25,无 overlap 约 20 块,索引量增加约 25%。
Overlap 应与证据跨度和边界方式匹配:完整句/章节切块可较小,OCR 流或固定 Token 切块可能更大;表格行、代码函数不能机械截断。检索后要按 parent_id 和字符区间合并重叠文本,避免模型看到同一句三次。用 0/10/20/30% 消融,按文档类型分别选择,不设全局神奇比例。
chunk1: [0 ---------------- 500]
chunk2: [400 ---------------- 900]
overlap: [400 ---- 500] = 100 Token
完整版教学
一、边界为什么会损坏语义
若一句“仅在购买后 30 天内且未拆封可退款”被切成两块,第一块只有期限,第二块只有条件。查询可能只召回一半,模型就给出不完整结论。跨段指代、定义—解释和代码调用也有同样问题。
Overlap 把边界附近内容复制到相邻块,提高至少一个 chunk 含完整证据的概率。它是对机械边界的保险,不是越多越好的知识增强。
二、用公式理解索引膨胀
文档长度 N、chunk 长度 C、步长 S,块数近似为:
num_chunks = ceil((N - C) / S) + 1
overlap_ratio = (C - S) / C
N=10000、C=500:无 overlap 时 S=500,约20块;O=100 时 S=400,约25块;O=250 时 S=250,约39块。50% overlap 几乎让索引、embedding 和候选重复翻倍。
记忆钩子:Overlap 用存储和噪声购买“边界保险”;保险额应覆盖典型证据跨度,而不是覆盖半篇文档。
三、语义切块优先于重叠补救
按标题、段落、句子、Markdown 节点、代码函数和表格结构切块,能让边界天然落在语义断点。固定 Token 只作为最大长度约束。当一个章节过长,再在句子边界做滑窗。
| 文档 | 推荐边界 | Overlap 重点 |
|---|---|---|
| 说明文 | 标题/段落 | 定义与下段解释 |
| 合同 | 条款 | 不拆条件列表 |
| 代码 | 函数/类 | 签名、注释和调用上下文 |
| 表格 | 表头+行组 | 每块重复必要表头 |
| OCR | 行/版面块 | 修复阅读顺序边界 |
表头重复属于结构上下文,不应与盲目 Token overlap 混为一谈。
四、Overlap 过大会怎样伤检索
同一句在多个向量中出现,查询 Top-5 可能全是相邻块,挤掉另一份必要证据。向量库变大导致构建和 ANN 延迟增加,最终 Prompt 也重复,占用 Token 并放大某条证据权重。评估需看去重前后的来源多样性。
可以在索引中保留每块字符区间和 parent_id。候选融合时把相邻或高重叠区间合并,RRF/rerank 对同一 parent 设配额。不要只依靠文本完全去重,因为相邻块并不完全相同。
五、如何根据证据跨度设置
统计标注答案所需证据的 Token span,以及它跨越切块边界的比例。若 95% 证据段小于 80 Token,且语义切块后只有 5% 跨界,100 Token overlap 可能足够;若问题需要跨多个章节,继续增加 overlap 不如父子检索或多跳检索。
长依赖不能靠把 overlap 调到 80% 解决,那会产生大量副本。用小块命中,回填父章节或相邻节点,再由 reranker 选择完整上下文,结构更清晰。
六、不同粒度的特殊处理
代码应重复函数签名、类名和 imports 元数据,不应从字符串中间切;表格块需附表名、列头和行键;对话记录可按轮次并保留说话人;PDF 多栏先恢复阅读顺序。统一 20% 规则会忽略这些结构。
多语言 Token 密度不同,同样 500 字对应 Token 数不同。切块和 overlap 以目标 tokenizer 的 Token 或结构单位测量,并给字符异常/超长单句安全处理。版本化 chunker,改变策略必须重建索引。
七、怎样做消融实验
固定 embedding、索引和生成器,比较 overlap 0、50、100、150 Token。测 evidence Recall@k、Top-k 唯一父文档数、重复 Token 比、索引大小、检索 P95 和答案准确率。按文档类型切片,选择 Pareto 点。
例如 100 Token 让 Recall 从 80% 到 88%,索引增 25%;200 Token 只到 89%,索引增 67%,边际收益很低。若去重后答案没提升,说明瓶颈可能在 query 或 rerank,而不是继续加 overlap。
八、常见误区与追问
- 误区:固定 20% overlap 适合所有文档。 证据跨度和结构不同,应分类型评测。
- 误区:Overlap 越大越不漏信息。 重复候选会挤掉其他证据并增大成本。
- 误区:有 overlap 就不用语义切块。 结构边界能从根本上减少语义断裂。
- 追问:为什么 Top-k 总是同一段? 重叠块未按 parent/区间去重或设配额。
- 追问:跨章节问题怎么办? 用父子、多跳或邻居扩展,不要无限放大 overlap。
- 追问:调 overlap 要重建索引吗? 通常要,因为 chunk 文本和 ID/向量都改变。
九、加强记忆
Overlap 可记成“保边界、有代价、先结构、后消融”。它复制少量边界让完整证据更易命中,同时增加索引和重复噪声;先按语义结构切块,再根据证据跨度设兜底重叠,检索后按区间合并。用 Recall 增益对索引/重复成本找拐点,没有通用百分比。