一篇新鲜出炉的RAG综述

火山方舟向量数据库大模型

提纲

1 简介

2 RAG分类

3 RAG增强

4 讨论

参考文献

1 简介

尽管目前大模型取得非常不错的效果,但是依旧面临不少挑战,包括如何获取实时跟长尾知识,如何规避数据泄露的风险,以及高昂的训练跟推理成本。为了应对这些挑战,RAG逐渐受到更多人的关注。

近期看 到一篇北京大学发表的关于RAG的综述文章,概括性地描述各个模态下的RAG相关技术,其中关于NLP部分的内容很是不错,于是在这里整理了下其中的部分内容。 (原文内容很多,但在这里只记录了笔者感兴趣的部分)

2 RAG分类

文中根据如何利用检索模块增强生成模块的方式,将RAG分为4种范式。

picture.image

图1:RAG分类

Query-based RAG

利用用户query检索得到相关文档,将检索结果跟用户query拼接到一起作为生成模型的输入。  **这是利用外部检索知识显示指导生成模型的方式,也是目前RAG主流的范式。** 这种范式的兴起跟生成模型能力不断提升有非常大的关系,尤其是到了大模型的时代,由于大模型的能力相当强大,所以只要直接将外部知识跟其他输入一起喂给大模型,大模型自身就可以处理这些信息并生成合适的回复,简单粗暴且效果不错。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

Latent Representation-based RAG

利用用户query检索得到相关文档,并获取对应文档的向量表征,在生成模型生成阶段融入知识文档的表征信息。  **这是一种利用外部检索知识隐式指导生成模型的方式,生成模型会跟检索知识的向量表征进行交互,从而增强生成模型的理解能力跟生成文本的质量。** 最典型的就是FiD,这种范式在大模型时代前也曾一度流行,由于当时生成模型的能力不足,于是出现这种想在decoder阶段直接注入外部知识的方案,能够让检索枷锁更加直接地干预到生成结果。  

Logit-based RAG

生成模型在decoder阶段计算下一个token的logit时,同时考虑生成预测的结果跟检索模块返回的信息。  **可以理解为将检索模块跟生成模块视作两个独立的链路,分别计算对应的下个token输出的logit值,再将两个链路的logit联合起来。** 最典型的就是knn-LM。  

Speculative RAG

利用检索模块来替代生成模块的方式,主要用于节省资源跟加速文本生成。  **可以理解为利用检索结果提供一段候选回复,让生成模型判断这段候选回复是否适合作为最终结果,适合的话就保留,不适合的话就从不适合的位置起进行截断,然后重复上述过程。** 最典型的就是REST

3 RAG增强

为了提升RAG整体效果,可以从以下几个方面进行。

picture.image

图2:RAG增强方式

Input Enhancement

用户query的质量会明显影响到检索模块的结果,可以通过query改写,数据增强等方式提升用户query的质量。  

Retriever Enhancement

检索模块提供的内容质量越高,生成模块的效果越有保证。提升检索文章质量的以下几种方式。


a) r

ecursive R etrieve 对用户query进行合理切分,再分别进行检索。

b) chunk optimaization 调整数据库的大小,例如sentence-window retrieval这种检索到特定文本后,将该文本的窗口内其他文本也一同返回。  



c) finetune retriever 利用高质量的领域数据或者特定任务数据对embedding模型进一步微调。  



d) hybrid retrieve 同时利用稠密检索跟稀疏检索等多种检索方案  



e) re-ranking 利用额外的精排模型对召回结果做进一步排序。  



f) meta-data filtering 利用某些属性对数据做进一步过滤

Generator Enhancement

生成模型的能力决定了整个RAG系统的上限。  

a) prompt engineering 懂得都懂,大模型对于prompt还是很敏感的,正确掌握大模型的使用方式可以得到足够惊艳的效果。  



b) decoding Tuning 在decoder阶段增加更多控制,调整解码参数以提升多样性,或者将输出词表限制到特定空间等等。


c) finetune generator 对生成模型做进一步finetune使得生成模型更适配特定领域或者检索模块。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

Result enhancement

‍‍‍‍‍

若生成模型的结果未能达到预期效果,还能对结果进一步修饰。这里文中提到的方法貌似不够全面,目前很火热的rethink或者refine都没有提及。

RAG pipeline enhancement

‍‍

a) adatpive retrieval 在检索模块前新增一个模块,根据用户query判断是否需要调用外部知识库,避免滥用检索造成的资源浪费跟模型幻视问题。‍‍‍‍


b) iterative RAG 迭代RAG,反复调用检索-生成这个pipeline以获得更佳效果。  

4 讨论

文中关于NLP部分的内容,概括得非常全面,尤其RAG增强的部分,RAG玩家想进一步提升自己设计的RAG系统性能的话,可以好好看下这部分内容,里面提到的很多技巧确实是很有收益的,跟大家实践经验也比较吻合。同时 ,可以发现目前的RAG可以被切分了非常多的子模块,而各个子模块的优化还是相对比较独立的,如何加强各个子模块之间的交互以达到系统整体最优的工作还值得进一步研究。

参考文献

1 Retrieval-Augmented Generation for AI-Generated Content: A Survey

https://arxiv.org/pdf/2402.19473.pdf

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论