【开发视角】大模型 RAG 检索增强生成究竟是什么

【大白话讲懂】大模型 RAG 检索增强生成

话先说在前面,本文不讲不会讲太多原理,仅面向工程开发,从工作流程的宏观角度进行梳理,旨在快速上手。

RAG 是什么

基本定义

让我们先来解释名词,看看宏观框架。

RAG 的意思是 Retrieval-Augmented Generation检索增强生成)。

哈哈,这里其实就很顾名思义了,RAG有三个部分:

  1. 检索 2. 增强 3. 生成

工作流程

RAG 最常见的应用场景是优化大模型对话问答。

我们接下来就来说说,RAG是如何在这这个场景下生效的。

下图是我从网上挑的,先欣赏一下就行了。
不要试图零基础看一眼就理解——学习应该放轻松,不要质疑自己的能力给自己太大压力🥰(反正我是这么想的)

RAG 工作流

上图的起点是【Query】,我把整个流程描述为一个表,只需要自上而下地阅读这个表,再对照着上图理解,轻轻松松就能搞懂这一切:

上图中的步骤输入输出解释
Query用户输入Query用户输入的内容就叫 Query(跟URL Query是一个含义)
Embedding ModelQueryQuery VectorEmbedding Model 会把 Query 处理为向量,即 Query Vector

为什么要处理成向量?先别想那么多,你也不想从 ML 感知机开始学起吧?)
Vector Store Index

Database
Query VectorDocument Vector1. 这里的 Database 通常是 Vector Database,顾名思义存储的是向量,RAG 场景下通常是 Document Vector

2. Vector Store Index 的作用和 MySQL这类传统数据库的索引一样,用于加速在 Database 中的查询

3. 这里在 Vector Database 中查找到了内容最相关的文档,这些向量将和 Query
ContextQuery Vector

Document Vector
Context1. 输入的二者将被融合,形成一个新的上下文,这个上下文极大拓展了用户的输入内容

2. 这个过程通常是由一个专门的AI模型完成的(上图没有强调这一点)
LLMQuery

Context
AnswerContext 可以理解为 Query 的背景、相关知识等,用于让大模型更全面理解 Query 所涉及的领域,以便于给出更好的 Answer

总结概述

RAG,检索增强生成。简而言之就是,给大模型加了一个搜索工具,可以让大模型检索它本身不懂的内容,从而增强它的生成的内容。

用喝完一杯咖啡的时间,读完上述内容,也就能大概了解 RAG 是 怎么一回事了,是不是相当赚?

RAG 有什么作用

大模型的缺陷

LLM 刚流行起来的时候被鼓吹得相当梦幻,但是实际用起来投入商业产品应用后,很多问题也就暴露出来了:

  1. 时效性与可靠性:世界不断发展,但大模型本身的知识只来自于当年训练它的数据集,所以它可能会产生不准确或过时的回答。
    其实这是诸多(并非全部)深度学习模型的通病,但是在大语言模型这里被无限放大了😢(谁让它这么火呢)。
  2. 幻觉
    当询问了一个超出大模型知识范围的问题时,大模型往往不会承认不知道(它甚至可能没有意识到自己不知道),这时它会和吃了云南菌子一样开始胡诌,也就是所谓的幻觉。
  3. 输入信息不足
    除了大模型自身的缺陷以外,还有来自它的用户的问题。不要指望每一个用户都学过提示词工程,大多都会给出一些模糊的问题。比如用户问“特斯拉是什么?”,大模型可能只会回答“特斯拉是一个汽车品牌”。

RAG 的价值

那 RAG 的作用是什么呢?

  1. 更新数据,避免过时
    通过定时爬虫等方式,不断更新 Vector Database 中的内容,也就能更新丰富大模型的知识,减少大模型给出过时的回答的可能性。
  2. 增强数据,避免幻觉
    先回忆一下什么叫幻觉——如果大模型遇到不懂的问题时,它可能就会开始胡诌。这时候如果用上 RAG,就可以帮它找到更多参考资料,也就能更准确地回答问题了。
  3. 丰富数据,避免片面
    比如用户问“特斯拉是什么?”,没有 RAG 的大模型可能只会回答“特斯拉是一个汽车品牌”。而有了 RAG,它就能更回答更多的内容:一个科学家、一个公司。

这里补充解释一下第3点:

按理说,【特斯拉是科学家】这件事比【特斯拉是一个汽车品牌】发生得更早,是更普遍而客观的认知才对。

但是过去的大模型常常会优先回答【是汽车品牌】,推测是因为训练该大模型的时期,网络上关于【是汽车品牌】的数据远远多于【是科学家】的数据,以至于大模型会倾向于回答前者。

而现在的大模型普遍加上了 RAG,能有更全面的认识,所以就能更全面地回答:【特斯拉是一个科学家、一个公司、一个汽车品牌】。

另外,RAG 还有一些常见的用处:

  1. 特化数据领域:可以通过大量添加特定领域的知识数据,构建垂直领域的知识图谱,比如化学工艺领域的问答大模型。

后续

感谢支持

如果你认为上述内容有帮助,可以点一手收藏和关注✨,我还会继续努力产出更多相关内容。

graphRAG 与 知识图谱开发

后续会进一步分享【graphRAG】 和 【知识图谱开发】相关的内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/390932.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科普文:微服务之SpringBoot性能优化器动态线程池【Dynamic-Tp】特性和源码解读

一、简述 gitee地址:https://gitee.com/yanhom/dynamic-tp github地址:https://github.com/lyh200/dynamic-tp dynamic-tp是一个轻量级的动态线程池插件,它是一个基于配置中心的动态线程池,线程池的参数可以通过配置中心配置进…

C++中lambda使用mutable关键字详解

C中lambda使用mutable关键字详解 在《C初学者指南-5.标准库(第二部分)–更改元素算法》中&#xff0c;讲“generate”算法时有下面这段代码&#xff1a; auto gen [i0]() mutable { i 2; return i; }; std::vector<int> v; v.resize(7,0); generate(begin(v)1, begin…

C++ STL在算法题中的常用语法

Vector 1.将vector<int>中的元素全部置换为0 fill(vec.begin(), vec.end(), 0); 2.vector容器是可以直接用比较是否值等的&#xff01; Unordered_set 1. unordered_set的删除&#xff08;count的值也会减少&#xff09; 2.unordered_map中的int默认值是0&#xff0c;…

在Jira中使用AI

Jira已经可以使用AI功能了。 如果您使用的是Jira Cloud&#xff0c;您需要请管理员在管理页面中打开AI功能开关。&#xff08;AI功能在Standard版中未提供&#xff0c;请使用Premium或更高级的版本&#xff09;如果您使用的是自己部署的Jira Data Center&#xff0c;您需要请管…

算法学习day28

一、寻找右区间(二分法) 题意&#xff1a;题目很容易理解 但是转换为二分法有点晦涩 给你一个区间数组 intervals &#xff0c;其中 intervals[i] [starti, endi] &#xff0c;且每个 starti 都 不同 。区间 i 的 右侧区间 可以记作区间 j &#xff0c;并满足 startj > e…

OpenCV||超详细的灰度变换和直方图修正

一、点运算 概念&#xff1a;点运算&#xff08;也称为像素级运算或单像素操作&#xff09;是指对图像中每一个像素点进行独立、相同的操作&#xff0c;而这些操作不会考虑像素点之间的空间关系。点处理优势也称对比度拉伸、对比度增强或灰度变换等。 目的&#xff1a;点运算…

【EtherCAT】Windows+Visual Studio配置SOEM主站——静态库配置+部署

目录 一、准备工作 1. Visual Studio 2022 2. Npcap 1.79 3. SOEM源码 二、静态库配置 1. 修改SOEM源码配置 2. 编译SOEM源码 3. 测试 三、静态库部署 1. 新建Visual Studio工程 2. 创建文件夹 3. 创建主函数 4. 复制静态库 5. 复制头文件 6. 配置头文件…

链接、装载和库——1 简介

前言 关于个人的读书笔记 第一章 温故而知新 1.1 从hello&#xff0c;world说起 ​计算机在执行hello&#xff0c;world的时候发生了什么&#xff1f; 1.2 万变不离其宗 ​在计算机多如牛毛的硬件设备中。有三个部件最为关键&#xff0c;它们分别是 CPU、内存和 I/O 控制芯…

一次多波束和浅地层处理的经历—信标机出问题?

最近处理多波束和浅地层时&#xff0c;一个从来没有过的问题出现了。 多波束数据(.pds)是由PDS2000采集的&#xff0c;使用设备型号为T50P。浅地层数据(.raw)是有SESWIN采集的&#xff0c;使用设备型号为SES2000 Standard。 1、多波束处理 多波束数据采用CARIS11.3处理的。船…

开源LivePortrait,快速实现表情包自定义

最近可灵AI很火&#xff0c;看到网上生成的效果也很赞啊&#xff0c;之前发现快手可灵开源了LivePortrait&#xff0c;今天去玩了一下&#xff0c;很有意思。 比如下图官方展示效果&#xff1a; 这些图片开始自带表情了&#xff0c;主要就是通过LivePortrait来实现。 LivePor…

[E二叉树] lc572. 另一棵树的子树(dfs+前中序判断+树哈希+树上KMP+好题)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;572. 另一棵树的子树 2. 题目解析 看到这个题目就感觉不简单&#xff0c;因为写了写 dfs 版本的&#xff0c;发现好像不太会… 还是简单粗暴一点&#xff0c;直接搞一个 前序中序&#xff0c;进行判断即可。我…

【PyTorch】神经风格迁移项目

神经风格迁移中&#xff0c;取一个内容图像和一个风格图像&#xff0c;综合内容图像的内容和风格图像的艺术风格生成新的图像。 目录 准备数据 处理数据 神经风格迁移模型 加载预训练模型 定义损失函数 定义优化器 运行模型 准备数据 创建data文件夹&#xff0c;放入…

数据恢复软件:电脑丢失文件,及时使用数据恢复软件恢复!

数据恢复软件什么时候会用到&#xff1f; 答&#xff1a;如果真的不小心删除文件&#xff0c;清空回收站&#xff0c;电脑重装系统等情况发生&#xff0c;我们要懂的及时停止使用电子设备&#xff0c;使用可靠的数据恢复软件&#xff0c;帮助我们恢复这些电子设备的数据&#…

二进制搭建 Kubernetes v1.20(上)

目录 一、操作系统初始化配置 二、升级Liunx内核 三、部署docker引擎 四、部署etcd集群 五、部署Master组件 六、部署Worker Node组件 hostnameip需要部署k8s集群master0120.0.0.100kube-apiserver kube-controller-manager kube-scheduler etcdk8s集群master0220.0.0.1…

CookieMaker工作室合作开发C++项目十一:拟态病毒

&#xff08;注&#xff1a;本文章使用了“无标题技术”&#xff09; 一天&#xff0c;我和几个同事&#xff0c;平台出了点BUG&#xff0c;居然给我刷出了千年杀&#xff0c;同事看得瑕疵欲裂&#xff0c;发誓要将我挫骨扬灰—— &#xff08;游戏入口&#xff1a;和平精英31.…

【数据脱敏】数据交换平台数据脱敏建设方案

1 概述 1.1 数据脱敏定义 1.2 数据脱敏原则 1.2.1基本原则 1.2.2技术原则 1.2.3管理原则 1.3 数据脱敏常用方法 3.1.1泛化技术 3.1.2抑制技术 3.1.3扰乱技术 3.1.4有损技术 1.4 数据脱敏全生命周期 2 制定数据脱敏规程 3 发现敏感数据 4 定义脱敏规则 5 执…

[Unity] ShaderGraph实现DeBuff污染 溶解叠加效果

本篇是在之前的基础上&#xff0c;继续做的功能衍生。 [Unity] ShaderGraph实现Sprite消散及受击变色 完整连连看如下所示&#xff1a;

TypeError: ‘float’ object is not iterable 深度解析

TypeError: ‘float’ object is not iterable 深度解析与实战指南 在Python编程中&#xff0c;TypeError: float object is not iterable是一个常见的错误&#xff0c;通常发生在尝试对浮点数&#xff08;float&#xff09;进行迭代操作时。这个错误表明代码中存在类型使用不…

C基础项目(学生成绩管理系统)

目录 一、项目要求 二、完整代码实例 三、分文件编写代码实例 一、项目要求 1.系统运行&#xff0c;打开如下界面。列出系统帮助菜单&#xff08;即命令菜单&#xff09;&#xff0c;提示输入命令 2.开始时还没有录入成绩&#xff0c;所以输入命令 L 也无法列出成绩。应提…

嵌入式Linux系统中pinictrl框架基本实现

1. 回顾Pinctrl的三大作用 记住pinctrl的三大作用,有助于理解所涉及的数据结构: * 引脚枚举与命名(Enumerating and naming) * 单个引脚 * 各组引脚 * 引脚复用(Multiplexing):比如用作GPIO、I2C或其他功能 * 引脚配置(Configuration):比如上拉、下拉、open drain、驱…