
记一次大模型检索增强系统中的一个问题——死板的RAG 原创
“ RAG的机制决定了其执行流程比较死板,而Agent更符合人类的思维模式。”
在RAG检索增强系统中,有一个很重要的概念就是语义相似度检索,其流程根据用户问题先去知识库中检索相关文档,然后再丢给模型做增强。
但在真实的业务实践过程中发现了一个问题,具体表现上是多轮对话的关联性问题,实际上是语义理解问题;这个问题产生的场景就是在多轮对话过程中无法准确理解每次对话之间的关系,但这个是由RAG的流程所决定的,无法避免,或者说无法完全避免。
多轮对话中的语义理解问题
RAG的处理流程就是先检索,再增强,这是由RAG的特性所决定的;但是为了保证多轮对话的连贯性,因此在实际的处理过程中会添加记忆功能,使用记忆拼接上下文,使模型能够更好的理解和处理用户问题。
但是,拼接上下文毕竟是属于第二步,第一步是需要先使用语义相似度检索文档;这里有一个问题就是,上一个问题和下一个问题可能是完全无关的,也可能是紧密相关的。
因此,两种情况就会导致召回不同的文档,特别是在两次语义相关,但又不完全相关的情况下;这样说可能很多人都不明白什么意思,所以我们就用具体的例子来看。
比如说,第一个问题是怎么做西红柿炒蛋?然后模型巴拉巴拉一堆告诉你怎么做;然后,第二个问题是怎么才能做得更好?
这时针对这两个问题来说,其是有语义关联性的,特别是在有记忆功能的情况下,大模型也能理解你说的怎么才能做的更好是什么意思。
但在召回阶段,两个问题之间的语义关联性就不是很明显了;而根据相似度召回,两个问题召回的文档也基本上可以说是完全不搭嘎。
所以,怎么解决这个问题?
在前面的文章中有聊到过这个问题,解决方案就是在做召回时,先对问题进行改写,改写时使用历史记录作为上下文,这样就可以让模型更好的理解当前的语境,然后理解相应的问题并给出一个更合理的问题进行数据召回。
但这里又带来了一个新的问题,就是这种召回方式虽然保证了多轮对话之间的语义相关性;但如果两轮对话是完全独立的对话怎么办,即两个问题完全没任何关系;这样就会让上一个问题污染到下一个问题的召回精度。
还一个更严重的问题是,两个问题之间有关联关系,但从语义上又区分不出来的场景。
举例来说,第一个问题是我要做西红柿炒蛋,第二个问题是应该去那个菜市场买菜。
这两个问题有关联性吗?肯定是有的,但你说它可以没有关联性吗?当然也可以。
所以这种情况下,应该怎么办?
如果把两个问题合在一起改写出一个新问题,但用户的本意可能是两个完全独立的问题;但如果不进行改写,用户的本意也可能是两个相关性问题。
这种情况如果从用户的角度来说,只需要把问题问的再具体一些就行了;但问题是我们无法控制用户的行为。
所以,如果从RAG的角度来考虑这个问题,这个问题基本上是无解的,只能去约束用户的行为;但如果换个思路,使用智能体来实现,由智能体自己去判断是否需要进行数据召回,还是利用现有的内容进行回复,这样就可以避免这个问题。
而产生这个问题的原因就是RAG的机制和我们人类思考模型的区别;RAG的机制就是,不论三七二十一,我先去捞一遍文档;但人类的思考模式是,先看能不能解决问题,如果解决不了再去查文档。
所以,从这一点来看智能体更符合人类的思维模式,而RAG相对来说就比较死板。
本文转载自AI探索时代 作者:DFires
