“ 测试一下个人写的文章的流量怎么样,笔者曾参与某月活过亿云文档的RAG产品的从0到1,以及从1到n。本文将从一个特别的角度来分享一下如何打造优秀的RAG系统。
RAG的初衷,可能是提高事实性、降低幻觉、使用实效性更强、专业性更强的知识来回复用户。一个标准的步骤如下“文档 -> 文档块 -> 索引+搜索 -> 生成 -> 评估”;在chatpdf爆火之后,互联网上有很多的博客、教程教大家如何构建自己的知识库机器人。最多的就是文档窗口切块,建立知识库索引,向量检索,拼接到结构化的prompt中,经过大模型得到最终的答案。
这个流程相对而言,还是比较简单的,因此定义这个流程为RAG系统的从0到1。这个系统存在什么问题呢?个人理解无外乎以下几种:
-
模型生成阶段没有获取到输入相关片段,存在的原因可能有2个,
-
召回遗漏
-
知识库确实不存在相关片段
-
模型生成的答案不全,这种也分2个情况
-
片段所带的信息不全
-
模型生成遗漏(这个在问题咨询多个方向的时候比较常见,例如:茅台的2023年净利润是多少?增长了多少?模型的结果只回答了一个问题)
-
模型的幻觉/错误
-
RAG下的幻觉大多都是跳脱文档片段来回答,不同模型的幻觉比例是不同的,这个是可以定量的评估的(本文不做更多介绍)。
-
理解错了提供的知识,比如上面的例子中问的是2023年的茅台,但是知识库的相关文档可能是2022年的,模型输出了错误的数据。
如果把这些业务问题归纳成算法人易于理解的语言,其实可以归为2类:
- 召回问题
- 模型问题
在本文,不打算介绍我们的RAG系统流程,本文的重点是尝试跳脱固定的流程,以几个启发式的思路来引导,如何能更好的处理上述2类问题。
- 用于进行文档召回的输入不一定非得同用户输入完全一致
- query改写,这个应该有小伙伴已经在用了。为什么需要改写?一方面改写能提高召回系统的RACALL;另一方面能让整个系统对用户的输入更鲁棒。
一个比较优秀的medium博客推荐,标题比较极端,但是内容可参考,需要会员才能访问,需要各显神通了(地址被微信屏蔽了,google搜rag fusion 应该能看到)。 2. self-rag,由模型来决定何时召回,用于召回用的query内容是什么,比如中国人口最多的城市有多少人?有没有可能分成2个问题,中国人口最多的城市是?xx的人口有多少?这个角度在本公众号上周的推文有一篇是关于这个的,地址。
-
借助大模型的知识,例如hyde算法,使用大模型生成一个伪答案,召回阶段会借助这个伪答案的辅助,这个方法的口碑很好,用的应该也比较多,但是存在的问题是受限于常见以及大模型的能力,有可能会产生副作用。
-
hybrid,这里不是指搜索过程的混合搜索,对输入结构,在术语一点叫query理解,可以帮助对答案要求更精确的场景。
-
召回的输出不一定非得跟大模型的输入一致
-
召回+排序,这个肯定是必备的(但是排序不是只能用交互式模型打分),排序是能大幅提高整个系统的RECALL的。
-
候选输入的顺序对于模型对知识的理解也很重要,一般首尾最重要,中间的输入信息会被遗漏,paper:lost in the middle
-
可以召回小片段,溯源大片段,类似于langchain的ParentDocumentRetriever方法,主要是想解决知识不全的问题
-
反之,也可以召回大片段,进模型使用小片段,类似于RECOMP中提到的Extractive Compression,主要是想解决模型上下文长度限制的问题
-
召回模块得到的片段不一定非得合并到一起进模型,类似于map-reduce的操作,主要是想更好的结合已有知识。
-
召回不一定非得用在prompt里面,类似经典的RAG模型knn-lm是用在输出,还有一些工作设计新的attention机制来实现融合,比如RETRO的工作等等。
-
召回系统不一定完全依赖向量模型
-
一个好用的模型,大多数时候都不是榜单上最好的那个,向量模型的榜单一般看c_mteb。有一个业务的评估标准比较重要。一个好的RAG向量模型,需要具备一定的跨域能力,并且通过联合训练能很大程度上提高生成模块与向量模块的配合。
-
向量模型固然好,但是劣势也很明显,如对上面询问茅台的净利润,不管哪一年的候选片段应该相似度都是非常高的。
-
不做更多展开,关于如何做好召回系统,可以借鉴搜索场景下的召回。
-
如何降低模型的幻觉,提高生成模型的准确率
这里的策略很多,不打算在展开,比如今天的另外一篇推文就能大幅提高事实性,降低幻觉。
总结:
要做好一个RAG系统,不管是文档块,还是召回,甚至是常见的大模型生成上都有很多的TRICK,但是不管是什么TRICK,最终的目的都是解决那部分属于它的badcase。
本文算是抛砖引玉,通过几个启发式的观点帮助大家摆脱思维定式,如果有更多的问题,可以公众号私信,或者添加笔者微信,微信id:nipi64310。内容有错误还请见谅,晚饭后半小时随笔。
