
记一次RAG问题优化——当需要从多个向量库中召回数据会面临那些问题? 原创
“ 要想做好一个RAG系统,需要在实践中不断地优化和调整,很难做到一蹴而就。”
昨天遇到了一个小问题,就是在数据召回的时候有部分应该召回的数据但没有显示出来;所以不确定到底是因为数据本身没有被召回,还是被召回之后由于某种原因被过滤掉了。
因此,今天就查了一下这个问题产生的原因,然后就发现了一些问题;目前系统中,不同的数据是分在多个不同的向量库中,然后在召回的时候发现每个库中都可以召回数据,但理论上来说跟问题无关的库中应该找不到数据才对。
所以,就需要思考为什么会产生这种问题,这种现象说明了什么?
多库召回问题
抛开标量召回(传统的字符匹配方式)方式,在相似度召回过程中,是通过把问题向量化,然后通过向量计算的方式匹配更近似的数据,虽然向量计算的算法不同,但本质上是一样的。
所以,再回到今天这个问题,在使用相似度召回时,虽然不同库中的数据不一样;从理论上来说,在相似度计算时,其它库中的计算结果应该是与问题无关的。
但这里有个问题就是,一是可能由于我们前期文档处理的质量不好,导致进行相似度计算时出现一定的偏差,因为目前相似度召回的阈值设置的就比较低;第二个可能的原因就是,其它文档中也有与问题相关的内容,导致其数据被召回,这个产生的原因就是业务需求和设计有问题,导致文档无法完全做到逻辑隔离。
但既然问题已经产生了,那么就需要找到一个解决方案,面对这样的问题应该怎么处理?
我们都知道,相似度召回是RAG中非常重要的一个技术手段;但单纯的相似度召回很难达到我们要求的文档质量,因此一般情况下在相似度召回之后还需要对召回的文档进行rerank重排序,目的就是过滤掉其中相关性不高的文档。
因此,作者遇到这个问题之后就是采用先召回,后重排过滤的方式来剔除其它无关库中的数据;但由于不好控制阈值,因此还是有部分其它库中的数据被保留了下来。
所以,这里就有了一个难点也是问题点,怎么完全过滤掉无关文档的影响?
如果仅仅只是通过提高阈值的方式,会导致部门正确的文档被过滤掉,导致文档不足,影响结果;而阈值太低就无法完全避免以上问题。
所以,遇到这种问题完全通过技术手段好像很难实现;因此,我们只能换个思路从结构来解决这问题,虽然说这并不一定是一个好的解决方案。
简单来说就是,通过两次召回和排序的方式来解决这个问题;第一次使用高阈值对数据进行召回和重排序,找到其中最相关的几条数据。然后,再拿到这几条数据所在库表,之后再在这个库表中再次召回,而第二次召回的阈值相对可以放得低一点;这样通过两次召回的方式,就能尽量避免以上问题的发生,虽然说还无法完全避免。
总之,在RAG中文档召回的质量直接响应到大模型的表现;但影响召回率和准确率的原因又有很多,因此我们只能在具体的实践过程中对系统进行不断的调整和优化才可能达到我们想要的效果。
本文转载自AI探索时代 作者:DFires
