什么是 RAG
RAG 全称是:检索增强生成 (Retrieval Augmented Generation)。
简单来说,RAG 是向大型语言模型 (LLM) 提供与提示词相关的特定信息的过程。
为什么 RAG 很重要
虽然大语言模型 LLM 功能很强大(在预训练时采用了庞大的数据集),但它们能够推理的信息却受限于以往训练数据。
当要求 LLM 提供预训练数据之外的信息时,大模型通常无法获取这些新知识。
例如一些专有领域的数据或模型训练截止后才出现的新知识。
RAG 正是通过获取与提示相关的信息,然后将其作为上下文传递给模型来解决上面这个问题的。
这里以一个简单的例子,当你询问模型:我五一去哪里玩了?
**input**
我五一去哪里玩了?
**generation**
我无法获取用户的个人信息,包括用户最新的行程。
毫无疑问,模型是不知道的,但是当你把上下文带给它的时候:
**input**
仅使用提供的上下文来响应用户的提示。
Prompt:“我五一去哪里玩了?”
Context:用户去了上海
**generation**
五一期间,你去了上海 ...
好,就这样,你通过提供查询到的相关额外信息增强了大语言模型的生成能力。
假设模型拥有准确的额外信息,那它现在就很有可能对用户查询返回准确的响应。
但它如何检索相关信息呢?
这依赖于一个称为 Embedding 的概念。
Tips:你可以为 RAG 应用程序获取任何上下文(包括 Google 搜索引擎返回的内容)。Embedding 和向量数据库只是实现语义搜索的一种特定检索方法。
Embedding
Embedding(嵌入)是一种将单词、短语或图像表示为高维空间中的向量的方法。
在这个向量空间中,相似的单词彼此接近,单词之间的距离可以用来衡量它们的相似性。
实际上,这意味着如果你嵌入了单词 cat 和 dog,你会期望它们在向量空间中彼此靠近。
计算两个向量之间相似度的过程称是 余弦相似度,其中 1 表示高度相似,-1 表示高度相反。
这篇国外大佬写的文章能帮你更深刻的理解它
jalammar.github.io/illustrated…
既然 Embedding 是一种表示单词和短语语义的方式。
这就意味着,Embedding 的输入越大,嵌入的质量就越低,匹配越不准确。
那么,如何处理,那些篇幅更大,比简单短语更长的嵌入内容呢?
这就要看 Chunking(分块)了。
Chunking
Chunking(分块)是指:将特定原始文本内容分解成更小块片段的过程。
分块的方法有很多种,都值得尝试,因为最有效的方法可能因用例而异。
一种简单常见的分块方法(也是您将在本指南中使用的方法)是按句子划分书面内容。
将源文本适当分块后,即可对每个材料进行嵌入,然后将嵌入和分块一起存储在数据库中。
Embedding 可以存储在任何支持向量的数据库中,比如国内的:阿里云,腾讯云。
我后面将使用 Postgres 与 pgvector 配套的向量数据库插件做演示。
总结
将所有这些结合在一起,RAG 就是一个过程,它使模型能够利用训练数据之外的信息进行响应。
具体方法是:嵌入用户查询,检索语义相似度最高的相关源材料(数据块),然后将其与初始查询一起作为上下文传递。
回到文章开头那个例子,流程如下:
通过传递适当的上下文并优化模型的生成质量,你便可以充分利用大模型的能力。
本质上讲:RAG 技术并没有改变或者微调大模型,只是一种通过检索强化 Prompt 的优化手段,通过让模型拥有更准确更长的额外上下文,以增强其内容合成能力。
我在下一篇文章,会用代码示例,讲清楚如何使用 Vercel AISDK 进行全栈 AI 应用开发。