自然语言处理:第三十三章FILCO:过滤内容的RAG

文章链接: [2311.08377] Learning to Filter Context for Retrieval-Augmented Generation (arxiv.org)

项目地址: zorazrw/filco: [Preprint] Learning to Filter Context for Retrieval-Augmented Generaton (github.com)




在人工智能领域,尤其是在开放域问答和事实验证等任务中,即时检索相关知识是构建可靠系统的关键因素。然而,由于检索系统并非完美,生成模型在面对部分或完全无关的段落时仍需生成输出,这可能导致对上下文的过度或不足依赖,并在生成的输出中产生幻觉等问题。为了缓解这些问题,提出了一种名为FILCO的方法,该方法通过(1)基于词汇和信息论方法识别有用的上下文,以及(2)训练上下文过滤模型以便在测试时过滤检索到的上下文。在六个知识密集型任务中使用FLAN-T5和LLaMa2模型进行实验,证明了FILCO方法在提取式问答(QA)、复杂多跳和长形QA、事实验证以及对话生成任务上优于现有方法。FILCO有效地提高了上下文的质量,无论其是否支持规范输出。



背景

检索增强型生成方法已被证明对于许多知识密集型语言任务是有效的,它们能够产生更忠实、可解释和可泛化的输出。尽管检索系统通常将检索到的顶级段落无条件地提供给生成模型,但这些系统往往返回不相关或分散注意力的内容。这导致生成模型在训练时容易产生幻觉或虚假记忆:

  1. 过度依赖上下文 :生成模型可能会过度依赖检索到的段落,即使这些段落包含分散注意力的内容或与问题仅有微弱关联。
  2. 幻觉和错误记忆 :由于检索系统返回的内容不准确或不相关,生成模型可能会产生幻觉,即生成与真实情况不符的信息,或产生错误记忆,即使用错误信息生成输出。

FILCO(Filtering Context for Retrieval-Augmented Generation)方法针对上述问题提出了创新的解决方案,通过以下两个方面显著提升了性能:

  1. 上下文的精细过滤 :FILCO通过细粒度的句子级别过滤检索到的上下文,而非整个段落,从而更精确地提供对生成任务有用的信息。
  2. 过滤模型的训练 :FILCO训练了一个上下文过滤模型(Mctx),该模型能够在测试时动态过滤检索到的上下文,确保生成模型(Mgen)接收到的信息是相关且有用的。


核心算法

FILCO的核心思想如下图,主要的pipeline也是分成两部分

  1. 是在细粒度的句子级别上学习过滤检索到的上下文,简单的来说就是通过计算query 和 向量数据库的相似度召回top_k相关文档后,训练一个专属的过滤模型(Mctx)对召回的文档进行精简/过滤 (ps: 有点像之前说的Corrective RAG)
  2. 然后再将过滤完的文档输入给生成模型(Mgen)进行回答。

下面会分别的对这两部分模型进行介绍

在这里插入图片描述



上下文过滤模型(Mctx)

FILCO训练了一个上下文过滤模型(Mctx),使用上述三种度量方法过滤检索到的上下文。(i)STRINC:段落是否包含生成输出;(ii)词汇重叠:内容和输出之间有多少单字重叠;(iii)条件交叉互信息(CXMI):当提供内容时,生成器生成输出的可能性增加多少。FILCO训练上下文过滤模型Mctx,使用这三种度量方法过滤检索到的上下文,并学习在过滤上下文中生成输出。训练数据是通过将检索到的段落和查询作为输入,然后应用过滤方法获得过滤后的上下文(tsilver)。Mctx 原始输入是问题query + 检索召回的上下文 , 最后的输出就是过滤后的上下文

  • 数据准备

    • 对于每个训练样本,使用检索系统(如Dense Passage Retriever,DPR)从知识库(如Wikipedia)中检索相关的文档或段落,并将其与查询一起作为输入。
  • 过滤算法选择

    三种过滤策略(STRINC、LEXICAL、CXMI)选择最优的文本片段。

    • 字符串包含(String Inclusion, STRINC):

      • STRINC是一种基于词汇的简单过滤方法,它检查检索到的文本片段是否包含生成输出的确切文本。
      • 该方法通过枚举检索到的段落,并选择第一个包含输出文本的文本片段。
    • 词汇重叠(Lexical Overlap):

      • 该策略通过计算示例和候选文本片段之间的单字重叠来评估它们之间的主题相似性。
      • 对于问答(QA)和对话生成任务,它使用F1分数来衡量文本片段和输出之间的相似度。
      • 对于事实验证任务,由于输出是一个二元标签,它使用查询和文本片段之间的F1分数。
    • 条件交叉互信息(Conditional Cross-Mutual Information, CXMI):

      • CXMI是一种基于信息论的方法,用于衡量在给定上下文的情况下,生成模型生成期望输出的概率变化。 该策略选择具有最高CXMI分数的文本片段,因为它们最有可能增加生成正确输出的概率。下图是作者关于CXMI的算法图解

      在这里插入图片描述

  • 过滤上下文

    • 应用选择的过滤策略,从检索到的段落中生成过滤后的上下文(tsilver)。这是非完美的过滤结果,因为真实的输出标签在训练时是未知的。
  • 模型训练

    • 训练Mctx,使其能够基于查询和检索到的段落生成过滤后的上下文tsilver。这个过程可以形式化为:[ M_{ctx}(t_{silver} | q \oplus P) ],其中( q )是查询,( P )是检索到的段落,( t_{silver} )是过滤后的上下文。



生成模型(Mgen)

在训练时,FILCO将过滤后的上下文(tsilver)预处理到查询中,然后输入到生成模型(Mgen)进行训练,以输出规范的响应。在推理时,使用Mctx预测过滤后的上下文(tpred),然后将其与查询一起提供给Mgen以预测输出。

  1. 准备输入
  • 将过滤后的上下文tsilver预处理到查询q的前面,形成模型的输入( q \oplus t_{silver} )。
  1. 训练生成模型

    • 使用上述输入训练Mgen生成规范的输出o。这个过程可以形式化为:[ M_{gen}(o | t_{silver} \oplus q) ]。
  2. 推理

    • 在推理时,使用训练好的Mctx模型为每个测试查询q预测过滤后的上下文tpred:[ tpred = M_{ctx}(q \oplus P) ]。
    • 然后将tpred与查询q一起提供给Mgen,以预测输出:[ M_{gen}(o | tpred \oplus q) = M_{gen}(o | M_{ctx}(q, P) \oplus q) ]。

训练细节如下:

  • 模型架构:FLAN-T5和LLAMA2作为Mctx和Mgen的模型架构,因其在开源模型中的潜在优越性能。
  • 序列长度:所有序列的最大长度设置为1024个token。Mctx生成的过滤上下文最多512个token,Mgen生成的输出最多128个token。
  • 解码策略:使用贪婪解码策略生成过滤上下文和最终生成输出。
  • 训练周期:通常训练所有Mctx和Mgen模型3个epoch,使用学习率为5e-5,批量大小为32。



实验结果

FILCO在六个知识密集型语言数据集上进行了实验,包括NaturalQuestions (NQ)、Trivia QA (TQA)、HotpotQA、ELI5、Fact Extraction and VERificaton (FEVER)以及Wizard of Wikipedia (WoW)。使用FLAN-T5和LLaMa2模型,FILCO在所有六个数据集上都优于基线方法,即全上下文增强和段落级过滤。下图事在这6个数据集上的性能,可以看到Filco 和sliver 基本都在各个数据集上能达到SOTA

在这里插入图片描述

  • Full: 召回top_k内容全部进行推理生成
  • PSG: 基于句子场景进行部分过滤
  • FILCO: 本文的算法,过滤上下文
  • Silver: 迭代的算法,根据不同数据集进行微调后的算法


过滤完后的上下文不仅仅是性能上最优,并且能减少大约 4 - 6 成的内容,从而减少token消耗。

在这里插入图片描述




上文提到的上下文过滤模型Mctx可选三种过滤算法,其中不同算法在不同数据集上表现不同。具体如下,可以发现对于随着任务难度的增加,STRINC、LEXICAL、CXMI 算法逐渐更适合用于过滤上下文。

在这里插入图片描述

总结

通过实验,FILCO在以下方面显示出显著的优势:

  • 性能提升:FILCO在六个知识密集型任务上的性能均优于基线方法,包括提取式问答、复杂多跳问答、长形问答、事实验证和对话生成任务。
  • 上下文质量改善:FILCO有效地提高了上下文的质量,无论其是否支持规范输出。
  • 输入长度减少:FILCO通过过滤检索到的上下文,显著减少了模型输入的长度,平均减少了44-64%。
  • 答案精度提高:过滤后的上下文在所有任务上都实现了更高的答案精度,特别是对于抽象任务,如FEVER和WoW。

FILCO的成功证明了在检索增强型生成任务中,通过这种训练方法,FILCO能够有效地训练上下文过滤模型以精确地识别和过滤有用的上下文,同时训练生成模型以在过滤后的上下文上生成高质量的输出。这种细粒度的过滤和生成过程,使得FILCO在各种知识密集型任务中表现出色,提高了输出的准确性和相关性。FILCO的成功实施为未来在更多场景中实现忠实生成提供了新的思路。 — 对于数据里有很多冲突知识的时候这个算法会很有效

引用文献

  • Alon, U., Xu, F. F., He, J., Sengupta, S., Roth, D., & Neubig, G. (2022). Neuro-symbolic language modeling with automaton-augmented retrieval. In ICML 2022 Workshop on Knowledge Retrieval and Language Models.
  • Asai, A., Gardner, M., & Hajishirzi, H. (2022). Evidentiality-guided generation for knowledge-intensive NLP tasks. In Proceedings of the 2022 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies.

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

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

相关文章

Go微服务: 关于TCC分布式事务

TCC 分布式事务 T: Try 预处理, 尝试执行,完成所有的业务检查,做好一致性,预留必要的业务资源,做好准隔离性C: Confirm 确认,如果所有的分支Try都成功了, 就到了这个阶段, Confirm 是真正执行业务的过程, 不做任何业务…

【多模态】37、TextSquare | 借助 Gemini-Pro 通过四个步骤来生成高质量的文本问答数据

文章目录 一、背景二、方法2.1 Square-10M2.2 模型结构2.3 使用 Square-10M 进行有监督微调 三、效果3.1 实验设置3.2 Benchmark 测评 论文:TextSquare: Scaling up Text-Centric Visual Instruction Tuning 代码:暂无 出处:字节 | 华中科技…

linux 服务器上离线安装 node nvm

因为是离线环境 如果你是可以访问外网的 下面内容仅供参考 也可以继续按步骤来 node 安装路径 Node.js — Download Node.js nvm 安装路径 Tags nvm-sh/nvm GitHub 后来发现 nvm安装后 nvm use 版本号 报错 让我去nvm install 版本 我是内网环境 install不了 下面 你要 把安…

玄机平台应急响应—apache日志分析

1、前言 apache的日志一共有两个,一个是access.log,这个日志记录了所有对Web服务器的访问,被入侵时重点排查这个。另一个是error.log,错误日志记录了服务器运行期间遇到的各种错误,以及一些普通的诊断信息&#xff0c…

【Python】推荐比print更好用的调试方法

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【Vue】作用域插槽

插槽分类 默认插槽:组件内定制一处结构 具名插槽:组件内定制多处结构 插槽只有两种,作用域插槽不属于插槽的一种分类。作用域插槽只是插槽的一个传参语法 作用: 定义slot 插槽的同时, 是可以传值的。给 插槽 上可以 绑定数据&a…

LeetCode 算法:滑动窗口最大值c++

原题链接🔗:滑动窗口最大值 难度:困难⭐️⭐️⭐️ 题目 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动…

Skins

本主题解释如何将DevExpress主题/皮肤应用到应用程序中,如何允许用户在运行时在主题之间切换,如何自定义现有皮肤或创建自己的皮肤,等等。 WinForms订阅包括许多基本控件:按钮、复选框、表单、消息框、对话框、对话框等。 我们实现…

MFC 使用sapi文字转换为语音

文章目录 添加头文件声明变量 添加头文件 声明变量 pSpVoice NULL; //默认构造函数中初始化为空 bool CChKBarSCCodeApp::InitSpVoice() {HRESULT hr ::CoInitialize(NULL); // COM初始化if (!SUCCEEDED(hr)){AfxMessageBox(_T("声音环境初始化失败!…

自定义模块设置示例

CSDN 针对部分博主开放了自定义模块设置&#xff0c;我也是简单的使用了一下这个功能&#xff0c;感觉很不错&#xff0c;下面是我编写的参考代码大家可以复制下面代码来使自己的博客主页多样化。 <div class"pmusic"><iframe frameborder"no" bo…

.net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript

.net core 使用js&#xff0c;.net core 使用javascript&#xff0c;在.net core项目中怎么使用javascript 我项目里需要用到“文字编码”&#xff0c;为了保证前端和后端的编码解码不处bug, 所以&#xff0c;我在项目中用了这个 下面推荐之前在.net F4.0时的方法 文章一&#…

将div渲染成textarea框,类似于ant design 的TextArea

一 先看效果 原始效果 输入时效果 二 代码如下 1. html 代码 <div className{style.divTextArea} contentEditable"true"></div> 2. Css(Less)代码 .divTextArea {width: 90%;margin-top: 10px;line-height: 28px;min-height: 60px;border: 1px solid …

MySQL有哪些锁?

文章目录 前言一、全局锁1.全局锁是怎么用的&#xff1f;2.全局锁应用场景是什么&#xff1f;3.加全局锁又会带来什么缺点呢&#xff1f;4.既然备份数据库数据的时候&#xff0c;使用全局锁会影响业务&#xff0c;那有什么其他方式可以避免&#xff1f; 二、表级表1.MySQL 表级…

selenium中, quit 和close的区别

close时 """ close和quit的区别 close关闭当前页 (只是关闭了当前) quit离开整个浏览器 &#xff08;走远了&#xff09; """ from selenium import webdriver import time# 创建浏览器驱动对象 from selenium.webdriver.co…

js如何实现当文本内容过长时,中间显示省略号...,两端正常展示

前一阵做需求时&#xff0c;有个小功能实现起来废了点脑细胞&#xff0c;觉得可以记录一下。 产品的具体诉求是&#xff1a;用户点击按钮进入详情页面&#xff0c;详情页内的卡片标题内容过长时&#xff0c;标题的前后两端正常展示&#xff0c;中间用省略号...表示&#xff0c…

如何在MySQL中实现upsert:如果不存在则插入?

目录 1 使用 REPLACE 2 使用 INSERT ... ON DUPLICATE KEY UPDATE 使用 INSERT IGNORE 有效会导致 MySQL 在尝试执行语句时忽略执行错误 INSERT 。这意味着 包含 索引或 字段 INSERT IGNORE 中重复值的语句 不会 产生错误&#xff0c;而只是完全忽略该特定 命令。其明显目的是…

[word] word大括号怎么打两行 #其他#其他#微信

word大括号怎么打两行 Word给用户提供了用于创建专业而优雅的文档工具&#xff0c;帮助用户节省时间&#xff0c;并得到优雅美观的结果。 一直以来&#xff0c;Microsoft Office Word 都是最流行的文字处理程序。 作为 Office 套件的核心程序&#xff0c; Word 提供了许多易…

秒杀优化+秒杀安全

1.Redis预减库存 1.OrderServiceImpl.java 问题分析 2.具体实现 SeckillController.java 1.实现InitializingBean接口的afterPropertiesSet方法&#xff0c;在bean初始化之后将库存信息加载到Redis /*** 系统初始化&#xff0c;将秒杀商品库存加载到redis中** throws Excepti…

【YOLOv10】使用 TensorRT C++ API 调用GPU加速部署 YOLOv10 实现 500FPS 推理速度——快到飞起!

NVIDIA TensorRT ™ 是一款用于高性能深度学习推理的 SDK&#xff0c;包含深度学习推理优化器和运行时&#xff0c;可为推理应用程序提供低延迟和高吞吐量。YOLOv10是清华大学研究人员近期提出的一种实时目标检测方法&#xff0c;通过消除NMS、优化模型架构和引入创新模块等策…

平稳交付 20+ 医院,卓健科技基于 OpenCloudOS 的落地实践

导语&#xff1a;随着数字化转型于各个行业领域当中持续地深入推进&#xff0c;充当底层支撑的操作系统正发挥着愈发关键且重要的作用。卓健科技把 OpenCloudOS 当作首要的交付系统&#xff0c;达成了项目交付速度的提升、安全可靠性的增强、运维成本的降低。本文将会阐述卓健科…