RAG 文档切分方法详解:从原理流程到常见策略与场景选择
RAG 文档切分是将长文档拆成语义相关文本块的关键步骤。它连接文档分析与向量检索,影响上下文组织。适合了解递归分块、语义分块和场景选择。

RAG 文档切分是什么
RAG 文档切分,也常称为 Text Chunking 或 Chunking,是把加载后的长篇文档拆成更小、更易处理的文本单元。它是构建 RAG 流程中的关键步骤,目标不是简单按长度截断文本,而是让每个文本块尽量包含语义上相关的内容。
可以把一份长篇技术文档理解为一本书:如果直接把整本书交给检索系统,范围过大;如果先按章节、段落或主题拆成多个知识片段,后续检索就更容易定位到与问题直接相关的部分。
在 RAG 场景中,文本块通常会作为后续向量检索处理的对象。分块质量会影响检索返回的上下文是否聚焦,也会影响大模型基于上下文生成回答时能否抓住关键信息。
要点: RAG 文档切分的核心不是“切得越细越好”,而是把长文档切成大小适当、语义相关、便于检索的文本块。
文档切分处在 RAG 流程的哪一环
在典型 RAG 流程中,文档切分通常发生在文档准备和文档分析之后,并位于向量检索之前。也就是说,系统一般会先收集文档和测试查询,对文档结构与内容进行基本分析,再进入分块阶段。
| 阶段 | 主要任务 | 与分块的关系 |
|---|---|---|
| 文档准备 | 收集、整理待处理文档 | 为后续分析和切分提供输入 |
| 文档分析 | 识别文档结构、内容类型和潜在边界 | 帮助判断按章节、段落还是其他方式切分 |
| 文档切分 | 将长文档拆成大小适当的文本块 | 形成后续检索的基本候选单元 |
| 向量检索 | 围绕用户问题查找相关文本块 | 使用切分后的文本块作为检索对象 |
这个位置决定了文档切分既不是单纯的数据预处理,也不是检索之后的补救步骤。它更像是连接原始内容和检索系统的结构化环节:切分前需要理解文档,切分后要服务于检索。
高质量文本块需要满足什么条件
高质量文本块通常需要同时满足两个方向:大小适当,以及语义相关。大小适当可以避免一个文本块包含过多主题;语义相关则有助于检索时返回更聚焦的上下文。
大小要适当,避免超大数据块
在 RAG 分块中,应避免使用过大的数据块。过大的文本块可能把多个主题、多个问题或多个章节内容混在一起,导致检索系统虽然命中了文本块,却无法提供足够聚焦的上下文。
这里不宜机械套用固定长度。不同文档类型、内容密度和检索目标差异较大,分块大小应结合实际问题和文档结构调整。
语义要尽量集中
每个文本块应尽量包含语义上相关的内容。例如,一个解释“递归分块”的段落,最好不要与另一个无关的“部署成本”段落混在同一块中。语义更集中的文本块,更适合作为用户问题的检索候选。
分块质量检查清单
在设计或调整 RAG 文档切分策略时,可以用下面的清单检查:
- 是否保留了标题、章节或页面板块等有助于理解上下文的结构信息?
- 是否在关键解释、定义或步骤中间强行截断,造成上下文断裂?
- 单个文本块是否包含过多无关主题?
- 文本块是否适合作为后续向量检索的候选对象?
- 测试查询命中后,返回的文本块是否能直接支持回答问题?
要点: 文本块不是越大越完整,也不是越小越精准。更重要的是让每个块在检索时承载一个相对清晰、可回答的问题范围。
常见 Chunking 方法及适用场景
RAG 文档切分可以有多种实现方式。常见方法包括按字符、Token、段落、递归和语义分块,也可以按页面板块进行切分。实际项目中,这些方法并不互斥,往往会结合文档结构和检索目标组合使用。
| 方法 | 基本思路 | 更适合的场景 | 注意点 |
|---|---|---|---|
| 按字符分块 | 按字符数量或近似长度切分文本 | 文档结构较弱、需要快速建立初始方案 | 可能切断句子或语义边界 |
| 按 Token 分块 | 以 Token 数量作为主要边界 | 需要控制文本块输入规模的场景 | 仍需关注语义是否被切断 |
| 按段落分块 | 以自然段作为基本单位 | 段落主题相对清晰的文章、说明文档 | 长段落可能仍需进一步拆分 |
| 递归分块 | 按较大结构边界优先切分,必要时逐步细分 | 标题、章节、段落层级比较清楚的文档 | 需要选择合适的结构优先级 |
| 语义分块 | 尽量让文本块内部内容语义相关 | 主题边界比固定长度更重要的内容 | 需要更多关注内容含义和边界判断 |
| 页面板块分割 | 按文章、博客文章等有效内容板块切分 | 长篇内容、内容类型多样的网站 | 需要识别页面中真正有价值的内容区域 |
页面板块分割
页面板块分割适合把网页或站点内容按有效内容板块拆开,例如文章、博客文章或其他主要内容区域。对于长篇内容以及内容类型多样的网站,这种方式有助于避免把多个类型的页面内容混在同一个文本块中。
如果一个网站同时包含教程、博客、产品说明和帮助文档,可以先按页面板块或内容类型做初步区分,再在每个板块内部继续使用段落、递归或语义分块。
方法可以组合使用
在真实 RAG 项目中,很少只依赖一种分块方法。例如:
- 对长篇网页,先按页面板块切分,再按段落或语义进一步拆分。
- 对层级清楚的技术文档,先按标题结构递归切分,再检查文本块是否过大。
- 对主题连续但边界不明显的内容,优先关注语义相关性,再结合长度控制。
递归分块与语义分块怎么选
递归分块和语义分块都是 RAG Chunking 中常见的思路,但它们关注的重点不同。递归分块更依赖文档的显式结构,语义分块更关注内容本身的主题连续性。
递归分块适合层级清晰的文档
递归分块适合具有多个层级结构的文档。例如一份技术文档可能包含一级标题、二级标题、段落和列表。递归分块可以优先按较大的结构边界切分;如果某一块仍然过大,再继续按更小边界拆分。
在工程实现中,RecursiveCharacterTextSplitter 可作为多层级结构文档分割的一种选择。它的价值在于帮助开发者按预设边界逐步拆分内容,而不是只做一次固定长度截断。
语义分块适合主题边界更重要的内容
语义分块的核心关注点是让文本块内部内容尽量保持语义相关。对于一些段落较长、主题逐步展开、但标题层级不够清晰的内容,单纯按字符或固定长度切分可能会破坏语义连续性。
这类场景下,应优先观察内容主题是否发生变化:如果前半部分在解释定义,后半部分在讨论应用限制,就不应为了凑长度把它们强行放在同一个文本块中。
可以用三个问题做初步判断
| 判断维度 | 更倾向递归分块 | 更倾向语义分块 |
|---|---|---|
| 文档层级是否清晰 | 标题、章节、列表结构明显 | 标题较少或结构不稳定 |
| 段落主题是否连续 | 每个章节内部边界清楚 | 主题在段落之间自然过渡 |
| 检索问题是否聚焦 | 用户常问某个章节或步骤 | 用户常围绕概念、解释或上下文追问 |
如果文档本身结构清楚,可以从递归分块开始;如果检索问题更依赖主题完整性,则需要更多关注语义边界。
面向落地的分块策略检查清单
落地 RAG 文档切分时,建议从用户问题和检索目标出发,而不是先决定某一种固定切分方法。分块策略的好坏,最终要看它是否能让向量检索返回相关、聚焦、可用于回答的文本块。
第一步:明确检索要回答的问题类型
先判断用户问题主要属于哪一类:
- 事实型问题:需要找到某个定义、参数、步骤或结论。
- 段落解释:需要返回一段相对完整的说明内容。
- 长文档综合理解:需要跨多个片段理解文档内容。
不同问题类型对文本块的要求不同。事实型问题通常需要更聚焦的文本块;解释型问题需要保留足够上下文;长文档综合理解则可能需要多个相关文本块共同支持。
第二步:根据文档类型选择初始方法
| 文档类型或内容特征 | 可优先考虑的方法 | 选择理由 |
|---|---|---|
| 长篇网页、内容类型多样的网站 | 页面板块分割 | 先分离有效内容区域,再进入细粒度切分 |
| 标题、章节、列表层级清楚的文档 | 递归分块 | 可利用结构边界逐层拆分 |
| 段落主题清晰的文章 | 段落分块 | 自然段本身往往承载相对完整语义 |
| 结构较弱但需要快速处理的文本 | 字符或 Token 分块 | 便于快速建立初始方案,但需要后续检查语义断裂 |
| 主题边界比长度更重要的内容 | 语义分块 | 有助于保持文本块内部主题一致 |
第三步:检查文本块是否适合作为检索对象
完成初始分块后,不应只检查块数量,还要检查文本块本身是否适合进入后续检索流程:
- 是否过大,导致一个块中包含多个主题?
- 是否过度切碎,导致回答问题所需上下文不完整?
- 是否保持语义相关?
- 是否保留必要标题、段落或上下文线索?
- 是否能作为向量检索返回给大模型的候选上下文?
第四步:用测试文档和测试查询迭代
分块策略需要结合测试文档和测试查询观察效果。可以选取一组典型问题,查看检索结果是否返回了相关文本块:
| 观察项 | 可能问题 | 调整方向 |
|---|---|---|
| 检索命中的文本块太泛 | 文本块过大或主题混杂 | 缩小块范围,按段落、标题或语义重新切分 |
| 命中文本块缺少关键上下文 | 切分过细或切断解释链路 | 调整切分边界,保留必要上下文 |
| 经常命中无关页面区域 | 页面结构未处理好 | 先做页面板块分割,区分主要内容区域 |
| 层级文档命中不稳定 | 未利用标题和章节结构 | 尝试递归分块,保留结构边界 |
要点: 好的 RAG 文档切分策略通常来自迭代:先基于文档结构选择初始方法,再用测试查询观察检索结果,最后围绕文本块大小和语义相关性持续调整。