写在开头:博客已经四个月没更新博客了,过年的时候家里事情太多,没时间写。开学后忙于重构以前的屎山,外加写新产品,忙完只想歇会儿,于是就停更了很久,趁着清明假期,更新一下博客,写一下我对于 RAG 的一些思考,RAG 已经有很多优质文章了,本文只是我个人的思考和总结,欢迎大家交流讨论。本文以
Naive RAG
为例
在正文开始之前,我们先来构建一下知识体系,带入这些问题阅读,如果你能够在阅读全文后清楚的回答这些问题,我想你就能理解 RAG 的核心概念了:
- 你知道什么是 RAG 吗?它的全称是什么?它的工作原理是什么?
- 你知道 RAG 的应用场景吗?它能解决什么问题?
- 你知道 RAG 的优势和劣势吗?它和传统的生成式 AI 有什么区别?
LLM 的局限性
RAG(Retrieval-Augmented Generation 检索增强生成)正如其字面意思,是通过检索信息来增强 LLM(大语言模型)生成的能力。RAG 是一种新兴的 AI 技术,它结合了信息检索和生成式 AI 的优势,能够在处理复杂任务时提供更准确和相关的答案。
RAG 的工作原理是:首先通过检索引擎从一个大型知识库中获取相关信息,然后将这些信息通过 Prompt 工程与 LLM 结合,生成最终的答案。
为什么需要这样做呢?无论是2022年底的 ChatGPT 爆火,还是2025年初的 DeepSeek热潮,我想只要你用过任何一个 LLM,你就会发现它们的一个共同点:
在新建对话后,LLM 基本上没有任何记忆(注:这里排除掉内建 RAG 的 部分产品,比如现如今的 ChatGPT 官方网页/APP版本)
同时 LLM 会回答你很多不存在的东西,编造一些不存在的事实,或者是对事实进行错误的推理,LLM 回答不存在的东西的现象被称为“幻觉”(Hallucination)。
你也会发现 LLM 尤其不擅长于最新的技术和最近的热点事件(注:这里排除掉能够使用联网能力的产品),因为 LLM 训练时使用的数据集是有截止日期的。
就像你的同学是个学霸,考试成绩很好,但是他只学他让他学的东西,考试的时候也是闭卷,假如考试超纲,他就不会了,为了能尽可能拿点分,可能他编都会编造一些答案出来,万一蒙对了呢?
到这里,你应该就能理解常见的 LLM 的局限性了。
RAG 的实现
实现前面已经提到过 RAG 的工作原理,接下来我们用一个图示来描述一下 RAG 的实现过程:
看起来很简单对吧?不就是 检索+ LLM 生成吗?
是的,RAG 的实现就是这么简单,但是它的核心在于如何检索到相关的信息,以及如何将这些信息与 LLM 结合,这就是 RAG 的关键所在。
对于一个RAG 产品来说,检索的质量和 LLM 的生成能力是两个最重要的指标,它们直接决定了给用户呈现的最终效果,而对 AI 落地产品来说,检索的质量更是重中之重,因为 AI 落地产品的核心就是要解决用户的问题,而不是让用户来解决 AI 的问题。
自然语言检索的核心:Embedding
那么,如何提高检索的质量呢?
模糊搜索/关键词匹配?那肯定不行,用户输入的问题可能是抽象的,常规的模糊搜索算法可能在用户一长段问题中找不到任何相关的内容,或者是找到的内容和用户的问题完全不相关,自然语言暗藏了太多的语义信息,模糊搜索和关键词匹配都无法捕捉到这些信息。
再仔细想想?LLM 的全称是什么?大语言模型(Large Language Model),它的核心就是语言模型,语言模型的核心就是概率分布,RAG 的检索过程其实就是一个概率分布的过程,但是 LLM 是需要经过训练的,训练的过程就是不断的调整模型参数,使得模型能够更好的拟合数据集中的概率分布。
那我们把 LLM 训练好的模型参数转换成数学模型,再使用一些数学方法来计算概率分布,最后通过概率分布来检索相关的信息,这样不就能提高检索的质量了吗?(这里仅仅是打个比方,实际并非如此)
如果你能想到这个问题的解决方案,那么恭喜你,你已经掌握了 RAG 的核心思想了。
而 Embedding 模型就是用来解决这类自然语言检索问题的,它的核心思想就是将自然语言转换成向量(Vector),然后通过计算向量之间的距离来判断它们之间的相似度。
关于 Embedding 的实现原理和算法,这里不做过多展开,实际上如果你想开发AI落地应用,可以不用了解任何算法原理,只需要你理解算法用处即可,您可参考: 1. 腾讯: 用万字长文聊一聊 Embedding 技术 2. 【大模型开发】 一文搞懂 Embedding 工作原理
这里过于抽象,那么我们举个例子来说明一下:
假设我们有一个问题:“你能给我推荐一个用一个红色水果做品牌名称的科技公司出的产品吗?”
假设我们有一个 Embedding 模型,它能够将这些自然语言转换成抽象高维度向量,向量的每一个维度都代表了一个特征,比如颜色、形状、大小等等。
假设我们有一个知识库,里面有很多关于水果的品牌名称,比如“手机”、“电动汽车”、“智能台灯”,“苹果”、“香蕉”、“西瓜”等等。
假设我们有一个检索算法,它能够计算向量之间的距离,比如欧几里得距离、余弦相似度等。
我们使用余弦相似度来计算向量之间的距离,那么我们可以将问题转换成向量,比如“你能给我推荐一个用一个红色水果做品牌名称的科技公司出的产品吗?”可以转换成一个向量
对于文本类问题,我们通常使用余弦相似度来计算向量之间的距离,余弦相似度的公式如下:
通过此公式,我们可以计算出向量
这个时候,我们将检索内容通过 Prompt 工程再喂给 LLM,LLM 就会根据检索到的内容生成最终的答案。
在实际开发中,Embedding 模型可能是超高维度的,通常在
这些向量数据库通常会使用一些高效的索引算法来加速向量的检索,比如 HNSW
、IVF
、PQ
等等。
HNSW(Hierarchical Navigable Small World)是一种高效的近似最近邻搜索算法,它通过构建一个小世界图来加速向量的检索。您可参考 3. HNSW算法的基本原理及使用 来了解 HNSW 的实现原理和算法。
向量数据库通常已处理好了这些算法,你只需要调用相关 API 即可。
开始构建 RAG 吧!
以上就是 Naive RAG 的实现原理,接下来我们重新梳理一个详细的 RAG 的实现过程:
你会注意到,这里有两个阶段:预处理阶段和查询处理阶段。在预处理阶段,我前面没有提到文档解析与分块的过程,因为在通常情况下,你所使用的Embedding 模型能够处理的文本长度是有限制的,而构建知识库的过程就是将文档解析成小块,然后将这些小块进行向量化,存入向量数据库中,在分块时,你可以使用不同的算法,你可以固定大小分块,比如说每
分块的算法多种多样,您可以根据自己的需求选择合适的算法,您可以参考 4. 最详细的文本分块(Chunking)方法,直接影响LLM应用效果 来了解文本分块的实现原理和算法。
Embedding 的一些细节
除了前面提到的分块算法,Embedding 模型还有一些细节需要注意:
- Embedding 模型的选择:不同的 Embedding 模型在性能和效果上可能会有所差异,您可以根据自己的需求选择合适的模型,尤其要注意,不同模型的向量维度可能会有所不同,您需要根据模型的要求进行调整,并且他们即使是相同维度,但是每个维度的含义可能会有所不同,因此不建议使用不同的模型进行向量化,除非你有足够的理由去相信它们的向量是可以互相替代的。
- 向量数据库的选择:向量数据库无疑是对于 RAG 来说最重要的部分之一,向量数据库对于服务器压力较大,尤其是对于大规模的知识库来说,且向量数据库不像传统关系型数据库那样成熟,因此在选择向量数据库时,您需要考虑到它的性能、稳定性和易用性等因素。
- Prompt 工程:它决定了 LLM 生成的质量和效果,您需要根据自己的需求设计合适的 Prompt 模板,并且在设计时要考虑到 LLM 的特点和限制,尤其是要注意 LLM 的上下文长度限制,为了准确性您通常需要控制 LLM 的温度(temperature)来提高生成的准确性,通常情况下,温度越低,生成的内容越准确,但是也会导致生成的内容越单一,因此您需要根据自己的需求进行调整。
多种多样的 RAG
RAG 的实现方式有很多种,除了前面提到的 Naive RAG,还有一些其他的实现方式,比如:
Advanced RAG:它在 Naive RAG 的基础上,增加了一些优化,在检索前、检索中、检索后都增加了一些优化,比如使用多种检索算法进行组合,使用多种 LLM 进行组合,使用多种 Prompt 模板进行组合等等,这样可以提高检索的质量和生成的效果。
Modular RAG:它将 RAG 的各个部分进行模块化,您可以根据自己的需求选择合适的模块进行组合,比如使用不同的检索算法、不同的 LLM、不同的 Prompt 模板等等,这样可以提高 RAG 的灵活性和可扩展性。
使用传统的 Naive RAG
可能会导致检索的质量和生成的效果不理想,也有可能使用 Rerank
(重排序)算法来对检索的结果进行重排序,或者使用 Chain of Thought
(思维链)来对生成的结果进行优化,这些都是 RAG 的变种实现方式。
有机会的话,我会在后续的文章中介绍一下 Advanced RAG 和 Modular RAG 的实现原理和应用场景。
结语
RAG 是一种新兴的 AI 技术,它结合了信息检索和生成式 AI 的优势,能够在处理复杂任务时提供更准确和相关的答案。RAG 的实现过程相对简单,但是它的核心在于如何检索到相关的信息,以及如何将这些信息与 LLM 结合,这就是 RAG 的关键所在。
最后,别忘了回答我开头提出的问题哦。