Skip to main content

文档转换器

前往集成,查看内置文档转换器与第三方工具的文档。

一旦加载了文档,您通常会希望对其进行转换,以更好地适应您的应用程序。最简单的例子是您可能希望将长文档拆分为更小的块,以适应您模型的上下文窗口。LangChain提供了许多内置的文档转换器,使得拆分、合并、过滤和其他文档操作变得容易。

文本拆分器

当您想要处理大块文本时,有必要将文本拆分为块。虽然听起来很简单,但这里存在许多潜在的复杂性。理想情况下,您希望将语义相关的文本片段保持在一起。"语义相关"的含义可能取决于文本的类型。本笔记本演示了几种做法。

在高层次上,文本拆分器的工作方式如下:

  1. 将文本拆分为小的、语义上有意义的块(通常是句子)。
  2. 将这些小块组合成较大的块,直到达到某个大小(由某个函数测量)。
  3. 一旦达到该大小,将该块作为自己的文本片段,然后开始创建一个具有一定重叠的新文本块(以保持块之间的上下文)。

这意味着有两个不同的轴可以定制您的文本拆分器:

  1. 文本如何拆分
  2. 块大小如何测量

开始使用文本拆分器

默认推荐的文本分割器是 RecursiveCharacterTextSplitter。该文本分割器接受一个字符列表。它尝试根据第一个字符进行分割来创建块,但如果任何块太大,则继续移动到下一个字符,依此类推。默认情况下,它尝试进行分割的字符是 ["\n\n", "\n", " ", ""]

除了控制可以进行分割的字符之外,您还可以控制一些其他事项:

  • length_function:计算块长度的方法。默认只计算字符数,但通常在此处传递一个令牌计数器。- chunk_size:块的最大大小(由长度函数测量)。- chunk_overlap:块之间的最大重叠。保持一些连续性之间可能有一些重叠(例如使用滑动窗口)。- add_start_index:是否在元数据中包含每个块在原始文档中的起始位置。
This is a long document we can split up.
with open('../../state_of_the_union.txt') as f:
state_of_the_union = f.read()
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
# Set a really small chunk size, just to show.
chunk_size = 100,
chunk_overlap = 20,
length_function = len,
add_start_index = True,
)
texts = text_splitter.create_documents([state_of_the_union])
print(texts[0])
print(texts[1])
    page_content='Madam Speaker, Madam Vice President, our First Lady and Second Gentleman. Members of Congress and' metadata={'start_index': 0}
page_content='of Congress and the Cabinet. Justices of the Supreme Court. My fellow Americans.' metadata={'start_index': 82}