外观
LangChain文本分割
文本分割
文本分割
LangChain 的文本分割(Text Splitters) 是指将大段文本拆分为更小、更易管理的“块”(chunks)的过程。这些块通常需要满足两个核心目标:
- 适配语言模型的上下文窗口限制(例如,不超过 4096 或 8192 个 token);
- 保留语义完整性与上下文连贯性,以便在检索增强生成(RAG)、问答系统等下游任务中表现良好。
文本分割策略
LangChain 文本分割策略主要分为三类:参考文档
| 场景 | 推荐 splitter |
|---|---|
| 通用文本(文章、PDF、网页) | RecursiveCharacterTextSplitter (最常用) |
| 需严格控制 token 数(如调用 GPT) | CharacterTextSplitter.from_tiktoken_encoder() |
| Markdown / HTML / JSON / 代码 | 对应结构化 splitter |
文本分割长度
不同的嵌入模型,最佳文本分割长度不同
| 特性 | BGE-large-zh-v1.5 | BGE-M3 |
|---|---|---|
| 最大输入长度 | 512 token | 8192 token |
| 分块关键 | 严格确保不超过512 token,需精细控制分块字符数。 | 可利用长上下文优势,采用更大的分块以保持语义完整。 |
| 推荐分块策略 | 使用ChineseTextSplitter,字符分块大小约500-800进行调试。 | 可根据文档特点,灵活采用较大的分块(如千字以上),或按章节等自然段落分割。 |
| 适用场景 | 适合处理短文本或需要被精细切分的标准文档。 | 特别适合处理长文档、书籍、技术手册等,减少不必要的切分。 |
基于文本结构的分割(Text structure-based)
这是最常用且推荐的默认策略,尤其适用于普通自然语言文本(如文章、书籍、网页内容等)。
- 核心实现:
RecursiveCharacterTextSplitter - 工作原理:
- 首先尝试按段落(
\n\n)切分; - 如果段落仍超过
chunk_size,则退回到按句子(.、?、!等)切分; - 若句子仍太大,则进一步按单词甚至字符切分。
- 首先尝试按段落(
- 优点:
- 尽可能保留自然语言边界;
- 在保持语义连贯的同时控制块大小。
安装
shell
pip install -U langchain-text-splitters -i https://mirrors.aliyun.com/pypi/simple --trusted-host=mirrors.aliyun.com示例
python
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50 # 重叠部分有助于上下文衔接
)
# 分割字符
splits = text_splitter.split_text(texts)
# 分割文档
splits = text_splitter.split_documents(docs)基于长度的分割(Length-based)
这种策略不考虑语义或结构,仅依据字符数或 token 数进行硬性切割。
- 适用场景:对性能要求高、或文本无明显结构(如日志、代码片段)。
- 两种子类型:
- 字符级(Character-based):按字符数量切分;
- Token 级(Token-based):使用 tokenizer(如 TikToken)计算 token 数量后切分,更贴合 LLM 实际输入。
python
from langchain_text_splitters import CharacterTextSplitter
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
encoding_name="cl100k_base", # 适用于 GPT-3.5/4
chunk_size=100,
chunk_overlap=0
)
splits = text_splitter.split_text(texts)基于文档结构的分割(Document structure-based)
针对具有明确结构的文档格式(如 Markdown、HTML、JSON、代码等),利用其语法结构进行智能切分。
- 优势:
- 保留逻辑单元(如 Markdown 标题下的全部内容);
- 提升检索相关性和生成质量。
- 典型用例与工具:
- Markdown:按
#,##等标题层级切分 →MarkdownHeaderTextSplitter - HTML:按
<div>,<p>等标签切分 →HTMLHeaderTextSplitter - JSON:递归切分嵌套对象 →
RecursiveJsonSplitter - 代码:按函数、类划分 →
CodeSplitter
- Markdown:按
文本加载与分割综合示例
示例
python
from langchain_community.document_loaders import UnstructuredMarkdownLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
def load_md():
"""加载markdown文件"""
file_path = "./data/md/热门专业top20.md"
loader = UnstructuredMarkdownLoader(
file_path,
mode="single",
strategy="fast",
)
docs = loader.load()
# print(len(docs))
# print(type(docs[0]))
# print(docs[0])
return docs
def split_text(docs):
"""对文档进行文本分割"""
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
# print(len(splits))
# print(type(splits[0]))
# print(splits[0])
return splits
# 得到分割后的文档
splits = split_text(load_md())