从《红楼梦》的视角看大模型知识库 RAG 服务的 Rerank 调优

背景介绍

在之前的文章 有道 QAnything 源码解读 中介绍了有道 RAG 的一个主要亮点在于对 Rerank 机制的重视。

从目前来看,Rerank 确实逐渐成为 RAG 的一个重要模块,在这篇文章中就希望能讲清楚为什么 RAG 服务需要 Rerank 机制,以及如何选择最合适的 Rerank 模型。最终以完整的《红楼梦》知识库进行实践。

至于为什么要用红楼梦,答案就是作为读了很多遍《红楼梦》的忠实粉丝,问题的答案是不是靠谱一眼就能判断,问题相关的片段也能快速定位,就像定位 bug 一样快。

Rerank 是什么

以有道 QAnything 的架构来看 Rerank 在 RAG 服务中所处的环节
在这里插入图片描述
可以看到有道 QAnything 中的 Rerank 被称为为 2nd Retrieval, 主要作用是将向量检索的内容进行重新排序,将更精准的文章排序在前面。通过向大模型提供更精准的文档,从而提升 RAG 的效果。

在目前的 2 阶段检索(Embedding + Rerank)设计下,Embedding 模型只需要保证召回率,从海量的文档中获取到备选文档列表,不需要保证顺序的绝对准确。而 Rerank 模型负责对少量的备选文档列表的顺序进行精调,优中选优确定最终传递给大模型的文档。

打个简单的比方,目前的 Embedding 检索类似学校教育筛选中的实验班,从大量的学生中捞出有潜质的优秀学生进行培养。而 Rerank 则从实验班中对学生进一步精细排序,选出少数能上清北的重点培养。

为什么不能一步到位

Embedding 检索时会获得问题与文本之间的相似分,以往的 RAG 服务直接基于相似分进行排序,但是事实上向量检索的相似分是不够准确的。

原因是 Embedding 过程是将文档的所有可能含义压缩到一个向量中,方便使用向量进行检索。但是文本压缩为向量必然会损失信息,从而导致最终 Embedding 检索的相似分不够准确。参考 Pipecone 对应的图示如下所示:

在这里插入图片描述

可以看到 Embedding 过程包含两步:

  1. 运行单个 Transformer 计算以创建查询向量。
  2. 将查询向量与具有余弦相似性的文档向量进行比较,获取相似文档。

而 Rerank 阶段不会向量化,而是将查询与匹配的单个文档 1 对 1 的计算相似分,没有向量化带来的信息损失,必然会得到更好的效果,对应的过程如下所示:

在这里插入图片描述

那直接执行 Rerank 是否可行呢?肯定也是不行的,Rerank 需要 1 对 1 计算相似分的,在海量的文档中一一比对查找文档,效率肯定是不能接受的。

除了这个原因以外,拆分 Rerank 阶段也提供了更加灵活的筛选文档的能力,比如之前介绍过的 Ragflow 就是在 Rerank 中使用 0.3 * 文本匹配得分 + 0.7 * 向量匹配得分 加权得出综合得分进行排序,Rerank 阶段可以提供类似这种灵活的选择手段。

支持超大上下文的模型是否可以避免 Rerank

我们之所以需要提供准确的文档,一般是因为大模型提供的窗口有限,无法塞入过多的文档。但是目前有模型提供了更大的上下文窗口,重排是否就可有可无了呢。

Pipecone 提供的曲线图可以看到 GPT 3.5 中存在如下所示现象:
在这里插入图片描述

随着塞入大模型上下文的文档数增加,大模型从文档中召回信息的准确性会下降。

以我实际碰到的一个例子来看,两次检索与重排得到的都是同样顺序的文本内容,而且需要召回的信息都出现在排名第一的位置上。当我选择加入大模型上下文中的文档数量为 10 时,大模型最终的回答如下所示:
在这里插入图片描述

但是减少加入上下文的数量为 5 时,大模型最终的答案如下所示:
在这里插入图片描述

可以看到,加入大模型的文档过多,召回信息的准确性确实会下降。所以超大上下文窗口并不是解决所有问题的灵丹妙药。

Rerank 模型的选择

目前开源的 Rerank 模型选择不如 Embedding 模型那么多,主要是下面几个:

  • 智源提供的 BGE 系列
  • 有道提供的 BCE 模型
  • Cohere 提供的 CohereRerank 系列

由于主要考虑开源可使用的模型,因此先排除了 CohereRerank 系列模型,结合搜索的信息确定备选的模型如下所示:

  • bce-reranker-base_v1 有道 BCE 系列只提供了这一款 Rerank 模型,上个月 huggingface 下载量 8.7k
  • bge-reranker-large 这一款为 BGE 系列的经典 Rerank 模型,评价比较高,上个月 huggingface 下载量 33.2k
  • bge-reranker-v2-m3 这一款为智源目前推荐的多种场景的建议模型,上个月 huggingface 下载量 69.4k

参考的信息源主要是:

  • 有道 QAnything 测评
  • 智源的 Rerank 测评
  • llamaIndex 测评文章
  • ninehills 的博客

那个模型表现最好呢?

有道在 网站 上放出来的测评结果如下所示:
在这里插入图片描述

可以看到测评得到的结果是 bce-reranker-base_v1 是略胜一筹的,当然大家都知道各家官方上给出的都是对自己有利的测评结果,但是其中对友商的测评结果大概率还是可以相信的,可以看到 bge-reranker-v2-m3 小幅领先 bge-reranker-large

另外一个测评是来自于 智源网站 提供的
在这里插入图片描述

可以看到表现最好是 bge-rerank-v2-minicpm-28, 但是看了下 hugggingface 上模型大小为 10G 左右,相对 2G 左右的 bge-reranker-large 资源开销大太多了。

综合下载量和测评结果,bge-reranker-v2-m3 看来是当前最佳选择,bge-reranker-large 和 bce-reranker-base_v1 可以作为备选。实际表现如何还需要进一步验证。

动手实践

具体的实现可以直接参考 langchain-chatchat 中的 Rerank 模块。

此模块主要实现的就是加载 Rerank 模型,然后计算文档块与问题的相似分,之后根据此相似分进行重排。

接下来的实践过程相对简单,将完整的《红楼梦》导入知识库,分片向量化,为了方便在本地的普通 CPU 笔记本上运行,我接入了百度提供的在线大模型 API 进行测试。而 Embedding 模型我使用的是 stella-base-zh-v3-1792d。

在本次测试中,我主要验证了两种场景:

  1. 多 Rerank 模型的效果比较,主要关注同样的文档使用 Rerank 模型排序后的顺序差异,看哪个 Rerank 排序的结果最符合人的预期;
  2. 选择 Rerank 模型的优胜者和无 Rerank 情况进行比较,确认是否吊打无 Rerank 的情况;
多 Rerank 模型比较

实际基于 Kimi 生成了 15 个问题,具体的问题如下所示:

  1. 红楼梦中,贾宝玉和林黛玉第一次见面是在哪一年?
  2. 请列举《红楼梦》中贾府的四位主要女性角色。
  3. 《红楼梦》中,王熙凤为什么被称为“凤姐”?
  4. 贾宝玉的通灵宝玉有什么特殊之处?
  5. 林黛玉的诗作中,有一首描写春天的诗,请找出并描述其内容。
  6. 在《红楼梦》中,贾母为何偏爱贾宝玉?
  7. 描述《红楼梦》中薛宝钗的性格特点。
  8. 请找出《红楼梦》中关于“大观园”的描述,并说明其在故事中的意义。
  9. 《红楼梦》中,贾宝玉和林黛玉的关系是如何发展的?
  10. 请列出《红楼梦》中提到的几种不同的茶。
  11. 红楼梦中,林黛玉的死因是什么?
  12. 请列举《红楼梦》中贾府的几位仆人,并描述他们的角色。
  13. 《红楼梦》中,贾宝玉和薛宝钗的婚姻是如何安排的?
  14. 红楼梦中,贾元春的封号是什么?
  15. 请描述《红楼梦》中贾宝玉的人生观和价值观。

测试中除了 Rerank 模型外,其他部分都保持一致,最终测试下来,结论如下:

  1. bge-reranker-v2-m3 模型表现最好,bce-reranker-base_v1 和 bge-reranker-large 在不同问题中各有胜负。
  2. bge-reranker-large 的相似分很容易出现接近 1 的高分,与实际人的直觉不完全一致
  3. bce-reranker-base_v1 的相似分相对更均衡,经常在 0.4 ~ 0.7 之间,与常规的人的直觉更接近

当然这个测试偏向简单验证,有一定的主观判断,而且问题的数量不够多,如果进行模型选型还是需要根据自己的数据集和问题进行进一步测试。

部分的问题的结果展示如下,下面测试结果中的第一个百分比为 Rerank 模型给出的相似分,第二个百分比为原始 Embedding 模型给出的相似度评分,可以看到其中的判断差异:

问题 1. 红楼梦中,贾宝玉和林黛玉第一次见面是在哪一年?

bce-reranker-base_v1
在这里插入图片描述

bge-reranker-large
在这里插入图片描述

bge-reranker-v2-m3
在这里插入图片描述

问题中大模型最后都没有正确回答,因为没有检索到正确的内容,但是 bge-reranker-v2-m3 确实给出了相当低的相似分,表明没有正确的内容,而其他模型在这种情况下都没体现出这个特征。

问题 13. 《红楼梦》中,贾宝玉和薛宝钗的婚姻是如何安排的?

bce-reranker-base_v1
在这里插入图片描述

bge-reranker-large
在这里插入图片描述

bge-reranker-v2-m3
在这里插入图片描述

这个比较明显,bce-reranker-base_v1 和 bge-reranker-large 都没能将正确的片段排序在最前面,而 bge-reranker-v2-m3 排序最靠前的片段才是符合预期的。而大模型的回答也体现出这种差异,回答明确提到了婚姻是由贾母等长辈决定的。

而且可以看到 bge-reranker-large 中由于上下文排序不合适导致大模型的幻觉更加严重了,连林黛玉意外远嫁都幻想出来了。

有无 Rerank 机制的比较

同样创建了一批问题进行测试,Rerank 模型选择的是 bge-reranker-v2-m3,实际测试确实效果还是比较明显的,Rerank 后前面的回答相关性明显更强,比如:

无 Rerank 原始版本
在这里插入图片描述

Rerank 版本
在这里插入图片描述

可以看到 Rerank 后给出了更准确的信息,大模型的回答中也会包含更多细节,回答质量也会更高。

总结

从本次《红楼梦》的实践来看,Rerank 机制的效果还是比较明显的。通过额外的精细重排,给大模型提供了更精准的上下文,从而提升大模型知识库回答的质量。

从本次测试的情况来看,开源模型 bge-reranker-v2-m3 表现更胜一筹,当然实际的表现与数据集和问题都有很大关系,大家实际使用时可以基于自己的知识库与问题进行有针对性的测试。

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

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

相关文章

Redisson-分布式锁单Redis节点模式

Redisson-分布式锁单Redis节点模式 为什么要用分布式锁? 使用分布式锁的主要目的是为了解决多线程或多进程并发访问共享资源时可能出现的竞争条件和数据一致性问题。举一些实际场㬌: 数据库并发控制:在分布式系统中,多个节点同…

从0开始实现一个博客系统 (SSM 实现)

相关技术 Spring Spring Boot Spring MVC MyBatis Html Css JS 实现功能 用户注册 - 密码加盐加密 (md5 加密)前后端用户信息存储 - 令牌技术用户登录 - (使用 拦截器 做登录校验)博客的增删改查后端数据返回前端, 采用 SpringBoot 做统一功能处理和统一异常处理 数据…

软考-程序员 知识点与部分真题梳理

软考-程序员 知识点与部分真题梳理 参照《程序员教程》第五版划分类别; 持续更新中… 计算机系统基础知识 如何理解和处理浮点数的加减法运算 在计算机科学中,处理浮点数的表示和运算是基础且关键的,尤其是在进行科学计算、图形处理和数据分…

【网络】为什么udp协议报头有长度字段,而tcp没有

引言: 在网络通信中,UDP(用户数据报协议)和TCP(传输控制协议)是两种常用的传输层协议。它们在设计和功能上有一些不同之处,其中之一就是报头中的长度字段。本文将深入探讨UDP和TCP协议中长度字…

SpringCloud Alibaba详解:打造高可用的分布式系统

SpringCloud Alibaba是一个基于Spring Cloud的微服务开发框架,它集成了阿里巴巴的一系列中间件和工具,能够快速构建高可用的分布式系统。在本文中,将详细介绍如何使用SpringCloud Alibaba来打造高可用的分布式系统,并通过代码案例…

第十一课,end关键字、简单while循环嵌套、初识for循环

一,end关键字 end关键字用于在print输出的内容后面声明结束的字符,我们之前学过并且十分了解print是默认输出内容之后跟着换行的,如果我们不希望换行而希望使用其它字符来代替换行,就可以用end关键字来实现 特殊的,en…

Redis机制-Redis缓存穿透,击穿,雪崩理解等问题的理解和学习

目录 一 缓存穿透问题 二 缓存击穿问题 三 缓存雪崩问题: 图1 正常的Redis缓存流程 一 缓存穿透问题 我们都知道Redis是一个存储键值对的非关系型数据库,那么当用户进行查询的时候,势必会从前端发起请求,从而数据从Redis缓存…

内网穿透--Frp-简易型(速成)-上线

免责声明:本文仅做技术交流与学习... 目录 frp项目介绍: 一图通解: ​编辑 1-下载frp 2-服务端(server)开启frp口 3-kali客户端(client)连接frp服务器 4-kali生成马子 5-kali监听 6-马子执行-->成功上线 frp项目介绍: GitHub - fatedier/frp: A fast reverse proxy…

论文精读-SwinIR Image Restoration Using Swin Transformer

论文精读-SwinIR: Image Restoration Using Swin Transformer SwinIR:使用 Swin Transformer进行图像恢复 参数量:SR 11.8M、JPEG压缩伪影 11.5M、去噪 12.0M 优点:1、提出了新的网络结构。它采用分块设计。包括浅层特征提取:cnn提取&#…

Verilog实战学习到RiscV - 1 : Yosys 综合

Yosys 综合 实例 一般 FPGA IDE 的第一步都是RTL 综合(Synthesis)。之后就能看到数字电路图了。然后可以做RTL 级的仿真模拟。 直接上代码,这里我们看一个简单的加法器来学习。 module adder(input [7:0] a,input [7:0] b, input …

Java延时队列取消未支付的订单 之 重启服务任务丢失

一、定义延迟任务类 package com.activity.domain;import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit;/*** 延迟任务类*/ public class DelayedCancellation implements Delayed {private String order;private final long delayTime; // 延迟时间p…

智能体之斯坦福AI小镇(Generative Agents: Interactive Simulacra of Human Behavior)

相关代码地址见文末 论文地址:Generative Agents: Interactive Simulacra of Human Behavior | Proceedings of the 36th Annual ACM Symposium on User Interface Software and Technology 1.概述 论文提出了一种多个智能体进行协同,进而模拟可信的人…

Linux系统下Mysql忘记密码怎么解决

一、对Mysql配置文件进行设置 1、找到/etc/mysql/my.cnf路径下,用Vi命令编辑my.cnf配置文件,命令如下: # 以管理员身份登录 sudo su # 输入管理员密码 # 登录成功后,找到Mysql的配置文件-->Mysql配置文件默认在此 cd /etc/my…

善用KEGG数据库挖掘目的基因

有关KEGG的分析在很多已发表的论文中都十分常见,涉及到的方向也很广泛,比如:代谢组、表观组、转录组等等。通常得到相关的基因集或者代谢物后,我们都希望能够快速了解它们的蛋白功能和涉及的调控机制,从而进一步锁定接…

NetSuite Intercompany COGS科目设置问题

在22年底的NetSuite多公司功能串讲中,有一个题目是Intercompany COGS科目的设置问题。近期在项目上这个问题被密集讨论。为了方便分享,所以在此摘出来独立成文。有兴趣的同学也可以翻看之前的视频。 NetSuite知识会 第8谈 多公司功能串讲 NetSuite Inter…

图论(从数据结构的三要素出发)

文章目录 逻辑结构物理结构邻接矩阵定义性能分析性质存在的问题 邻接表定义性能分析存在的问题 十字链表(有向图)定义性能分析 邻接多重表(无向图)定义性能分析 数据的操作图的基本操作图的遍历广度优先遍历(BFS)算法思想和实现性能分析深度优先最小生成…

WORD、PPT技巧

WORD技巧 编辑设置 word标题导航窗口怎么调出word2016,缩小了页面,可是怎么是竖着的一页一页排列啊?以前不是好几页横排着的么?怎么设置,求救:在Word标题栏那一行找到“视图”,点击“显示比例…

20212416 2023-2024-2 《移动平台开发与实践》第5次作业

百度地图应用 1.实验内容2.实验过程2.1 Android Studio配置2.1. 创建一个Android项目2.2 在项目中本地集成BaiduMap SDK 2.2 编写代码2.2.1 配置AndroidManifest.xml文件2.2.2 编写UI界面布局文件2.2.3 编写主函数代码2.2.4 运行结果 3.学习中遇到的问题及解决4.学习感悟与思考…

数据结构篇其三---链表分类和双向链表

​ 前言 数据结构篇其二实现了一个简单的单链表,链表的概念,单链表具体实现已经说明,如下: 单链表 事实上,前面的单链表本质上是无头单向不循环链表。此篇说明的双向链表可以说完全反过来了了。无论是之前的单链表还…

Java进阶学习笔记12——final、常量

final关键字: final是最终的意思。可以修饰类、方法、变量。 修饰类:该类就被称为最终类,特点是不能被继承了。 修饰方法:该方法是最终方法,特点是不能被重写了。 修饰变量:该变量只能被赋值一次。 有些…