RankLLM:RAG架构下通过重排序实现精准信息检索

一、前言

在检索增强生成(Retrieval-Augmented Generation, RAG)的框架下,重排序(Re-Rank)阶段扮演着至关重要的角色。该阶段的目标是对初步检索得到的大量文档进行再次筛选和排序,以确保生成阶段能够优先利用最相关的信息。这一过程类似于传统信息检索中的两阶段排序策略,其中粗排(粗略排序)阶段追求高效的检索速度,而精排(精细排序)阶段则专注于提升结果的相关性和准确性

在RAG架构中,重排序不仅仅是对文档列表的简单重新排列,它还涉及到对文档相关性的深入理解和评估。有效的重排序技术能够显著提升RAG系统的性能,确保生成的内容不仅准确,而且与用户查询高度相关。然而,现有的重排序方法面临着一系列挑战,包括对输入顺序的过度依赖、缺乏对动态网络信息的适应性,以及模型的不透明性和不可复现性。

针对这些挑战,开源的重排序方法 RankLLM 应运而生。RankLLM 利用大型语言模型(LLMs)的强大能力,通过零样本学习(zero-shot learning)的方式,无需特定任务的训练数据即可执行重排序任务。这种方法不仅提高了重排序的效率和效果,而且通过开源实现了模型的透明性和可访问性,为研究社区提供了一个可复现、可改进的重排序工具。

RankLLM 的引入为RAG架构的发展提供了新的动力,它不仅能够处理静态的、预先定义的查询,还能够适应实时变化的数据和查询,满足不断演变的信息需求。通过这种开源和高效的重排序策略,RankLLM有望成为未来RAG系统中不可或缺的组成部分,推动信息检索和自然语言处理领域的进一步发展。

二、RankLLM 介绍

RankLLM 是一种基于大型语言模型(Large Language Models, LLMs)的重排序方法,它利用了LLM的强大能力来改进信息检索的结果。在信息检索的过程中,初步检索阶段可能会返回大量相关或不相关的文档,RankLLM 的作用是在这些文档中进行再次排序,以提高检索结果的相关性和准确性。RankLLM通过使用LLM作为“提示-解码器”(prompt-decoder),在没有特定任务训练数据的情况下(即零样本设置),对文档列表进行重新排序,优化诸如归一化折扣累积增益(nDCG)等检索指标。

三、RankLLM 原理

RankLLM 重排序的原理基于零样本学习(zero-shot learning),它不需要特定任务的训练数据。RankLLM 使用一种提示(Prompt)来指导LLM如何对文档列表进行排序。这个提示描述了重排序任务,并提供了一个格式,让模型知道如何生成排序后的文档列表。RankLLM 利用了 LLM 的理解和生成能力,通过指令微调(instruction fine-tuning)来学习如何根据相关性对文档进行排序

在实际操作中,RankLLM接收一系列候选文档和相关的查询,然后使用LLM生成一个按相关性排序的文档列表。这个过程涉及到从大型数据集中提取有用的信息,并将这些信息融入到LLM的生成过程中,以实现更准确的重排序。

四、RankLLM 实现

如何使用 RankLLM 工具对搜索结果进行重新排序,以提升结果的相关性和准确性。RankLLM 提供了一系列专门针对这项任务进行优化的开源大语言模型,例如 RankVicunaRankZephyr

本文将通过比较 Van Gogh Wiki 页面的搜索结果,分别使用了传统的检索方法和结合 RankLLM 的检索方法。一方面是仅利用检索(通过 llama-index 的 VectorIndexRetriever 实现),另一方面则是结合了 RankLLM 进行的检索加重排序。演示中展现了 RankLLM 的两种模型:

  • RankVicuna 7B V1
  • RankZephyr 7B V1 - Full - BF16

依赖项:

  • 目前,RankLLM 的重排序功能需要 CUDA 环境,并且必须安装 rank_llm(通过命令 pip install rank_llm 安装)。
  • 而内置的检索工具则依赖于 Pyserini,需要 JDK11、PyTorch 和 Faiss 环境。

castorini/rank_llm 是一个专门用于利用大语言模型(如 GPT3.5, GPT4, Vicuna 和 Zephyr)进行提示解码的代码库。

4.1、安装依赖

%pip install llama-index-core
%pip install llama-index-llms-openai
%pip install llama-index-postprocessor-rankllm-rerank
%pip install rank-llm
import nest_asyncio# 启用异步I/O
nest_asyncio.apply()
import logging
import syslogging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.postprocessor import LLMRerank
from llama_index.llms.openai import OpenAI
from IPython.display import Markdown, display
import osOPENAI_API_TOKEN = "sk-"
os.environ["OPENAI_API_KEY"] = OPENAI_API_TOKEN

4.2、加载数据,构建索引

从维基百科(Wikipedia)获取Vincent van Gogh的文本内容,并将这些文本内容保存到本地文件中,最后构建一个索引以便后续的数据检索。

from pathlib import Path
import requestswiki_titles = ["Vincent van Gogh",
]data_path = Path("data_wiki")for title in wiki_titles:response = requests.get("https://en.wikipedia.org/w/api.php",params={"action": "query","format": "json","titles": title,"prop": "extracts","explaintext": True,},).json()page = next(iter(response["query"]["pages"].values()))wiki_text = page["extract"]if not data_path.exists():Path.mkdir(data_path)with open(data_path / f"{title}.txt", "w") as fp:fp.write(wiki_text)
# 加载文档
documents = SimpleDirectoryReader("./data_wiki/").load_data()
# 构建索引
index = VectorStoreIndex.from_documents(documents,
)

五、检索与 RankLLM 重排序流程

  1. 准备检索器和重排序器

在开始检索流程之前,首先需要准备两个关键组件:检索器(Retriever)和重排序器(Reranker)。检索器负责从大量文档中快速筛选出与查询相关的候选文档集合。常见的检索器包括基于词频的BM25算法、基于神经网络的SPLADE++ ED和RepLLaMA等。这些检索器可以是无监督的、监督的、稀疏的、密集的,或者是它们的混合形式。重排序器则进一步优化检索结果,通过深入理解文档内容和用户查询意图,对候选文档进行精细排序。

  1. 对给定的搜索查询进行检索,不加重排序

用户发起搜索查询后,检索器首先在文档集合中进行初步检索,生成一个未经排序的候选文档列表。这一步骤不涉及任何形式的排序,目的是尽可能广泛地覆盖与查询相关的文档,为后续的重排序提供原材料。

  1. 使用 RankZephyr 进行重排序后的搜索查询检索

接下来,利用 RankZephyr 对初步检索得到的候选文档列表进行重排序。RankZephyr 是一种基于开源大型语言模型(LLM)的重排序工具,它通过零样本学习(zero-shot learning)的方式,无需特定任务的训练数据即可执行重排序任务。RankZephyr通过指令微调(instruction fine-tuning)来学习如何根据相关性对文档进行排序,能够根据归一化折扣累积增益(nDCG)等检索指标优化文档排序。

  1. 使用 RankVicuna 进行重排序后的搜索查询检索

为了进一步提升检索效果,可以采用 RankVicuna 对 RankZephyr 的输出结果进行二次重排序。RankVicuna 是另一种基于开源LLM的重排序工具,它在 RankZephyr 的基础上进一步优化,通过多阶段的重排序策略(progressive reranking)来迭代改进排序结果。RankVicuna 通过引入变量窗口大小和随机输入顺序的训练,增强了模型对于不同重排序场景的适应性和鲁棒性。

通过上述流程,RankLLM 能够有效地结合检索器的快速筛选能力和重排序器的深度理解能力,为用户提供更加精准和相关的搜索结果。

from llama_index.core.retrievers import VectorIndexRetriever
from llama_index.core import QueryBundle
from llama_index.postprocessor.rankLLM_rerank import RankLLMRerankimport pandas as pd
from IPython.display import display, HTMLdef get_retrieved_nodes(query_str,vector_top_k=10,reranker_top_n=3,with_reranker=False,with_retrieval=False,model="zephyr",
):query_bundle = QueryBundle(query_str)# 配置检索器retriever = VectorIndexRetriever(index=index,similarity_top_k=vector_top_k,)retrieved_nodes = retriever.retrieve(query_bundle)if with_reranker:# 配置rerankerreranker = RankLLMRerank(top_n=reranker_top_n, with_retrieval=with_retrieval, model=model)retrieved_nodes = reranker.postprocess_nodes(retrieved_nodes, query_bundle)return retrieved_nodesdef pretty_print(df):return display(HTML(df.to_html().replace("\\n", "")))def visualize_retrieved_nodes(nodes) -> None:result_dicts = []for node in nodes:result_dict = {"Score": node.score, "Text": node.node.get_text()}result_dicts.append(result_dict)pretty_print(pd.DataFrame(result_dicts))

不加重排序的检索前三结果:

预期结果显示:

经过梵高的多次恳求,高更于10月23日抵达阿尔勒,并于11月两人一起作画。高更在他的《向日葵画家》中描绘了梵高。

new_nodes = get_retrieved_nodes("Which date did Paul Gauguin arrive in Arles?",vector_top_k=3,with_reranker=False,model="zephyr",
)visualize_retrieved_nodes(new_nodes)

正确的结果在未重排序时排名第三。

使用 RankZephyr 重排序前 10 结果并返回前 3:

new_nodes = get_retrieved_nodes("Which date did Paul Gauguin arrive in Arles?",vector_top_k=10,reranker_top_n=3,with_reranker=True,with_retrieval=False,model="zephyr",
)visualize_retrieved_nodes(new_nodes)

在 RankZephyr 重排序后,正确的结果升至第一位。

使用 RankVicuna 重排序前 10 结果并返回前 3:

new_nodes = get_retrieved_nodes("Which date did Paul Gauguin arrive in Arles?",vector_top_k=10,reranker_top_n=3,with_reranker=True,with_retrieval=False,model="vicuna",
)visualize_retrieved_nodes(new_nodes)

在 RankVicuna 重排序后,正确的结果同样位居第一位。

六、总结

RankLLM是一种创新的重排序方法,它利用了大型语言模型的能力来改进信息检索的结果。通过零样本学习和指令微调,RankLLM能够在不需要特定任务训练数据的情况下,有效地对文档列表进行重新排序。这种方法不仅提高了检索结果的相关性和准确性,而且由于其开源性质,还增加了研究的可重复性和模型的可访问性。RankLLM的引入为解决RAG架构中的一些关键挑战提供了新的可能性,为未来的信息检索和文本生成任务开辟了新的道路。

七、References

[1]. RankLLM Github:https://github.com/castorini/rank_llm

[2]. Pyserini: https://github.com/castorini/pyserini

[3]. Ronak Pradeep, Sahel Sharifymoghaddam, Jimmy Lin, R. (2023). RankZephyr: Effective and Robust Zero-Shot Listwise Reranking is a Breeze: https://arxiv.org/abs/2312.02724

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

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

相关文章

特征融合篇 | RTDETR引入基于内容引导的特征融合方法 | IEEE TIP 2024

本改进已集成到 RT-DETR-Magic 框架。 摘要—单幅图像去雾是一个具有挑战性的不适定问题,它从观察到的雾化图像中估计潜在的无雾图像。一些现有的基于深度学习的方法致力于通过增加卷积的深度或宽度来改善模型性能。卷积神经网络(CNN)结构的学习能力仍然未被充分探索。本文提…

一周年纪念

文章目录 机缘:命运之门收获---知识之心日常---灵魂之窗成就 — 自我之光憧憬 — 未来之路 机缘:命运之门 “人生是由一连串的选择组成,而真正的成长,往往始于最具挑战性的决定。” —— 这句话恰如其分地概括了我选择跨考计算机的…

【C++】map set 底层刨析

文章目录 1. 红黑树的迭代器2. 改造红黑树3. map 的模拟实现4. set 的模拟实现 在 C STL 库中,map 与 set 的底层为红黑树,那么在不写冗余代码的情况下使用红黑树同时实现 map 与 set 便是本文的重点。 1. 红黑树的迭代器 迭代器的好处是可以方便遍历&…

数据结构--树和二叉树

树和二叉树 1.树概念及结构树的概念树的相关概念树的表示 2.二叉树概念及结构概念特殊的二叉树二叉树的性质 3.二叉树顺序结构及实现4.二叉树链式结构及实现二叉树的顺序结构二叉树的前,中,后序遍历层序遍历 1.树概念及结构 树的概念 树是一种非线性的…

SSL协议是什么?有什么作用?

SSL协议是一种让互联网上的数据传输变得更安全的技术。它的主要作用是: 保密性: 使用加密手段,让别人偷看不了你在网上发的信息(比如密码、聊天内容、银行卡号等)。完整性:防止你的信息在传输途中被偷偷修…

九州金榜|孩子叛逆,家长应该怎么办?

孩子是父母的宝贝,孩子快乐,作为父母就会快乐,每位家长都希望自己的孩子健康快乐长大。孩子在成长的过程中,随着年龄以及阅历的增长,都会出现叛逆,孩子出现叛逆,对于父母来说是一种挑战&#xf…

恶劣条件下GNSS定位的鲁棒统计

全球导航卫星系统(GNSS)作为定位信息的主要来源,在智慧工厂、智慧能源、智慧交通的未来应用中发挥着重要作用。此外,GNSS为电网或股市等关键应用提供定时同步功能。然而,GNSS的性能很容易因自然现象和信号反射而降低。…

【THM】Exploit Vulnerabilities(利用漏洞)-

介绍 在这个房间里,我们将讨论一些识别漏洞的方法,并结合我们的研究技能来了解这些漏洞是如何被滥用的。 此外,您还会发现一些公开可用的资源,这些资源是您在执行漏洞研究和利用时的技能和工具的重要补充。然后,您将在房间的最后将所有这些应用到实际挑战中。 自动化与…

HTML5.Canvas简介

1. Canvas.getContext getContext(“2d”)是Canvas元素的方法,用于获取一个用于绘制2D图形的绘图上下文对象。在给定的代码中,首先通过getElementById方法获取id为"myCanvas"的Canvas元素,然后使用getContext(“2d”)方法获取该Ca…

STM3定时器输入捕获、超声波测距

1、超声波测距模块介绍 1、HC-SR04共四个引脚:VCC、GND、Trig、Echo,如下图 2、使用 1、通过gpio口向Trig引脚发送一个脉冲信号。 2、HC-SR04接收到脉冲信号后,就会向外发送一段超声波,模块会将echo拉高。 …

rpm、yum和编译安装软件

一、rpm 1.rpm包管理工具 建立统一的数据库文件(一张对应表将信息写入) 详细记录软件包安装、卸载等变化信息,自动分析软件包依赖关系 2.rpm一般命令格式 bash-4.1.2-15.el6_4.x86_64.rpm bash(shell软件名称) …

STM32CubeIDE基础学习-定时器PWM实验

STM32CubeIDE基础学习-定时器PWM实验 文章目录 STM32CubeIDE基础学习-定时器PWM实验前言第1章 硬件介绍第2章 工程配置2.1 基础工程配置部分2.2 生成工程代码部分 第3章 代码编写3.1 查看PWM波3.2 设置单个比较值3.3 呼吸灯 第4章 实验现象总结 前言 在平时单片机开发时&#…

JQuery(一)---【JQuery简介、安装、初步使用、各种事件】

零.前言 在学习JQuery前,您需要具备以下知识: HTML相关知识(DOM)CSS相关知识JavaScript相关知识 一.JQuery 1.1JQuery简介 JQuery是一个JavaScript的“函数库”,不是JavaScript的一个框架,与“VUE、REACT”有本质区别&#x…

IPSEC VPN双机热备份的配置讲解一

IPSEC VPN双机热备份的配置讲解一 VPN 是一种专用网络,可使用公共网络连接两个或两个以上的远程站点。VPN 可使用通过公共网络路由(以隧道方式发送)的虚拟连接,而非网络之间的专用连接。IPsec VPN 是一项协议,由建立 …

DHCP-PXE

Dynamic Host Configuration Protocol 动态主机配置协议 1.Selinux 调试为Permission 防火墙配置 搭建DHCP的主机必须有一个静态地址,提前配置好 安装DHCP软件 服务名为dhcpd DHCP地址分配四次会话, DISCOVERY发现 OFFER 提供 REQUEST 回应 A…

代码随想录算法训练营第42天| 背包问题、416. 分割等和子集

01 背包 题目描述:有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 二维dp数组01背包: 确定dp数组以及下标的含义 …

实景三维技术也是一种新质生产力

实景三维技术作为一种新兴的技术手段,正在逐渐被认为是一种新质生产力。它通过高精度的数据采集、处理和可视化,为多个行业领域提供了全新的工作方式和解决方案,从而推动了生产力的发展和创新。以下是实景三维技术作为新质生产力在不同方面的…

Mac 配置 Aria2

文章目录 1. Aria2 安装1.1 安装 brew1.2 安装 Aria2 2. 配置 Aria22.1 创建配置文件 aria2.conf 和空对话文件 aria2.session2.2 编辑配置文件 aria2.conf 3. 开机启动设置3.1 创建用户启动文件3.2 管理自启动项 4. 配置 BT tracker 自动更新4.1 XIU2/TrackersListCollection …

通义灵码-ai编码

https://developer.aliyun.com/topic/lingma/activities/202403?taskCode14508&recordIdb1ef3ba27250a5818b1b6ffe418af658#/?utm_contentm_fission_1 「通义灵码 体验 AI 编码,开 AI 盲盒」

【Kafka】Kafka安装、配置、使用

【Kafka】安装Kafka 1. 安装Kafka2. Kafka使用2.0 集群分发脚本xsync(重要)2.0.1 scp命令2.0.2 rsync远程同步工具2.0.3 写一个集群分发脚本xsync (Shell 脚本) 2.1 Zookeeper安装2.2 对Kafka进行分发2.2.1 执行同步脚本2.2.2 三台云主机配置Kafka环境变量 1. 安装Kafka Kafka…