登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  科技周边 >  人工智能

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 对照,看完整证据是否至少被一块包含。这里要找的是“证据范围”,不是任意重复关键词。

原文证据范围与两个切片及其重叠区域的静态关系
图1:静态范围说明图。两个切片的共享原文可以补足边界附近的上下文,但不能凭空补充原文不存在的答案。

例如“提交复核后需要补充哪些字段”的答案句跨过边界时,让下一块带上前一块末尾的一小段,可能使条件和字段名称一起进入下一块。若条件在上一章节,答案在很远的段落,大幅加 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 开始,可以容纳示例的完整证据范围。这个结论来自示例构造与范围关系,本文没有执行代码,也没有生成实测终端输出。

chunk size、overlap、窗口步长以及重复字符量与上下文预算的静态依赖框图
图2:静态参数说明图。size 与 overlap 共同决定固定窗口步长,重复内容影响总字符量与上下文预算;不是实际召回率或性能结果。

代码把 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,比套用固定比例更有依据。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>