
在RAG中文档处理质量参差不齐的情况下——提升召回精度的企业级解决方案 原创
“ RAG做起来很简单,但想把RAG做好就需要想尽办法去提升数据的召回质量。”
在RAG中文档处理可以说是一个重难点,特别是复杂文档的处理更是一言难尽;因此,面对这种现实问题,总不能直接摆烂,因此怎么在文档质量处理参差不齐的情况下,提升RAG的召回精度就是一个需要解决的问题。
文档处理的质量直接影响到RAG的召回效率,但目前文档处理是一个难点;因此怎么基于现有条件,提升RAG的召回精度?既然文档处理质量控制不了,那么就只能想别的办法,尽量弥补文档质量的不足。
提升RAG召回精度
关于RAG中的文档处理,目前主流的方式还是以人工介入为主,比如说对文档格式进行转换(word,pdf,ppt等转换成markdown),对文档进行人工分段;设置文档拆分长度等等。
虽然说人工已经尽可能的考虑文档完整性的情况下,其处理效果还是差强人意;因此,面对这种问题其实最好的解决方式让大模型自己去给文档做拆分,注意这里说的是大模型,而不是小模型。
为什么这么说?
原因在于随着大模型技术的发展,大模型的能力也变得越来越强,因此在某些情况下人工做的并一定比模型做的好,特别是这种对文档进行处理的场景,模型根据语义对文档进行拆分或处理,或许比人工做的要更好。
人工在对文档处理的情况下,一般是按照标题,段落或长度对文档进行拆分;而如果把文档直接丢给模型,让模型根据自己的理解对文档进行拆分,或许能更好地保证文档的语义完整性;而这种情况下,大模型的表现肯定会比小模型要好,这也是为什么在前面强调说是大模型,而不是小模型的原因。
当然,毕竟模型的上下文窗口有限,而且大模型对长文本处理存的效果并不是特别好;因此,面对较长的文档,还是需要人工进行初步的处理,才能交给模型去拆分。
OK,前面说了文档的一种处理方式,那么下面我们进入正题,怎么在文档质量参差不齐的情况下,来提升召回精度?
其实这个问题说简单也简单,说复杂也复杂;说简单是因为我们的目的很明确,那就是提升模型的召回精度;复杂是怎么提升这个召回精度?
下面我们就来介绍几种提升召回精度的方式:
1. 同时使用稠密向量和稀疏向量
2. 对分段的文档进行关键字提取
3. 对分段文档进行总结提炼
4. 同时使用标量检索和向量检索
同时使用稠密向量和稀疏向量
这种方式是基于向量数据库本身的一种特性,部分向量数据库比如说milvus支持稠密向量和稀疏向量,简单来说就是对分段内容进行两次向量化,一次是稠密向量,一次是稀疏向量。
在milvus向量数据库的官方文档中介绍,密集向量是捕捉语义关系的绝佳方法,而稀疏向量则是精确匹配关键词的高效方法。
因此,同时使用稠密向量和稀疏向量,能够从更多的维度对数据进行召回,当然也能够提升文档的召回质量。
对分段的文档进行关键字或主要内容提取
既然文档处理的质量参差不齐,并且用户问题可能比较简短的情况下,这时很难进行语义检索,甚至很多时候根据检索不到数据。
因此,在文档入库之前,我们可以使用模型先对已分段文档进行关键字提取,这样把提取的关键字作为标签,因此就可以在检索时就可以进行关键字匹配,当然也可以把标签向量化,进行标签语义匹配;这样在用户提问时,也对用户问题进行同样的操作,这样就可以使用更准确的关键字进行数据召回,提升召回质量。
对分段文档进行总结提炼
既然文档处理质量不齐,而且即使文档处理质量还行,但由于用户的问题较简短;那么我们就对文档内容进行总结提炼,然后再对总结之后的内容进行向量化,之后进行语义检索;这样也可以提升数据的召回质量。
同时使用标量检索和向量检索
在向量数据库中,一般情况下把文档内容进行向量化,但同时文档也存在一些元数据,这个元数据可以是文档本身的(文档名称,简要说明等),也可以是我们人为提取的(关键字标签)。
这时我们在检索时,就可以先根据这些元数据进行初步筛选,然后再进行语义筛选;这时通过多种召回方式的配合,就能更好地对数据进行召回。
当然,上面介绍的都是文档的召回策略问题;而且上面的几种召回策略并不是非此即彼的,很多时候可以多种联合使用;因此,通过以上召回策略召回数据之后,我们需要对召回的数据进行统一的处理,比如说去重,排序,重排序等多种操作,最后才是我们需要的数据。
本文转载自AI探索时代 作者:DFires
