深度对比 LangChain 8 种文档分割方式:从逻辑底层到选型实战

对 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 中,默认的切分顺序是什么?
  • 为什么在做代码切分时,不建议直接用简单的换行符切割?
相关推荐
java1234_小锋15 小时前
基于LangChain的RAG与Agent智能体开发 - 使用LangChain调用聊天大模型
langchain·rag
智算菩萨16 小时前
【How Far Are We From AGI】3 AGI的边界扩张——数字、物理与智能三重接口的技术实现与伦理困境
论文阅读·人工智能·深度学习·ai·agi
剑穗挂着新流苏31216 小时前
Pytorch加载数据
python·深度学习·transformer
码码哈哈0.018 小时前
LangChain 快速入门(从0到可用)
开发语言·python·langchain
爱喝可乐的老王20 小时前
LangChain Frontend 概述(官方文档总结)
langchain
智算菩萨20 小时前
【How Far Are We From AGI】6 AGI的进化论——从胚胎到终极的三级跃迁与发展路线图
论文阅读·人工智能·深度学习·ai·agi
胡少侠720 小时前
LangGraph 多步推理:State + Node + 条件路由,手写 StateGraph
ai·重构·langchain·agent·rag·langgraph
梦醒过后说珍重20 小时前
【超分实战】拒绝灾难性遗忘!记一次原生4K医疗影像(SurgiSR4K)的模型微调踩坑实录
深度学习
梦醒过后说珍重21 小时前
拒绝显存溢出!手把手教你写原生 4K 超分辨率数据集 (SurgiSR4K) 的 PyTorch DataLoader
深度学习
junjunzai12321 小时前
设置cuda:1但是cuda:0在波动的问题
人工智能·深度学习