大模型+检索增强(RAG、Atlas 和 REPLUG)

news2024/11/25 4:40:41

https://zhuanlan.zhihu.com/p/651380539

https://github.com/ninehills/blog/issues/97

1. 检索增强生成 RAG

在问答和对话的场景下,通常可以通过检索和生成两种方式得到一个回复。检索式回复是在外部知识库中检索出满意的回复,较为可靠和可控,但回复缺乏多样性;而生成式回复则依赖于强大的语言模型中储存的内部知识,不可控,解释性差,但能生成更丰富的回复。把检索和生成结合起来,Facebook AI research 联合 UCL 和纽约大学于 2020 年提出:外部知识检索加持下的生成模型,Retrieval-Augmented Generation (RAG) 检索增强生成

  • 检索:这是指系统搜索庞大的数据库或存储库以查找相关信息的过程。
  • 生成:检索后,系统生成类似人类的文本,整合获取的数据。

检索增强方法来克服大型语言模型(Large Language Models, llm)的局限性,比如幻觉问题(胡言乱语)和知识有限问题(常用于补充最新知识、公司内部知识)。检索增强方法背后的思想是维护一个外部知识库,在提问时检索外部数据,并将其提供给LLM,以增强其生成准确和相关答案的能力。

原理

RAG 由两部分组成:

  • 第一部分负责在知识库中,根据 q u e r y x query_x queryx 检索出 top-k 个匹配的文档 z i z _i zi
  • 第二部分将 query 和k个文档拼接起来作为QA的prompt,送入 seq2seq 模型,生成回复 y y y
    在这里插入图片描述

第一部分:Retriever

在第一部分 Retriver 中,RAG 通过两个不同的 BERT 把 外部知识 和 query 嵌入为稠密向量,做内积得到内积最大的 k 个文档。将 query 和 k个文档 拼接起来组成 k 个输入,作为第二部分的输入。

第二部分:Generator

Generator 中有两种使用文档的方式。

  • 第一种称为 RAG-Sequence model:使用同一个文档生成每个词,先确定一个文档 z i z_i zi ,然后计算 p ( y ∣ x , z i ) p(y|x,z_i) p(yx,zi)
    在这里插入图片描述

  • 第二种称为 RAG-Token model:使用不同的文档生成每个词,对于第 i 个位置,候选词的概率等于所有文档的条件概率之和,即计算候选词对文档的边际概率。
    在这里插入图片描述

BART 是一个基于完整的 transformer 预训练模型,使用去噪作为预训练任务。作者选用 BART-large 作为 RAG 的生成器。

在训练过程中,只有负责嵌入 query 的 BERT 和负责生成的 BART 参与微调更新参数,负责嵌入外部知识的 BERT 不用更新参数。在测试过程中,RAG-Token model 在计算当前词的概率时,前面位置候选词的概率已经完成计算了。因此,RAG-Token model 如同朴素的生成模型一样使用 beam search 解码。而 RAG-Sequence model 要遍历完所有文档才能得到每个位置候选词的概率。因此需要对每个文档使用 beam search 解码,然后再整合。

8大挑战

数据源加载与处理

各种数据加载、解析过程中,如何尽可能保留原始数据的逻辑和语义关系是一个需要注意的问题。可以多尝试不同的加载与解析方式,对比不同的py库。也可预定于好prompt便于LLM理解。

在这里插入图片描述

一个好的prompt可以通过补充相关材料实现:背景知识、互联网检索结果、RAG检索结果、in-context QA实例。

在这里插入图片描述

数据切分难

  • chunk_size: 对输入文本序列进行切分的最大长度。大语言模型一般会限制最大输入序列长度,比如GPT-3的最大输入长度是2048个token。为了处理更长的文本,需要切分成多个chunk,chunk_size控制每个chunk的最大长度。
  • chunk_overlap: 相邻两个chunk之间的重叠token数量。为了保证文本语义的连贯性,相邻chunk会有一定的重叠。chunk_overlap控制这个重叠区域的大小。

举例来说,如果chunk_size设为1024,chunk_overlap设为128,则对一个长度为2560的文本序列,会切分成3个chunk:
chunk 1: 第1-1024个token
chunk 2: 第897-1920个token (与chunk 1重叠128个)
chunk 3: 第1793-2560个token (与chunk 2重叠128个)
这样的切分方式既满足了最大长度限制,也保证了相邻chunk间语义的衔接。适当的chunk大小和重叠可以提升大语言模型处理长文本的流畅性和连贯性。

在这里插入图片描述

如何对原始文本进行切分(如何选择 chunk size),影响很大,需要根据业务具体需求判断:

  1. 实验改超参数,不断测试
  2. 解耦 index 时和 generation时的 chunk size,这里也有两种方式:

在这里插入图片描述

  • 在检索时,文档如果可以构建为文档树结构,比如 段1段2,则可以先让 LMM 分别进行摘要,在搜索时首先根据摘要定位段落(也是使用相似度 ann 的方式 ),然后在段落内部 ann 检索。
  • 将文档分的很小很小,这样每一个 chunk 内部的语义 已经很清晰了,然后检索到 chunk k 之后,我们取 chunk k-1, k, k+1 ,即相邻的 chunk 作为上下文。

检索效果不好

在这里插入图片描述
无法检索到有效的chunk (模型问题,切分问题) ; chunk 内部有无效信息 (先进行摘要,相关性过滤)。

提升方法:

  • 可以使用 混合搜索 Hybrid Search ,即混合其他相似度评价指标,比如 Bm25,Keyword,Vector
  • 混合其他的搜索字段,比如 元数据 meta-data,同时也可以考虑让 LLM 去抽取chunk 的大义,关键词;也可以结合上下文摘要

检索结果过多或过长

在这里插入图片描述
检索结果的过滤:后处理,其实就是一个重排的过程

在这里插入图片描述

告诉模型 原始query 和 metadata 中类型的集合,让模型帮助我们得到子集合,从而进行筛选。

Re-rank 的问题 :需要真实业务 domain 的数据来微调;这里可以 尝试使用 LLM 来 rerank (给LLM写好prompt)。

在这里插入图片描述

答案合成策略:
在这里插入图片描述

Default 版本:
在这里插入图片描述

迭代式 refine 版本:一条 一条 chunk 输入,不断让模型修改更新原答案
在这里插入图片描述

可解释性与鲁棒性

在这里插入图片描述

复杂query的处理

Prompt → Sub-query , 不断拆分成子问题 → 直到可以回复
在这里插入图片描述

2. Atlas

Atlas: Few-shot Learning with Retrieval Augmented Language Models
Atlas :用检索增强的语言模型进行few-shot学习

Atlas 拥有两个子模型,一个检索器与一个语言模型。当面对一个任务时,Atlas 依据输入的问题使用检索器从大量语料中生成出最相关的 top-k 个文档,之后将这些文档与问题 query 一同放入语言模型之中,进而产生出所需的输出。
在这里插入图片描述

Atlas 模型的基本训练策略在于,将检索器与语言模型使用同一损失函数共同训练。检索器与语言模型都基于预训练的 Transformer 网络,其中:

  • 检索器基于 Contriever 设计,Contriever 通过无监督数据进行预训练,使用两层编码器,query 与 document 被独立的编码入编码器中,并通过相应输出的点乘获得 query 与 document 的相似度。这种设计使得 Atlas 可以在没有文档标注的情况下训练检索器,从而显著降低内存需求。
  • 语言模型基于 T5 进行训练,将不同文档与 query 相互拼接,由编码器分别独立处理,最后,解码器对于所有检索的段落串联进行 Cross-Attention 得到最后的输出。这种 Fusion-in-Decoder 的方法有利于 Atlas 有效的适应文档数量的扩展。

检索增强的优势

  • 可解释性:大模型的黑箱属性,使得研究者很难以利用大模型对模型运行机理进行分析,而检索增强模型可以直接提取其检索到的文档,从而通过分析检索器所检索出的文章,可以获得对 Atlas 工作更好的理解。
  • 可控性:我们往往会认为大模型存在训练数据“泄露”的风险,即有时大模型针对测试问题的回答并非基于模型的学习能力而是基于大模型的记忆能力,也就是说在大模型学习的大量语料中泄露了测试问题的答案,而在这篇论文中,作者通过人为剔除可能会发生泄露的语料信息后,模型正确率从56.4%下降到了55.8%,仅仅下降0.6%,可以看出检索增强的方法可以有效的规避模型作弊的风险。
  • 可更新性:检索增强模型可以无需重新训练而只需更新或替换其依托的语料库实现模型的时时更新。

https://www.51cto.com/article/717069.html

https://zhuanlan.zhihu.com/p/595258642

https://zhuanlan.zhihu.com/p/563129454

3. REPLUG

REPLUG: Retrieval-Augmented Black-Box Language Models

这篇工作所提出的REPLUG模型可以说是“黑盒”式检索增强的代表。在这种新范式下,语言模型是一个黑盒子(它的参数被冻结了,不会被更新优化),检索组件才是可微调的部分。

RERLUG(Retrieve and Plug) 其实就是在语言模型上额外加了一个检索组件,利用检索组件获得一些相关信息,与原始输入一起作为语言模型的新输入,检索组件和语言模型都不需要训练。(个人认为某种程度上检索出来的加到原始输入即用户query上的这些文本有点像prompt)。

RERLUG LST(RERLUG with LM-Supervised Retrieval)可以看作是 RERLUG 的升级版,它利用语言模型产生监督信号,从而去优化检索组件,让检索组件倾向于挑选出能够降低语言模型所生成文本的困惑度。

https://blog.csdn.net/qq_27590277/article/details/129414851

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

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

相关文章

如何使用 MATLAB 数学编程软件调用 Python 脚本详细教程(每周更新中)

MATLAB 读写操作 在 MATLAB 中,可以使用各种函数来读取和写入文件。其中,filename.txt 是要读取或写入的文件名,r 表示读取模式,w 表示写入模式。fscanf 和 fprintf 函数用于读取和写入文件内容,%c 和 %s 是格式说明符…

Python 通过 stomp 发送消息到 ActiveMQ 的代码

只需要下面简单的几行代码,我们就可以把我们本地数据发送到 ActiveMQ 上面去。 def send_mq(data):hosts [(AMQHOST, AMQPORT)]conn stomp.Connection(host_and_portshosts, auto_content_lengthFalse)conn.connect(usernameAMQUSER, passcodeAMQPASS, waitTrue)…

基于Spring Boot的医院预约挂号系统设计与实现

前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…

功夫再高也怕菜刀。多年经验,会独立开发的机器视觉工程师,技术太强,但是找工作能力差劲

功夫再高也怕菜刀,专业的事情交给专业的人去做。 今年7月份中旬的时候,遇到一位老朋友,向我咨询某公司的信息,其实我根本不了解这家公司的情况与实力,向他说了,抱歉,我查下,等我晚上…

怎么把利用paddlepaddle导出的json文件转化为yolo或者voc文件

这两天想偷懒,想让模型先在数据上标一遍,然后我再做修正,主要是图个省事。由于我们的业务主要是利用paddle,模型也是基于paddle推理的,因此即便我对paddle有一万个吐槽但也不得不用它。但在利用paddle保存推理结果文件时&#xff…

Linux Day17 生产者消费者

一、生产者消费者问题概述 生产者 / 消费者问题,也被称作有限缓冲问题。两个或者更多的线程共享同一个缓冲 区,其中一个或多个线程作为 “ 生产者 ” 会不断地向缓冲区中添加数据,另一个或者多个线程作为 “ 消费者 ” 从缓冲区中取走数据。…

搭建本地MQTT服务器

环境及所用工具 win10本地环境下,使用docker配置一个mqttbroker,选择emqx docker操作:Docker_liangchaaaaa的博客-CSDN博客 测试使用MQTTX软件 Docker拉取镜像仓库 docker pull emqx/emqx:4.2.5 可以上官网看最新版本,或直接…

vue动态修改浏览器title和icon图标

vue动态修改浏览器title和icon图标 实例代码 setTitleIcon(){var link document.querySelector("link[rel*icon]") || document.createElement(link);link.type image/x-icon;link.rel shortcut icon;link.href /002.png; // 图片放public目录document.getElem…

PHP8的类与对象的基本操作之类的实例化-PHP8知识详解

定义完类和方法后,并不是真正创建一个对象。类和对象可以描述为如下关系。类用来描述具有相同数据结构和特征的“一组对象”,“类”是“对象”的抽象,而“对象”是“类”的具体实例,即一个类中的对象具有相同的“型”,…

循环神经网络-02文本预处理

https://zh-v2.d2l.ai/chapter_recurrent-neural-networks/text-preprocessing.html 本节中,我们将解析文本的常见预处理步骤。 这些步骤通常包括: 将文本作为字符串加载到内存中。 将字符串拆分为词元(如单词和字符)。 建立一个…

QT---day3---9.19

1> 完成文本编辑器的保存工作 ui界面&#xff1a; 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QFontDialog> #include <QMessageBox> #include <QColor> #include <QColorDialog> #include <QFo…

计算机竞赛 深度学习 python opencv 实现人脸年龄性别识别

文章目录 0 前言1 项目课题介绍2 关键技术2.1 卷积神经网络2.2 卷积层2.3 池化层2.4 激活函数&#xff1a;2.5 全连接层 3 使用tensorflow中keras模块实现卷积神经网络4 Keras介绍4.1 Keras深度学习模型4.2 Keras中重要的预定义对象4.3 Keras的网络层构造 5 数据集处理训练5.1 …

IDEA全局替换快捷键有大坑---详解

1、ctl shift r 可选择范围最小就是包 那么必然就会造成全局替换过了&#xff01;&#xff01;&#xff01;&#xff01; 2、ctl r实现当前类全局替换 因为这个坑&#xff0c;浪费大爷我2小时。艹

认识一下Git

目录 Git Git下载 Git安装 Git初始化 Git操作 Git、GitLab、和Eclipse是公司中软件开发常用的组合&#xff1a; 1. Git&#xff1a;Git是一种分布式版本控制系统&#xff0c;用于跟踪文件和代码的变化。它提供了管理代码仓库的功能&#xff0c;可以记录每次提交的修改&am…

Python语言:列表初体验

列表是Python中的一个对象&#xff0c;他类似于C语言中的数组&#xff0c;可以存储许多数据&#xff0c;也可以称之为数据集合。他原则是可以存储不同类型的数据&#xff0c;一般不建议这样使用&#xff0c;有点奇怪&#xff1b;一般情况下一个列表中保存的都是同一种类型的数据…

Matlab中 * 与 .* 的区别

* 用于矩阵乘法 示例1&#xff1a; 注&#xff1a; 表示转置&#xff0c;即矩阵a的转置 乘以 矩阵b 根据矩阵乘法&#xff0c;r结果为&#xff1a; 示例2&#xff1a; 矩阵a 乘以 矩阵b的转置 根据矩阵乘法&#xff0c;结果为&#xff1a; .* 用于对应位置单个元素相乘 示例…

【虚幻引擎】UE5 VLC接入网络监控、视频直播、网络直播支持RTSP、RTMP

一、如何更新自己的插件匹配自己想要的UE版本 我们在网上下载的插件一般是UE4版本的插件&#xff0c;这个时候就需要我们自己去修改编译&#xff0c;接下来教大家修改插件来适配自己的引擎。 如果不想自己编译代码&#xff0c;可以直接找我拿编译好的UE5.0、UE5.1、UE5.2的插件…

[hive]搭建hive3.1.2hiveserver2高可用可hive metastore高可用

参考: Apache hive 3.1.2从单机到高可用部署 HiveServer2高可用 Metastore高可用 hive on spark hiveserver2 web UI 高可用集群启动脚本_薛定谔的猫不吃猫粮的博客-CSDN博客 没用里头的hive on spark,测试后发现版本冲突 一、Hive 集群规划(蓝色部分) ck1ck2ck3Secondary…

Meow

环境准备 操作系统:Kali Linux 或者 Windows工具:nmap,telnet nmap工具 [Kali 官网] 手册地址:https://www.kali.org/tools/nmap/ 摘要: Nmap is a utility for network exploration or security auditing. It supports ping scanning (determine which hosts are up), many…

Linux之动静态库

动静态库 动静态库的基本原理动静态库的认识动静态库特征静态库的打包与使用动态库的打包与使用 动静态库的基本原理 我们知道&#xff0c;生成一个可执行程序会经历以下四个步骤&#xff1a; 预处理&#xff1a;头文件展开&#xff0c;宏替换&#xff0c;去注释&#xff0c;…