本文非技术向,不需要技术基础,适合所有对大模型技术了解不多,但是想对其中一些技术建立概念性认识的同学。RAG(Retrieval-Augmented Generation,检索增强生成)是可以为大模型提高思考能力的技术。本文会通过一系列的说明与类比解释RAG是如何提升模型能力的。
1. RAG与开卷考试哲学
检索增强生成本质上就是帮助大模型在思考时“开卷考试”,为模型提供有助于生成答案的参考资料。
经常开卷考试的同学都知道,开卷考试中需要查阅资料的情况主要有两种:
- 压根不会的知识(信息过时或信息不足)。
- 担心记错或者记串的知识(遗忘或者记忆错乱)。
和我们一样,大模型面在处理提问时也会面对这些问题,这种情况下的胡言乱语,就是大家常说的大模型幻觉问题。 大模型是通过大量的数据训练出来的,对于他没有接触过的,或者是新产生的知识,其理解能力必然不足。另外,面对自己学习到的大量知识,大模型在思考时可会有记错或者记忆错乱的情况,这个时候,一份可供参考的资料就能有效的引导他向着正确的方向思考。
经常挂科的同学都知道,开卷考试虽然相对简单,但只要平时课上睡的足够多,想挂科还是不难的。对于大模型也是如此,模型智商太低,把资料送到嘴边,模型压根都理解不了,最后的答案也是一团糟。于是,我们就有了RAG技术在大模型上应用的一个重要认知:打铁还需自身硬,RAG起到的锦上添花的作用。
1.1. embedding
当我们拿着一本洁白无暇的教材前往开卷考试的考场时,往往就预示着这场考试大概率要挂科了。因此,资料的准备至关重要,在RAG中也是如此,这也就是常说的embedding的过程:
- 数据清洗: 剔除无用资料,保留精华(标记重点章节)
- 知识分片: 去除文本中的停顿词、无用信息,标记重点段落(在具体的文字划重点)
- 建立索引: 建立合理的数据结构,加速召回过程(贴标签,翻的更快)
1.2. 数据召回
常用的数据召回方式有关键词召回与向量召回两种方式。
- 关键词召回: 从用户的提问中提炼出关键词,之后根据关键词检索与之关联的文档。
选取文档关键词的方法有两种:提炼与推演。
提炼是指选取文档中存在、有代表性的词语作为关键词。最常见的做法是根据词频、词语的独特性以及词语与文章其他词语关系的紧密程度判断词语的重要性。
推演是指根据文档的内容或主旨,提出更具概括性的描述词。例如“今晚月色真美”的标签可能是爱情、浪漫,“采菊东篱下,悠然见南山”的标签可能是隐居、超脱。
- 向量召回: 将文档以及用户提问转化为向量,召回与用户提问向量距离更近的部分文档。
向量召回本质是关键词召回的另一种方式。关键词是我们基于自然语言对文档的概括总结,那么,有没有可能基于机器语言对文档进行概括总结,获得机器更容易理解的概括总结呢?答案是有的,就是向量,通过算法将文档凝练成向量,机器判断两个向量之间相似度的能力会更强。
2. 关键词搜索
2.1. 选取关键词的原则
选取文档的关键词时,我们往往会考虑以下的几个原则:
- 词语出现的频率越高说明词语越关键。
- 词语有差异性,在本文出现的多,在其他文章出现的少,说明词语更关键。
- 词语与文章其他词语的相关性更高,则词语更关键。
2.2. 关键词算法
TF-IDF算法就是通过综合考虑词频与词语差异性的思路确定文章关键词的。TextRank算法可以建立词语的加权无向图,进而量化每个词语与文章其他词语间的相关性。
除TF-IDF与TextRank外,拉迪奇利分配 (Latent Dirichlet Allocation, LDA) 也是确认文章关键词的方法之一。想要理解LDA,我们需要先理解下面的例子:
有100个人,完全随机的散落到一个荒岛上,荒岛上有三个村落,我们假设这其中有三类人,一类人喜欢吃甜、一类人喜欢吃苦、一类人喜欢吃辣。开始的时候,人们会就近前往某个村落生活,开始的时候,村落A吃辣的人最多,于是种了很多辣椒,村落B吃苦的人最多,于是种了很多苦瓜,村落C吃甜的人最多,种了很多的甘蔗,久而久之,各个村落喜欢吃辣的人就会向村落A集中,吃苦的人向B集中,吃甜的人向C集中。
是不是很符合常理,从完全随机的初始态,随着人口的逐渐迁移,形成了不同特性的群落。
拆解群落产生的过程:
- 初始分布完全随机(与初始态无关)
- 人口按照自己的喜好逐渐转移(概率转移)
- 最终形成了不同的村落(结果收敛)
理解了这个过程,我们就已经完全理解了拉迪奇利分配甚至说绝大部分机器学习算法:
- 随机初始化+ 状态转移函数/评价函数/损失函数 + 不断迭代 + 最终收敛。
拉迪奇利分配首先需要我们统计所有文档中关键词,建立起一个整体的词汇表,之后,需要我们预先建设有K个主题,每个主题由多个词语组成,之后在迭代过程中按照概率函数不断迁移主题间的词语,直到我们的评价函数收敛。之后判断每个文档的关键词在各主题中出现的概率,出现高的就说明这篇文章与这个主题相关。当我们搜素一个关键词时,就能根据关键词对应到多个主题,之后再根据主题关联多篇文章。
3. 向量搜索
图书馆中存放着数不胜数的书籍,那我们是如何找到自己想要的书本呢?比如我们想在BABA图书馆找《战争与和平》,文学类书籍可能在4类,外国文学在4楼C区,《战争与和平》在325书架,那我们去4-C-325就能找到想要的书籍了。从数学的角度看[4, C, 325]就是一个向量,能在BABA图书馆的场域下定位到《战争与和平》,同样的,我们要找《活着》,那在BABA图书馆中的编号就可能是[4, A, 222]。这就是文本向量化,在一个特定场域中,用向量的方式标记出每个文本的位置,道理和图书馆是一样的,只是可能在真正的应用时,向量的维度不只是3维,可能会更多。
我们无需关心具体场域以及向量维度是如何定义的,理解了图书馆的例子,我们就已经抓住了文本向量化的两个核心特点:
- 从向量的角度看,两个点离得越近,其特征就越接近(《战争与和平》《活着》都是文学)。
- 同样的内容,在不同场域中的向量是不同的(《活着》在浙江图书馆与北京图书馆中的位置不同)。
当我们借助向量引擎召回知识时,需要先将用户query向量化,之后计算与其距离最近的N个知识片段,用于后续的参考。