分块策略(Chunking):粒度决定召回上限

01-RAG基础与架构 核心 约 20 分钟 #chunking#分块#语义分块#父子分块 更新 2026-10-02
当前状态:未学
本文基于模型知识整理(生成时未联网核对),关键结论建议对照经典文献复核。

一句话定义

分块把长文档切成可检索单元,是"检索粒度"与"证据完整性"之间的权衡:块太大稀释嵌入语义、挤占上下文,块太小丢上下文、命中后模型读不懂——分块策略直接决定了召回的天花板。

为什么重要

嵌入向量编码的是"一整块文本的语义":一个 2000 字的块里混了三个主题,向量就成了语义平均糊,任何查询都只能弱相关地命中它。工业界经验反复证明:RAG 效果差的第一嫌疑人不是模型而是分块。它便宜(改参数即可)、影响大、却最常被忽视。

前置知识

kp-002(流水线位置)、kp-007(嵌入的工作方式)。

核心概念

  • 固定窗口分块:每 N token 切一块,重叠 overlap M。简单可控,但会在句中硬切。
  • 递归字符分块:按分隔符层级(段落 → 句子 → 词)递归切分,尽量保住自然边界——LangChain 默认方案,通用性最好。
  • 语义分块(semantic chunking):计算相邻句嵌入的语义突变点,在主题转换处切块;块内语义更纯,代价是多一遍嵌入计算。
  • 父子分块(parent-child / small-to-big):用小块(如 256 token)做检索命中,返回其所属大块(如 2048 token)给 LLM——检索精度与上下文完整性兼得,是当前工程首选模式之一。
  • 结构感知分块:按文档结构(标题层级、条款、表格行、代码函数)切,Markdown/HTML 标题是最便宜的结构信号。

原理与机制

粒度权衡的量化直觉:假设答案证据为 200 字。块 = 2000 字时,嵌入向量中目标语义占比 ~10%,相似度被稀释,且命中后 2000 字挤占上下文(一次只能放几个块);块 = 100 字时证据被切碎,任何单块都不可独立理解。经验范围:通用文档 256–1024 token、overlap 10–20%,并以"答案块是否自含可读"做人工抽检。

重叠(overlap)的作用与代价:overlap 让跨边界的证据至少完整出现在一个块里;但重叠块的嵌入高度相似,检索时容易占满 top-k(同一内容命中多次),需要去重或按父块合并。

为什么父子分块能两全:嵌入与匹配用小块(语义纯、相似度尖锐),喂给 LLM 用大块(上下文完整)。这本质是"检索表示"与"生成表示"的分离——同一思想在后文kp-023 图构建(小块抽实体、段落进上下文)与 kp-014(上下文组装)中反复出现。

图示

原文: [A1 A2 A3 | B1 B2 | C1 C2 C3]   (A/B/C 三个主题)
固定 512: [A1 A2 A3 B1] [B2 C1 C2] [C3]      ← B 被劈开, 块2 混主题
语义:    [A1 A2 A3] [B1 B2] [C1 C2 C3]        ← 边界对齐主题
父子:    检索块 [A2] [B1] [C3] → 命中 B1 → 返回父块 [B1 B2] 给 LLM

实例或案例

  • 合同/法务文档:按条款(第 X 条)切块,每块带"第几条"元数据,检索命中直接可引用条款号。
  • FAQ 对话记录:一问一答为一块;按固定 token 切会把问答劈开,是新手常见翻车点。
  • 表格密集的财报:表格整体或按行为块 + 标题上下文注入,纯文本管道会把表格撕成碎片(配合 kp-005 的解析)。

常见误区

  • 误区一:"默认 512 全场景通用"。问答类、条款类、叙事类的最优粒度差异巨大;至少按文档类型分组调参。
  • 误区二:"overlap 越大越保险"。大 overlap 制造大量近重复块,top-k 被同一答案的多个变体占满,反而挤掉其他相关内容;10–20% 足够。
  • 误区三:"分块只在离线做一次"。块策略变更 = 全量重建索引;上线前必须用评测集(kp-016)对比方案,而不是上线后凭感觉换。

与其他知识点的关系

  • kp-007:块大小与嵌入模型输入上限、语义纯度的耦合。
  • kp-005:解析质量决定分块边界是否可用。
  • kp-014:块如何被组装进上下文。
  • kp-023:图构建同样从分块出发(块是实体抽取的单元)。

自测题

  1. 为什么"块太大"和"块太小"都伤召回?

答:太大→嵌入语义被平均稀释、相似度区分度差、上下文占用高;太小→证据被切碎,单块不可独立理解,命中后模型缺上下文。

  1. 父子分块如何同时优化检索与生成?

答:小块做嵌入匹配(语义尖锐、命中准),命中后返回所属大块给 LLM(上下文完整),实现"检索表示"与"生成表示"分离。

  1. overlap 的副作用是什么?

答:相邻块内容高度相似导致近重复命中挤占 top-k,需要去重或按父块聚合;一般 10–20% 即可。

延伸阅读

  • LangChain 文档:Text Splitters 与 semantic chunking。
  • LlamaIndex 文档:Node Parser / hierarchical retriever(父子分块实现)。
  • Chroma Research, "Evaluating Chunking Strategies"(2024)。