温馨提示:
这是本人的第一篇博客,有写的不好的还请包含。写博客的主要目的是在自己枯燥的研究生生涯中寻得一丝精神寄托,当个乐子看就行。由于本人的研究方向是大模型,博客的大部分内容是关于大模型的,这些都是从其他博客或者公众号上面看到的知识点,再结合本人的理解。大家可以多去看看原文。
原文链接:RAG“新手村”速通攻略
本文介绍:
本文主要在基础RAG方案之上,从宏观层面梳理RAG的优化策略和方案。作者主要通过两个方面进行论述,即RAG优化核心策略和RAG优化方案。本文未涵盖Prompt Engineering和比较复杂的多模态RAG内容。
0、什么是RAG
检索增强生成(Retrieval Augmented Generation,简称 RAG)为大语言模型 (LLMs) 提供了从数据源检索的信息,以此为基础生成回答。简而言之,RAG 结合了搜索技术和大语言模型的提示功能,即模型根据搜索算法找到的信息作为上下文来回答查询问题。无论是查询还是检索的上下文,都会被整合到发给大语言模型的提示中。
使用RAG的优势在于:LLMs 虽展现出强大能力,但在实际应用中,例如在准确性、知识更新速度和答案透明度方面,仍存在挑战。RAG 被证明能显著提升答案的准确性,并特别是在知识密集型任务上减少模型的错误输出。通过引用信息来源,用户可以核实答案的准确性,从而增强对模型输出的信任。此外,RAG 有助于快速更新知识并引入特定领域的专业知识。RAG 有效结合了大语言模型的参数化知识和非参数化的外部知识库,成为实施LLMs的关键方法之一。
1、策略
首先,让我们看看一般RAG的基础方案,如图1。(为什么说是一般呢?因为还有一种高级RAG技术,由于和本篇文章无关,就不在做论述)
图1:RAG的基础方案
大致流程:(1)将知识进行分块,得到若干块。(2)将得到的块通过Embedding Model进行向量化存储到向量数据库中。(3)用户输入问题经过Embedding Model进行向量,再经过向量数据库进行检索。(4)将检索得到前k个相关的块,以及用户问题通过提示工程输入给大模型。(5)大模型经过分析得到答案。
RAG优化核心策略主要基于Information Retrieval的2-stage经典思路展开:即同时保证高召回率和精度。2-stage在基础RAG策略上进行升级(图2),包含两个阶段:
阶段1:最大化召回率(High Recall),同时接受较低的精度( Low Precision)。此阶段涵盖RAG的Indexing和Retrieval部分(为了区别于一般意义上的Retrieval,我们改称该部分为Recalling),其目标是使用较为快速、低廉的方式覆盖全部输入文档,并保证问题相关的文档切片都可以被召回。
阶段2:提升精度(Higher Precision)。此阶段由新增的Reranking部分构成,其目的是在切片文档被获取后进行“Postprocessing”,以提升Top_K的精度,降低送往大模型文档切片的噪声。
图2:基础RAG -> 2-stage策略
将RAG的准确率从45%提升到98%主要来源于针对Indexing、Recalling和Reranking这三个部分的优化。也就是说这三部分也是RAG优化的核心。
图3: OpenAI RAG最佳实践
2、方案选择
2-stage在Recalling、Indexing和Reranking等三个部分至少存在9个优化点位。每个点位都包括N个技术实现,此外,点位的组合又会产生多种优化方案。
图4: RAG的优化点位
(1、文本分块。2、索引。3、Indexing。4、存储。5、查询优化。6、嵌入。7、向量存储。8、检索。9、重排)
优化方案选择:用“Top-Down”策略。
(一)首先,依据实际业务需求厘清优化目标,明确要在哪一个或者多个部分实现优化。
Recalling、Indexing和Reranking三部分优化目标分别如下:
- Recalling的目标是完善Query以取得更高的召回率;
- Indexing的优化目标是在提升召回率的同时保证语义完整性;
- Reranking的优化目标是保证Top_K的精度。
(二)其次,根据优化目标,选择不同类型的方案或方案组合。(图5)
图5: 主流方案及其优化目标
(1)Standard 2-stage由基础RAG策略+Reranking环节构成。该方案中最重要的是Reranker(也称为cross-encoder,由大模型或者算法实现),其能够在召回的切片之上,基于相关性对切片进行重排,以保证返回最相关的n个切片。
图6: Reranker的基本原理
(2)Question Transformation是通过改写、拓展和丰富问题的语义以提升召回率。当前比较流行的方案包括:
- Rewrite-Retrieve-Read:使用大模型改写问题;
- Step Back prompting:使用大模型产生问题的“Step-back Question”,并将问题和Step-back一同用于召回;
- Follow Up Questions:将历史对话记录融入当前问题进行召回;
- Multi Query Retrieval:使用大模型基于原始问题,从不同角度产生多个新问题,并使用每一个新问题进行召回;
- HyDE:使用大模型产生问题的Hypothetical答案,并将问题和答案一同用于召回。
(3)RAG-Fusion结合Multi Query Retrieval 和基于Reciprocal Rank Fusion (RRF)算法的Reranker,通过产生多个问题变种、进行多次召回,再用RRF算法进行合并和排序来提升召回率和精度。RAG-Fusion兼备2-stage和Query Transformation的优点,且不需要大模型来进行Reranking,是当下热度较高的方案。其主要流程如下:
图7: RAG-Fusion的工作流程
(4)Hybrid Search同时执行Keyword Search和Vector Search,并使用RRF算法合并、并重排两种不同检索的结果(下图)。相较于Vector Search,Keyword Search更善于:
- 精准匹配,例如产品名称和人名;
- 仅匹配几个字符;
- 匹配低频度词汇。
图8: Hybrid Search
BM25是Keyword Search的核心算法,该算法估算Keyword与文档之间的相关性,已经被广泛应用于搜索系统,其特点是可以高速完成对海量文档的覆盖。
(5)Small-to-Big采用分离索引和内容的方式以提升Vector Search的完整性。该类方案通常通过一小段索引(节点)关联到一大块完整的切片,以小切片搜索的精确度驱动大切片内容的完整性。Small-to-Big有如下实现:
- Sentence-window retrieval:索引句子,关联到句子的上下文;
- Auto-merging retrieval:通过子节点递归关联父节点;
- Multiple-Vector Retriever:通过切片的Summary,找到存储在Doc Store中的切片原文。
(6)Question Construction是利用Metasearch和Text-to-SQL等技术提升对“结构化”数据查询的准确性。“结构化”数据不仅仅存在于关系型数据中(例如数据库),也存在于非关系型的文本中(例如文本中的数字,年份等)。使用Metasearch和Text-to-SQL可以有效地提升这部分数据的召回率。