从《红楼梦》的视角看大模型知识库 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.rhkb.cn/news/331014.html

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

相关文章

现代密码学——消息认证和哈希函数

1.概述 1.加密-->被动攻击(获取消息内容、业务流分析) 消息认证和数字签名-->主动攻击(假冒、重放、篡改、业务拒绝) 2.消息认证作用: 验证消息源的真实性, 消息的完整性(未被篡改…

集合、Collection接口特点和常用方法

1、集合介绍 对于保存多个数据使用的是数组,那么数组有不足的地方。比如, 长度开始时必须指定,而且一旦制定,不能更改。 保存的必须为同一类型的元素。 使用数组进行增加/删除元素的示意代码,也就是比较麻烦。 为…

分布式数据库HBase入门指南

目录 概述 HBase 的主要特点包括: HBase 的典型应用场景包括: 访问接口 1. Java API: 2. REST API: 3. Thrift API: 4. 其他访问接口: HBase 数据模型 概述 该模型具有以下特点: 1. 面向列: 2. 多维: 3. 稀疏: 数据存储: 数据访问: HBase 的数据模型…

你真的会使用Vue3的onMounted钩子函数吗?Vue3中onMounted的用法详解

目录 一、onMounted的前世今生 1.1、onMounted是什么 1.2、onMounted在vue2中的前身 1.2.1、vue2中的onMounted 1.2.2、Vue2与Vue3的onMounted对比 1.3、vue3中onMounted的用法 1.3.1、基础用法 1.3.2、顺序执行异步操作 1.3.3、并行执行多个异步操作 1.3.4、执行一次…

基于STM32实现智能光照控制系统

目录 引言环境准备智能光照控制系统基础代码示例:实现智能光照控制系统 光照传感器数据读取PWM控制LED亮度用户界面与显示应用场景:智能家居与农业自动化问题解决方案与优化收尾与总结 1. 引言 本教程将详细介绍如何在STM32嵌入式系统中使用C语言实现智…

纯代码如何实现WordPress搜索包含评论内容?

WordPress自带的搜索默认情况下是不包含评论内容的,不过有些WordPress网站评论内容比较多,而且也比较有用,所以想要让用户在搜索时也能够同时搜索到评论内容,那么应该怎么做呢? 网络上很多教程都是推荐安装SearchWP插…

数据结构----堆的实现(附代码)

当大家看了鄙人的上一篇博客栈后,稍微猜一下应该知道鄙人下一篇想写的博客就是堆了吧。毕竟堆栈在C语言中常常是一起出现的。那么堆是什么,是如何实现的嘞。接下来我就带大家去尝试实现一下堆。 堆的含义 首先我们要写出一个堆,那么我们就需…

基于地理坐标的高阶几何编辑工具算法(4)——线分割面

文章目录 工具步骤应用场景算法输入算法输出算法示意图算法原理 工具步骤 选中待分割面,点击“线分割面”工具,绘制和面至少两个交点的线,双击结束,执行分割操作 应用场景 快速切分大型几何面,以降低面的复杂度&…

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

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

ElasticSearch - 删除已经设置的认证密码(7.x)

文章目录 Pre版本号 7.x操作步骤检查当前Elasticsearch安全配置停止Elasticsearch服务修改Elasticsearch配置文件删除密码重启Elasticsearch服务验证配置 小结 Pre Elasticsearch - Configuring security in Elasticsearch 开启用户名和密码访问 版本号 7.x ES7.x 操作步骤 …

从ES到ClickHouse,Bonree ONE平台更轻更快!

本文字数:8052;估计阅读时间:21 分钟 作者:博睿数据 李骅宸(太道)& 娄志强(冬青) 本文在公众号【ClickHouseInc】首发 本系列第一篇内容: 100%降本增效!…

01-02.Vue的常用指令(二)

01-02.Vue的常用指令(二) 前言v-model:双向数据绑定v-model举例:实现简易计算器Vue中通过属性绑定为元素设置class 类样式引入方式一:数组写法二:在数组中使用三元表达式写法三:在数组中使用 对…

redis--redis Cluster

简介 解决了redis单机写入的瓶颈问题,即单机的redis写入性能受限于单机的内存大小、并发数量、网卡速率等因素无中心架构的redis cluster机制,在无中心的redis集群当中,其每个节点保存当前节点数据和整个集群状态,每个节点都和其他所有节点连…

数组和指针的联系(C语言)

数组和指针是两种不同的数据类型,数组是一种构造类型,用于存储一组相同类型的变量;而指针是一种特殊类型,专门用来存放数据的地址。数组名除了sizeof(数组名)和&数组名表示整个数组外,其他情况下都表示的是首元素的…

百度集团:AI重构,走到哪了?

内有自家公关一号“自曝”狼性文化,主动制造舆论危机。 外有,OpenAI、谷歌、字节、华为等大模型劲敌扎堆迭代新产品, 强敌环伺。 今天我们要说的是早就从BAT掉队的——百度。 最近,在武汉Aapollo Day 2024上,百度发布了…

增强ev代码签名证书2300

代码签名证书是软件开发者们确保软件完整性和安全性的重要工具之一。在各种类型的代码签名证书中,增强EV代码签名证书拥有许多独特的功能而受到企业开发者的欢迎,今天就随SSL盾小编了解增强EV代码签名证书的申请条件以及申请流程。 1.增强型EV代码签名证…

npm介绍、常用命令详解以及什么是全局目录

目录 npm介绍、常用命令详解以及什么是全局目录一、介绍npm的主要功能npm仓库npm的配置npm的版本控制 二、命令1. npm init: 初始化一个新的Node.js项目&#xff0c;创建package.json文件。package.json是一个描述项目信息和依赖关系的文件。2. npm install <package_name&g…

Linux 内核之 mmap 内存映射的原理及源码解析

文章目录 前言一、简介1. mmap 是什么&#xff1f;2. Linux 进程虚拟内存空间 二、mmap 内存映射1. mmap 内存映射的实现过程2. mmap 内存映射流程2.1 mmap 系统调用函数2.2 ksys_mmap_pgoff 函数2.3 vm_mmap_pgoff 函数2.4 do_mmap_pgoff 函数2.5 do_mmap 函数2.6 get_unmappe…

ElasticSearch操作之重置密码脚本

ElasticSearch操作之重置密码脚本 #!/bin/bash # 使用样例 ./ES密码重置.sh 旧密码 新密码# 输入旧密码 es_old_password$1# 设置新的密码变量 es_password$2# 正确响应 es_reponse{"acknowledged":true}# 检查Elasticsearch是否在运行 if pgrep -f elasticsearch &g…

DNF手游攻略:角色培养与技能搭配!游戏辅助!

角色培养和技能搭配是《地下城与勇士》中提升战斗力的关键环节。每个职业都有独特的技能和发展路线&#xff0c;合理的属性加点和技能搭配可以最大化角色的潜力&#xff0c;帮助玩家在各种战斗中立于不败之地。接下来&#xff0c;我们将探讨如何有效地培养角色并搭配技能。 角色…