【NLP】LLM 和 RAG

在这里,我描述了我在过去几年中关于 RAG 系统如何发展的主要经验。分享 Naive RAG、Advanced RAG 和 Modular RAG 框架之间的区别。总结了高云帆等人发表的一篇出色的RAG 技术调查论文的关键见解。 

 什么是 RAG 框架?

OpenAIGPT系列、MetaLLama系列、GoogleGemini等大型语言模型(LLM)在生成人工智能领域取得了重大成就。

但这些模型是不确定的。通常,LLM 可能会产生不准确或不相关的内容(称为幻觉),依赖过时的信息,并且他们的决策过程不透明,导致黑箱推理。

检索增强生成 (RAG) 框架旨在帮助缓解这些挑战。 RAG 通过额外的特定领域数据增强了LLM的知识库。

例如,基于 RAG 的系统用于高级问答 (Q&A) 应用程序——聊天机器人。要创建一个可以理解并响应有关私人或特定主题的查询的聊天机器人,有必要使用所需的特定数据来扩展大型语言模型 (LLM) 的知识。这就是 RAG 可以提供帮助的地方。

简单 RAG、高级 RAG 、 模块化 RAG

RAG 框架解决了以下问题:

  • “要检索什么信息”
  • “检索信息什么时候召回”
  • “如何使用检索到的信息”

在过去的几年里,RAG 领域进行了大量的研究和创新。RAG 系统可分为 3 类

  • 简单 RAG
  • 高级 RAG
  • 模块化 RAG

下面是所有三种 RAG 范式(Naive RAG、Advanced RAG 和 Modular RAG)之间的比较。

RAG三种范式的比较

简单 RAG

简单 RAG 管道由以下关键阶段组成:

数据索引

  1. 数据加载:这涉及导入所有要使用的文档或信息。
  2. 数据分割:大文档被分成更小的部分,例如每个部分不超过 500 个字符。
  3. 数据嵌入:使用嵌入模型将数据转换为向量形式,使其易于计算机理解。
  4. 数据存储:这些向量嵌入保存在向量数据库中,以便于搜索。

数据召回

当用户提出问题时:

  1. 用户的输入首先使用数据索引阶段的相同嵌入模型转换为向量(查询向量)。
  2. 然后将该查询向量与向量数据库中的所有向量进行匹配,以找到可能包含用户问题的答案的最相似的向量(例如,使用欧几里得距离度量)。此步骤是关于识别相关知识块。

增强与生成

LLM 模型采用用户的问题和从向量数据库检索的相关信息来创建响应。此过程将问题与已识别的数据相结合(增强)以生成答案(生成)。

Naive RAG 的问题

Naive RAG 在各个阶段都面临着挑战:

  • 检索——未能检索所有相关块或检索不相关块。
  • 增强——从可能不连贯或包含重复信息的检索块中集成上下文的挑战。
  • 生成— LLM 可能会生成不基于所提供的上下文(检索到的块)的答案,或者基于检索到的不相关上下文生成答案。

高级 RAG

高级 RAG 策略的开发是为了解决 Naive RAG 面临的挑战。以下是关键高级 RAG 技术的概述。

RAG 应用程序必须有效地从数据源检索相关文档。但每一步都面临着多重挑战。

  1. 我们如何实现文档和查询的准确语义表示?
  2. 什么方法可以对齐查询和文档(块)的语义空间?
  3. 检索员的输出如何与LLM的偏好保持一致?

这里我概述一下检索前、检索和检索后策略:

预检索

  • 如何优化数据索引?
  • 提高数据质量——删除不相关的信息,消除实体和术语中的歧义,确认事实的准确性,维护上下文并更新过时的信息。
  • 优化索引结构- 优化块大小以捕获相关上下文或从图形结构添加信息以捕获实体之间的关系。
  • 添加元数据— 将日期、章节、小节、目的或任何其他相关信息作为元数据添加到块中,以改进数据过滤

块优化——当使用外部数据源/文档构建 RAG 管道时,第一步是将它们分解成更小的块以提取细粒度的特征。然后嵌入块来表示它们的语义。但是嵌入太大或太小的文本块可能会导致次优结果,因此我们需要针对 RAG 管道中使用的文档类型优化块大小。

关键预检索技术总结

  • 滑动窗口— 使用块之间重叠的分块方法。
  • 自动合并检索——在初始搜索阶段利用小文本块,随后向语言模型提供更大的相关文本块进行处理。
  • 摘要嵌入——根据文档摘要(或摘要)优先进行 Top-K 检索,提供对整个文档上下文的全面理解。
  • 元数据过滤——利用文档元数据来增强过滤过程。
  • 图索引——将实体和关系转换为节点和连接,显着提高相关性。
  •       
  • 检索

    一旦确定了块的大小,下一步就是使用嵌入模型将这些块嵌入到语义空间中。

    在检索阶段,目标是识别要查询的最相关的块。这是通过计算查询和块之间的相似性来完成的。在这里,我们可以优化用于嵌入查询和块的嵌入模型。

    领域知识微调——为了确保嵌入模型准确捕获 RAG 系统的特定领域信息,使用特定领域数据集进行微调非常重要。用于嵌入模型微调的数据集应包含:查询、语料库和相关文档。

  • 相似性度量——有许多不同的度量来衡量向量之间的相似性。相似性度量的选择也是一个优化问题。矢量数据库(ChromaDB、Pinecode、Weaviate...)支持多种相似性指标。以下是不同相似性度量的几个示例:

  • 余弦相似度
  • 欧氏距离 (L2)
  • 点积
  • L2 平方距离
  • 曼哈顿距离

检索后

从向量数据库检索上下文数据(块)后,下一步是将上下文与查询合并,作为 LLM 的输入。但一些检索到的块可能是重复的、有噪声的或包含不相关的信息。这可能会影响 LLM 如何处理给定的上下文。

下面我列出了一些用于克服这些问题的策略。

重新排名- 对检索到的信息重新排名,以优先考虑最相关的内容。当引入额外的上下文时,LLM 通常会面临性能下降,而重新排名通过对检索到的块进行重新排名并识别 Top-K 最相关的块(然后将其用作 LLM 中的上下文)来解决此问题。LlamaIndex、Langchain 、 HayStack等库提供不同的重新排序器。

及时压缩——检索到的信息可能会有噪音,在提交给LLM之前压缩不相关的上下文并减少上下文长度很重要。使用小语言模型计算即时互信息或复杂度来估计元素重要性。当上下文较长时使用摘要技巧。

模块化 RAG

模块化 RAG 集成了 Adanced RAG 的各种模块和技术,以改进整个 RAG 系统。例如,合并用于相似性检索的搜索模块并在检索器中应用微调方法。模块化 RAG 成为构建 RAG 应用程序时的标准范例。模块的一些示例:

搜索模块——除了从向量数据库中检索上下文之外,搜索模块还集成来自其他来源的数据,例如搜索引擎、表格数据、知识图等。

内存模块- 将内存组件添加到 RAG 系统中,其中 LLM 不仅可以引用从向量数据库检索的块,还可以引用存储在系统内存中的先前查询和答案。

融合——涉及原始查询和扩展查询的并行矢量搜索、智能重新排名以优化结果,以及将最佳结果与新查询配对。

路由——查询路由决定用户查询的后续操作,例如摘要、搜索特定数据库等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python程序设计 多重循环(二)

1.打印数字图形 输入n&#xff08;n<9)&#xff0c;输出由数字组成的直角三角图形。例如&#xff0c;输入5&#xff0c;输出图形如下 nint(input("")) #开始 for i in range(1,n1):for j in range(1,i1):print(j,end"")print()#结束 2.打印字符图形 …

牛客NC181 单词拆分(一)【中等 动态规划,前缀树 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/c0d32c1ce5744472a01b2351a2c2767f 思路 前缀树动态规划参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规…

即刻体验 | 使用 Flutter 3.19 更高效地开发

我们已隆重推出全新的 Flutter 版本——Flutter 3.19。此版本引入了专为 Gemini 设计的新 Dart SDK、一个能让开发者对 Widget 动画实现精细化控制的全新 Widget&#xff0c;Impeller 更新带来的渲染性能提升、有助于实现深层链接的工具和对 Windows Arm64 的支持&#xff0c;以…

JVM—类加载子系统

JVM—类加载子系统 JVM的类加载是通过ClassLoader及其子类来完成的。 有哪些类加载器 类加载器如下&#xff1a; 启动类加载器&#xff08;BootStrap ClassLoader&#xff09;&#xff1a;负责加载JAVA_HOME\lib目录或通过-Xbootclasspath参数指定路径中的且被虚拟机认可&am…

Linux|centos7|postgresql数据库主从复制之异步还是同步的问题

前言&#xff1a; postgresql数据库是一个比较先进的中型关系型数据库&#xff0c;原本以为repmgr和基于repmgr的主从复制是挺简单的一个事情&#xff0c;但现实很快就给我教育了&#xff0c;原来postgresql和MySQL一样的&#xff0c;也是有异步或者同步的复制区别的 Postgre…

物联网实战--入门篇之(十)安卓QT--后端开发

目录 一、项目配置 二、MQTT连接 三、数据解析 四、数据更新 五、数据发送 六、指令下发 一、项目配置 按常规新建一个Quick空项目后&#xff0c;我们需要对项目内容稍微改造、规划下。 首先根据我们的需要在.pro文件内添加必要的模块&#xff0c;其中quick就是qml了&…

Springboot集成knife4j (swagger)

1、添加依赖 在pom.xml 文件中添加 knife4j-spring-boot-starter 的依赖 <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>3.0.3</version> </depe…

TCP、UDP协议

TCP与UDP协议的区别 TCP&#xff08;Transmission Control Protocol&#xff09;和UDP&#xff08;User Datagram Protocol&#xff09;是两种常用的传输层协议&#xff0c;它们之间有以下几点区别&#xff1a; 1. 连接性&#xff1a; - TCP是面向连接的协议&#xff0c;通…

玩转ChatGPT:Kimi测评(科研写作)

一、写在前面 ChatGPT作为一款领先的语言模型&#xff0c;其强大的语言理解和生成能力&#xff0c;让无数用户惊叹不已。然而&#xff0c;使用的高门槛往往让国内普通用户望而却步。 最近&#xff0c;一款由月之暗面科技有限公司开发的智能助手——Kimi&#xff0c;很火爆哦。…

VMware-16.0配置虚拟机网络模式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、为什么要配置网络&#xff1f;二、配置步骤1.检查VMware服务2.进入配置页面3.添加网络模式1.Bridge2.NAT3.Host-only 4.DHCP租约5.静态IP 三、使用总结 前言…

wife_wife【web 攻防世界】

大佬的wp:WEB&#xff1a;Wife_wife-CSDN博客 知识点&#xff1a; prototype是new class 的一个属性&#xff0c;即__proto__指向new class 的prototype属性__proto__如果作为json代码解析的话会被当成键名处理&#xff0c;但是如果是在类中的话则会被当成子类的原型 如let o…

OpenCV 4.9基本绘图

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV使用通用内部函数对代码进行矢量化 下一篇&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; ​目标 在本教程中&#xff0c;您将学习如何&am…

如何对Webpack进行优化

目录 1.优化-提取css代码 1.1. 插件 mini-css-extract-plugin 1.2. 步骤&#xff1a; 1.3. 注意 1.4. 好处 1.5. 练习 2. 优化-css代码提取后压缩 2.1. 问题引入 2.2. 解决 2.3. 步骤 3. Webpack打包less代码 3.1. 加载器 less-loader 3.2. 步骤 3.3. 注意&#xf…

【Redis 知识储备】应⽤数据分离架构 -- 分布系统的演进(2)

应⽤数据分离架构 随着系统的上线&#xff0c;我们不出意外地获得了成功。市场上出现了⼀批忠实于我们的⽤⼾&#xff0c;使得系统的访问量逐步上升&#xff0c;逐渐逼近了硬件资源的极限&#xff0c;同时团队也在此期间积累了对业务流程的⼀批经验。⾯对当前的性能压⼒&#x…

Android Studio学习8——点击事件

在xml代码中绑定 在java代码中绑定 弹出一个toast 随机&#xff0c;数组

基于Docker for Windows部署ChatGPT-Next-Web

基于Docker for Windows部署ChatGPT-Next-Web 项目地址安装Docker for Windows部署项目参数讲解参数示例 运行 项目地址 https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web 安装Docker for Windows 官网地址&#xff1a;https://www.docker.com/ 下拉找到Download 选择W…

篮球竞赛预约平台的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)篮球馆,篮球赛,竞赛项目,赛事预约

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

数据库系统概论(超详解!!!) 第三节 关系数据库标准语言SQL(Ⅳ)

1.集合查询 集合操作的种类 并操作UNION 交操作INTERSECT 差操作EXCEPT 参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同 查询计算机科学系的学生及年龄不大于19岁的学生。SELECT *FROM StudentWHERE Sdept CSUNIONSELECT *FROM StudentWHERE Sage&l…

go之web框架gin

介绍 Gin 是一个用 Go (Golang) 编写的 Web 框架。 它具有类似 martini 的 API&#xff0c;性能要好得多&#xff0c;多亏了 httprouter&#xff0c;速度提高了 40 倍。 如果您需要性能和良好的生产力&#xff0c;您一定会喜欢 Gin。 安装 go get -u github.com/gin-gonic/g…

SpringBoot | Spring Boot“整合Redis“

目录: 1. Redis 介绍2. Redis 下载安装3. Redis “服务开启”和“连接配置”4. Spring Boot整合Redis的“前期准备” :① 编写实体类② 编写Repository 接口③ 在“全局配置文件”中添加 “Redis数据库” 的 “相关配置信息” 5. Spring Boot整合“Redis” (案例展示) 作者简介…