RAG的分块策略详解
目录+
一、背景与重要性
在 RAG(Retrieval-Augmented Generation)系统中,文档分块质量直接影响问答系统的准确性与连贯性。即使使用高性能大模型和精心设计的 Prompt,若分块不当,仍会导致:
- 上下文缺失
- 事实性错误
- 拼接不连贯
- 幻觉或错误引用
常见误区是按固定长度硬切文本,忽略语义边界(如标题、段落、列表、表格等),造成关键信息断裂。高质量分块应:
- 贴合自然语义/结构边界
- 设置适度重叠以保持上下文连续
- 保留元数据(如章节路径)以支持可追溯性和重排
结论:分块质量几乎决定了 RAG 系统的性能上限。
二、为何需要分块?
- 模型上下文窗口限制 LLM 无法处理超长文本,需将文档切分为适配模型输入长度的片段。
- 提升检索信噪比
- 块过大 → 引入噪声,稀释关键信息
- 块过小 → 缺乏上下文,难以理解语义
- 保障语义连续性
通过
chunk_overlap(重叠窗口)缓解边界断裂,避免定义、条件等关键内容被拆散。
理想目标:在“上下文完整性”与“信息密度”之间取得动态平衡。
三、分块策略详解
1. 基础分块
(1)固定长度分块
- 特点:按预设字符数直接切割,无视文本结构。
- 优点:实现简单、通用、速度快。
- 缺点:极易破坏语义边界;块大小难调。
- 适用场景:结构弱的纯文本、初期基线方案。
- 参数建议(中文):
chunk_size:300–800 字chunk_overlap:10%–20%
(2)基于句子的分块
- 特点:先按句子切分,再聚合成块。
- 优点:保证句子级语义完整,利于问答匹配与引用。
- 缺点:中文需专用分句工具;块可能过短。
- 适用场景:法律法规、新闻、FAQ 等以句子为主的文本。
- 注意:避免使用 NLTK(不支持中文标点),推荐 HanLP、Stanza 或正则分句。
(3)递归字符分块
- 特点:按“粗→细”分隔符(如标题→段落→换行→空格→字符)递归切分。
- 优点:兼顾语义边界与块大小控制,即插即用。
- 缺点:对高度格式化内容(如表格、代码)效果一般。
- 适用场景:说明文档、报告、知识库条目等综合性语料。
- 分隔符建议(中文):
- 标题(Markdown/编号)
\n\n(段落)\n(换行)- 空格、字符(兜底)
2. 结构感知分块
利用文档固有结构(标题、列表、代码块、表格、对话轮次)作为分块边界。
(1)结构化文本分块(如 Markdown/HTML)
- 特点:以标题层级为父节点,聚合其后内容;超长章节二次细分。
- 优点:逻辑清晰、可追溯性强、信噪比高。
- 实施要点:
- 解析结构(如用 BeautifulSoup 或正则)
- 合并过短块(同父标题下)
- 注入父级节点路径(如
指南 > 安装)
- 适用场景:技术文档、手册、白皮书等强结构文本。
(2)对话式分块
- 特点:以“说话人+轮次”为单位,按话题窗口聚合。
- 优点:保持对话连贯性,支持“谁说的、在哪说的”追溯。
- 重叠方式:采用“轮次重叠”(如前后各1–2轮),而非字符重叠。
- 检索优化:召回后做“邻接扩展”(拼接前后轮次)。
- 适用场景:客服对话、会议纪要、访谈记录。
通用建议:
- 优先用“结构重叠”(如父标题路径)替代大比例字符重叠
- 为每个块写入丰富 metadata(标题、层级、类型等)
3. 语义与主题分块
不依赖物理结构,依据语义连续性或话题转移切分。
(1)语义分块
- 原理:计算句向量,当相邻句子语义相似度骤降(“语义突变”)时切分。
- 流程:
- 中文分句
- 句向量编码(如 BGE-M3)
- 检测新颖度(novelty)或相似度下降点
- 结合最小/最大块长约束
- 优点:块内高度内聚,适合高精度检索。
- 缺点:计算开销大;对短文档效果有限。
- 适用场景:论文、白皮书、技术论证类文档。
(2)主题分块
- 原理:对句向量聚类(如 KMeans),按主题标签切换点切分。
- 流程:
- 句向量 + 聚类
- 序列平滑(避免标签抖动)
- 主题命名(关键词或摘要)
- 优点:捕捉宏观话题边界。
- 缺点:需预设主题数;小文档不适用。
- 适用场景:长篇报告、书籍、多主题综述。
4. 高级分块策略
(1)小-大分块(Small-Big Chunking)
-
思想:用“小块”(句子)高精度召回,用“大块”(段落)提供上下文。
-
流程
:
- 构建句子级索引 + 段落存储
- 检索命中句子 → 聚合到所属段落
- 交叉编码重排 → 组装局部上下文(命中句±邻近窗口)
-
优势:兼顾精准性与上下文完整性。
-
适用场景:需“句级证据 + 段落解释”的问答系统。
(2)父子段分块(Parent-Child Chunking)
- 思想:显式维护“父块(段落)-子块(句子)”映射。
- 优势:支持灵活检索组装,易于去重与回链。
- 与小-大分块关系:前者是数据建模方式,后者是检索流程,常配合使用。
(3)代理式分块(Agent-Based Chunking)
-
思想:用小型 LLM Agent 动态判断分块边界。
-
规则
:
- 不在代码/表格/公式中间切分
- 保持标题链路完整
- 输出结构化 JSON(含偏移量、路径、理由)
-
适用场景:高度复杂、混合格式的非结构化长文档。
-
注意:需加规则护栏 + 自动回退机制,控制成本。
5. 混合分块(Hybrid Chunking)
核心理念:单一策略难以覆盖所有场景,应“先粗后细、按需细化”。
推荐流程:
-
粗切:按结构(标题/段落/代码块)初步分割
-
细化:
- 普通文本 → 递归或句子分块
- 超长/混杂文本 → 语义分块
- 对话 → 对话式分块
- 原子块(代码/表格)→ 保持完整
-
索引:同时构建“小块索引”与“大块存储”
-
检索:小块召回 → 父块聚合 → 局部上下文组装
质量-成本档位建议:
| 档位 | 策略 | 适用场景 |
|---|---|---|
| Fast | 结构 → 递归 | 快速上线、资源有限 |
| Balanced(推荐) | 结构 → 递归 + 异常块语义分块 + 小-大检索 | 大多数生产环境 |
| Quality | Balanced + Agent 精修 + 强 rerank | 高精度要求场景 |
四、总结与建议
-
分块是 RAG 的基石,其质量直接影响最终答案的事实性与连贯性。
-
避免固定长度硬切,优先尊重文档的自然结构与语义边界。
-
重叠窗口(overlap) 是维持上下文连续的关键,但不宜过大(通常 ≤20%)。
-
Metadata 至关重要:标题路径、块类型、位置信息等可显著提升检索与重排效果。
-
混合策略最稳健:结合结构、语义、任务目标,动态选择最优分块方式。
-
调优方法论
:
- 固定检索与重排,仅调整分块参数
- 用 Recall@k、nDCG、事实性(faithfulness)等指标评估
- 观察块长分布,动态调整
chunk_size与分隔符
最终目标:让知识以连贯、可追溯、高内聚的方式呈现给 LLM,而非碎片化的噪声。