pip install -U langchain-text-splitters
uv add langchain-text-splitters
文本分割器 将大型文档拆分为更小的块,这些块可以单独检索并适合模型上下文窗口限制。
分割文档有多种策略,每种策略都有其自身的优势。
基于文本结构
文本自然地组织成段落、句子和单词等层次结构。我们可以利用这种固有结构来指导分割策略,创建保持自然语言流程的分割,保持分割内的语义连贯性,并适应不同级别的文本粒度。LangChain 的 RecursiveCharacterTextSplitter 实现了这个概念:
- -
RecursiveCharacterTextSplitter尝试保持较大单元(如段落)完整。 - - 如果某个单元超过块大小,它会移动到下一个级别(例如句子)。
- - 如有必要,此过程会继续下探至单词级别。
示例用法:
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=0)
texts = text_splitter.split_text(document)
可用的文本分割器: - 递归分割文本
Length-based
一种直观的策略是根据文档的长度来分割文档。这种简单而有效的方法确保每个块不超过指定的大小限制。基于长度的分割的主要优点:
- - 直接实现
- - 一致的块大小
- - 易于适应不同的模型要求
基于长度的分割类型:
- - 基于令牌:根据令牌数量分割文本,这对于处理语言模型特别有用。
- - 基于字符:根据字符数量分割文本,这在处理不同类型文本时可能更加一致。
使用 LangChain 的示例实现 CharacterTextSplitter 使用基于令牌的分割:
from langchain_text_splitters import CharacterTextSplitter
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
encoding_name="cl100k_base", chunk_size=100, chunk_overlap=0
)
texts = text_splitter.split_text(document)
基于文档结构
某些文档具有固有结构,例如 HTML、Markdown 或 JSON 文件。在这种情况下,根据文档结构进行分割是有益的,因为它通常自然地将语义相关的文本分组。基于结构的分割的主要优点:
- - 保留文档的逻辑组织
- - 保持每个块内的上下文
- - 对于检索或摘要等下游任务可能更有效
基于结构的分割示例:
- - Markdown:根据标题分割(例如,
#,##,###) - - HTML:使用标签分割
- - JSON:按对象或数组元素分割
- - 代码:按函数、类或逻辑块分割
可用的文本分割器: - 分割 Markdown - 拆分 JSON - 拆分代码 - 拆分 HTML