写给前端同学:算法大佬们说的 AI 智能体 RAG 技术到底是什么?

131 阅读4分钟

大模型并不知道你五一去哪里了

什么是 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 可以存储在任何支持向量的数据库中,比如国内的:阿里云,腾讯云。

腾讯云 VectorDB

我后面将使用 Postgres 与 pgvector 配套的向量数据库插件做演示。

数据集分块与嵌入流程

总结

将所有这些结合在一起,RAG 就是一个过程,它使模型能够利用训练数据之外的信息进行响应。

具体方法是:嵌入用户查询,检索语义相似度最高的相关源材料(数据块),然后将其与初始查询一起作为上下文传递。

回到文章开头那个例子,流程如下:

RAG 技术就干了这些

通过传递适当的上下文并优化模型的生成质量,你便可以充分利用大模型的能力。

本质上讲:RAG 技术并没有改变或者微调大模型,只是一种通过检索强化 Prompt 的优化手段,通过让模型拥有更准确更长的额外上下文,以增强其内容合成能力。

我在下一篇文章,会用代码示例,讲清楚如何使用 Vercel AISDK 进行全栈 AI 应用开发。