对 LangChain 常见的 8 种分割器进行多维度横向对比,明确每种工具的底层逻辑。

🧠 核心概念:三个维度看分割

在对比之前,请记住这三个衡量尺度:

  1. Split By (怎么断句):换行符、正则、还是特定的语法树?
  2. Measured By (怎么算大小):数几个字符(Length),还是数几个 Token?
  3. Context (语义保留):切完之后,这段话还能看懂吗?

🧩 8 种分割器深度对标

我们将这 8 位选手分为四个“战队”:

第一战队:基础通用类(程序员最常用)
  1. CharacterTextSplitter
    • 逻辑:极其死板。你指定一个字符(默认是 "\n\n"),它就按这个切。
    • 缺点:容易超限。如果一段话特别长,中间没有 "\n\n",它就会让这一块变得巨大。
  2. RecursiveCharacterTextSplitter
    • 逻辑最推荐的默认选手。它有备选方案:先找段落符,找不到再找换行符,再找不到找空格。
    • 底层:这就是一个递归函数,直到块大小达标为止。
第二战队:结构感知类(最懂程序员)
  1. MarkdownHeaderTextSplitter
    • 逻辑:它不看长度,它看 ######
    • 强项:它能把标题作为元数据(Metadata)带给切出来的每一块。这对于 RAG 检索非常关键,模型能知道这段话属于哪个章节。
  2. Language()
    • 逻辑:这是 RecursiveCharacterTextSplitter 的变体,内置了各种编程语言的分隔符。
    • 支持:Python, Go, Rust, JS 等。它知道不要把一个 if-else 从中间切断。
第三战队:模型对齐类(LLM 最喜欢)
  1. TokenTextSplitter
    • 逻辑:使用 tiktoken 等编码器。
    • 意义:大模型的“胃口”是按 Token 算的。字符数不等于 Token 数。用这个可以物理意义上精准控制不爆 Context(上下文)。
  2. SentenceTransformersTokenTextSplitter
    • 逻辑:专为特定的 Embedding 模型设计。
    • 场景:如果你用的向量模型有严格的 Token 限制(比如只能处理 512 个 Token),用这个最保险。
第四战队:自然语言专家(最懂人类语言)
  1. NLTKTextSplitter
    • 逻辑:调用 NLTK 这个老牌 NLP 库,按“句子”切分。
    • 优势:它懂英文的句号、感叹号,不会在缩写(如 Mr.)后面乱切。
  2. SpacyTextSplitter
    • 逻辑:比 NLTK 更重、更准的 NLP 模型。
    • 适用:处理极其复杂、不规范的长文本。

📊 终极对比决策表

分割器名称 分割依据 测量单位 优点 缺点 推荐场景
Character 单个字符 字符数 简单直接 容易切出超大块 极简格式数据
Recursive 字符列表(递归) 字符数 灵活、语义保留好 通用首选
Markdown Markdown 标题 无(按标题) 保留文档结构 不管长度,可能超限 知识库、技术文档
Language 代码语法 字符数 保证函数/类完整 需要指定语言 源码分析、Code Review
Token Token 编码 Token数 绝不超模型限制 人类不可读 临门一脚发给模型前
SentenceTransformer Token 编码 Token数 与向量模型完美契合 速度稍慢 针对特定 Embedding 优化
NLTK NLP 句子识别 字符数 句子边界极准 需要下载 NLTK 库 长篇小说、论文
Spacy NLP 句子识别 字符数 最强的语义切分 性能开销最大 对准确度要求极高的文本

❓ 苏格拉底式引导思考

  1. 场景: 假如你现在要爬取你的旧博客(Markdown 格式)做成一个私人 AI 助手,你会如何组合使用这些分割器?(提示:可以先按标题切,再按递归切吗?)
  2. 性能: 如果处理 1000 万字的语料,你会选 SpacyTextSplitter 还是 RecursiveCharacterTextSplitter?为什么?
  3. 逻辑: 既然 Token 是最准的,为什么我们不干脆全部只用 TokenTextSplitter

✅ 选型口诀(小结)

  • 默认用 Recursive;
  • 有结构用 Markdown 或 Language;
  • 怕溢出用 Token;
  • 求精准用 NLTK 或 Spacy。

🔁 轻量复习问题

  • RecursiveCharacterTextSplitter 中,默认的切分顺序是什么?
  • 为什么在做代码切分时,不建议直接用简单的换行符切割?
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐