Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks 阅读笔记

news2024/11/19 16:41:23

这才是真正RAG,如果只是把检索得到结果放到prompt里面,可能够呛。

好久没有读paper了,最近因为有个小工作,来读一篇较早提出来RAG想法的文章吧。这篇文章是Facebook、伦敦大学学院以及纽约大学的研究者们搞出来的。文章首先指出,目前大语言模型在一些知识密集型任务上,性能并不高,而且你总不能一直要求大语言模型不断训练新知识吧,成本也是很高的,于是乎。他们提出了a general-purpose fine-tuning recipe for retrieval-augmented generation (RAG) — models which combine pre-trained parametric and non-parametric memory for language generation. 基于RAG的微调方法,用这个方法模型会将预训练的参数和非参数记忆结合起来进行内容生成。这句话听起来有些麻烦,但是咱们仔细看看他们是怎么做的。但是在看细节之前,先讲一下为什么现在RAG这么火,到处都在尝试用。主要原因就是大语言模型的Hallucination,幻觉特性。也就是大语言模型会,讲出不符合实际的回答(与事实不一致,或者直接捏造),有点像瞎编的一样。一些研究人员把幻觉主要分成了几类:

  1. 和指令表现不符,LLM忽略了用户的指令。比如你跟他说我要用中文回答,LLM用英文回答了问题。
  2. 上下文不一致,LLM输出了与所提供的上下文不存在或矛盾的信息。
  3. 逻辑不一致,LLM的输出存在逻辑错误。

幻觉的原因,目前大家主要说的是这么几点:

  1. 无法反映出训练数据集中没有的知识点,所以瞎说
  2. 训练数据集庞大、复杂、多样,事实正确性,无偏见性、公平性根本无法保证。
  3. 模型的训练目标不一致。
  4. 推理阶段,上下文注意力不足、采样方法的随机性导致输出的随机性。
  5. 提示词缺乏明确的背景信息或措辞含糊。

为了解决幻觉这个问题,有这么几种方向,比如更好的Prompt提示信息,提高数据质量,使用评分系统等等,RAG可以看作是一种更好的Prompt提示信息。相比于让通用的大语言模型直接回答用户的问题,RAG将更相关的背景知识一起送给大语言模型,在进行序列字符的概率预测时,相当于减少了一些不确定性。我不用再从10个球里选那个红色的了,而是从3个球里选。有这种感觉。

接下来废话不多说,继续来看这篇文章,作者的RAG模型中,参数记忆是预先训练好的seq2seq模型,就是咱们的LLM。非参数记忆是一个维基百科的向量索引,可以通过检索器进行访问。作者比较了两种RAG,We compare two RAG formulations, one which conditions on the same retrieved passages across the whole generated sequence, and another which can use different passages per token。这个要怎么理解呢,

实验任务是三个开放领域的QA任务,模型表现当然是优于不做RAG的LLM以及一些特定任务的模型框架。我们来看一下文章的框架图:

看起来挺复杂,不过大致可以看到query来了以后encoder一下,然后根据maximum inner product search,最大点积向量搜索,找到维基百科中最相关的K个文档,然后送给文本生成器,让其进行文本序列的预测。文章是这么公式化咱们的生成器:

翻译一下就是,两步走:

  • Retriever:给定原始输入x(用户query),检索得到TopK的文档片段z。文章用了Dense Passage Retrieval(详见:https://github.com/facebookresearch/DPR)。
  • Generator:给定原始输入x和检索得到的相关文档片段z,生成字符序列,且是不断根据之前的字符预测下一个字符。文章用了BRAT模型(详见:https://huggingface.co/docs/transformers/en/model_doc/bart)。

另外,文章提出了两种RAG形式:

RAG-sequence:根据检索到的同一个文档来生成sequence。

看公式,右边是一个连乘符号,把所有单个token得概率相乘,得到整个sequence的概率,然后左边是咱根据输入x检索得到z的概率。将两者相乘后,相当于对于给定的x和检索出的z,生成sequence得概率。因为z是有k个,所以整体都要加在一起。

RAG-Token:根据检索到的所有文档来生成一个一个的token。

看公式,对于每个生成的token,即yi的概率,都和根据x检索得到z的概率进行了相乘。因为有TopK个z,所以要进行加和。然后对于所有的token,整个再相乘,以得到整个输出sequence的概率。

最后最后我们再总结一下这个过程:

  1. 检索器将输入变成embedding后,利用DPR算法来检索相关文本,用了MIPS计算的。
  2. 然后检索得到的文本z和咱们的用户query x,一起送给BART模型,模型基于z和x,依次生成第i个字符。并且计算所有N个字符输出出来的时候的概率,即当前sequence的概率。
  3. 针对所有Top K个检索回来的文档分别计算概率,通过将所有概率相加(Marginalisation/边缘化)以推断出根据用户query x,检索K个相关文档,返回给大语言模型后得到输出的概率。

在训练的时候,作者表明他们并没有给出任何监督的信息,即什么样的文本应该被检索出来。仅仅fine-tuning 查询query的encoder BERTq 以及BART生成器。最后在Decode阶段,要重点讲一下RAG-sequence,token那种一次就把每个字符确定了所以其实问题不大。但是对于sequence,每篇检索得到的文章出来的sequence可能并不相同,那就需要看怎么操作一下。

首先,作者利用beam search(搜索算法,用于在图或树结构中扩展最有希望的节点)得到了每篇基于检索得到的文章z,所生成出来比较好的一些结果y。但是并不是所有的z都是一样的答案。于是,为了估计到底得到什么y,对于每个文章z在进行beam search中有些没有出现的y,进行了前向传播以得到概率,然后将该概率带入计算最终的边缘概率里,该操作叫thorough decoding。当y序列长度较长时,生成后就不进行前向传播,以节省计算资源,该操作叫fast decoding。

最后的最后,总的来说,这篇文章把检索器的query encoder和一个seq2seq的文本生成模型,串在了一起做训练。

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

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

相关文章

8-异常与错误

8-异常与错误 1、简介2、异常处理2.1 抛出异常2.2 捕获异常2.3 匹配顺序 3、异常说明4、构造函数中的异常5、析构函数中的异常6、标准库异常 1、简介 在程序编码过程中难免会出现错误,主要有:语法错误、逻辑错误、功能错误等,当我们面对以上…

SpringBoot打war包并配置外部Tomcat运行

简介 由于其他原因,我们需要使用SpringBoot打成war包放在外部的Tomcat中运行,本文就以一个案例来说明从SpringBoot打war包到Tomcat配置并运行的全流程经过 环境 SpringBoot 2.6.15 Tomcat 8.5.100 JDK 1.8.0_281 Windows 正文 一、SpringBoot配置打war包 第一步&a…

echarts 图表不显示的问题

是这样的,点击详情,再点击统计,切换的时候就不会显示echarts图表,刚开始使用的是next Tick,没有使用定时器,后来加上了定时器就实现了如下所示: 代码是如下 const chartContainer ref(null); …

开发一个SDK(starter)

1.创建项目 将pom.xml中build删除掉

pikachu靶场(unsafe upfileupload(文件上传)通关教程)

目录 client check 1.在桌面新建一个文本文档 2.保存为.png格式 3.打开网站 4.按照图中操作 5.点击forward 6.访问 MIME type 1.新建一个php文件,里面写上 2.上传文件,就是我们保存的文件 3.打开抓包工具,点击开始上传 4.修改Conen…

服务器主板电池

一、什么是服务器纽扣电池? 服务器纽扣电池,也叫CMOS电池,是一种非常小型的电池,通常与服务器主板上的CMOS芯片相结合,用于储存BIOS设置、时钟和其他关键系统信息。这种电池的体积通常比一枚硬币还小,而且…

RT-DETR:端到端的实时Transformer检测模型(目标检测+跟踪)

博主一直一来做的都是基于Transformer的目标检测领域,相较于基于卷积的目标检测方法,如YOLO等,其检测速度一直为人诟病。 终于,RT-DETR横空出世,在取得高精度的同时,检测速度也大幅提升。 那么RT-DETR是如…

数据库(13)——DQL分组查询

语法 SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件] 示例 原始表: 根据性别分组并统计人数 select sex,count(*) from information group by sex; 根据性别分组,并求年龄的平均值:

2024抖音流量认知课:掌握流量底层逻辑,明白应该选择什么赛道 (43节课)

课程下载:https://download.csdn.net/download/m0_66047725/89360865 更多资源下载:关注我。 课程目录 01序言:拍前请看.mp4 02抖音建模逻辑1.mp4 03抖音标签逻辑2.mp4 04抖音推流逻辑3.mp4 05抖音起号逻辑4.mp4 06养号的意义.mp4 0…

Java | Leetcode Java题解之第123题买卖股票的最佳时机III

题目&#xff1a; 题解&#xff1a; class Solution {public int maxProfit(int[] prices) {int n prices.length;int buy1 -prices[0], sell1 0;int buy2 -prices[0], sell2 0;for (int i 1; i < n; i) {buy1 Math.max(buy1, -prices[i]);sell1 Math.max(sell1, b…

Bean作用域和生产周期已经Bean的线程安全问题

bean 的作用域 单例(Singletion) : Spring 容器中只有一个 bean &#xff0c;这个 bean 在整个应用程序内共享。 原话(Prototype) : 每次 getBean()&#xff0c; 都是不同的bean&#xff0c;都会创建一个实例。 请求(Request)&#xff1a;每个HTTP请求都会创建一个新的 Bean …

开发者工具-sources(源代码选项)

一、概要说明 源代码面板从视觉效果上分为三个区域&#xff1a;菜单区、内容区、监听区。 菜单区里面有5个子分类&#xff1a; 网页(Page)&#xff1a;指页面源&#xff0c;包含了该页面中所有的文件&#xff0c;即使多个域名下的文件也都会展示出来&#xff0c;包括iframe…

束测后台实操文档2-OpenWrt

束测后台实操文档1-PVE、PBS 上面文&#xff0c;把proxmox装好并添加好PBS上的镜像存储空间后&#xff0c;还原已经做好的镜像基本上就可以在已有的镜像下开展工作了。 调试的PVE环境一般两个网口&#xff0c;一个外网wan&#xff0c;一个子网lan&#xff0c;虚拟机一般在lan…

【redis】宝塔,线上环境报Redis error: ERR unknown command del 错误

两种方式&#xff1a; 1.打开宝塔上的redis&#xff0c;通过配置文件修改权限&#xff0c;注释&#xff1a;#rename-command DEL “” 2.打开服务器&#xff0c;宝塔中默认redis安装位置是&#xff1a;cd /www/server/redis 找到redis.conf,拉到最后&#xff0c;注释#rename-co…

大语言模型技术系列讲解:大模型应用了哪些技术

为了弄懂大语言模型原理和技术细节&#xff0c;笔者计划展开系列学习&#xff0c;并将所学内容从简单到复杂的过程给大家做分享&#xff0c;希望能够体系化的认识大模型技术的内涵。本篇文章作为第一讲&#xff0c;先列出大模型使用到了哪些技术&#xff0c;目的在于对大模型使…

C++设计模式-策略模式

文章目录 27. 策略模式 运行在VS2022&#xff0c;x86&#xff0c;Debug下。 27. 策略模式 策略模式让算法的选择与使用独立开来&#xff0c;使得代码更灵活、可扩展和易维护。应用&#xff1a;如在游戏开发中&#xff0c;AI角色需要根据环境和条件做出不同的行为&#xff0c;如…

基于云服务器使用DreamBooth训练主体

资源整理 参考教程&#xff1a;StableDiffusion/NAI DreamBooth自训练全教程 - 知乎 (zhihu.com) 云服务器平台&#xff1a;AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDL 镜像链接&#xff1a;CrazyBoyM/dreambooth-for-diffusion/dreambooth-for-diffusion、 代码仓…

使用Python操作Git

大家好&#xff0c;当谈及版本控制系统时&#xff0c;Git是最为广泛使用的一种&#xff0c;而Python作为一门多用途的编程语言&#xff0c;在处理Git仓库时也展现了其强大的能力。通过Python&#xff0c;我们可以轻松地与Git仓库进行交互&#xff0c;执行各种操作&#xff0c;从…

为参数设置默认值

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 调用函数时&#xff0c;如果没有指定某个参数将抛出异常&#xff0c;为了解决这个问题&#xff0c;我们可以为参数设置默认值&#xff0c;即在定义函…

Blueprints - Collision Presets相关

一些以前的学习笔记归档&#xff1b; 在Static Mesh或SkeletalMesh等的属性中&#xff0c;都有Collision Presets&#xff1a; 其中Oject Type只是一个枚举参数&#xff0c;代表设置该Actor为什么类型&#xff0c;Collision Responses代表该Actor对各种类型的Actor有什么反应&a…