RAG 文档切片怎样决定 overlap
来源:17golang原创
时间:2026-10-15 02:30:23 278浏览 收藏
RAG 文档切片的 overlap 应按跨边界证据是否丢失来决定,而不是先规定一个通用百分比。先固定 chunk size 的计量单位与上限,观察哪些答案依赖相邻句段,再从零重叠和少量重叠的候选中选择能保留必要证据、又不过度重复的设置。
如果检索结果找到了问题里的关键词,却缺少紧接着的条件或结论,先检查原文与切片边界。答案本来就在一块里,只是没有被检索到,和答案被切成两半,是不同的问题;增加 overlap 主要针对后一类风险。
先固定 chunk size 的单位,再谈 overlap
chunk size 表示切片大小,overlap 表示相邻块保留的重叠范围,两者必须使用同一计量规则。字符、字节与 token 不能混用。中文文本不能用“一个字符等于一个 token”直接换算;模型输入约束需要用对应 tokenizer 检查。
LangChain 的 RecursiveCharacterTextSplitter 在 length_function=len 时按字符计量,chunk_overlap 是目标重叠量。分隔符、合并边界和原文结构会影响实际块长与实际重叠,因此“设置 100”不等于任意相邻两块都复制了恰好 100 个字符。
官方地址:https://docs.langchain.com/oss/python/integrations/splitters/recursive_text_splitter
确定 size 时要兼顾 embedding 输入限制与检索上下文的有效信息。块过大可能把多个主题混在一起,过小可能把限定条件与答案拆散。给切片补标题、标签等内容时,它们也占输入长度,不能只检查原文正文。
用跨边界证据判断是否需要重叠
选几个真实问题,标出回答所需的最小原文范围:问题里的实体、限定条件、答案句。把这些范围与当前 chunk A、chunk B 对照,看完整证据是否至少被一块包含。这里要找的是“证据范围”,不是任意重复关键词。

例如“提交复核后需要补充哪些字段”的答案句跨过边界时,让下一块带上前一块末尾的一小段,可能使条件和字段名称一起进入下一块。若条件在上一章节,答案在很远的段落,大幅加 overlap 往往只是复制大量无关文本;应先检查切片结构,而不是把重叠当作任意距离的关联工具。
overlap 还带来重复上下文。检索 top-k 相邻块时,同一原文可能重复进入提示词,占据本可用于其他证据的空间。判断改动效果时,除了是否保住答案,还要看候选块是否越来越相似,以及独立证据有没有被挤出。
用带偏移的固定窗口看清边界
下面是无第三方依赖的原创 Python 字符窗口例子。80 与 24 只用于展示边界,不是推荐 RAG 参数。原文使用人工重复的背景句,把完整证据放在字符偏移 75 开始的位置;它会跨过第一个 80 字符窗口的末端。
def windows(text, size, overlap):
# 此示例以 Python 字符数计量,保留原文与左闭右开偏移
if size 0 且 0 = right
]
stored_chars = sum(len(p["text"]) for p in parts)
print("重叠字符数:", overlap)
print("完整证据所在范围:", containing)
print("总存储字符量:", stored_chars, "原文字符量:", len(text))
固定窗口的步长是 size-overlap。overlap=0 时,窗口在偏移 80 附近切开这个证据句;overlap=24 时,下一块从偏移 56 开始,可以容纳示例的完整证据范围。这个结论来自示例构造与范围关系,本文没有执行代码,也没有生成实测终端输出。

代码把 start/end 定义为左闭右开区间,并保留原文字符,不去掉空格、不替换换行。如果先做清洗或在切片中附加标题,这些偏移就不能不加说明地用于原始文件。空文档返回空列表,overlap 不得达到 size,否则窗口无法正常向前推进。
该函数特意采用硬字符窗口来说明数学关系,不适合直接替代所有中文文档的生产切分器。实际处理可优先保留段落和句子,并为中文加入合适标点分隔规则。递归切分的 overlap 是目标值,不能用这个固定步长公式预测每一块的真实起止。
根据漏证据和重复量调整,而不是套比例
| 观察到的现象 | 先看什么 | 可尝试的调整 |
|---|---|---|
| 条件与答案刚好分居边界两侧 | 最小证据范围 | 少量增加 overlap,比较完整覆盖 |
| 关键段落本已在一块内但没被召回 | 问题与实际检索候选 | 不要先把 overlap 当成根因 |
| 相邻块大量重复同一答案 | 独立原文范围和上下文占用 | 降低 overlap,检查块长 |
| 块本身混有多个不相关主题 | size 与段落边界 | 先调整块粒度再比较重叠 |
对照时保持 embedding 模型、检索设置与同一组问题不变,只改一个切片参数。先固定 size 比较 overlap 候选;需要改变 size 时另起一组,避免无法判断收益来自更长的块还是更多重叠。
可记录:完整证据是否被单块覆盖、检索候选是否命中该范围、相邻候选重复了哪些原文、总索引字符或 token 量、装入模型的有效独立上下文。覆盖检查不是召回率,切片数变多也不是效果更好。成本和问答质量应由自己的测试集产生,本文不提供虚构指标。
微软的切片说明也把不同结构与内容类型作为选择条件,并给出起始参数示例。它们是特定上下文里的起点,不是所有中文知识库的最佳设置。参考地址:https://learn.microsoft.com/en-us/azure/search/vector-search-how-to-chunk-documents。
短文档也一定要 overlap 吗?
不一定。若文档已经能完整进入一个语义连贯的块,根本没有相邻边界需要补齐。优先保留它的独立含义,不要为了一个比例制造额外副本。
为什么 overlap 设了值却没有看到那么多重复字符?
先确认切分器的计量函数、分隔规则与实际块内容。结构化或递归切分通常不会像硬窗口一样逐字符保证相同重叠。观察真实起止与原文引用范围,不要只盯配置值。
overlap 越大是否越能降低答案遗漏?
不能保证。它有助于保留附近边界上下文,但也会增加冗余,并可能让检索结果集中在同一段原文。原文缺失、抽取错误或远距离条件关联,都不是继续提高 overlap 就能可靠修复的问题。
最终选择应落在可解释的证据上:哪些问题原来被切断,改动后哪些范围被完整保留,增加了多少重复内容。能回答这三件事,再决定保留哪个 overlap,比套用固定比例更有依据。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
131 收藏
-
491 收藏
-
187 收藏
-
科技周边 · 人工智能 | 1小时前 | LoRa PEFT adapter save_pretrained adapter_model.safetensors selected_adapters save_embedding_layers483 收藏
-
485 收藏
-
386 收藏
-
356 收藏
-
441 收藏
-
266 收藏
-
370 收藏
-
485 收藏
-
118 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习