当前位置: 首页 > news >正文

前沿重器[36] | ACL23-基于检索的大语言模型-报告阅读

前沿重器

栏目主要给大家分享各种大厂、顶会的论文和分享,从中抽取关键精华的部分和大家分享,和大家一起把握前沿技术。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。(算起来,专项启动已经是20年的事了!)

2022年的文章合集,累积起来有60w字,在这:CS的陋室60w字原创算法经验分享-2022版。

往期回顾

  • 前沿重器[31] | 理性聊聊ChatGPT

  • 前沿重器[32] | 域外意图检测——解决“没见过”的问题

  • 前沿重器[33] | 试了试简单的prompt

  • 前沿重器[34] | Prompt设计——LLMs落地的版本答案

  • 前沿重器[35] | 提示工程和提示构造技巧

在顶会ACL2023上,陈丹琦老师团队带来了一份长达近4小时的tutorial:Retrieval-based Language Models and Applications,内容非常丰富而且具有很强的使用价值,本文主要总结一下这篇文章的内容,并附带一些自己的理解和思考。

开始之前,先把关键的参考资料给出:

  • 官方材料:https://acl2023-retrieval-lm.github.io/,PPT和阅读材料都给到。

  • 还不错的解读文章:https://blog.csdn.net/qq_27590277/article/details/132399887

简介

简介章节讲的是比较基础的,主要介绍了本次要介绍的概念,即检索(Retrieval)和大语言模型(LLM):

1406e8d1722146582d6071df23d3f5fe.png

简单的说,其实就是通过检索的模式,为大语言模型的生成提供帮助,从而使之生成更符合要求的结果,听起来,其实就和最近比较火的另一个概念——检索增强生成(RAG,retrieval augment generation),在我的理解下,就是一件事。

众所周知,LLM其实已经在很多领域和问题下都取得了很好的效果,那为何还需要依赖检索做进一步优化,在本文看来,主要有5个原因:

  • LLM无法记住所有知识,尤其是长尾的。受限于训练数据、现有的学习方式,对长尾知识的接受能力并不是很高。

  • LLM的知识容易过时,而且不好更新。只是通过微调,模型的接受能力其实并不高而且很慢,甚至有丢失原有知识的风险。

  • LLM的输出难以解释和验证。一方面最终的输出的内容黑盒且不可控,另一方面最终的结果输出可能会受到幻觉之类的问题的干扰。

  • LLM容易泄露隐私训练数据。用用户个人信息训练模型,会让模型可以通过诱导泄露用户的隐私。

  • LLM的规模大,训练和运行的成本都很大。

而上面的问题,都可以通过数据库检索快速解决:

  • 数据库对数据的存储和更新是稳定的,不像模型会存在学不会的风险。

  • 数据库的数据更新可以做得很敏捷,增删改查可解释,而且对原有的知识不会有影响。

  • 数据库的内容是明确、结构化的,加上模型本身的理解能力,一般而言数据库中的内容以及检索算法不出错,大模型的输出出错的可能就大大降低。

  • 知识库中存储用户数据,为用户隐私数据的管控带来很大的便利,而且可控、稳定、准确。

  • 数据库维护起来,可以降低大模型的训练成本,毕竟新知识存储在数据库即可,不用频繁更新模型,尤其是不用因为知识的更新而训练模型。

问题定义

首先,按照文章的定义:

A language model (LM) that uses an external datastore at test time。

关键词两个:语言模型和数据库。

语言模型这块,我们其实都熟悉了,早些年以bert代表的模型,到现在被大量采用的大模型,其实结构都具有很大的相似性,而且已经相对成熟,模型结构这事就不赘述了。更为重要的是,prompt受到关注的这件事,在现在的视角看来是非常关键的发现,prompt能让大模型能完成更多任务,通过引导能让模型解决不同的问题,同时,效果还是不错,在现在的应用下,prompt精调已经成为了经济高效的调优手段了。

9058eadb2b7b0d33273c0fcd7ae4d87d.png

至于数据库,配合大模型,构造成如下的推理结构:

4bf8cd7dc605fbb812e4b1562fd6a53d.png

datastore是数据源,构造成索引后,可以接受query进行检索,检索结果和大模型配合,就能输出结果。

架构

此时,就出现一个问题,大模型和检索查询之间的关系是什么,拆解下来,就是这几个问题:

  • 查什么:query如何构造以及检索的。

  • 如何使用查询:查询结果出来后如何跟大模型协同。

  • 何时查:什么时候触发查询,或者换个说法,如何构造查询query。

b87acb370a26c212db6a6f16f067edd0.png

section3中,通过论文讲解的方式,讨论了多篇论文在解决上述3个问题下的解决方案,并且讨论了他们的优缺点。

73305f0796f3945056e594bc02f96f0e.png

这里总结一些关键要点给大家,让大家理解这些检索策略的不一样会有什么优缺点:

  • 检索不一定检索一次,可以切句,例如机械地n个token地切后查询,会比只查一次要强一些。

  • RETRO中构造了临时层对检索结果进行解析,提升检索结果的理解和使用能力,但这也意味着这些层需要进行训练后才可使用,训练成本是增加的。

  • KNN-LM在检索上,从词降级为token,能对低频或域外(out of domain)数据有很好的支持,但存储空间会变大很多,同时该方法缺少输入和检索结果的交互信息。

  • 后续的FLARE和Adaptive-LM采用了自适应检索的方式,能提升检索的效率,但当然与之对应的检索策略并不一定是最优的(误差叠加)。

  • Entities as Experts直接检索实体,能提升效率,但这个位置是需要额外的实体识别的。

训练

在LLM-Retrieval的框架下,训练除了为了更好地让LLM做好推理预测,还需要尽可能让LLM和检索模块协同,而显然,同时训练LLM和检索模块的模型,无疑是成本巨大的,就这个背景,文章总结了4种LLM和检索模块的更新策略。(注意,此处我把training翻译为更新)

首先是独立更新(Independent training),即两者各自更新,互不影响。这个应该是目前我看到最常见的一种方式了。

  • 优点:对频繁更新的索引,大模型不需要频繁更新,甚至不需要更新;每个模块可以独立优化。

  • 缺点:大模型和检索模型两者之间并无协同。

然后是依次训练(Sequential training),即训练其中一个的时候,另一个固定,等此模块训练完训练完以后再训另一个。

  • 优点:和独立更新有相似点,大模型不需要频繁更新,甚至不需要更新;不同的是,大模型可以进行适配检索模块的训练,反之亦然。

  • 缺点:因为是依次训练,所以在训练其中一个时,另一个是固定的,不能做到比较彻底的协同,而且大模型更新的频率不见得跟得上索引库的更新,如果紧跟,成本会变高。

第三种是异步索引更新下的联合训练,即允许索引过时,定期更新即可。这种方式的难点是需要权衡,索引更新的频率是多少,太多了则训练成本昂贵,太少了则索引过时,导致有些问题会出错。

第四种也是联合训练,但考虑到更新索引的频次问题,所以索引通过批次的方式来更新,当然了,这种方式的同样会带来成本的问题,无论是训练阶段,还是索引更新阶段。

总结一下,有关训练阶段,两者协同,有如下优缺点。

a49120234ef154c315734635a86d1abf.png

应用

应用这块,通过这几个月我们的深入使用,大模型给了我们很多的使用空间,到了LLM+检索的场景,我们需要知道的是有哪些优势场景,在本文中,作者总结了如下使用场景:

736e1ba4b22f418deddf09a9a0dcbdf1.png
28a54b52777965aa47928db679e52f9c.png

第一行3个任务主要优势表现在知识密集型的任务中,中间和下面的6个则是比较经典的NLP任务了,中间3个偏向生成,后面3个倾向于分类,此时,我们需要回答两个问题:

  • 如何把LLM+检索这个模式应用在这些任务中?

  • 使用LLM+检索这个模式的时机是什么?

首先是第一个问题,如何应用,这里给出了3种使用方法,分别是微调、强化学习和prompt。我们日常使用的更多的可能是prompt,但是从一些实战经验上,可能还有别的模式可能能让模型更好地利用。

47ed3b1afe78ce4610ba3bd9795b45a9.png

微调方面,只要把整个流程串起来其实就能发现,是完全可行的,ATLAS这篇论文比较典型,再处理知识库的更新上选择了相对独立的策略,从实验来看,效果还是不错的,作者的评价是这样的:

  • 微调能为知识密集型任务提供很大的提升。

  • 对检索库本身的微调也十分重要。

6300504de2b4b6f8763576140b430609.png

而强化学习,也算是最近比较热门的研究方向了,RLHF能把全流程串起来,有人工的评价能为结果带来更多的提升,作者用的是“alignment”,是对齐用户的偏好,然而实际上,这种人工的数据其实还是比较难获得并使用的。

99873f18ca8cb73c052640e391d2b69b.png

在prompt这块,作者首先提出一个问题:“What if we cannot train LMs for downstream tasks?”,这个问题很现实,因为很多原因,我们可能没法训练模型,只能用开源的或者是固定通用的模型(心法利器[102] | 大模型落地应用架构的一种模式),此时,prompt就是一个非常好用的方案了。从结果层面显示,这种方案可以说是非常“effective”,同时作者还提及不用训练和并不差的效果(用的strong),但缺点也比较明显,可控性还是不够,相比微调的效果还是要差点。

然后,下一个问题,就是使用检索这个模式的时机了。说到时机,其实回归到前面所提到的原因就知道了,即长尾知识、知识过时、内容难验证、隐私问题和训练成本问题,经过作者的整理,从使用检索的原因,转为提及检索这个模式的优势,则是6点:长尾知识、知识更新能力、内容可验证性、参数效率、隐私以及域外知识的适配性(可迁移性)。

多模态

多模态是让自然语言处理超越文字本身的窗口了,知识的形式是丰富多样的,可以是文章、图谱、图片、视频、音频等,如果能把多种信息进行解析,那对知识的支撑能力无疑是新的提升(毕竟不是所有信息都通过文字传播),在这章,更多是给了很多知识应用的思路,论文还不少,此处不赘述,大家可以去PPT里面钱问题记得网站上面找参考文献。

挑战和展望

总算到了挑战和展望,本章在总结前文的基础上,提出了很多新的问题,研究者们可以参考作为新的研究方向。

首先是基于检索的LLM的规模,第一个问题是小模型+大数据库,是否能约等于一个大模型,

  • 小模型+大数据库,是否能约等于一个大模型?两者在规模上的关系是什么样的。

  • 两者的缩放规则是什么样的,当知识库能支撑知识层面的需求后,语言模型的参数量、token量对结果有什么影响。

  • 检索效率问题,一个是速度,另一个是空间。

第二个问题是,需要探索其应用。

  • 开放式文本生成下,基于检索的大模型在蕴含和推理能力上还有局限性,毕竟光靠相似度的检索不太够,同时知识库大了以后,面对相似但是困难的知识点也会对推理造成干扰。

  • 对于复杂的推理任务,有没有更好的潜在方案可探索,例如多次检索、query改写等策略。

再然后,是一些开放的问题:

  • 基于检索的LLMs下最优的结构和训练策略是什么样的。

  • 对模型的规模,我们无法比较好地去拓展和提升,尤其在具有检索能力支持的情况下。

  • 下游任务上,需要更多更好的解码、推理等方案,甚至是自适应的。

小结

这篇文章写了挺久的,可以说是大开眼界吧,里面的论文看了不少,收获还是挺大的,让我知道有关检索-LLM这个模式下有那么多前人尝试过的玩法,后面有些我应该也会去尝试,看看提升如何。

补充一下,有关RAG和这个Retrieval-based LLM,我自己感觉其实是一回事,很难感受出区别,如果有大佬了解的,欢迎在评论区指点下,感谢感谢。

e99eb188f3f931761d7879f54027ff1b.png

相关文章:

前沿重器[36] | ACL23-基于检索的大语言模型-报告阅读

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享,从中抽取关键精华的部分和大家分享,和大家一起把握前沿技术。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。(算起来,专项启动已经…...

2023秋招笔试算法Python3题解

诸神缄默不语-个人CSDN博文目录 签两方了,感觉秋招已经结束了,所以发布一下之前写的笔试编程题题解。 不全。可能有些题我会继续补。 不保证能过。 后续依然有可能继续刷算法题,但是就另外专门写博文来解析了。 打码是因为原则上其实是不让公…...

uniapp--点击上传图片到oss再保存数据给后端接口

项目采用uniapp与uview2.0组件库 --1.0的也可以参考一下,大差不差 一、项目要求与样式图 点击上传n张图片到oss,然后点击提交给后端 二、思路 1、打开上传按钮,弹出框内出现上传图片和提交按钮 2、点击上传图片区域,打开本地图…...

创建Secret(使用kubectl)

创建Secret(使用kubectl) 假设某个 Pod 需要访问数据库。在您执行 kubectl 命令所在机器的当前目录,创建文件 ./username.txt 文件和 ./password.txt 暂存数据库的用户名和密码,后续我们根据这两个文件配置 kubernetes secrets。…...

Notepad++正则查询替换操作

Notepad编辑器查找功能非常强大,本处记录一些实战中常用到复杂查询替换操作。 注意:如果是重要文件,替换操作前最好备份;当前一个操作后也可以用ctrlz恢复。 查找重复行 用查找(ctrlf)功能,用正则表达式模式匹配。 查…...

Hive特殊函数的使用

Hive特殊函数的使用 with ascastget_json_objectunix_timestampfrom_unixtime with as 在Hive中,WITH AS是一种子查询的用法,用于在查询的开头定义一个临时表达式。它的语法结构如下: WITH [表达式名称] AS (子查询表达式 )在这个结构中,[表…...

Unity Spine 指定导入新Spine动画的默认材质

指定导入新Spine动画的默认材质 找到Spine的Editor导入配置如何修改方法一: 你可以通过脚本 去修改Assets/Editor/SpineSettings.asset文件方法二:通过面板手动设置 找到Spine的Editor导入配置 通常在 Assets/Editor/SpineSettings.asset 配置文件对应着 Edit/Prefe…...

lvs负载均衡集群

目录 一、集群: 1、集群的目的: 2、集群的类型: 3、集群的可靠性指标: 4、设计集群时需要考虑的原则: 二、lvs集群: 1、lvs集群中的术语: 2、lvs访问的大致流程: 三、lvs的…...

MySQL---表的增查改删(CRUD基础)

文章目录 什么是CRUD?新增(Create)单行数据 全列插入多行数据 指定列插入 查询(Retrieve)全列查询指定列查询查询字段为表达式起别名查询去重查询排序查询条件查询分页查询 修改(Update)删除&…...

听GPT 讲Rust源代码--library/std(2)

File: rust/library/std/src/sys_common/wtf8.rs 在Rust源代码中,rust/library/std/src/sys_common/wtf8.rs这个文件的作用是实现了UTF-8编码和宽字符编码之间的转换,以及提供了一些处理和操作UTF-8编码的工具函数。 下面对这几个结构体进行一一介绍&…...

力扣第1005题 K 次取反后最大化的数组和 c++ 贪心 双思维

题目 1005. K 次取反后最大化的数组和 简单 相关标签 贪心 数组 排序 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组: 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以…...

Swoole 4.8版本的安装

1、从github拉取安装包 Release v4.8.13 swoole/swoole-src GitHub 2、解压压缩包 tar -zxvf ./v4.8.13.tar.gzcd ./swoole-src-4.8.13 3、执行安装命令 phpize && \ ./configure && \ make && sudo make install 4、检查swoole模块是否安装完成…...

ChatGPT和Copilot协助Vue火速搭建博客网站

AI 对于开发人员的核心价值 网上会看到很多 AI 的应用介绍或者教程 使用 AI 聊天,咨询问题 —— 代替搜索引擎使用 AI 写各种的电商文案(淘宝、小红书)使用 AI 做一个聊天机器人 —— 这最多算猎奇、业余爱好、或者搞个套壳产品来收费 以上…...

javaEE -8(9000字详解网络编程)

一:网络编程基础 1.1 网络资源 所谓的网络资源,其实就是在网络中可以获取的各种数据资源,而所有的网络资源,都是通过网络编程来进行数据传输的。 用户在浏览器中,打开在线视频网站,如优酷看视频&#xff…...

FPGA从入门到精通(二十)SignalTapII

这一篇将介绍SignalTapII。 之前的工程我们是做仿真,设置激励,观察输出波形去判断代码没有问题,但事实上我们真实的需求是综合后的代码下载到FPGA芯片中能够符合预期。 其中可能出现问题的原因有: 1、我们是写testbench设置激励…...

RHCE---shell 条件测试

文章目录 目录 文章目录 前言 一.条件测试 概述: 文件测试 整数测试: 总结 前言 当我们完成某一命令的编写时,除了观察输出的内容,我们又如何得知命令是否执行成功呢? 这里,我们需要用到条件测试 一.条…...

Linux下QT打开文件选择对话框时,程序报错退出

系统:Ubuntu QString fileName QFileDialog::getOpenFileName(this, "open", "./", "document Files (*.pdf)"); 调用该语句弹出文件对话框时,程序崩溃退出 错误提示: (Widget:5272): Gtk-WARNING **: 14…...

PyTorch中的intrusive_ptr

PyTorch中的intrusive_ptr 前言 intrusive_ptr與unique_ptr,shared_ptr等一樣,都是smart pointer。但是intrusive_ptr比較特別,它所指向的物件類型必須繼承自intrusive_ptr_target,而intrusive_ptr_target必須實現引用計數相關的…...

webrtc-stream编译报错记录

磁盘空间不足错误 错误信息 677.2 fatal: cannot create directory at blink/web_tests/external/wpt: No space left on device说明:这个错误是由于本地在配置docker资源时所给磁盘空间太小导致,直接根据镜像大小合理分配资源大小即可 pushd和popd执…...

什么是Docker CLI

Docker CLI(命令行界面)是一个工具,允许用户通过命令行或终端与Docker进行交互。Docker是一个开源平台,用于开发、运送和运行应用程序。Docker使用容器化技术来打包应用程序及其依赖项,以确保在不同环境中的一致性和隔…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性&#xf…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...