ArcLibrary

Chunking (文本分块)

把长文档切成可以被检索 / 喂给模型的小片段。

RAGChunking
核心 · Key Idea

一句话:Chunking = 把一份长文档切成几百到几千字一块的片段。RAG 是按 chunk 检索 + 喂模型的 —— 所以怎么切、切多大、有没有重叠,几乎决定了 RAG 上限。

是什么#

一篇 50 页 PDF 不能整个扔进向量库(一是太长 embedding 失焦,二是检索回来塞不进 context)。常见做法:

原文档: 50 页 PDF (50,000 字)
   ↓ Chunking
chunk_001: 第 1 段, 500 字
chunk_002: 第 2 段, 500 字 (与 chunk_001 重叠 50 字)
...
chunk_120: 第 120 段, 500 字

每个 chunk 单独做 embedding、单独被检索、单独被喂模型。

打个比方#

打个比方 · Analogy

查百科全书没人整本背回去
你会翻到「最相关的那几页」 —— Chunking 就是预先把书切成「页」,每页一张语义指纹,按指纹找页。

关键概念#

Chunk Size块大小
200–800 字常见。太小丢上下文,太大稀释主题。
Overlap重叠
相邻 chunk 共享一些字 (10–20%),避免话题被切断。
Splitter切分策略
按字符 / 按 token / 按句 / 按段 / 按 markdown 标题…
Metadata元数据
每个 chunk 附带 doc_id / 章节标题 / 页码 —— 检索后能溯源。

三种主流策略#

  • 固定长度:最简单,FlashCards / 论坛问答适用。
  • 结构化:有清晰标题层级的文档(书、API doc)首选 —— 天然把语义边界保住
  • 语义化 (Semantic Chunking):相邻句子 embedding 距离突变处切 —— 效果最好但贵。

实操要点#

  • 先按结构切,再考虑长度:H1/H2/H3、列表、表格 —— 这些天然边界不要打断
  • chunk size 跟着模型 + embedding 调:embedding 模型通常 512 token 是甜点,超过会被截断。
  • 每个 chunk 拼上「祖先标题」# 第三章 - ## 退款政策 - chunk 内容检索 + 生成时都极有帮助
  • 小文档别切:<2000 字直接整篇当一个 chunk,少切少噪声
  • 可以双粒度索引:句子级 chunk 用于召回,取回后扩展上下文到所在段落 / 章节再喂模型。

易混点#

Chunking
**应用层**:把长文切成「段」(几百字)。
Tokenizing
**模型层**:把字符切成「token」(子词)。
完全不同抽象层。

延伸阅读#