
LangChain 中的切分器(Text Splitter)种类有很多,但对于绝大多数场景,官方最推荐、也是首先最应该尝试的,就是 RecursiveCharacterTextSplitter(递归字符文本切分器)。它在保持语义完整和管理块大小之间取得了很好的平衡。
推荐:RecursiveCharacterTextSplitter
它的核心思想是“尽力保持大单元完整,实在太大再往下切分”。它按照一个分隔符列表(默认是 ["\n\n", "\n", " ", ""])的优先级顺序,递归地尝试切分文本。
-
工作方式:先尝试用
\n\n(段落)切分;如果切出来的块还是太大,就对超大的块用\n(换行)继续切;如果还大,就用空格切;最后兜底用空字符串(逐字符)切,保证一定能切到符合大小。 -
为什么推荐:这种方式能最大程度地保留段落、句子等语义单元的完整性,让切出来的块更有意义。
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 每个块的最大字符数
chunk_overlap=50, # 块之间的重叠字符数,防止语义被切断
length_function=len, # 按字符数计算长度
)
chunks = text_splitter.split_text(document)
其他常用切分器
除了递归切分器,LangChain 还提供了针对不同场景的专用切分器:
1. 基础字符切分:CharacterTextSplitter
-
特点:最简单的方式,只用一个固定的分隔符(默认
\n\n)切分,块大小按字符数算。 -
适用场景:当文档结构非常统一,且明确知道用什么分隔符最好时。
2. 按长度/Token 切分
-
TokenTextSplitter:按 Token 数量切分(使用 tiktoken)。当需要严格控制输入给大模型的 Token 数时使用。 -
CharacterTextSplitter.from_tiktoken_encoder():先用字符切分,但用 Token 来计算块大小,能更精确地适配模型上下文窗口。
3. 按文档结构切分
-
MarkdownTextSplitter:根据 Markdown 的标题(#、##)、代码块等结构切分,能很好地保留文档层级。 -
HTMLHeaderTextSplitter:根据 HTML 标签(如<h1>、<h2>)切分,提取语义结构。 -
RecursiveCharacterTextSplitter.from_language():针对代码文件(Python、JS、Java 等)优化,会按def、class、{}等语法结构切分。
4. 按语义/句子切分
-
NLTKTextSplitter/SpacyTextSplitter:利用自然语言处理库,按句子边界切分,适合对句子完整性要求极高的场景。
提醒:中文文档优化
如果处理的是中文文档,使用默认的 RecursiveCharacterTextSplitter 可能会把词语切断。建议自定义 separators 列表,加入中文标点:
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
separators=["\n\n", "\n", "。", "!", "?", ";", ",", " ", ""] # 加入中文标点
)
切分器对比
| 场景 | 推荐切分器 |
|---|---|
| 通用文本(首选) | RecursiveCharacterTextSplitter |
| 严格限制 Token 数 | TokenTextSplitter 或 RecursiveCharacterTextSplitter.from_tiktoken_encoder |
| Markdown/HTML 文档 | MarkdownTextSplitter / HTMLHeaderTextSplitter |
| 代码文件 | RecursiveCharacterTextSplitter.from_language |
| 中文文本 | RecursiveCharacterTextSplitter + 中文分隔符 |
| 按句子切分 | SpacyTextSplitter / NLTKTextSplitter |
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/wangsen927/article/details/169264442



