LangChain 中的 TextSplitter 文档切分策略有哪些?
- 标签:LangChain、文档切分
🏛 业务架构师
LangChain 的 TextSplitter 切分策略,我按类型讲并给选型逻辑:
1. CharacterTextSplitter:按指定分隔符(如 \n\n)+ 固定长度切。最简单,适合格式规整的纯文本。
2. RecursiveCharacterTextSplitter(默认首选):递归尝试分隔符列表 ["\n\n", "\n", "。", " "]——先按段落切,太大再按句子、再按字符回退。尽量保住语义单元完整性,通用场景的稳妥默认。
3. TokenTextSplitter:按 token 数精确切分——需要严格控制上下文预算时用(成本可精确预估)。
4. MarkdownHeaderTextSplitter / HTMLSectionSplitter:按标题层级结构切(# → ## → ###)——企业知识库大量是结构化文档,按章节切天然对齐业务单元(一条制度、一个功能说明),且元数据可带上标题路径(检索过滤和引用展示都用得上)。
5. CodeTextSplitter:按代码语法单元(函数、类)切——代码知识库专用。
6. SemanticChunker:用 Embedding 计算句间语义距离,在语义突变处切分——语义完整性最好,但计算成本高(每句要向量化)。
关键参数:chunk_size(块大小)与 chunk_overlap(重叠,10%~20%,防止关键句被切断在边界)。
我的选型决策树:有结构(Markdown/HTML)→ HeaderSplitter;代码 → CodeSplitter;追求语义最优且预算够 → SemanticChunker;其余 → RecursiveCharacterTextSplitter。参数从 300~500 字/15% 重叠起步,用评测集按 badcase 迭代——切分策略没有理论最优,只有业务数据驱动的最优。
🏗 系统架构师
LangChain TextSplitter 策略我按语义保真度排谱系:
- CharacterTextSplitter(固定字符切分):按 separator 切 + chunk_size 上限 + overlap——最简单,语义易断腰,PoC 用;
- RecursiveCharacterTextSplitter(递归分隔符,通用默认):按分隔符优先级递归——
\n\n(段落)→\n(行)→(词)→ 字符——优先在自然语义边界断开,实在放不下才降级。生产默认选择; - TokenTextSplitter:按 token 数精确切——计费与窗口预算精确对齐(字符数 ≈ token 数的误差在中文场景很大);
- MarkdownHeaderTextSplitter(结构感知):按标题层级切(#、##、###)——chunk 继承标题路径元数据("安装指南 > Linux > 依赖"),检索时语义完整 + 可溯源,技术文档首选;
- HTMLHeaderTextSplitter:同上,按 HTML 标签结构;
- 代码类切分器:按语言语法边界(函数、类)——Language Enum 声明语言,代码场景必用(从函数中间切断的 chunk 基本不可检索);
- SemanticChunker(语义切分):相邻句子 embedding 相似度找断点——语义最优但嵌入成本高、阈值敏感,用得少。
参数经验:chunk_size 256~512 token(中文 300~800 字)、overlap 10~20%。
选型纪律:按文档类型路由——Markdown 文档用 Header 切分、代码用语法切分、普通文本递归切分兜底;chunk 带元数据(标题路径、来源)贯穿检索与引用。分块策略对 RAG 效果的影响权重排前三,值得用金标集认真调。
💻 全栈开发专家
LangChain 的 TextSplitter 体系按策略分(含选择经验):
1. CharacterTextSplitter:按单一分隔符切(默认 \n\n)。最简单,只适合结构非常规整的文本——一般不单独用。
2. RecursiveCharacterTextSplitter(默认首选):按分隔符优先级递归(\n\n → \n → 。 → 空格),在 chunk_size 内尽量贴自然边界断开。通用文本 90% 场景用它。
python
RecursiveCharacterTextSplitter(
chunk_size=512, chunk_overlap=64,
add_start_index=True) # 记录偏移,便于溯源高亮3. TokenTextSplitter:按 token 数精确切——预算敏感(Embedding 上限、上下文配额)时用,和字符切分差异在中文场景显著(1 汉字≠1 token)。
4. MarkdownHeaderTextSplitter:按 # 标题层级切,标题路径进 metadata——技术文档/规范类首选,天然带层级过滤能力。同类:HTMLHeaderTextSplitter。
5. RecursiveJsonTextSplitter:JSON 结构感知切分(不破坏对象边界),API 响应、配置类数据入库用。
6. 代码类:按语言语法切(PythonLanguageParser 等,函数/类边界),代码库检索场景。
7. SemanticChunker(进阶):相邻句 Embedding 相似度突变处断开——语义完整但成本高,效果增益看语料。
我的选型流程:先看格式(Markdown/JSON/代码→专用 splitter;没有→Recursive)→ 定参数(chunk_size 按 Embedding 模型最优区间,overlap 10%~20%)→ 拿评测集对比 2~3 组参数的 recall@k——参数没有万能值,语料说了算。切分后必须抽查:表格碎了、句子腰斩了都要回炉。