微信扫码
添加专属顾问
我要投稿
Rankify:简化RAG的高效工具,覆盖24种重排序方法。 核心内容: 1. Rankify的安装、配置和实际应用指南 2. 核心组件:检索器、重排序器和生成器 3. 支持的24种重排序方法和自定义数据集处理
编者按:继昨天《RAG太折磨人啦,试下pip install rankify,检索、重排序、RAG三合一,完美》发布之后,有许多朋友向我询问Rankify的具体使用方法和部署细节,尤其是生产环境如何处理自定义数据集和本地数据集。应读者需求,我很荣幸收到了Rankify第一作者Abdelrahman Abdallah博士提供的这份详细使用指南和授权发布邮件。本文全面介绍了Rankify的安装配置、核心组件和实际应用场景,从入门到进阶,为研究人员和开发者提供了完整的操作指南。无论您是想快速上手这个强大的RAG工具包,还是希望深入了解其技术细节,这篇文章都能满足您的需求。
RAG太折磨人啦,试一下pip install rankify,检索、重排序、RAG三合一,完美。| 独家
另外,本项目.cursorrules file已经在Github上更新。也请各位读者能为Rankify点亮Star!以感谢Abdelrahman Abdallah博士团队为信息检索和检索增强生成领域的重要进展所做出的贡献。
在自然语言处理和信息检索快速发展的领域中,高效查找、排序和利用相关信息的能力变得越来越重要。Rankify 作为这些挑战的强大解决方案应运而生,提供了一个专为检索、重排序和检索增强生成(RAG)任务设计的综合性 Python 工具包。
Rankify 是一个模块化且高效的框架,它无缝集成了整个信息检索流程中的最先进模型和技术。无论您是探索新排序算法的研究人员,构建问答系统的数据科学家,还是实现生产级 RAG 应用的开发人员,Rankify 都能提供满足您需求的工具和灵活性。
Rankify 的核心围绕三个基本组件构建,这些组件共同创建了一个完整的信息检索和生成流程:
检索器构成了流程的第一阶段,负责高效搜索大型文档集合以找到潜在相关信息。Rankify 支持多种检索技术,从传统的稀疏方法如 BM25 到先进的密集检索方法,如 DPR(Dense Passage Retrieval)、ANCE、BGE 和 ColBERT。这些检索器擅长快速从成千上万或数百万文档中筛选出可管理的候选集,以供进一步处理。
一旦检索器识别出候选文档,重排序器就会介入以改进这些结果的排序。Rankify 实现了 24+ 种最先进的重排序模型,分为两大类:
重排序器通过对较小的检索文档集应用计算密集但更准确的相关性判断,显著提高了搜索结果的质量。
流程中的最后一个组件,生成器利用检索和重排序的信息生成连贯、上下文相关的文本输出。Rankify 支持多种 RAG 方法,包括零样本(Zero-shot)、解码器融合(Fusion-in-Decoder,FiD)和上下文内(In-Context)方法。这些生成器通过结合大型语言模型和外部知识源的力量,实现了问答、内容摘要和基于知识的文本生成等应用。
Rankify 以模块化为核心原则设计。每个组件可以独立使用或组合成定制化的流程以满足特定需求。这种模块化架构提供了几个优势:
Rankify 具有几个显著特点,使其成为信息检索和 RAG 应用的强大工具:
Rankify 旨在服务多样化的用户群体:
在接下来的部分,我们将详细探讨 Rankify 的每个组件,提供有关其实现、使用和最佳实践的见解。我们还将介绍安装选项、自定义数据集支持和实用示例,帮助您开始使用这个强大的工具包。
开始使用 Rankify 非常简单,提供灵活的安装选项以适应不同的需求和用例。本节提供了安装 Rankify、设置环境和实现基本使用模式的全面指南,帮助您快速利用这个工具包的强大功能。
Rankify 设计为默认模块化和轻量级。这种方法允许用户只安装他们需要的组件,最小化特定用例的依赖项和资源需求。
对于核心功能,您可以使用 pip 安装 Rankify:
pip install rankify
这个基本安装提供:
基本安装适合希望快速入门或主要需要核心重排序功能而不需要高级检索或专业重排序模型所需的额外依赖项的用户。
对于更专业的需求,Rankify 提供组件特定的安装选项:
用于检索功能(BM25、DPR、ANCE 等):
pip install "rankify[retriever]"
此安装添加:
用于高级重排序功能:
pip install "rankify[reranking]"
此安装包括:
对于需要 Rankify 完整功能的用户,包括所有检索器、重排序器和生成器:
pip install "rankify[all]"
这个全面安装提供:
对于贡献者或想要最新开发版本的用户:
git clone https://github.com/DataScienceUIBK/rankify.git
cd rankify
pip install -e .
对于完整的开发环境:
pip install -e ".[all]"
Rankify 需要 Python 3.10 或更高版本。我们建议使用 conda 设置专用环境:
conda create -n rankify python=3.10
conda activate rankify
Rankify 与 PyTorch 2.5.1 配合最佳。为获得最佳性能,特别是使用 GPU 加速:
pip install torch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 --index-url https://download.pytorch.org/whl/cu124
这将安装支持 CUDA 12.4 的 PyTorch。对于其他平台或 CUDA 版本,请参阅 PyTorch 安装页面。
如果您计划使用 ColBERT 检索器,需要额外的设置步骤:
# 安装 GCC 和所需库
conda install -c conda-forge gcc=9.4.0 gxx=9.4.0
conda install -c conda-forge libstdcxx-ng
# 导出必要的环境变量
export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$LD_LIBRARY_PATH
export CC=gcc
export CXX=g++
export PATH=$CONDA_PREFIX/bin:$PATH
# 清除缓存的 torch 扩展
rm -rf ~/.cache/torch_extensions/*
安装 Rankify 后,您可以开始实现强大的检索、重排序和生成流程。以下是一些帮助您入门的常见使用模式:
Rankify 提供对 40 个预检索基准数据集的访问,使您无需大量计算资源即可轻松入门:
from rankify.dataset.dataset import Dataset
# 显示可用数据集
Dataset.avaiable_dataset()
# 下载 nq-dev 的 BM25 检索文档
dataset = Dataset(retriever="bm25", dataset_name="nq-dev", n_docs=100)
documents = dataset.download(force_download=False)
# 访问文档
for doc in documents[:5]: # 前 5 个文档
print(f"Question: {doc['question']}")
print(f"Number of contexts: {len(doc['ctxs'])}")
print("---")
对于基本检索功能:
from rankify.dataset.dataset import Document, Question, Answer, Context
from rankify.retrievers.retriever import Retriever
# 创建和配置文档索引
retriever = Retriever(method="bm25", n_docs=5, index_type="wiki")
documents = [
Document(question=Question("the cast of a good day to die hard?"), answers=Answer([
"Jai Courtney",
"Sebastian Koch",
"Radivoje Bukvić",
"Yuliya Snigir",
"Sergei Kolesnikov",
"Mary Elizabeth Winstead",
"Bruce Willis"
]), contexts=[]),
Document(question=Question("Who wrote Hamlet?"), answers=Answer(["Shakespeare"]), contexts=[])
]
# 为查询检索文档
retrieved_documents = retriever.retrieve(documents)
for i, doc inenumerate(retrieved_documents):
print(f"\nDocument {i+1}:")
print(doc)
为改进检索文档的排序:
from rankify.dataset.dataset import Document, Question, Answer, Context
from rankify.models.reranking import Reranking
# 示例文档设置
question = Question("When did Thomas Edison invent the light bulb?")
answers = Answer(["1879"])
contexts = [
Context(text="Lightning strike at Seoul National University", id=1),
Context(text="Thomas Edison tried to invent a device for cars but failed", id=2),
Context(text="Coffee is good for diet", id=3),
Context(text="Thomas Edison invented the light bulb in 1879", id=4),
Context(text="Thomas Edison worked with electricity", id=5),
]
document = Document(question=question, answers=answers, contexts=contexts)
# 初始化重排序器
reranker = Reranking(method="monot5", model_name="monot5-base-msmarco")
# 应用重排序
reranker.rank([document])
# 打印重新排序的上下文
for context in document.reorder_contexts:
print(f" - {context.text}")
对于完整的检索增强生成流程:
from rankify.dataset.dataset import Document, Question, Answer, Context
from rankify.generator.generator import Generator
# 定义问题和答案
question = Question("What is the capital of France?")
answers = Answer(["Paris"])
contexts = [
Context(id=1, title="France", text="The capital of France is Paris.", score=0.9),
Context(id=2, title="Germany", text="Berlin is the capital of Germany.", score=0.5)
]
# 构建文档
doc = Document(question=question, answers=answers, contexts=contexts)
# 初始化生成器(例如,Meta Llama)
generator = Generator(method="in-context-ralm", model_name='meta-llama/Llama-3.1-8B')
# 生成答案
generated_answers = generator.generate([doc])
print(generated_answers) # 输出:["Paris"]
Rankify 完全支持自定义数据集,使其适用于实际应用:
对于仅包含问题的数据集:
from rankify.dataset.dataset import Dataset
# 加载问答数据(仅问题)
documents = Dataset.load_dataset_qa("path_to_your_input_file.json")
# 处理每个问题
for doc in documents:
question = doc["question"]
# 在此使用您的检索流程
对于带有预检索文档的数据集:
from rankify.dataset.dataset import Dataset
# 加载带有检索文档的数据集
documents = Dataset.load_dataset("path_to_your_retriever_dataset.json", top_k=100)
# 访问预检索文档
for doc in documents:
question = doc["question"]
contexts = doc["ctxs"]
# 在此使用您的重排序和生成流程
为了在生产环境中充分利用 Rankify:
如果您在使用 Rankify 时遇到问题:
有了这些安装和使用指南,您应该能够开始使用 Rankify 构建强大的检索、重排序和生成流程。框架的模块化设计允许您从简单开始,随着需求的发展逐步整合更高级的组件。
Rankify 框架中的第一个关键组件是检索器模块。检索器作为任何有效信息检索系统的基础,负责高效搜索大型文档集合以识别潜在相关信息。在本节中,我们将探讨检索器在 Rankify 流程中的作用、支持的各种检索技术以及如何在应用中有效使用它们。
检索器解决了信息检索中的一个基本挑战:从可能庞大的集合中高效识别相关文档的小子集。检索器的主要目标是在保持合理效率的同时实现高召回率(找到大部分或所有相关文档)。这个初始检索阶段至关重要,因为后续组件如重排序器和生成器只能处理检索器提取的文档。
在 Rankify 框架中,检索器设计用于:
Rankify 集成了全面的检索技术,代表了传统方法和前沿神经方法:
BM25(Best Matching 25)是基于概率检索框架的传统词袋检索函数。尽管简单,BM25 仍然是一个强大的基准,特别适用于:
Rankify 的 BM25 实现针对准确性和性能进行了优化,使其成为许多应用的可靠选择。
DPR 代表了信息检索的范式转变,使用神经网络将查询和文档编码为密集向量表示。这些嵌入捕获了超越简单关键词匹配的语义关系,即使在精确术语不匹配的情况下也能更有效地检索相关内容。
Rankify 的 DPR 实现支持:
ANCE 通过使用硬负例的迭代训练过程改进了基本的密集检索。这种方法产生更具辨别力的嵌入,能更好地区分相关和不相关文档。
Rankify 集成 ANCE 包括:
由北京人工智能研究院开发的 BGE 模型,代表了一些可用的最强大的开源嵌入模型。这些模型擅长捕获跨多种语言和领域的语义关系。
Rankify 的 BGE 集成特点:
ColBERT 引入了一种新颖的"后期交互"范式,保留了查询和文档的细粒度上下文信息。ColBERT 不是将文档压缩为单一向量,而是维护令牌级表示并计算细粒度相似度分数。
Rankify 的 ColBERT 实现包括:
Contriever 模型是无需标记数据训练的自监督密集检索器,在监督训练数据有限时特别有价值。这些模型通过精心设计的对比学习目标学习有效表示。
Rankify 支持:
预检索文档遵循一致的格式:
[
{
"question":"...",
"answers":["...","...", ...],
"ctxs":[
{
"id":"...", // 数据库 TSV 文件中的段落 ID
"score":"...", // 检索器分数
"has_answer":true|false// 段落是否包含答案
}
]
}
]
Rankify的预检索数据集托管在Hugging Face上,为研究和开发提供了宝贵的资源。这些数据集涵盖了广泛的领域和检索任务,包括:
每个数据集都遵循一致的格式,包括:
这种标准化格式使得:
要充分利用Rankify的检索器组件,请考虑这些优化策略:
检索器组件构成了Rankify信息检索流程的基础,提供了高效和有效的方法来识别相关文档。在下一节中,我们将探讨Rankify的重排序器如何进一步优化这些结果以实现更高的精确度和相关性。
在检索器识别出一组潜在相关的文档后,重排序器介入以优化和改进这些结果的排序。这是Rankify流程中的第二个阶段,对于实现高精确度和确保最相关的信息排在最前面至关重要。在本节中,我们将探讨重排序器的作用、Rankify支持的各种重排序方法,以及如何在您的应用中有效地实现它们。
重排序器解决的挑战与检索器不同。虽然检索器专注于召回率(找到大部分或所有相关文档)和大集合的效率,但重排序器优先考虑精确度(确保最相关的文档排名最高),并且可以在仅处理少量文档的情况下使用更复杂的计算方法。
在Rankify框架中,重排序器的设计目标是:
Rankify支持令人印象深刻的24+种最先进的重排序模型,分为两大类:逐点重排序和列表式重排序。
逐点重排序器独立评估每个查询-文档对,在不考虑结果集中其他文档的情况下分配相关性分数。这些模型通常更容易实现和训练,但可能会错过文档质量的重要上下文信息。
RankT5利用强大的T5(Text-to-Text Transfer Transformer)架构进行文档重排序。它将重排序任务框架为文本生成问题,其中模型经过微调以生成相关性指标。
Rankify的RankT5实现的主要特性:
与RankT5类似,MonoT5也使用T5架构,但特别关注逐点相关性评估。该模型经过训练直接输出"true"或"false"以指示文档相关性。
Rankify的MonoT5实现包括:
FlashRank是一个针对低延迟应用优化的轻量级重排序模型。它使用知识蒸馏技术压缩更大的模型,同时保持竞争性能。
Rankify的FlashRank实现特性:
基于Sentence Transformer的重排序器使用双编码器模型来计算查询和文档嵌入之间的相似度。虽然技术上与某些检索器类似,但这些模型通常专门针对重排序任务进行微调。
Rankify集成了:
InRanker是一个基于对比学习的增量重排序器,可以逐步优化候选列表。它特别适用于动态数据分布。
Rankify的实现包括:
APIRanker为第三方重排序API(如Cohere Rerank或Google Vertex AI)提供了一个便捷的封装器,允许与外部重排序服务无缝集成。
主要特性:
UPR是一个独特的无监督重排序器,利用预训练语言模型的固有知识来评估相关性,无需标记训练数据。
Rankify的UPR实现提供:
Rankify还支持几种其他逐点重排序方法:
列表式重排序器在做出排序决策时考虑整个检索文档集。这种全局视角允许它们捕获文档之间的依赖关系并优化整体排序质量,通常比逐点方法实现更好的性能。
RankGPT利用像GPT-4或GPT-3.5这样的大型语言模型通过将任务框架为自然语言指令来重排序文档。模型被提示根据查询相关性对文档列表进行排序。
Rankify的RankGPT实现包括:
ListT5扩展了T5架构以处理列表式重排序。它不是独立评分文档,而是处理整个候选列表以生成全局最优排序。
Rankify中的主要特性:
Rankify中的LiT5(Listwise T5)变体包括:
这些模型平衡了列表式感知的优势和高效实现。
LLM Layerwise重排序器使用大型语言模型的不同层的表示进行多粒度排序。浅层捕获词汇模式,而深层表示语义理解。
Rankify的实现特性:
与RankGPT类似但专门设计用于基于API的LLM服务,RankGPT-API提供了一种在不需要本地部署的情况下利用强大模型的经济有效的方式。
主要功能:
Rankify还支持几种其他列表式重排序方法:
Rankify的重排序器实现包含几项技术创新,以确保效果和效率:
许多重排序器,特别是基于大型语言模型的重排序器,可能计算密集。Rankify通过以下方式解决这个挑战:
Rankify支持各种评分方法:
在Rankify提供的众多重排序选项中,为您的特定需求选择正确的方法可能具有挑战性。以下是一些指导原则:
重排序器组件显著提升了Rankify流程中搜索结果的质量,确保最相关的文档被优先考虑用于下游任务。在下一节中,我们将探讨Rankify的生成器如何利用这些高质量排序的文档来生成连贯、上下文相关的文本输出。
生成器模块是Rankify流程中的最后一个组件,它利用检索和重排序的信息来生成连贯、上下文相关的文本输出。该组件是检索增强生成(RAG)的核心,这是一种强大的范式,结合了检索系统的知识访问能力和大型语言模型的流畅文本生成能力。在本节中,我们将探讨生成器在Rankify框架中的作用、支持的各种RAG方法,以及如何在您的应用中有效地实现它们。
检索增强生成解决了大型语言模型的一个基本限制:它们的知识仅限于训练期间学习的内容,无法直接访问或引用外部信息。RAG系统通过以下方式克服这一限制:
这种方法提供了几个显著的优势:
在Rankify框架中,生成器建立在检索器和重排序器的工作基础上,创建一个完整的端到端流程用于知识密集型NLP任务。
Rankify实现了几种最先进的RAG方法,每种方法都具有独特的特点和优势:
零样本RAG代表了最简单和最灵活的检索增强生成方法。在这种方法中,检索的文档与查询一起直接作为上下文提供给语言模型,无需任何任务特定的微调。
Rankify的零样本RAG实现特性:
示例用例:
Fusion-in-Decoder是一种更复杂的RAG方法,在编码器中独立处理每个检索文档,然后在解码器中融合所有文档表示以生成全面的答案。这种架构擅长整合来自多个来源的信息。
Rankify的FiD实现的主要特性:
示例用例:
上下文内RAG利用大型语言模型的少样本学习能力,不仅提供检索的文档,还提供如何有效使用该信息的示例。这种方法特别适用于复杂推理任务。
Rankify的上下文内RAG实现包括:
示例用例:
Rankify还支持几种其他RAG方法和扩展:
Rankify的生成器实现包含几项技术创新,以确保效果和效率:
RAG系统的一个关键挑战是管理语言模型的上下文窗口限制。Rankify通过以下方式解决这个问题:
有效的提示设计对RAG性能至关重要。Rankify提供:
Rankify支持广泛的语言模型用于生成:
要充分利用Rankify的生成器组件,请考虑这些优化策略:
Rankify的生成器组件支持广泛的实际应用:
构建全面的问答系统,可以:
创建对话代理,可以:
开发内容创建工具,可以:
构建研究支持系统,可以:
生成器组件完成了Rankify的端到端流程,将检索和重排序的信息转化为连贯、上下文相关的文本输出。通过结合检索系统和语言模型的优势,Rankify使开发能够前所未有地有效访问、处理和利用外部知识的强大应用成为可能。
Rankify代表了信息检索和检索增强生成领域的重要进展。通过提供全面、模块化和高效的框架用于检索、重排序和生成任务,它使研究人员、数据科学家和开发人员能够构建强大的应用,有效地查找、排序和利用相关信息。
在本文中,我们探讨了构成Rankify强大工具包的三个核心组件:
Rankify的模块化设计允许这些组件独立使用或组合成定制的流程,提供了解决广泛信息检索和生成任务的灵活性。
Rankify最大的优势之一是其模块化架构。这种设计理念提供了几个关键优势:
这种模块化使Rankify适用于广泛的用户,从寻求最小设置快速解决方案的用户到需要尖端功能进行高级实验的研究人员。
Rankify对自定义数据集的强大支持是另一个突出特点。无论您是使用仅包含问题的数据集还是包含预检索文档的集合,Rankify都提供了直接的方法来集成您的数据:
Dataset.load_dataset_qa()
加载自定义问题进行检索。Dataset.load_dataset()
处理已包含检索文档的数据集。这种灵活性确保了Rankify可以适应多样化的领域和应用,从通用问答到高度专门化的技术或科学用例。
随着信息检索和检索增强生成领域的持续发展,Rankify已做好准备整合新的进展和技术。未来的发展可能包括:
我们鼓励您探索Rankify并发现它如何增强您的信息检索和生成项目:
pip install rankify
或pip install "rankify[all]"
无论您是在构建问答系统、实现文档检索应用,还是开发知识密集型NLP解决方案,Rankify都提供了帮助您成功的工具和灵活性。
通过在模块化和易访问的框架中结合最先进的检索技术、强大的重排序模型和先进的生成方法,Rankify代表了向更广泛的研究人员和实践者提供高级信息检索和RAG功能的重要一步。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-10-27
2024-09-04
2024-07-18
2024-05-05
2024-06-20
2024-06-13
2024-07-09
2024-07-09
2024-05-19
2024-07-07
2025-04-16
2025-04-14
2025-04-13
2025-04-11
2025-04-09
2025-04-07
2025-04-05
2025-04-04