文档转换器
前往集成,查看内置文档转换器与第三方工具的文档。
一旦加载了文档,您通常会希望对其进行转换,以更好地适应您的应用程序。最简单的例子是您可能希望将长文档拆分为更小的块,以适应您模型的上下文窗口。LangChain提供了许多内置的文档转换器,使得拆分、合并、过滤和其他文档操作变得容易。
文本拆分器
当您想要处理大块文本时,有必要将文本拆分为块。虽然听起来很简单,但这里存在许多潜在的复杂性。理想情况下,您希望将语义相关的文本片段保持在一起。"语义相关"的含义可能取决于文本的类型。本笔记本演示了几种做法。
在高层次上,文本拆分器的工作方式如下:
- 将文本拆分为小的、语义上有意义的块(通常是句子)。
- 将这些小块组合成较大的块,直到达到某个大小(由某个函数测量)。
- 一旦达到该大小,将该块作为自己的文本片段,然后开始创建一个具有一定重叠的新文本块(以保持块之间的上下文)。
这意味着有两个不同的轴可以定制您的文本拆分器:
- 文本如何拆分
- 块大小如何测量
开始使用文本拆分器
默认推荐的文本分割器是 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}