RAG是什么?
RAG 是大模型的外挂知识库,英文全称 Retrieval – Augmented Generation
是大模型的知识外挂。
明确大模型的知识边界
首先,明确大模型的知识边界,要知道大模型不能干什么。
第一:大模型是由过去的知识训练得来的,所以在知识的实时性上存在短板
第二:大模型的核心实现是基于数学概率,所以在内容生成上存在不合逻辑不符合的实际的现象,这也被称作幻觉。
第三:大模型一般都是公开的数据集训练成,缺乏专业领域的知识,所以需要补充行业或者是公司内部的专业知识,另一个原因就是为了保证专业知识的数据安全性,一般都不会把这类知识放在第三方的平台上进行训练和推理。
所以RAG主要就是对现下的大模型进行补短板和优化。解决知识的实时性补充和上下文的逻辑补充,以及专业知识的补充,和维护数据安全。
基本上RAG要解决的就是这四个方面的问题。
RAG的实现
把RAG 的目的搞清楚了之后,再来讨论它是怎么实现的。上文已经知道了RAG是对大模型进行知识补充,也就是说,RAG应该有很多数据,那么这些数据如果我们要使用的话,就涉及到对数据进行检索和存储的问题。
检索和生成这两点都是RAG的核心。
在检索这块,为了提高检索的效率和准确性,必然是要用到一些技术的,这里面包括对查询的优化,和对索引的优化。
在查询这块上,一般会使用Enrich、多路召回、问题分解等优化方法(这里主要对这三种做解释)。
Enrich,对查询丰富化,也就是要求用户补充足够的信息,也就是要求用户提供更加全面的信息。
多路召回,对问题从不同的维度去进行检索。
问题分解,对问题进行分解,按一个一个小问题进行回答。
这里需要注意,多路召回和问题分解是有本质上不同的。
索引的优化,有:
摘要索引,这里会结合大模型,对知识文档生成摘要,然后将摘要作为索引。
父子索引,这里实际上是对文档进行切割,例如将文档切成不同的大块之后,将每个大块切成若干份小块,类似于树形结构。
假设性问题索引,这里会对文档生成若干份的假设性问题,然后将问题作为索引。
以及元数据索引,像文章的标题、作者,甚至是摘要,也就是说文章的相关信息。
以上所说的优化是预检索优化,除了预检索优化还有后检索优化。
这里包括混合检索以及重排序、向量过滤。(为避免复杂,这里不对多模态RAG作解释)
搜索和索引说完之后,我们再来看看存储。
在存储上,一般会分为两块,一块是知识文档的存储,一块是索引向量的存储。
存储索引向量的同时,一般会附带着存储索引所对应的文档信息,也就是说会根据索引找到文档。
除了以上的实现,再点一下数据预处理,也就是数据的解析以及分块和入库。
数据的类型包括pdf、world、excel等等,我们需要对些文档做一些必要的解析和分块,最后就是入库和构建索引。