【NLP】LLM 和 RAG

news2024/12/22 20:46:43

在这里,我描述了我在过去几年中关于 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 不仅可以引用从向量数据库检索的块,还可以引用存储在系统内存中的先前查询和答案。

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

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

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

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

相关文章

InterliJ IDEA基本设置

安装好idea后,将软件打开,可以进行基础设置 1.打开软件,先安装插件-汉化包(不推荐,最好使用英文版),本次我们使用汉化版本完成基本设置,后期希望大家适应英文版的开发环境。&#x…

Databend 开源周报第 138 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 支持多表插入 …

一次MySQL事务的旅程:Buffer Pool, Binlog, Redo Log揭秘

MySQL中的各种Buffer和Log以及表空间 MySQL中一次事务涉及了各种Buffer,Log和表空间,主要涉及:Buffer Pool, Binlog, Undo Log, Redo Log以及表空间。 我们来探讨下。 Buffer Pool Buffer Pool主要存放在内存中,它是一个缓存区域&#xf…

论文阅读RangeDet: In Defense of Range View for LiDAR-based 3D Object Detection

文章目录 RangeDet: In Defense of Range View for LiDAR-based 3D Object Detection问题笛卡尔坐标结构图Meta-Kernel Convolution RangeDet: In Defense of Range View for LiDAR-based 3D Object Detection 论文:https://arxiv.org/pdf/2103.10039.pdf 代码&…

Python 与机器学习,在服务器使用过程中,常用的 Linux 命令包括哪些?

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 本博客旨在分享在实际开发过程中,开发者需要了解并熟练运用的 Linux 操作系统常用命令。Linux 作为一种操作系统,与 Windows 或 MacOS 并驾齐驱,尤其在服务器和开发环…

【Node.js从基础到高级运用】二十一、使用child_process模块创建子进程

引言 在Node.js中,child_process模块是一个提供了创建和管理子进程的能力的核心模块。通过使用child_process模块,Node.js可以执行系统命令、运行其他脚本或应用程序,实现与Node.js进程的并行处理。 child_process模块提供了几种创建子进程的…

环信IM集成教程——Web端UIKit快速集成与消息发送

写在前面: 千呼万唤始出来,环信Web端终于出UIKit了!🎉🎉🎉 文档地址:https://doc.easemob.com/uikit/chatuikit/web/chatuikit_overview.html 环信单群聊 UIKit 是基于环信即时通讯云 IM SDK 开…

Docker:探索容器化技术,重塑云计算时代应用交付与管理

一,引言 在云计算时代,随着开发者逐步将应用迁移至云端以减轻硬件管理负担,软件配置与环境一致性问题日益凸显。Docker的横空出世,恰好为软件开发者带来了全新的解决方案,它革新了软件的打包、分发和管理方式&#xff…

聚观早报 | 蔚来推出油车置换补贴;iPhone 16 Pro细节曝光

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 4月02日消息 蔚来推出油车置换补贴 iPhone 16 Pro细节曝光 小米SU7创始版第二轮追加开售 OpenAI将在日本设立办事…

OSPF中配置静态路由实验简述

静态路由协议和OSPF(开放最短路径优先)协议是两种常见的路由协议,它们在路由选择和网络管理方面有一些区别。他们可以共存。 静态路由协议需要手动配置路由表,不会自动适应网络拓扑变化,适用于小型网络或者网络拓扑变化…

图神经网络:处理非欧几里得数据的新视角

目录 1. 引言 2.图数据与图神经网络基础 3.GNN模型详解 4.应用案例 4.1. 社交网络分析 4.2. 化学分子性质预测 5.总结 1. 引言 非欧几里得数据指的是那些不遵循传统欧几里得空间几何规则的数据。在欧几里得空间中,数据点之间的距离和形状可以通过标准的几何度…

书生·浦语大模型(学习笔记-1)

一、大模型的发展 模型与通用人工智能(AGI),大模型通常被视为发展通用人工智能的重要途径。AI研究从专用模型向通用模型转变,在过去的一二十年中,研究重点在于针对特定任务的专用模型。专用模型的已经再多个领域取得显…

试过了,ChatGPT确实不用注册就可以使用了!

看到官网说不用登录也可以直接使用ChatGPT 我们来试一下 直接打开官网 默认是直接进入了chatgpt3.5的聊天界面 之前是默认进的登录页面 聊一下试试 直接回复了,目前属于未登录状态,挺好! 来试下ChatGPT4 跳转到了登录页面 目前来看gpt4还…

时序预测 | Matlab实现CPO-LSTM【24年新算法】冠豪猪优化长短期记忆神经网络时间序列预测

时序预测 | Matlab实现CPO-LSTM【24年新算法】冠豪猪优化长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab实现CPO-LSTM【24年新算法】冠豪猪优化长短期记忆神经网络时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CPO-LSTM【24年新算法】…

【Java+Springboot】----- 通过Idea快速创建SpringBoot项目操作方法

一、第一步: 点击选择【File】->【New】-> 【Project】 最后弹出[new Project]界面。 二、第二步: 1. 选择【Spring Initializr】 2. 然后选择【Project SDK】的版本 3. 然后 Choose Initializr Service URL 选择默认(Default&#x…

OpenCV项目实战-深度学习去阴影-图像去阴影

往期热门博客项目回顾: 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 //正文开始! 图…

Python+requests+Pytest+logging+allure+pymysql框架详解

一、框架目录结构 1)tools目录用来放公共方法存储,如发送接口以及读取测试数据的方法,响应断言 数据库断言 前置sql等方法;2)datas目录用例存储接口用例的测试数据,我是用excel来存储的数据,文件数据 图片数据等;3)testcases目录用来存放测试用例,一个python文件对应…

linux删除 buff/cache缓存

1.查看当前内存占用 free -h如图,缓存占用了将近9G,接下来进行清理 释放页缓存 echo 1 > /proc/sys/vm/drop_caches释放dentries和inodes echo 2 > /proc/sys/vm/drop_caches释放所有缓存 echo 3 > /proc/sys/vm/drop_caches再次查看&#…

uniapp创建opendb-city-china Schema文件后,如何导入城市的数据?

1.点击opendb-city-china后面的详情,进入到gitee代码仓库 2.下载如下图所示的data.json文件 3.将本地创建的opendb-city-china.schema.json上传到云端 4.点击导入json 如果直接将data.json导入会报错,如下图所示: 5.将data.json本来的数组对象&#…

物联网行业中,我们如何选择数据库?

在当今数字化潮流中,我们面对的不仅是海量数据,更是时间的涟漪。从生产线的传感器到金融市场的交易记录,时间序列数据成为了理解事物演变和趋势的关键。在面对这样庞大而动态的数据流时,我们需要深入了解一种强大的工具——时序数…