Skip to content

问题

RAG 里文档切分(chunking)有哪些常见策略?各自适用什么场景?

标准答案

1. 固定大小切分(Fixed-size)

按固定 token/字符数滑窗切分,配合 overlap(常见 512 token、10%~20% 重叠)。

  • 优点:实现简单、块大小均匀,检索长度可控
  • 缺点:容易把完整语义切断

2. 递归字符切分(Recursive Character Splitting)

按分隔符层级(段落 → 换行 → 句号 → 空格)递归切分,尽量保留段落/句子边界。LangChain 的 RecursiveCharacterTextSplitter 就是这个思路,通用性最强,适合做默认起点。

3. 结构感知切分

按文档结构切:Markdown 按标题层级、代码按函数、PDF 按版面(段落/表格/图片分别处理)。

  • 表格、公式、代码块不要切碎,整块作为 chunk,并在元数据里带上所属标题

4. 语义切分(Semantic Chunking)

先按句子切,计算相邻句 embedding 的相似度,在相似度骤降的位置断开。效果通常更好,但多一遍 embedding 计算,索引成本更高。

5. 父子块索引(Small-to-Big / Parent-Child)

用小块(如 256 token)做检索命中,命中后返回它所属的大块(如 1024 token)给 LLM 生成。兼顾「检索要精准、上下文要完整」这对矛盾需求,面试高频考点。

6. LLM / Agentic 切分

让 LLM 判断语义边界,或为每个 chunk 生成摘要标题。成本最高,效果上限也最高。

参数与工程要点

要素常见取值说明
chunk size256~1024 token太小检索结果碎,太大稀释相关度
overlap10%~20%防止语义在边界被切断
元数据标题/来源/章节检索后可过滤,生成时可拼上下文
评测hit rate / MRR换切分策略后必须回归评测

选型经验:中文通用文档用递归切分 + overlap 起步;结构化文档用结构感知;追求效果上父子块 + 语义切分。

追问链

  • chunk size 怎么定?跟 embedding 模型的上下文长度是什么关系?
  • overlap 设得太大会有什么副作用?
  • 父子块方案里,「小块检索、大块生成」为什么比直接检索大块好?
  • 表格和代码块的切分有什么特殊处理?
  • 切分策略怎么评测?离线指标和在线指标分别看什么?
  • 图文混排的 PDF 怎么切?

我的理解

chunk 的本质矛盾是:检索单元要小而准,生成上下文要大而全。所有策略都是在这对矛盾上做折衷——固定大小是「躺平式折衷」,父子块是「两头都要」的结构化方案。实践顺序:先结构感知 + 递归兜底,用 hit rate 建立基线,效果不够再上语义切分。

本站仅供个人学习使用,请勿外传