文档转换器与字符分割器组件的使用!
文档转换器与字符分割器组件的使用!
月伴飞鱼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 默认配置的分隔符均是英文场合下的。
在中文场合下,除了换行/空格,一般还有更加复杂的语句结束判断标识,例如:。、!、?等标识符。
如果想更好去切割 中英文文档,可以考虑重设分隔符列表(或者继承该类进行重写)。