在处理 RAG(Retrieval-Augmented Generation)过程中,数据质量直接影响生成结果的质量。
在之前案例的演示中,我们均使用Langchain提供的document loader在默认参数下加载数据。不过,实际应用中常常面临一些问题,例如在读取和分块过程中表格被切割、段落被断裂等,虽然通过overlap策略可以在一定程度上弥补,但这并总能解决问题。
原本打算写一篇介绍在文档载入和切分过程中的一些技巧,但正巧发现了 Unstructured这个工具库,宣称能够从多种格式的数据源中获取数据,并将其转换为适合大语言模型理解的JSON文件。
我们通过一个示例演示如何使用Unstructured库来优化文档载入和数据切分的过程。
Unstructured 的优势在于使用同一接口处理多种格式数据源,并提供元素识别和视觉生成模型,优化 PDF、图片等非结构化数据的处理。
Unstructured 提供线上付费接口和开源的本地部署版本。鉴于国内企业对安全性的要求,我们选择本地部署版本进行效果演示。
当然,如果没有安全性担忧的话,线上付费接口提供了效果更佳的识别模型且不依赖于本地硬件资源。
首先,通过pip安装Unstructured的Python SDK:
我们依然选取之前的腾讯财报案例数据,展示数据处理流程:
Unstructured 返回的结果是一个元素列表,每个元素包含了文本内容、元数据等信息。
我们通过查看返回列表的长度,可以发现Unstructured将PDF文件切分为了823个块,这也是Unstructured最显著的特点,它会将文档中的每个元素(标题、表格、图片等)识别并切分为一个独立的元素。
我们挑选几个元素来查看其内容:
可以看到Unstructured将文档中的标题、表格等内容识别出来,并将其切分为独立的元素,每个元素的长度是不同的,这与我们之前按字数切分的方式有显著区别。
虽然Unstructured能精确识别和切分文档元素,但如此细粒度的切分会导致严重缺失上下文信息。这也是Unstructured另一个特点,其思路不是载入整个文档再进行切分,而是识别每一个元素,对元素进行组合。
通过设置 combine_under_n_chars
参数,我们可以将长度小于指定值的元素进行合并,达到类似于切分文档的效果。
此时可以看到元素数量减少到了229个。
我们再次查看第一个元素的内容:
此时,文章开头的一段文字被合并到了一起,已经是可以向量化进行 RAG 应用的效果了。
通过Unstructured的处理方式,可以有效避免文档切分不当导致的数据质量问题,提高召回准确度和大模型问答效果。
当然这并不意味着我们可以抛弃其他技巧,依然可以叠加使用overlap策略、文档预处理等方法,以进一步提升效果。