LLM Agent之再谈RAG的召回多样性优化

1. Query多样性

  • 2019 Query Expansion Techniques for Information Retrieval: a Survey

传统搜索Query的扩展,有基于用户搜索日志挖掘的相似Query,有基于相同召回文档关联的相似Query,也有基于SMT的Query改写方案。那和大模型时代更搭配的自然是改写方案,LLM的加持很大程度上降低了Query改写的难度,也为改写提供了更多的可能性。

1.1 相似语义改写

  • Learning to Rewrite Queries,雅虎(2016)

  • webcpm: Interactive Web Search for Chinese Long-form Question Answering,清华(2023)

比较早在16年yahoo就探索过query改写的方案,那时还是个seq2seq的LSTM。再就是之前介绍的webcpm也有使用大模型进行query改写来提高内容召回。近期langchain也集成了MultiQueryRetriever的类似功能。逻辑就是把用户的Query改写成多个语义相近的Query,使用多个Query一起进行召回,如下

img

1.2 双向改写

  • Query2doc: Query Expansion with Large Language Models,微软(2023)

  • Query Expansion by Prompting Large Language Models, 谷歌(2023)

除此之外还有一种另类Query的改写方案,就是Query2doc中提到的把Query改写成document。论文使用4-shot prompt让LLM先基于query生成一个pseudo-document,然后使用生成的答案来进行相关内容的召回。这种改写方案确实有一些显著的优点

  • 缓解短文本query向量化效果较差的问题

  • 缓解document长文本向量和query短文本向量存在空间差异的问题

  • 提高BM25等离散索引抽取的效果,毕竟文本长了更容易抽出有效关键词

当然缺点也很显著,一个是pseudo-docuemnt可能发生语义漂移,幻觉回答会引入错误的关键词降低召回的准确率,以及解码的耗时较长~

img

这里Query2Doc反过来写,Doc2Query也是另外一个优化方向,就是给每篇文档都生成N个关联Query(pseudo-query),使用关联Query的embedding向量来表征文档,和真实Query进行相似度计算。langchain的MultiVector Retriever也集成了类似的功能。

谷歌也做了类似的尝试。分别对比了Query2Doc(Q2D), Query2Keyword(Q2E), Query2COT几种改写方案,以及使用zero-shot,few-shot,召回文档增强等不同prompt指令的效果。其中Query2Doc采用了和上面微软相同的prompt指令,其他指令如下

img

结果显示,当模型规模足够大之后,Query2COT展现出了显著更优的效果。甚至超越了在上文中加入相关文档的COT/PRF 方案。一方面COT会对Query进行多步拆解,一方面思考的过程会产生更有效的关键词,以及不使用相关文档可以更有效的释放模型本身的知识召回能力和创造力。

img

1.3 强化学习改写

  • ASK THE RIGHT QUESTIONS: ACTIVE QUESTION REFORMULATION WITH REINFORCEMENT LEARNING,谷歌(2018)

  • Query Rewriting for Retrieval-Augmented Large Language Models,微软(2023)

以上的改写方案在openai的闭门会都有提到,确实一定程度上可以提升RAG的效果,可以用于初期的尝试。不过这种改写是无监督的,也就是基于相似语义进行改写,并不能保证改写后的query搜索效果一定更好。那我们不妨引入一个目标来定向优化改写效果。

2018年谷歌就曾尝试使用强化学习来优化改写模型,把搜索系统视作Environment,seq2seq模型生成多个Query的改写候选作为Action。把原始Query的召回内容,和改写Query的召回内容,一起送入后面的排序模块,使用排序模块TopK内容中改写Query召回内容的召回率作为Reward打分,来梯度更新改写模型,最大化改写召回率。毕竟不论你改写的多么花里胡哨,能有效提高内容召回,拥有更高的独占召回率才是真正有用的改写模型。

而在大模型时代,改写模块被升级为LLM。在微软提出的rewrite-retrieve-read框架中,使用大模型作为rewriter,Bing搜索作为Retriever,chatgpt作为Reader,在QA任务上,尝试使用PPO微调改写模型,Reward模型的目标是不同改写query召回后推理内容和真实答案的Exact Match和F1。不过真实场景中,这种有标准答案的QA问答其实占比很小,更多都是开放式问答。那么其实可以类比以上的传统方案,使用大模型推理的引用率,作为Reward目标。毕竟大模型选择哪几条输入的上文进行推理,和精排原理其实是相似的。

img

2. 索引扩展

简单说完query扩展,我们再来看下索引扩展。当前多数RAG得召回索引还是以单一的Embedding向量模型为主,但单一向量作为召回索引有以下几个常见问题

  • 文本的相似有不同类型:有语义相似,有语法结构相似,有实体关键词相似,单一维度无法区分etc

  • 文本的相似有不同粒度:有些场景下需要召回精准匹配的内容,有些则需要模糊匹配,多数向量模型的区分度有限

  • 不同领域相似定义不同:在垂直领域存在向量模型适配度较低的问题

  • 长短文本间的相似问题:长短文本向量可能不在一个向量空间

下面我们看下还有哪些索引类型可以作为单一向量的补充

2.1 离散索引扩展

  • Query Expansion by Prompting Large Language Models, 谷歌(2023)

  • ChatLaw: Open-Source Legal Large Language Model with Integrated External Knowledge Bases

传统搜索中往往会使用到大量的离散索引,在很多垂直领域的内容召回中往往和向量召回有很好的互补效果,部分离散索引例如实体的召回准确率可能会显著高于向量召回。一些常见的Query理解生成离散索引的方案包括:

  • 抽取: 分词,新词ngram识别,词性识别,实体抽取,关键词抽取etc

  • 分类:意图分类,话题分类,概念分类,地点分类etc

  • 多跳:实体链接,同义词扩展,KG查询etc

最先想到使用大模型来进行范式改良的方向,大家都不约而同把目光放在了关键词扩展

虽然在上面谷歌的论文中尝试query2Keyword的效果并没有超越query2Doc和Query2COT。但是关键词生成本身低耗时,以及在一些垂直领域其实有很好的效果。例如ChatLaw一个法律领域的大模型,就是用了LLM进行法律条文的关键词联想。论文使用LLM针对用户Query生成法律相关联想关键词,并使用关键词的Ensemble Embedding来召回对应的法律条款。当然也可以使用关键词直接进行召回。这种设计其实是针对在法律领域,领域关键词往往有显著更好的召回效果而设计的。

img

2.2 连续索引扩展

  • GitHub - FlagOpen/FlagEmbedding: Dense Retrieval and Retrieval-augmented LLMs

  • GitHub - shibing624/text2vec: text2vec, text to vector. 文本向量表征工具,把文本转化为向量矩阵,实现了Word2Vec、RankBM25、Sentence-BERT、CoSENT等文本表征、文本相似度计算模型,开箱即用。

  • GitHub - Embedding/Chinese-Word-Vectors: 100+ Chinese Word Vectors 上百种预训练中文词向量

  • AUGMENTED EMBEDDINGS FOR CUSTOM RETRIEVALS, 微软2023

向量索引的扩展,最先想到的就是同时使用多种不同的连续向量索引,包括

  1. 朴素模式:不同的Embedding模型,常见的就是OpenAI的Ada,智源的BGE,还有Text2vec系列,使用多路embedding模型同时召回,或者加权召回的方案,取长补短。

  2. 简单模式:使用以上抽取的关键词,使用词向量加权进行召回。相比文本向量,词向量的召回率往往更高,在一些垂直领域有很好的效果。当然反过来就是词向量可能准确率偏低,不过召回阶段本来就是广撒网多敛鱼

  3. Hard模式:训练领域Embedding。成本最高,可以放在最后面尝试,在openai devday上提及的观点也是领域模型对比通用模型提升有限,且成本较高

不过微软近期提出了一个相比微调领域embedding模型更加轻量化的方案,和lora微调的思路类似,咱不动基座模型,但是在上面微调一个adapter来定向优化query和document的匹配效果。

img

向量变化的adapter,论文使用了向量加法,就是在原始模型输出的D维embedding的基础上加一个residual,residual的计算是一个Key-Value lookup函数,包含两个相同shape的变量K和v。例如针对openai的向量输出是D =1536维,residual会选用h<<D来进行变换,h的取值在16~128,则K和V都分别是h*D维的矩阵,也就是adapter部分只需要梯度更新2hD量级的参数,如下

微调损失函数使用了对比学习的GlobalNegative Loss,也就是每个(query,content)pair是正样本,其余样本内所有content均是负样本,学习目标是query和正样本的相似度>和其余所有负样本相似度的最大值。看起来似乎是很轻量的方案,有机会准备去试一下~

img

img

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言快速入门——高级特性

C语言高级特性 C语言高级特性函数创建和使用函数全局变量和局部变量函数参数和返回递归调用 指针什么是指针指针与数组多级指针指针数组与数组指针指针函数与函数指针 结构体、联合体和枚举创建和使用结构体结构体数组和指针联合体枚举typedef关键字 预处理文件包含系统库介绍宏…

Spring——Spring IOC(2)

1.Spring中的工厂类 1.1 ApplicationContext ApplicationContext的实现类&#xff0c;如下图&#xff1a; ClassPathXmlApplicationContext&#xff1a;加载类路径下 Spring 的配置文件FileSystemXmlApplicationContext&#xff1a;加载本地磁盘下 Spring 的配置文件 1.2 B…

知虾会员**成为知虾会员,尊享专属权益**

在当今繁忙的生活中&#xff0c;线上购物已经成为现代人们的主要消费方式之一。而作为线上购物平台的领军者之一&#xff0c;Shopee为了提供更加个性化和便利的购物体验&#xff0c;推出了知虾会员&#xff08;Shopee会员&#xff09;服务。知虾会员不仅可以享受到一系列会员专…

Gromacs WARNING问题

上述示例中&#xff0c;NA 是对系统净电荷进行中和的阳离子。请根据您的系统特性和仿真需求调整这些值。 总体而言&#xff0c;这个警告是为了提醒您关于电荷中性化的问题&#xff0c;确保您的模拟结果更加物理可信。 收敛性未达到预期精度&#xff1a; 警告指出&#xff0c;优…

喜讯|智安网络实力上榜《ISC 2023数字安全创新能力全景图谱》

近日&#xff0c;由360牵头举办的互联网安全大会正式发布了《ISC 2023数字安全创新能力全景图谱》&#xff0c;智安网络凭借在网络安全行业领先的产品实力、专业的安全服务水平及多年累积的行业经验&#xff0c;从300余家厂商、1000多份案例中脱颖而出&#xff0c;成功入围安全…

打地鼠python程序设计说明,打地鼠游戏界面设计

这篇文章主要介绍了打地鼠python程序设计说明&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 Pygame库是专门为了帮助做出的游戏和其他多媒体应用Python编程语言的一个开放源代…

Mysql和Redis数据一致性问题

MySQL和Redis数据一致性算是个很经典的问题,在之前也看到过很多相关的文章,最近心血来潮,想把一致性问题的解决方案和存在问题都总结一下。 不推荐方案 1 先更新MySQL,再更新Redis。 如上图有两个请求要同时进行更新操作,在并发情况下,B请求虽然更新时间晚于A请求,但是…

知虾分析——深入了解Shopee平台的知虾分析工具

Shopee是一家知名的电商平台&#xff0c;为了帮助卖家提高业务表现&#xff0c;他们提供了一款强大的数据分析工具——知虾分析。这个工具可以帮助卖家监控店铺的运营状况&#xff0c;优化销售策略&#xff0c;并提高整体的业务表现。本文将深入解析知虾分析的关键功能和用途&a…

Android kotlin build.gradle.kts配置

1. 添加 maven 仓库 1. 1. settings配置 1. 1.1. settings.gradle repositories {maven {url https://maven.aliyun.com/repository/public/}mavenCentral() }1. 1.2. settings.gradle.kts repositories {maven {setUrl("https://maven.aliyun.com/repository/public/…

【STM32】STM32学习笔记-TIM编码器接口(19)

00. 目录 文章目录 00. 目录01. 编码器接口简介02. 正交编码器03. 编码器接口基本结构04. 工作模式05. 实例(均不反相)06. 实例&#xff08;TI1反相&#xff09;07. 预留08. 附录 01. 编码器接口简介 Encoder Interface 编码器接口编码器接口可接收增量&#xff08;正交&#…

通过Vue自定义指令实现前端埋点

在营销活动中&#xff0c;通过埋点可以获取用户的喜好及交互习惯&#xff0c;从而优化流程&#xff0c;进一步提升用户体验&#xff0c;提高转化率。 在之前的埋点方案实现中&#xff0c;都是在具体的按钮或者图片被点击或者被曝光时主动通过事件去上报埋点。这种方法在项目中…

springboot实现OCR

1、引入依赖 <dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.5.4</version> </dependency> 2、config Configuration public class TessOcrConfiguration {Beanpublic …

5.1 QThread的两种使用方式

5.1 QThread的两种使用方式 QThread类用于创建和管理线程,它并不是线程本身。通过使用QThread,我们可以在应用程序中实现并发执行的任务,从而提高应用程序的性能和响应能力,能够有效地利用CPU资源,提高程序运行效率。且QThread创建和管理线程的方式是独立于平台的,不管是…

鸿蒙南向开发—OpenHarmony技术编译构建框架

概述 OpenHarmony编译子系统是以GN和Ninja构建为基座&#xff0c;对构建和配置粒度进行部件化抽象、对内建模块进行功能增强、对业务模块进行功能扩展的系统&#xff0c;该系统提供以下基本功能&#xff1a; 以部件为最小粒度拼装产品和独立编译。支持轻量、小型、标准三种系…

CTF数据分析题详解

目录 题目一(1.pcap) 题目二(2.pcap) 题目三(3.pcap) 题目四(4.pcap) CTF流量分析经典例题详解-CSDN博客 本文章涉及的所有题目附件下载地址&#xff1a; 链接&#xff1a; https://pan.baidu.com/s/18mWo5vn1zp_XbmcQrMOKRA 提取码&#xff1a;hrc4 声明&#xff1a;这里…

安全测试之SSRF请求伪造

前言 SSRF漏洞是一种在未能获取服务器权限时&#xff0c;利用服务器漏洞&#xff0c;由攻击者构造请求&#xff0c;服务器端发起请求的安全漏洞&#xff0c;攻击者可以利用该漏洞诱使服务器端应用程序向攻击者选择的任意域发出HTTP请求。 很多Web应用都提供了从其他的服务器上…

案例074:基于微信小程序的儿童预防接种预约管理系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder …

设计模式——装饰模式(Decorator Pattern)

概述 装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为&#xff0c;装饰模式是一种用于替代继承的技术&#xff0c;它通过一种无须定义子类的方式来给对象动态增加职责&#xff0c;使用对象之间的关联关系取代类之间的继承关系。在装饰模式中引入了装饰类&…

肿瘤til细胞类型

TISCH (comp-genomics.org)

python学完之后可以做什么,python学完可以做什么

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python学完可以做哪些工作&#xff0c;python学完之后可以做什么&#xff0c;今天让我们一起来看看吧&#xff01; Python是一种全栈的开发语言&#xff0c;你如果能学好Python&#xff0c;前端&#xff0c;后端&#x…