主题
bash
pip install -U langchain-text-splittersbash
uv add langchain-text-splitters文本分割器(Text splitters)将大型文档拆分成更小的块,这些块可以单独检索,并能适应模型上下文窗口的限制。
有几种文档分割策略,每种都有其自身的优势。
对于大多数用例,建议从 RecursiveCharacterTextSplitter 开始。它在保持上下文完整性和管理块大小之间提供了良好的平衡。这个默认策略开箱即用效果很好,只有在需要针对特定应用微调性能时才应考虑调整它。
基于文本结构
文本自然地组织成层次化单元,如段落、句子和单词。我们可以利用这种固有结构来指导我们的分割策略,创建能保持自然语言流、在分割块内保持语义连贯性,并能适应不同文本粒度的分割。LangChain 的 RecursiveCharacterTextSplitter 实现了这一概念:
RecursiveCharacterTextSplitter尝试保持较大的单元(例如,段落)完整。- 如果一个单元超过了块大小,它会移动到下一个级别(例如,句子)。
- 如有必要,此过程会一直持续到单词级别。
使用示例:
python
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=0)
texts = text_splitter.split_text(document)可用的文本分割器:
基于长度
一种直观的策略是根据文档的长度进行分割。这种简单而有效的方法确保每个块不超过指定的大小限制。基于长度分割的主要优点:
- 实现简单直接
- 块大小一致
- 易于适应不同的模型需求
基于长度分割的类型:
- 基于令牌(Token-based):根据令牌数量分割文本,这在处理语言模型时很有用。
- 基于字符(Character-based):根据字符数量分割文本,这在不同类型的文本之间可能更一致。
使用 LangChain 的 CharacterTextSplitter 进行基于令牌分割的示例实现:
python
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:按对象或数组元素分割
- 代码:按函数、类或逻辑块分割
可用的文本分割器: