1、RAG技术流总结
第一张图是比较经典的RAG知识图谱,第二张图是更加详细扎实的介绍图。
1.1 索引
坦白来说这部分的技术并不是大模型领域的,更像是之前技术在大模型领域的应用;早在2019年我就做过faiss部分的尝试,彼时索引技术已经在互联网领域得到了广泛的应用。
1、大模型需要通过向量化去建立语义理解。
通过将包含高维信息的知识降维到向量空间里,这些知识就变成了一堆数字串;此时,当用户去提问时,先将提问的知识向量化变成一串数字后,再从知识库中通过余弦计算等方式找出和用户提问数字串最相似的信息出来,这就完成了所谓的语义理解。
2、分块能够有效提升检索效率和缓解上下文长度限制。
理想状态下,在检索时将每个信息都遍历一遍肯定就不会漏信息了,但是当信息量大且不能让用户等待过久的时候,还是需要更高效和更具性价比的方式;同时,大模型一次能输入的上下文有长度限制,虽然已经有大模型将上下文长度延伸至了更高量级,但似乎实验证明更大的上下文窗口不一定对检索结果更有效。
而分块技术,则可以理解为将一篇50w字的书籍文档按照段落或者语义等方式划分成n个块。这样,既能够有效解决上下文长度限制问题,同时也对于检索有一定的效率提升;但同时也存在可能会丢失文档的全局结构、不同块之间的前后逻辑等问题(这些问题在陆续通过建立重叠上下块内容、建立块的类似索引结构等方式进行优化)。
1.2 检索Retrieval
当用户提问后,通过检索技术则可以从知识库中召回相关内容块。检索方式将不局限于关键词检索和向量检索,最终的形态一定是多种检索方式的结合和互补。当混合检索结束后,再通过一个Rerank的机制重新对不同渠道的检索结果做一个最终的整合和排序。
1.3 生成(Generation)
将检索得到的前 K 个文本块和用户问题一起送进大模型,让大模型基于给定的文本块来回答用户的问题。
在整个完整的RAG过程中,索引和检索将极大的影响最终生成的质量。其中索引直接决定语义保存的完整度,检索决定提供给大模型的文本质量,值得注意的是检索过程还存在rerank的过程。
在知识库问答,数据越多效果越好吗?中,有道大模型团队提出针对query大连医科大学怎么样,主要原因是第三批加入的某些文档中恰好有大连理工大学 xxx 怎么样?的句子,和 query 大连医科大学怎么样?表面上看起来确实非常像,Embedding 给它打了比较高的分。直接向量检索的情况下因为缺乏语义部分导致
而类似大连医科大学师资介绍这样的片段相关性就稍微低了些。而 LLM 输入 token 有限制,前面两个最相关但是实际并不能回答 query 问题的片段就已经占满了 token 的窗口,只能把他俩送进 LLM 里。结果可想而知,啥都不知道。
RAG知识除了可以参考前面有道团队的介绍,另外也可以参考这一篇:
一文读懂:大模型RAG(检索增强生成)含高级方法