文档转换器与字符分割器组件的使用!

DocumentTransformer 组件

在 LangChain 中,使用 文档加载器 加载得到的文档一般来说存在着几个问题:

  • 原始文档太大、原始文档的数据格式不符合需求(需要英文但是只有中文)、原始文档的信息没有经过提炼等问题。

如果将这类数据直接转换成向量并存储到数据库中,会导致在执行相似性搜索和 RAG 的过程中,错误率大大提升。

所以在 LLM 应用开发中,在加载完数据后,一般会执行多一步 转换 的过程。

  • 即将加载得到的 文档列表 进行转换,得到符合需求的 文档列表。

转换涵盖的操作就非常多,例如:文档切割、文档属性提取、文档翻译、HTML 转文本、重排、元数据标记等都属于转换。

在 LangChain 中针对文档的转换也统一封装了一个基类 BaseDocumentTransformer

  • 所有涉及到文档的转换的类均是该类的子类。

将大块文档切割成 chunk 分块的文档分割器也是 BaseDocumentTransformer 的子类实现。

BaseDocumentTransformer 基类封装了两个方法:

transform_documents()

  • 抽象方法,传递文档列表,返回转换后的文档列表。

atransform_documents()

  • 转换文档列表函数的异步实现,如果没有实现,则会委托 transform_documents() 函数实现。

在 LangChain 中,文档转换组件分成了两类:文档分割器(使用频率高)文档处理转换器(使用频率低,老版本写法)

并且目前 LangChain 团队已经将 文档分割器 这个高频使用的部分单独拆分成一个 Python 包。

哪怕不使用 LangChain 框架本身进行开发,也可以使用其文本分割包,快速分割数据。

在使用前必须执行以下命令安装:

1
pip install -qU langchain-text-splitters

对于文本分割器来说,除了继承 BaseDocumentTransformer

还单独设置了文本分割器基类 TextSplitter,从而去实现更加丰富的功能。

字符分割器基础使用技巧

在文档分割器中,最简单的分割器就是:字符串分割器。

这个组件会基于给定的字符串进行分割,默认为 \n\n,并且在分割时会尽可能保证数据的连续性。

递归字符文本分割器

普通的字符文本分割器只能使用单个分隔符对文本内容进行划分。

在划分的过程中,可能会出现文档块 过小 或者 过大 的情况,这会让 RAG 变得不可控。

中文场景下的递归分割

RecursiveCharacterTextSplitter 默认配置的分隔符均是英文场合下的。

在中文场合下,除了换行/空格,一般还有更加复杂的语句结束判断标识,例如:。、!、?等标识符。

如果想更好去切割 中英文文档,可以考虑重设分隔符列表(或者继承该类进行重写)。