一架梯子,一头程序猿,仰望星空!
LangChain教程(Python版本) > 内容正文

LangChain 文档转换器入门介绍


文档转换器

LangChain的文档转换器主要作用是分割文本内容,把一个大的文章内容,切割成多个小的内容片段。这么做的目的是因为大模型通常都有提示词长度限制,不能把所有的内容都丢给AI,即使有些大模型允许的提示词长度很大,从成本角度考虑实际应用也不会把那么长的内容传给AI,毕竟内容越长API调用费用越高(就算是本地部署的开源模型,内容越长需要的显存越高,推理越慢)。合理的做法是请求AI模型的时候把相关内容片段作为背景信息和提示词拼接在一起传给AI。

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_splitters 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='..忽略文本..' metadata={'start_index': 0}
    page_content='..忽略文本..' metadata={'start_index': 82}

其他转换:

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

除了拆分文档,我们还可以对文档内容做其他转换操作。使用EmbeddingsRedundantFilter,我们可以识别相似的文档并过滤掉冗余内容。通过像doctran这样的集成,我们可以执行诸如将文档从一种语言翻译成另一种语言,提取所需的属性并将其添加到元数据中,以及将对话转换为一组Q/A格式的文档等操作。



关联主题