RAG概述(一):RAG架构的演进

目录

概述

RAG核心步骤

Indexing索引

Retrieval检索

Generation生成​​​​​​​

Native RAG

Advanced RAG

Modular RAG

参考


概述

RAG:Retrieval-Augmented Generation 检索增强生成。

RAG通过结合LLMs的内在知识和外部数据库的非参数化数据,提高了模型在知识密集型任务中的准确性和可信度。

RAG是一种通过整合外部知识库来增强LLMs的范式。

RAG的发展经历了三个主要阶段:初级(Native RAG)、高级(Advanced RAG)和模块化RAG(Modular RAG)。

RAG核心步骤

  1. Indexing 索引
  2. Retrieval检索
  3. Generation生成

Q&A场景下的RAG工作流示例:

用户询问ChatGPT关于一个最近的高调事件(例如,OpenAI首席执行官的突然解雇和复职),这引起了公众的广泛讨论。

ChatGPT作为最著名和广泛使用的LLM,受到其预训练数据的限制,缺乏对最近事件的了解。

RAG通过从外部知识库检索最新的文档摘要来解决这一差距。这些文章与初始问题一起,被合并成一个丰富的提示,使ChatGPT能够综合出一个知情的回应。

这个例子说明了RAG过程,展示了它通过实时信息检索增强模型响应的能力。

Indexing索引

索引过程是数据准备中的一个关键初始步骤,它在离线状态下进行,并涉及多个阶段。

【数据提取】它从数据索引开始,原始数据被清洗和提取,各种文件格式如PDF、HTML、Word和Markdown被转换成标准化的纯文本。

【分块】为了适应语言模型的上下文限制,这些文本随后被分割成更小、更易于管理的块,这个过程被称为分块。

【向量化】这些块随后通过一个嵌入模型转换为向量表示,这有助于在检索阶段进行相似性比较。

【索引】最后,创建一个索引来存储这些文本块及其向量嵌入作为键值对,这允许高效和可扩展的搜索能力。

Retrieval检索

【查询向量化】在收到用户查询后,系统使用与索引阶段相同的编码模型将输入转换为向量表示。

【相似度计算】然后计算查询向量与索引语料库中向量化块之间的相似度分数。

【topk】系统优先检索与查询最相似的前K个块。这些块随后被用作扩展的上下文基础,以解决用户的请求。

Generation生成

【组装prompt】提出的查询和选定的文档被渲染成一个提示(Prompt),大型语言模型生成回答。

【剩下的就交给模型了】模型的回答方法可能因任务特定标准而异,允许它要么利用其内在的参数知识,要么将其回应限制在提供的文档内包含的信息。

在持续对话的情况下,任何现有的对话历史可以被整合到提示中,使模型能够有效地参与多轮对话互动。

Native RAG

就是包括最基本的Indexing-Retrieval-Generation三个过程。

不足:效果不好

具体表现:

  1. 准确性低:Retrieval阶段查询到的块,和query本身的相关性低。可能导致LLM出现幻觉或空中掉物等问题。
  2. 召回低:Retrieval阶段查询的块,并没有返回足够多的相关块,进一步降低了LLM构建全面回应的可能性。
  3. 组装prompt的问题:这个阶段会将检索到的块和query融合,构建一个prompt给到LLM。若检索到的多个块中包含了相似或重复的内容,可能导致最终LLM生成内容的冗余和重复,也就是表现的婆婆妈妈。
  4. 灵活性问题:若检索阶段拿到了足够丰富的信息,和query一起构建扔给LLM后,LLM的生成完全基于检索出的内容,并没有增加新生成的内容,变成了复读机。

Advanced RAG

概述:对Native RAG做了些优化

Advanced RAG是为了解决Naive RAG的不足而开发的,它实现了预检索和后检索策略。

为了解决Naive RAG在索引过程中遇到的挑战,Advanced RAG改进了其索引方法,使用了滑动窗口、细粒度分割和元数据等技术。它还引入了各种方法来优化检索过程。

(且听下回分解)

Modular RAG

概述:Indexing-Retrieval-Generation三段论不变,额外配置了一个超大的武器库,你可以自由选用合适的组件加入到三段论中。

模块化RAG结构与传统的朴素RAG框架不同,提供了更大的灵活性和适应性。它整合了各种方法来增强功能模块,例如加入搜索模块进行相似性检索,并在检索器中应用微调方法。重构的RAG模块和迭代方法已被开发出来以解决特定问题。

模块化RAG范式在RAG领域越来越成为常态,允许通过多个模块进行序列化流水线或端到端训练。

然而,模块化RAG并非独立存在。高级RAG是模块化RAG的一种特殊形式,而朴素RAG本身是高级RAG的一个特例。这三种范式之间的关系是继承和发展。

(且听下回分解)

参考

  1. https://arxiv.org/pdf/2312.10997
  2. https://zhuanlan.zhihu.com/p/683651359

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

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

相关文章

vue实现图片懒加载

在src中创建一个directives文件夹在里面创建一个lazy.js文件 在main.js中引入 import lazy from ./directives/lazy app.directive(lazy, lazy) 在app.vue中 <script setup lang"ts"> import { RouterLink, RouterView } from vue-router import HelloWorl…

与MySQL的初相遇

&#x1f30e;初识MySQL 注&#xff1a;本文SQL语句只为了验证猜想&#xff0c;不会也不要紧。 文章目录&#xff1a; MySql开端 认识数据库       什么是数据库       主流数据库       MySQL的本质 MySQL基础使用       连接mysql服务器     …

Linux内存管理--系列文章肆

一、引子 上篇文章介绍了目标文件&#xff0c;也就是讲到编译过程中的汇编这个阶段。本篇要讲目标文件怎么变成一个可执行文件的&#xff0c;介绍编译过程中的链接。 链接主要分为两种&#xff0c;静态链接和动态链接。它们本质上的区别&#xff0c;是在程序的编译和运行过程中…

自动化您的任务——crewAI 初学者教程

今天&#xff0c;我写这篇文章是为了分享您开始使用一个非常流行的多智能体框架所需了解的所有信息&#xff1a;crewAI。 我将在这里或那里跳过一些内容&#xff0c;使本教程成为一个精炼的教程&#xff0c;概述帮助您入门的关键概念和要点 今天&#xff0c;我写这篇文章是为了…

【代码随想录训练营】【Day 31】【回溯-5】| Leetcode 491, 46, 47

【代码随想录训练营】【Day 31】【回溯-5】| Leetcode 491, 46, 47 需强化知识点 排列问题和组合分割子集问题的区别&#xff1a; 排列是讲究顺序的&#xff0c;不同顺序的组合是不同的&#xff0c;因此不能使用startIndex来限制选择顺序&#xff0c;需要used来判断是否已被选…

easy-rule规则引擎使用

简介 轻量级的规则引擎&#xff0c;易于学习的api 简单来说&#xff0c;规则引擎就是一个函数&#xff1a;yf(x1,x2,…,xn) 将业务代码和业务规则分离&#xff0c;解耦业务决策和业务代码的绑定关系 入门示例 依赖引入 <dependency><groupId>org.jeasy</grou…

页面<html>上多了一个滚动条,定位发现是<body>里面多了一个id为trans-tooltip的div

现象分析&#xff1a; 页面根标签html多了一个滚动条&#xff0c;发现body里面多了一个id为trans-tooltip的div&#xff0c;虽然width为0&#xff0c;height为0&#xff0c;但是其子元素还是有高度&#xff0c;占据了空间&#xff0c;最终导致了滚动条&#xff1b; 根本原因&…

C++ 并查集模板

搬运jiangly鸽鸽的板子 #include <iostream> #include <string> #include <vector> #include <numeric>struct DSU {std::vector<int> f, siz;DSU() {}DSU(int n) {init(n);}void init(int n) {f.resize(n);std::iota(f.begin(), f.end(), 0);s…

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(十三)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 接上一篇文章内容&#xff0c;讲述如何进行Phpsploit-Framework软件的基础使用和二次开发。 我们&#xff0c;继续讲一…

Java面试题--JVM大厂篇(1-10)

引言&#xff1a; 在这个信息时代&#xff0c;对于准备进入大厂工作的朋友们来说&#xff0c;对于JVM&#xff08;Java虚拟机&#xff09;的掌握是面试中的一项重要内容。下面是一些精选的JVM面试题&#xff0c;希望对大家能有所帮助。 正文&#xff1a; 1. JVM有哪几种垃圾收…

[CISCN2024]-PWN:gostack解析(go语言程序,syscall)

查看保护 ida比较复杂&#xff0c;建议动调配合静态分析程序运行 这里函数返回不用leave和ret&#xff0c;而是利用add rsp和ret&#xff0c;所以要动调查看到底要覆盖哪里。 完整exp&#xff1a; from pwn import* pprocess(./gostack) syscall0x4616c9 pop_rax0x40f984 po…

GB报文中的Cseq值的注意点

一、 问题现象 【问题现象】NVR使用GB接三方平台发现倍速回放时&#xff0c; 【现场拓扑】现场拓扑如下 &#xff08;1&#xff09; NVR侧使用家用宽带的方式&#xff0c;通过国标跨公网接入三方平台。 图1.1&#xff1a;网络拓扑 二、 抓包分析 INVITE sip:420000004013200…

OpenAI安全系统负责人:从头构建视频生成扩散模型

作者 | Lilian Weng OneFlow编译 翻译&#xff5c;杨婷、宛子琳、张雪聃 题图由SiliconFlow MaaS平台生成 过去几年&#xff0c;扩散模型&#xff08;Diffusion models&#xff09;在图像合成领域取得了显著成效。目前&#xff0c;研究界已开始尝试更具挑战性的任务——将该技术…

深度学习Day-18:ResNet50V2算法实战与解析

&#x1f368; 本文为&#xff1a;[&#x1f517;365天深度学习训练营] 中的学习记录博客 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制] 要求&#xff1a; 根据本文Tensorflow代码&#xff0c;编写对应的Pytorch代码了解ResNetV2与ResNetV的区别 一、 基础…

【实战JVM】-基础篇-03-Java内存结构

【实战JVM】-基础篇-03-Java内存结构 1 运行时数据区1.1 总览1.2 程序计数器1.2.1 是否会内存溢出 1.3 java虚拟机栈1.3.1 栈帧的组成1.3.1.1 局部变量表1.3.1.2 操作数栈1.3.1.3 帧数据1.3.1.3.1 动态链接1.3.1.3.2 方法出口1.3.1.3.3 异常表 1.3.2 是否会内存溢出1.3.3 设置虚…

Day50 | 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费 总结

代码随想录算法训练营Day50 | 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费 总结 LeetCode 309.最佳买卖股票时机含冷冻期 题目链接&#xff1a;LeetCode 309.最佳买卖股票时机含冷冻期 思路&#xff1a; 四个状态。 保持持有股票&#xff0c;保持卖出股票…

Ardupilot开源飞控之FollowMe计划

Ardupilot开源飞控之FollowMe计划 1. 源由2. 分析3. 计划4. 话题5. 设备6. 后续 1. 源由 随着现在的智能设备越来越智能&#xff0c;FollowMe就是一个最基本的特性。&#xff08;注&#xff1a;远程遥控&#xff0c;传感联动&#xff0c;这些都是最基本的自动化控制技术&#…

【神经网络结构可视化】使用 Visualkeras 可视化 Keras / TensorFlow 神经网络结构

文章目录 Visualkeras介绍下载安装代码示例1、导入必要的库2、创建VGG16神经网络模型3、可视化神经网络结构4、完整代码5、使用教程 可视化自己创建的神经网络结构1、导入要的库2、创建自己的神经网络模型3、可视化神经网络结构图4、完整代码 Visualkeras介绍 Visualkeras是一…

C++代码错误解决1(函数模板)

1、代码如下 //示例函数模板的使用 #include <iostream> #include <string> using namespace std; template <typename T>//函数模板 T max(T a,T b) {return a>b?a:b; } int main() {int a,b;cout<<"input two integers to a&b:"…