Skip to main content
文本分割器将大文档分割成更小的片段,这些片段可以单独检索,并且适合模型上下文窗口的限制。 文档分割有几种策略,每种策略都有其自身的优势。
对于大多数用例,从RecursiveCharacterTextSplitter开始。它提供了在保持上下文完整和管理块大小之间良好的平衡。这个默认策略开箱即用效果很好,除非你需要针对特定应用程序进行性能微调,否则无需考虑调整它。

基于文本结构

文本自然地组织成层次单元,如段落、句子和单词。我们可以利用这种固有的结构来指导我们的分割策略,创建出保持自然语言流畅性、在分割内保持语义连贯性,并适应不同文本粒度级别的分割。LangChain的RecursiveCharacterTextSplitter实现了这一概念:
  • RecursiveCharacterTextSplitter 尝试保持较大的单元(例如段落)完整。
  • 如果一个单元超过块大小,它将移动到下一级(例如句子)。
  • 如果需要,此过程将继续到单词级别。
示例用法:
from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=0)
texts = text_splitter.split_text(document)
可用的文本分割器

基于长度

直观的策略是根据文档的长度来分割它们。这种方法简单而有效,确保每个片段不超过指定的尺寸限制。基于长度的分割的关键优势包括:
  • 简洁易行的实现
  • 一致的块大小
  • 容易适应不同的模型需求
基于长度的分割类型:
  • 基于令牌:根据令牌数量分割文本,这在处理语言模型时非常有用。
  • 基于字符:根据字符数量分割文本,这在不同类型的文本中可能更加一致。
示例使用基于标记分割的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:根据对象或数组元素进行分割
  • 代码:根据函数、类或逻辑块进行分割
可用的文本分割器

提供商特定

WRITER