RAG分块策略:如何拆分文档以获得更好的检索
文档拆分方式悄然决定RAG质量。策略、权衡以及如何选择。
分块是你将文档拆分成嵌入并存储以供检索的小段落的方式,它是对RAG质量最被低估的杠杆。分块太大,相关性被稀释;分块太小,丢失答案所需的上下文。本指南涵盖主要策略——固定大小、递归、句子和语义、结构感知(Markdown和代码)以及带重叠的父文档检索——此外还有分块如何与嵌入模型的上下文窗口交互,以及一个用于选择起点的决策表。
这是自托管RAG完整指南的深入探讨。如果你还没有构建管道,请先阅读该部分;本页假设你了解什么是嵌入和检索。
为什么分块比模型选择更重要
大多数团队将调整预算花在交换嵌入模型和LLM上。实际上,糟糕的分块比模型选择更能破坏RAG系统。原因是机械性的:你检索的是块,而不是文档。放在块边界内的任何内容都是嵌入模型必须表示为单个向量的单元,也是检索器可以完整返回或根本不返回的单元。
两种故障模式占主导地位:
- 稀释。 一个包含3000个token、在一句话中提及目标事实的块,会生成一个平均化块中所有其他内容的向量。相关信号被冲走,该块在需要的查询中排名低于应有水平。
- 碎片化。 一个包含100个token、将过程切成两半的块能够干净地检索,但答案不完整。模型从未看到步骤4,因为它位于未被检索的下一个块中。
好的分块使每个块连贯(一个想法、一个主题、可独立阅读),并且大小适合嵌入模型和答案。以下所有内容都是为这两点服务的。
固定大小分块
最简单的策略:每隔N个字符或token拆分文本,可选带重叠。在800个token处切断,滑动窗口,重复。
它快速、可预测且易于并行,这就是为什么它是许多教程中的默认方法。问题在于它完全忽略意义——它会愉快地切过句子、表格行或代码块的中间。对于没有强结构的清晰散文,它是一个合理的基线。对于任何有标题、列表或代码的内容,你可以几乎不费额外努力做得更好。
将固定大小作为你的起点,而不是终点。
递归字符/token拆分
这是2026年大多数文本合理的默认值,也是RecursiveCharacterTextSplitter(LangChain)和LlamaIndex中的节点解析器开箱即用所做的事情。你给它一个有序的分隔符列表——通常是段落分隔符,然后是换行符,然后是句子,然后是空格——以及一个目标块大小。它首先尝试在最大的分隔符处拆分,仅当片段仍然超过限制时才回退到较小的分隔符。
效果是尽可能尊重自然边界,仅作为最后手段在句子中间切断。你获得的块大多在段落或句子边缘开始和结束,同时保持在你的大小预算内。对于一堆你不想要编写自定义解析器的异构文档,使用合理大小和重叠的递归拆分作为起点很难被超越。
句子和语义分块
两种更注重意义的方法位于递归拆分之上。
句子窗口/基于句子拆分将整个句子分组到大小预算内,从不将一个句子切成两半。成本低,并且消除了最刺耳的边界问题。
语义分块更进一步:它嵌入句子(或小片段),然后在相邻片段之间的嵌入相似度低于阈值时放置边界——即主题转换的地方。结果是跟踪主题变化而非任意长度的块。它在混合主题文档上产生明显更连贯的块。
代价是成本和复杂性。语义分块在摄入期间运行嵌入模型仅仅为了决定边界,这增加了时间和活动部件。它在长篇、漫无边际的文档(会议记录、研究论文、庞大的维基)中表现出色,其中固定窗口内的主题漂移才是真正的问题。对于整洁、结构良好的文档,回报较小——结构感知分块通常更经济地达到目的。
结构感知分块(Markdown、HTML、代码)
如果你的文档有明确的结构,请使用它。这通常是最具杠杆作用的操作。
Markdown和HTML。 按标题层次拆分。一个Markdown感知的分块器将每个部分与其标题保持在一起,并可以将标题路径(# Setup > ## Database > ### Migrations)作为元数据附加到每个块上。这些元数据非常宝贵:它为模型提供了块所在位置的上下文,并为你提供了一个可过滤的字段。将FAQ在其##边界处拆分,使每个问答成为一个块,这往往是整个优化。
代码。 朴素的字符拆分会破坏代码——它会切断函数并使括号孤立。使用语法感知的分块器(LangChain和LlamaIndex提供语言感知的解析器;tree-sitter支持更好的那些),它在函数和类边界处拆分,使每个块都是完整、可解析的单元。将文件路径和符号名称保留在元数据中。
表格和PDF。 表格和多列PDF布局是长期的痛点。尽可能将表格保留为单个块,并考虑在分块之前而非之后使用布局感知的提取器(如Docling或Unstructured之类的工具)——一旦PDF被扁平化为破碎的文本,没有分块器能恢复行。
结构感知分块与你与向量一起存储的结构化元数据自然配对,然后可以在查询时进行过滤。
重叠和父文档检索
两种技术直接对抗碎片化问题。
重叠将前一个块的一部分重复到下一个块的开头——通常为块大小的10–15%。这样,跨边界出现的句子在两个块中都出现,因此检索到任何一个都会保留该想法。这是防止接缝处上下文丢失的廉价保险。代价是指数中的轻微冗余和检索上下文中偶尔的重复文本;保持重叠适度,不要将其开到50%。
父文档(从小到大)检索将搜索的单元与返回的单元解耦。你嵌入小而精确的子块(一个句子或短段落)以实现精确检索,但存储从每个子块到其更大父块(完整部分或页面)的指针。在查询时,你匹配小子块以获取精度,然后将大父块交给LLM以获取上下文。这是生产级RAG中最有效的模式之一:它通过拒绝做出大小权衡来规避它。LlamaIndex称之为自动合并/分层检索;LangChain提供了ParentDocumentRetriever。两者都实现了相同的想法。
如果你只从本指南中采用一种高级技术,那就是父文档检索。
块大小及其如何匹配嵌入上下文窗口
块大小是一种权衡,不是一个有正确值的设置。较小的块提供更精确的检索,浪费更少的LLM上下文窗口,但有碎片化风险。较大的块保留上下文但稀释相关性,并且每个检索块花费更多token。
两个硬约束限制了你的选择:
- 嵌入模型的上下文窗口。 每个嵌入模型都有最大输入长度。许多强大的本地模型——
nomic-embed-text、bge、e5——处理大约512个token的有意义输入;一些较新的模型扩展到8k。比模型有效窗口长的块会被静默截断,因此超大块的尾部从未被嵌入。在设置块大小之前,要知道你的模型限制。有关每个模型的数字,请参见最佳本地嵌入模型。 - 生成LLM的上下文预算。 你检索k个块并将它们粘贴到提示中。
k × 块大小加上问题必须舒适地容纳在LLM窗口中,并留有回答空间。大块和大的k会迅速耗尽。
一个同时尊重两者的实用默认值:每个块256–512个token,重叠约10–15%,检索k = 4–8。从那里根据真实的评估集进行调整——绝不要仅靠肉眼观看演示。
决策表
按文档类型的起点。这些是用于评估的默认值,不是规则。
| 文档类型 | 策略 | 块大小(约) | 重叠 | 备注 |
|---|---|---|---|---|
| 清晰散文(文章、书籍) | 递归 | 400–600 token | 10–15% | 句子感知边界;安全默认。 |
| 长篇漫无边际(记录、论文) | 语义或父文档 | 200–400 子块 | 低 | 主题漂移是敌人;从小到大最有帮助。 |
| Markdown / 文档站点 | 结构感知(标题) | 每个部分 | 无–低 | 在##处拆分;附加标题路径作为元数据。 |
| 常见问题解答 / Q&A | 结构感知 | 每块一个问答 | 无 | 每个答案已经是自包含的。 |
| 源代码 | 语法感知 | 每个函数/类 | 无 | 保持符号完整;存储文件路径+符号。 |
| 表格 / 电子表格 | 保持表格完整 | 一个表格/行组 | 无 | 在分块之前进行布局感知提取。 |
| 混合语料库(无时间调整) | 递归 | 512 token | 12% | 所有内容的可靠基线。 |
如何实际选择
不要从博客文章中选择一个策略就发布。从表格中选择一个合理的默认值,然后衡量:
- 构建一个小型评估集——20–50个真实问题,每个问题标记上应该回答它的文档。如何评估RAG指南介绍了整个过程。
- 运行该集合并记录检索召回率——正确的资源出现在前k个中的频率。
- 更改一个变量(块大小、重叠或策略),重新运行,仅在召回率提高时保留更改。
分块本质上是迭代的。拥有良好RAG的团队不是那些猜出完美块大小的团队;而是那些衡量了三个选项并保留获胜者的团队。一旦分块稳定,下一个杠杆通常是混合搜索和重排序。
常见问题解答
RAG的最佳块大小是多少? 没有通用的最佳值。一个可靠的默认值是256–512个token,重叠约10–15%,但正确的值取决于你的文档和嵌入模型的上下文窗口。用评估集衡量两三种大小,并保留检索召回率最高的那个。
块应该重叠吗?重叠多少? 通常是的。大约10–15%的块大小是一个良好的默认值——足以保留跨边界的思想而不膨胀你的索引。过多的重叠(40%+)主要增加了冗余。父文档检索是大重叠更干净的替代方案。
什么是父文档(从小到大)检索?
你嵌入小的子块以实现精确检索,但返回它们更大的父部分给LLM作为上下文。它同时提供了精度和上下文,规避了通常的块大小权衡。LlamaIndex(自动合并)和LangChain(ParentDocumentRetriever)都实现了这一点。
块大小是否需要适配嵌入模型的窗口? 是的。任何超过模型最大输入长度的文本都会被静默截断且从未嵌入。许多本地嵌入模型的有效窗口约为512个token,因此除非你使用长上下文模型,否则请将块保持在该限制以下。
语义分块值得额外成本吗? 对于长篇、主题飘移的文档,通常是值得的——它产生比固定窗口更连贯的块。对于整洁、结构良好的文档,结构感知拆分(按标题)通常以更低的成本获得相同的好处。从递归或结构感知开始,只有在评估表明需要时才转向语义分块。
Aquila是私有、自托管AI搜索的独立指南——建立在这样的信念上:你应该拥有自己的索引,而不是租用它。分块是许多RAG质量成败的关键,因此在自有基础设施上做到正确是值得的。探索更多指南或订阅新闻通讯,获取诚实的、供应商中立的内容。掌控你自己的搜索。