上一篇讲了 Loaders——把内容读进来。这一篇讲第二段——Text Splitters:把长文档切成块。
这一篇要讲一个反常识但重要的判断:切分质量对 RAG 效果的影响,往往比换 embedding 模型还大。很多人 RAG 效果差,第一反应是换更好的 embedding 模型,但其实根子在切分。
为什么要切分
为什么不把整篇文档直接向量化、直接存?因为:
- 太长:一篇文档几万字,整体向量化信息太杂,检索不准
- 要精准:RAG 检索要的是「和问题最相关的片段」,不是整篇。切成小块才能精准定位
- 窗口限制:检索到的内容要塞进 prompt,太长放不下
所以要把长文档切成语义相对完整的小块(chunk),每块独立向量化、独立可被检索。
切分的核心矛盾
切分的核心矛盾是块大小:
- 块太大:一块里信息太杂,检索到了但大部分无关,塞进 prompt 还费 token
- 块太小:语义不完整,一块只有半句话,检索到了也用不上
理想的块是「语义完整但聚焦」——一块讲清楚一个点,不大不小。这个平衡,是切分策略的核心。
几种切分策略
| 策略 | 怎么切 | 适合 |
|---|---|---|
| 固定长度 | 按字符/token 数硬切 | 最简单,但易割裂语义 |
| 递归切分 | 先按段落,段落太大再按句子,层层递归 | 最常用,兼顾结构和长度 |
| 按结构切分 | 按 Markdown 标题、代码块等结构边界 | 结构化文档 |
| 语义切分 | 按语义相似度判断边界 | 理论好,实际慢且不稳 |
最常用的是递归切分(RecursiveCharacterTextSplitter):优先按自然段落切,段落超长才按句子,句子超长才按字符——尽量在自然边界切,减少割裂。
重叠(Overlap):防止割裂的关键参数
无论哪种策略,都有一个关键参数:重叠(overlap)。
切分时,相邻块之间保留一段重叠内容。比如每块 1000 字,重叠 200 字——第二块的前 200 字,是第一块的后 200 字。
为什么要重叠?因为切分边界可能正好切断一句话或一个概念。有重叠,被切断的信息在相邻块里还有完整版本,检索时不会因为「正好切在半句」而丢失。重叠是切分质量的重要保障。
为什么切分比 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/记忆、生产化收束这条线更新。

