Deep Read

RAG的分块策略详解

一、背景与重要性

在 RAG(Retrieval-Augmented Generation)系统中,文档分块质量直接影响问答系统的准确性与连贯性。即使使用高性能大模型和精心设计的 Prompt,若分块不当,仍会导致:

  • 上下文缺失
  • 事实性错误
  • 拼接不连贯
  • 幻觉或错误引用

常见误区是按固定长度硬切文本,忽略语义边界(如标题、段落、列表、表格等),造成关键信息断裂。高质量分块应:

  • 贴合自然语义/结构边界
  • 设置适度重叠以保持上下文连续
  • 保留元数据(如章节路径)以支持可追溯性和重排

结论:分块质量几乎决定了 RAG 系统的性能上限。


二、为何需要分块?

  1. 模型上下文窗口限制 LLM 无法处理超长文本,需将文档切分为适配模型输入长度的片段。
  2. 提升检索信噪比
    • 块过大 → 引入噪声,稀释关键信息
    • 块过小 → 缺乏上下文,难以理解语义
  3. 保障语义连续性 通过 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)语义分块

  • 原理:计算句向量,当相邻句子语义相似度骤降(“语义突变”)时切分。
  • 流程:
    1. 中文分句
    2. 句向量编码(如 BGE-M3)
    3. 检测新颖度(novelty)或相似度下降点
    4. 结合最小/最大块长约束
  • 优点:块内高度内聚,适合高精度检索。
  • 缺点:计算开销大;对短文档效果有限。
  • 适用场景:论文、白皮书、技术论证类文档。

(2)主题分块

  • 原理:对句向量聚类(如 KMeans),按主题标签切换点切分。
  • 流程:
    1. 句向量 + 聚类
    2. 序列平滑(避免标签抖动)
    3. 主题命名(关键词或摘要)
  • 优点:捕捉宏观话题边界。
  • 缺点:需预设主题数;小文档不适用。
  • 适用场景:长篇报告、书籍、多主题综述。

4. 高级分块策略

(1)小-大分块(Small-Big Chunking)

  • 思想:用“小块”(句子)高精度召回,用“大块”(段落)提供上下文。

  • 流程

    1. 构建句子级索引 + 段落存储
    2. 检索命中句子 → 聚合到所属段落
    3. 交叉编码重排 → 组装局部上下文(命中句±邻近窗口)
  • 优势:兼顾精准性与上下文完整性。

  • 适用场景:需“句级证据 + 段落解释”的问答系统。

(2)父子段分块(Parent-Child Chunking)

  • 思想:显式维护“父块(段落)-子块(句子)”映射。
  • 优势:支持灵活检索组装,易于去重与回链。
  • 与小-大分块关系:前者是数据建模方式,后者是检索流程,常配合使用。

(3)代理式分块(Agent-Based Chunking)

  • 思想:用小型 LLM Agent 动态判断分块边界。

  • 规则

    • 不在代码/表格/公式中间切分
    • 保持标题链路完整
    • 输出结构化 JSON(含偏移量、路径、理由)
  • 适用场景:高度复杂、混合格式的非结构化长文档。

  • 注意:需加规则护栏 + 自动回退机制,控制成本。


5. 混合分块(Hybrid Chunking)

核心理念:单一策略难以覆盖所有场景,应“先粗后细、按需细化”。

推荐流程:

  1. 粗切:按结构(标题/段落/代码块)初步分割

  2. 细化:

    • 普通文本 → 递归或句子分块
    • 超长/混杂文本 → 语义分块
    • 对话 → 对话式分块
    • 原子块(代码/表格)→ 保持完整
  3. 索引:同时构建“小块索引”与“大块存储”

  4. 检索:小块召回 → 父块聚合 → 局部上下文组装

质量-成本档位建议:

档位 策略 适用场景
Fast 结构 → 递归 快速上线、资源有限
Balanced(推荐) 结构 → 递归 + 异常块语义分块 + 小-大检索 大多数生产环境
Quality Balanced + Agent 精修 + 强 rerank 高精度要求场景

四、总结与建议

  • 分块是 RAG 的基石,其质量直接影响最终答案的事实性与连贯性。

  • 避免固定长度硬切,优先尊重文档的自然结构与语义边界。

  • 重叠窗口(overlap) 是维持上下文连续的关键,但不宜过大(通常 ≤20%)。

  • Metadata 至关重要:标题路径、块类型、位置信息等可显著提升检索与重排效果。

  • 混合策略最稳健:结合结构、语义、任务目标,动态选择最优分块方式。

  • 调优方法论

    • 固定检索与重排,仅调整分块参数
    • 用 Recall@k、nDCG、事实性(faithfulness)等指标评估
    • 观察块长分布,动态调整 chunk_size 与分隔符

最终目标:让知识以连贯、可追溯、高内聚的方式呈现给 LLM,而非碎片化的噪声。