检索增强生成(RAG):智能内容生成的新纪元
引言
在大 AI 时代,生成式人工智能(GenAI)模型,尤其是大型语言模型(LLM),已经展现出了令人瞩目的能力。然而,这些模型在提供信息的准确、即时、专业、权威等方面仍存在局限。检索增强生成(Retrieval-Augmented Generation,下称 RAG)技术应运而生,它通过结合外部知识检索与模型生成能力,大幅提升了内容的准确性、即时性、可靠性。
RAG 技术的起源
RAG 技术的根源至少可以追溯到 20 世纪 70 年代初期,当时基于文本挖掘与信息检索研究的问答系统在访问文本上,就使用了类似的技术。
RAG 这一术语来自于帕特里克·刘易斯 (Patrick Lewis,现就职于 AI 初创公司 Cohere 的 RAG 团队)等人的论文(2020 年),RAG 这一名称可能不太讨喜,但 RAG 一词已经被应用于日益壮大的数百篇论文和数十种商业服务系列方法中,这些方法更是被认为代表了 GenAI 的未来。
什么是 RAG 技术?
RAG 是一种通过从生成模型(主要指 LLM,下文仅以 LLM 讲解)外部获取事实,来增强 LLM 生成内容的准确性和可靠性的技术。从本质上讲,LLM 是神经网络,通常是由其包含的海量参数来支撑生成能力的,这些参数可以称为 LLM 的参数化知识,像人类寻常使用单词组成句子,LLM 凭借这些参数化知识能够快速响应一般性的提示。然而,它不适合那些想要更深入地研究当下最新或特定主题问题的场景。RAG 则恰恰可以填补 LLM 参数化知识(先验知识)的空白与不足。
RAG 工作原理
RAG 模型的基本架构如图所示,其核心技术包括如下几个关键组件。

Embedding Model:嵌入模型,用于将外部文档和用户查询转换成 Embedding 向量。Vector DB:向量数据库,用于存储 Embedding 向量和执行向量相似性检索(检索出最相关的 Top-K 个信息)。Prompt Engineering:提示词工程,用于将用户的问题和检索到的上下文组合成 LLM 的输入。LLM:大语言模型,用于生成回答或响应内容。
首先,GenAI 应用可以维护一个特定业务领域的庞大知识库,这一知识库可以包含文档、网页、图像、视频、甚至结构化数据等。知识库通过对这些领域数据做进行相应切分,然后使用 Embedding Model 将之转换为向量表示(Embedding),最终将这些数据片段及其 Embedding 在 Vector DB 中进行向量索引存储,以便后续进行相关性检索。
当用户向 GenAI 应用提出问题时,应用会通过 Embedding Model 将问题也转换为 Embedding,然后使用这个 Embedding 与知识库中的向量索引进行比较,找到一个或多个最相关的匹配项(近似最近邻搜索,ANN Search),然后将这些匹配项中的最相关的内容作为用户问题的上下文信息(Prompt Engineering),一并输入 LLM,最终得到一个被上下文“约束”的答案。
LLM 根据从知识库检索到的最相关内容和它自己对问题的“理解”,组合生成问题的答案,呈现给用户的还可以包含知识库内容来源引用信息,使答案更具可信度。
如此,RAG 既解决了 LLM 常见的“幻觉”问题,又提高了生成内容的准确性与权威性。
想象一下法庭。法官会根据对法律的一般性理解来审理和判决案件。有时,医疗事故诉讼或劳动纠纷等案件需要特殊的专业知识,因此法官会派法院文员去法律图书馆寻找可以引用的先例和具体案例。
就像一位优秀的法官一样,GenAI 模型可以对人类各种各样的问题与任务做出响应。但想要提供具备权威引用的可靠答案,需要像“法庭文员”一样,进行一些额外的知识摄取和研究。这里的“法庭文员”就是 RAG 技术。
RAG 技术的优势
整合内外部资源,灵活结合开卷和闭卷的优势
RAG 技术将 GenAI 应用与外部资源联系起来,尤其是那些富含最新技术细节的资源。RAG 被当做“一种通用的微调方案”,几乎任何 LLM 都可以使用它来连接几乎任何外部资源。
例如,给出“地球上第一种哺乳动物是什么时候出现的?”这个问题,RAG 可能会检索“哺乳动物”、“地球历史”和“哺乳动物进化”的文档。这些支持文档作为上下文与原始输入组合起来,并输入到产生实际输出的 LLM 中。这里 RAG 有两个知识来源:LLM 存储在其参数中的知识(参数化知识)和 RAG 从中检索段落的语料库中存储的知识(外部知识)。
“闭卷”即仅使用参数化知识,“开卷”即基于检索的外部知识,两相结合,相辅相成。
降低 LLM 训练成本
GenAI 应用要在日常生活中真正发挥有用的价值,它们不仅需要能够访问大量信息,更需要能够访问正确的信息。世界变化是快速的,而 LLM 本身对世界哪怕微小变化的跟进也是一个巨大的挑战。
改变 LLM 的参数化知识需要用新的数据集重新训练整个模型,这往往是一个及其耗力耗时的过程,而更新 RAG 模型的外部知识只需将用于知识检索的知识库替换掉即可,这种自适应方法绕过了 LLM 再训练步骤,直接访问和提取最新信息。这在事实(或我们对事实的理解)随时间演变的情况下非常有用。
保持知识新鲜度
相比使用额外数据集重新训练 LLM 或进行微调(Fine-tune),RAG 的实现要简单很多,而且更快、更便宜。它允许用户即时热插拔新源(知识库,Knowledge Base)。
RAG 技术通过链接 LLM、Embedding Model 和 Vector Database,可以即时地更新 Vector Database 中的知识,时刻保持知识的新鲜、全面与准确。
建立用户信任
RAG 可以为 GenAI 应用提供引用的来源,好比研究论文中的脚注,凭此用户可以追溯引用内容的可靠性,从而建立对生成内容的信任。
此外,RAG 技术还能帮助 GenAI 应用消除用户问题中的歧义,降低模型做出错误猜测的可能性(幻觉现象)。
RAG 技术特点概览
优势
领域特定知识的整合:RAG 能够通过检索阶段获取特定领域的文档或信息,使得生成的文本更加贴合特定领域的语境和术语。上下文的丰富性:通过检索到的相关文档,RAG 能够利用丰富的上下文信息来生成更加准确和相关的回答。实时信息的获取:RAG 可以检索最新的领域相关信息,确保生成的内容不是基于过时的数据。提高准确性:在需要精确数据或专业术语解释的领域问题上,RAG 能够提供更加准确的信息。定制化和灵活性:RAG 可以根据不同的领域需求定制检索策略和生成模型,提高解决方案的灵活性。避免生成错误:对于那些容易出错或需要权威信息的领域,RAG 通过检索可靠的数据源来减少错误信息的生成。多模态数据处理:RAG 不仅可以处理文本数据,还可以扩展到其他类型的数据,如图片、视频等,只要检索系统能够索引和检索这些数据。
局限性
检索依赖性:RAG 的效果在很大程度上依赖于检索系统的性能,如果检索不到相关信息,生成的文本可能缺乏准确性。计算成本:RAG 结合了检索和生成两个阶段,可能会有更高的计算和时间成本。数据隐私和安全性:在检索阶段可能需要访问敏感数据,这就需要考虑数据隐私和安全性的问题。检索结果的偏差:如果检索系统存在偏差,那么 RAG 生成的文本也可能反映出这些偏差。领域知识的局限性:RAG 可能在处理需要广泛领域知识的问题时受限,特别是当检索到的文档不够全面或深入时。更新和维护成本:随着领域知识的快速发展,保持检索系统的数据更新可能需要持续的努力和资源。用户界面和体验:RAG 系统可能需要复杂的用户界面来允许用户有效地与检索和生成阶段交互,这可能影响用户体验。集成复杂性:将 RAG 技术集成到现有的系统或工作流程中可能需要克服技术挑战和适应性问题。
RAG 技术在特定领域的应用需要仔细考虑这些优势和局限性,并根据具体需求和条件进行优化和调整。
RAG vs. LLM
RAG 技术之于 LLM,在工作方式和应用场景上存在一些不同之处:
检索与生成的结合:RAG 特别强调检索(Retrieval)阶段,即在生成回答或文本之前,先从大量数据中检索相关信息或文档片段,以提供给生成模型更多的上下文信息。LLM 主要依赖于其预训练中学习到的知识,而不直接检索外部信息。上下文信息的利用:RAG 通过检索阶段,RAG 能够利用特定的、与查询相关的上下文信息,这使得它在需要特定领域知识或详细信息的任务中表现更好。LLM 拥有大量的知识,但它的知识是基于训练数据的,可能不包括最新的信息或特定领域的详细信息。实时信息的整合:RAG 能够检索最新的信息或文档,这意味着它可以生成基于最新数据的回答。LLM 对于需要最新信息的任务可能不够准确。生成过程的可控性:RAG 检索阶段提供了额外的控制点,可以根据检索到的信息调整生成策略,提高生成文本的相关性和准确性。LLM 生成过程主要依赖于模型内部的决策,外部控制相对较少。应用场景:RAG 适合于需要结合大量外部信息和上下文的任务,如开放域问答、事实核查等。LLM 适合于广泛的文本生成任务,包括写作、摘要、翻译等,尤其是在不需要特定领域知识的情况下。计算资源:RAG 可能需要更多的计算资源,因为它涉及到检索系统的实时查询和生成模型的计算。LLM 本身是一个计算密集型的模型,但它不需要实时检索,因此在某些情况下可能更高效。交互性:RAG 可以设计为更交互式的系统,通过检索阶段与用户进行多轮对话或提供更深入的回答。LLM 虽然也支持交互,但其交互性主要依赖于模型内部的上下文保持能力。知识更新:RAG 可以通过更新检索的文档库来相对容易地更新知识库。LLM 知识更新需要重新训练或使用其他方法来适应新信息,这可能更加复杂和耗时。
结语
RAG 技术作为 AI 领域的时下大火的新兴技术,创造性地链接了 LLM、Embedding Model 和知识库的分析能力与知识,有效克服了 LLM 的幻觉问题,同时在充分利用内外资源、保持知识准确与全面、建立用户信任等方面具有良好的效果,在 GenAI 应用中展现出强大优势。随着技术的不断发展,RAG 必将在更多场景中展现其潜力,推动信息获取和内容生成进入新的高度。
相关文章:
检索增强生成(RAG):智能内容生成的新纪元
引言 在大 AI 时代,生成式人工智能(GenAI)模型,尤其是大型语言模型(LLM),已经展现出了令人瞩目的能力。然而,这些模型在提供信息的准确、即时、专业、权威等方面仍存在局限。检索增…...
ubuntu2204安装elasticsearch7.17.22
下载安装 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.22-amd64.deb wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.22-amd64.deb.sha512 shasum -a 512 -c elasticsearch-7.17.22-amd64.deb.sha512 su…...
介绍Servlet后端中两种接收参数方式req.getAttributer和req.getParameter的区别
数据来源 getParameter:此方法用于获取客户端发送的请求中携带的参数,通常这些参数是通过HTTP GET或POST请求传递的表单数据。例如,用户填写的用户名和密码等输入信息。getAttribute:该方法用来获取在服务器端通过setAttribute方法…...
Delphi FMX安卓Android播放mp3音频内存流
【笔记:安卓开发JavaDelphi FMX】 Delphi FMX跨平台的MediaPlayer无法播放音频数据流只能打开音频文件播放,但有时候需要直接播放内存流数据而无需生成文件,可以通过把内存流转ByteArray再通过Android平台系统原生的MediaDataSource或ParcelF…...
MapUtils常用方法
1、摘要 MapUtils是一个用于处理Map对象的实用工具类,它提供了许多方便的方法来执行常见的操作,如获取值、设置默认值、合并Map等。本文将介绍MapUtils的常见用法,以帮助你更轻松地处理Map数据。 2、前言 在Java编程中,Map是一…...
自定义PasswordEditText控件,在手机字体应用后,字体样式未发生改变
原来的输入类型inputType为textPassword,现在将 inputType删掉即可...
学习打卡第31天
...
opencascade AIS_TexturedShape源码学习 贴纹理
opencascade AIS_TexturedShape opencascade 贴纹理 前言 //! 该类允许在形状上映射纹理。 //! 显示模式 AIS_WireFrame (0) 和 AIS_Shaded (1) 的行为与 AIS_Shape 中的行为相同, //! 而新模式 2 (包围盒) 和 3 (纹理映射) 扩展了其功能。 //! //! 纹理本身在 (0…...
C# winform 串口读取字节流,MB级别字节流
一、串口读取字节流 在 C# 中使用 Windows Forms (WinForms) 应用程序进行串口通信时,通常会使用 System.IO.Ports 命名空间中的 SerialPort 类。以下是一个简单的示例,展示了如何设置一个串口并读取字节流。 步骤 1: 添加引用 确保你的项目中已经包含…...
创建一个简单的单链表
1.头文件的Slist.h的代码 #pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> typedef int SListint; typedef struct Slist//单链表 {SListint data;struct Slist* next; }SL;//尾插 void SlistPushBank(SL*…...
15.1 Zookeeper简介安装及基础使用
1. Zookeeper介绍 1.1 介绍 1.2 应用场景简介 1.3 zookeeper工作原理 1.4 zookeeper特点...
详细说明Java中Map和Set接口的使用方法
Map与Set的基本概念与场景 Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。以前常见的搜索方式有: 1. 直接遍历,时间复杂度为O(N),元素如果比较多效率会非常慢。 2. 二分查找&#x…...
CSS3 scale 适配
Scale适配,在前端开发中,特别是在CSS3中,主要指的是使用scale()函数对元素进行缩放处理,以适应不同的屏幕尺寸或达到特定的视觉效果。以下是对Scale适配的详细介绍: 一、基本概念 scale() 是CSS3中transform属性的一…...
SX_初识GitLab_1
1、对GitLab的理解: 目前对GitLab的理解是其本质是一个远程代码托管平台,上面托管多个项目,每个项目都有一个master主分支和若干其他分支,远程代码能下载到本机,本机代码也能上传到远程平台 1.分支的作用:…...
这才是 PHP 高性能框架 Workerman 的立命之本
大家好,我是码农先森。 在这个大家都崇尚高性能的时代,程序员的谈笑间句句都离不开高性能,仿佛嘴角边不挂着「高性能」三个字都会显得自己很 Low,其中众所皆知的 Nginx 就是高性能的代表。有些朋友可能连什么是高性能都不一定理解…...
Python——记录pip问题(解决下载慢、升级失败问题)
在python开发中,经常需要使用到各种各样的库。 pip又是我们常用的安装工具。但是国外的源下载速度实在太慢,经常导致超时。 有很多朋友刚刚学Python的时候,会来问为什么pip下载东西这么慢啊? 而且pycharm里面下载库也是非常的慢…...
Windows Server 2025 Preview 部署 Ⅰ—— ISO下载和硬件要求
目录 1. 预览版下载2. Windows 服务器的硬件要求2.1安装 Windows Server 2025 虚拟机注意事项2.2 CPU2.3 RAM / Memory2.4 存储 Storage2.5 网络 Network2.6 其他需求 1. 预览版下载 下载网站:https://www.microsoft.com/en-in/evalcenter/download-windows-server…...
AI2-CUDA、CuDNN、TensorRT的详细安装教程
一、查看本机的显卡 首先你要看你的电脑是否有NVIDIA的独立显卡,你可以在设备管理器-显示适配器中查看 点击“开始”--找到“NVIDA Control Panel” 点击帮助--系统信息--组件,查看NVCUDA.DLL对应的产品名称,就可以看住CUDA的版本号 这里的版…...
TCP连接中重复使用了两个相同的端口怎么办
1.检查并避免重复配置: 首先,应该检查系统的配置和应用程序的设置,确保没有错误地将多个服务或进程配置为使用相同的端口号。 使用网络监控工具(如netstat、ss等)来查看当前哪些端口正在被使用。 2.使用端口复用选项…...
如何自定义异常
目录 为什么自定义异常自定义异常的步骤参考资料 为什么自定义异常 自定义异常是指开发者根据应用程序的需求和逻辑,自行定义的异常类。与 Java 提供的标准异常类(如 NullPointerException、IOException 等)不同,自定义异常允许程…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
