深度对比 LangChain 8 种文档分割方式:从逻辑底层到选型实战
本文对比了LangChain中8种文本分割器的核心逻辑与适用场景。从三个维度(分割方式、测量单位、语义保留)进行分析,将分割器分为四类:基础通用类(推荐RecursiveCharacter)、结构感知类(适合Markdown/代码)、模型对齐类(精准控制Token)、自然语言专家类(NLTK/Spacy)。通过对比表格展示了各分割器的优缺点,并给出选型建议:默认用Recursive,结构化内容用M
·
对 LangChain 常见的 8 种分割器进行多维度横向对比,明确每种工具的底层逻辑。
🧠 核心概念:三个维度看分割
在对比之前,请记住这三个衡量尺度:
- Split By (怎么断句):换行符、正则、还是特定的语法树?
- Measured By (怎么算大小):数几个字符(Length),还是数几个 Token?
- Context (语义保留):切完之后,这段话还能看懂吗?
🧩 8 种分割器深度对标
我们将这 8 位选手分为四个“战队”:
第一战队:基础通用类(程序员最常用)
- CharacterTextSplitter
- 逻辑:极其死板。你指定一个字符(默认是
"\n\n"),它就按这个切。 - 缺点:容易超限。如果一段话特别长,中间没有
"\n\n",它就会让这一块变得巨大。
- 逻辑:极其死板。你指定一个字符(默认是
- RecursiveCharacterTextSplitter
- 逻辑:最推荐的默认选手。它有备选方案:先找段落符,找不到再找换行符,再找不到找空格。
- 底层:这就是一个递归函数,直到块大小达标为止。
第二战队:结构感知类(最懂程序员)
- MarkdownHeaderTextSplitter
- 逻辑:它不看长度,它看
#、##、###。 - 强项:它能把标题作为元数据(Metadata)带给切出来的每一块。这对于 RAG 检索非常关键,模型能知道这段话属于哪个章节。
- 逻辑:它不看长度,它看
- Language()
- 逻辑:这是
RecursiveCharacterTextSplitter的变体,内置了各种编程语言的分隔符。 - 支持:Python, Go, Rust, JS 等。它知道不要把一个
if-else从中间切断。
- 逻辑:这是
第三战队:模型对齐类(LLM 最喜欢)
- TokenTextSplitter
- 逻辑:使用
tiktoken等编码器。 - 意义:大模型的“胃口”是按 Token 算的。字符数不等于 Token 数。用这个可以物理意义上精准控制不爆 Context(上下文)。
- 逻辑:使用
- SentenceTransformersTokenTextSplitter
- 逻辑:专为特定的 Embedding 模型设计。
- 场景:如果你用的向量模型有严格的 Token 限制(比如只能处理 512 个 Token),用这个最保险。
第四战队:自然语言专家(最懂人类语言)
- NLTKTextSplitter
- 逻辑:调用 NLTK 这个老牌 NLP 库,按“句子”切分。
- 优势:它懂英文的句号、感叹号,不会在缩写(如 Mr.)后面乱切。
- SpacyTextSplitter
- 逻辑:比 NLTK 更重、更准的 NLP 模型。
- 适用:处理极其复杂、不规范的长文本。
📊 终极对比决策表
| 分割器名称 | 分割依据 | 测量单位 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|---|---|
| Character | 单个字符 | 字符数 | 简单直接 | 容易切出超大块 | 极简格式数据 |
| Recursive | 字符列表(递归) | 字符数 | 灵活、语义保留好 | 无 | 通用首选 |
| Markdown | Markdown 标题 | 无(按标题) | 保留文档结构 | 不管长度,可能超限 | 知识库、技术文档 |
| Language | 代码语法 | 字符数 | 保证函数/类完整 | 需要指定语言 | 源码分析、Code Review |
| Token | Token 编码 | Token数 | 绝不超模型限制 | 人类不可读 | 临门一脚发给模型前 |
| SentenceTransformer | Token 编码 | Token数 | 与向量模型完美契合 | 速度稍慢 | 针对特定 Embedding 优化 |
| NLTK | NLP 句子识别 | 字符数 | 句子边界极准 | 需要下载 NLTK 库 | 长篇小说、论文 |
| Spacy | NLP 句子识别 | 字符数 | 最强的语义切分 | 性能开销最大 | 对准确度要求极高的文本 |
❓ 苏格拉底式引导思考
- 场景: 假如你现在要爬取你的旧博客(Markdown 格式)做成一个私人 AI 助手,你会如何组合使用这些分割器?(提示:可以先按标题切,再按递归切吗?)
- 性能: 如果处理 1000 万字的语料,你会选
SpacyTextSplitter还是RecursiveCharacterTextSplitter?为什么? - 逻辑: 既然
Token是最准的,为什么我们不干脆全部只用TokenTextSplitter?
✅ 选型口诀(小结)
- 默认用 Recursive;
- 有结构用 Markdown 或 Language;
- 怕溢出用 Token;
- 求精准用 NLTK 或 Spacy。
🔁 轻量复习问题
- 在
RecursiveCharacterTextSplitter中,默认的切分顺序是什么? - 为什么在做代码切分时,不建议直接用简单的换行符切割?
更多推荐



所有评论(0)