Skip to main content

文档转换器

info

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

一旦加载了文档,您通常会希望将它们转换为更适合您的应用程序的形式。最简单的例子是,您可能希望将长文档拆分为较小的块,以适应模型的上下文窗口。LangChain具有许多内置的文档转换器,可以轻松地拆分、合并、过滤和操作文档。

文本拆分器

当您想处理长文本时,有必要将文本拆分为块。尽管听起来很简单,但这里存在很多潜在的复杂性。理想情况下,您希望将语义相关的文本片段保持在一起。"语义相关"的含义可能取决于文本的类型。本文展示了几种实现这一目标的方法。

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

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

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

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

开始使用文本拆分器

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

除了控制可以分割的字符之外,您还可以控制其他一些内容:

  • length_function:如何计算分块的长度。默认只计算字符数,但通常在此处传递一个令牌计数器。
  • chunk_size:分块的最大大小(由长度函数测量)。
  • chunk_overlap:分块之间的最大重叠。保持一些连续性之间可能有一些重叠是很好的(例如使用滑动窗口)。
  • add_start_index:是否在元数据中包含每个分块在原始文档中的起始位置。
# 这是一个可以分割的长文档。
with open('../../state_of_the_union.txt') as f:
state_of_the_union = f.read()

from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
# 设置一个非常小的分块大小,只是为了展示。
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}

其他转换:

过滤冗余文档、翻译文档、提取元数据等等

我们可以对文档进行多种转换,不仅仅是简单地拆分文本。使用EmbeddingsRedundantFilter,我们可以识别相似的文档并过滤掉冗余内容。通过像doctran这样的集成,我们可以将文档从一种语言翻译成另一种语言,提取所需属性并将其添加到元数据中,以及将对话转换为问答格式的一组文档。