上一篇讲了 Loaders——把内容读进来。这一篇讲第二段——Text Splitters:把长文档切成块。

这一篇要讲一个反常识但重要的判断:切分质量对 RAG 效果的影响,往往比换 embedding 模型还大。很多人 RAG 效果差,第一反应是换更好的 embedding 模型,但其实根子在切分。

为什么要切分

为什么不把整篇文档直接向量化、直接存?因为:

  • 太长:一篇文档几万字,整体向量化信息太杂,检索不准
  • 要精准:RAG 检索要的是「和问题最相关的片段」,不是整篇。切成小块才能精准定位
  • 窗口限制:检索到的内容要塞进 prompt,太长放不下

所以要把长文档切成语义相对完整的小块(chunk),每块独立向量化、独立可被检索。

切分:长文档变成小块

切分的核心矛盾

切分的核心矛盾是块大小

  • 块太大:一块里信息太杂,检索到了但大部分无关,塞进 prompt 还费 token
  • 块太小:语义不完整,一块只有半句话,检索到了也用不上

块太大 vs 块太小

理想的块是「语义完整但聚焦」——一块讲清楚一个点,不大不小。这个平衡,是切分策略的核心。

几种切分策略

策略 怎么切 适合
固定长度 按字符/token 数硬切 最简单,但易割裂语义
递归切分 先按段落,段落太大再按句子,层层递归 最常用,兼顾结构和长度
按结构切分 按 Markdown 标题、代码块等结构边界 结构化文档
语义切分 按语义相似度判断边界 理论好,实际慢且不稳

几种切分策略

最常用的是递归切分(RecursiveCharacterTextSplitter):优先按自然段落切,段落超长才按句子,句子超长才按字符——尽量在自然边界切,减少割裂。

重叠(Overlap):防止割裂的关键参数

无论哪种策略,都有一个关键参数:重叠(overlap)

切分时,相邻块之间保留一段重叠内容。比如每块 1000 字,重叠 200 字——第二块的前 200 字,是第一块的后 200 字。

重叠防止边界信息割裂

为什么要重叠?因为切分边界可能正好切断一句话或一个概念。有重叠,被切断的信息在相邻块里还有完整版本,检索时不会因为「正好切在半句」而丢失。重叠是切分质量的重要保障。

为什么切分比 embedding 模型重要

现在回到开头的判断:为什么切分比换 embedding 模型更影响效果?

因为切分决定了「一块里有什么信息」。如果切分把一个完整概念切成了两半,那不管 embedding 模型多好,每一半向量化后都不完整——检索时可能只命中一半,另一半丢了。

而 embedding 模型决定的是「把文本转向量的质量」。模型再好,输入给它的就是割裂的半句话,它也转不出好向量。

切分是上游,影响大于 embedding

打个比方:切分是「食材处理」,embedding 是「烹饪」。食材切得稀烂(切分差),再好的厨艺(embedding)也做不出好菜。所以优化 RAG,先优化切分,再考虑 embedding

切分也要看文档结构

好的切分不是一刀切,要看文档结构:

  • 技术文档:按标题/章节切,保持每个知识点完整
  • 对话记录:按轮次切,每轮一个块
  • 代码:按函数/类切,别把一个函数切成两半
  • 小说/长文:按段落+合理重叠

第 26 篇说「Loader 要读干净」——读干净是为了让切分能感知结构。Loader 和 Splitter 是配合的:Loader 把结构读出来,Splitter 按结构切。

收束:切分是 RAG 效果的隐形决定因素

这一篇讲了 Text Splitters:

  • 切分是为了精准检索,核心矛盾是块大小
  • 几种策略,递归切分最常用
  • 重叠(overlap)防止边界割裂,是关键参数
  • 切分是 embedding 的上游,质量影响更大——先优化切分
  • 好切分要看文档结构,配合 Loader

下一篇讲第三段——Embeddings:把文本块转向量。会讲向量化的原理,以及中文场景的模型选型。


关于十三Tech

我是十三,All in AI Agent 方向的架构师,专注 AI 工程实践。我相信 AI 是程序员的最佳搭档。

如果你想跟完这套「图解 LangChain」,欢迎关注公众号 「十三Tech」。全系列 42 篇,会按认识基础、LangGraph 状态机、Agent 与 middleware、RAG 检索、Tools/MCP/记忆、生产化收束这条线更新。

十三Tech公众号二维码