检索增强生成(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 等)不同,自定义异常允许程…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...