文档转换器
info
请前往Integrations查看与第三方工具的内置文档转换器集成的文档。
一旦加载了文档,您通常会希望将它们转换为更适合您的应用程序的形式。最简单的例子是,您可能希望将长文档拆分为较小的块,以适应模型的上下文窗口。LangChain具有许多内置的文档转换器,可以轻松地拆分、合并、过滤和操作文档。
文本拆分器
当您想处理长文本时,有必要将文本拆分为块。尽管听起来很简单,但这里存在很多潜在的复杂性。理想情况下,您希望将语义相关的文本片段保持在一起。"语义相关"的含义可能取决于文本的类型。本文展示了几种实现这一目标的方法。
从高层次上看,文本拆分器的工作方式如下:
- 将文本拆分为小的、语义上有意义的块(通常是句子)。
- 将这些小块组合成较大的块,直到达到一定的大小(通过某个函数进行测量)。
- 一旦达到该大小,将该块作为自己的文本片段,然后开始创建一个具有一定重叠的新文本块(以保持块之间的上下文)。
这意味着您可以沿着两个不同的轴自定义文本拆分器:
- 文本如何拆分
- 块大小如何测量
开始使用文本拆分器
默认推荐的文本分割器是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这样的集成,我们可以将文档从一种语言翻译成另一种语言,提取所需属性并将其添加到元数据中,以及将对话转换为问答格式的一组文档。