📢 特别感谢 Xiumao 对 Rankify 的大力支持与推广!
以下是他撰写的两篇精彩中文解析文章,为用户更好理解 Rankify 提供了重要帮助:
如果你喜欢我们的框架,请不要犹豫,⭐ 给这个仓库加星 ⭐。这将帮助我们使 Rankify 变得更强大,并扩展到更多模型和方法 🤗。
一个模块化且高效的检索、重排序和 RAG 框架,专为最新的检索、排序和 RAG 任务模型设计。
Rankify 是一个 Python 工具包,专为统一的检索、重排序和检索增强生成(RAG)研究而构建。该工具包集成了 40 个预检索的基准数据集,支持 7 种检索技术,包含 24 种最先进的重排序模型,并支持多种 RAG 方法。Rankify 提供一个模块化且可扩展的框架,使研究人员和实践者能够轻松进行实验和基准测试,涵盖完整的检索流程。详细的文档、开源实现和预构建的评估工具,使 Rankify 成为该领域研究者和工程师的强大工具。
要在本地运行演示,请执行以下操作:
# 确保已安装 Rankify
pip install streamlit
# 然后运行演示
streamlit run demo.py2025-04-01.15-42-57-Cut-Merged-1743516492419.mp4
-
全面的检索与重排序框架:Rankify 将检索、重排序和检索增强生成(RAG)整合为一个模块化的 Python 工具包,支持无缝实验和基准测试。
-
广泛的数据集支持:包含 40 个基准数据集,提供 预检索文档,涵盖 问答、对话、实体链接和事实验证等多个领域。
-
多样化的检索器集成:支持 7 种检索技术,包括 BM25、DPR、ANCE、BPR、ColBERT、BGE 和 Contriever,提供灵活的检索策略选择。
-
先进的重排序模型:实现 24 种主流重排序模型 和 41 种子方法,涵盖 点对、对对(pairwise)、列表级(listwise) 重排序方法,以提升排名性能。
-
预构建检索索引:提供 预计算的 Wikipedia 和 MS MARCO 语料库,适用于多种检索模型,减少索引开销,加速实验进程。
-
无缝 RAG 集成:连接检索与生成模型(如 GPT、LLAMA、T5),支持 零样本(zero-shot)、解码器融合(Fusion-in-Decoder,FiD) 和 上下文学习(in-context learning) 等 RAG 生成策略。
-
模块化 & 可扩展设计:通过 Rankify 结构化的 Python API,轻松集成自定义数据集、检索器、重排序模型和生成模型。
-
全面的评估套件:提供 自动化性能评估,涵盖 检索、排序和 RAG 评测指标,确保可复现的基准测试。
-
用户友好的文档支持:提供详细的 📖 在线文档、示例笔记本和教程,便于快速上手。
Rankify 仍在积极开发中,目前已发布首个版本(v0.1.0)。尽管当前已支持多种检索、重排序和 RAG 技术,我们仍在不断增强其功能,计划增加更多的检索器、排序器、数据集和特性。
-
检索器(Retrievers)
- 支持 BM25、DPR、ANCE、BPR、ColBERT、BGE 和 Contriever
- 添加缺失的检索器:Spar、MSS、MSS-DPR
- 支持 自定义索引加载,允许用户定义检索语料库
-
重排序器(Re-Rankers)
- 24 种主流重排序模型,包含 41 种子方法
- 扩展支持,添加 更先进的排序模型
-
数据集(Datasets)
- 提供 40 个用于检索、排序和 RAG 的基准数据集
- 增加 更多数据集
- 支持 自定义数据集集成
-
检索增强生成(RAG)
- 已集成 GPT、LLAMA 和 T5
- 扩展支持 更多生成模型
-
评估与可用性(Evaluation & Usability)
- 提供标准的检索与排序评估指标(Top-K、EM、Recall...)
- 增加 更高级的评估指标(如 NDCG、MAP 用于检索器评估)
-
流程集成(Pipeline Integration)
- 新增流水线模块,简化检索、重排序和 RAG 工作流
首先,使用 Python 3.10 创建并激活 conda 环境:
conda create -n rankify python=3.10
conda activate rankify我们推荐使用 PyTorch 2.5.1 来安装 Rankify。请参考 PyTorch installation page 获取特定平台的安装命令。
如果你可以使用 GPU,我们建议安装支持 CUDA 12.4 或 12.6 版本的 PyTorch,因为许多评估指标已针对 GPU 进行了优化。
安装 PyTorch 2.5.1,可使用以下命令:
pip install torch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 --index-url https://download.pytorch.org/whl/cu124要安装 Rankify,只需使用 pip(要求 Python 3.10 及以上版本):
pip install rankify
此命令将安装 Rankify 的基本功能,包括检索、重排序和检索增强生成(RAG)。
为了获得完整功能,推荐安装 Rankify 及所有依赖项:
pip install "rankify[all]"这将确保所有必要的模块,包括检索、重排序和 RAG 支持,均已安装。
如果你只想安装特定组件,可使用以下命令:
# 仅安装检索相关依赖(支持 BM25、DPR、ANCE 等)
pip install "rankify[retriever]"
# 安装基础重排序组件,包括 vLLM 支持的 `FirstModelReranker`、`LiT5ScoreReranker`、`LiT5DistillReranker`、`VicunaReranker` 和 `ZephyrReranker`
pip install "rankify[reranking]"从 GitHub 安装最新开发版本 如果希望获取最新的开发版本,可从 GitHub 进行安装:
git clone https://github.com/DataScienceUIBK/rankify.git
cd rankify
pip install -e .
# 安装所有依赖项(推荐)
pip install -e ".[all]"
# 仅安装检索相关依赖
pip install -e ".[retriever]"
# 仅安装重排序相关依赖
pip install -e ".[reranking]"如果你想使用 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/*我们提供 每个数据集 1,000 条预检索文档,你可以从以下链接下载:
预检索的文档结构如下:
[
{
"question": "...",
"answers": ["...", "...", ...],
"ctxs": [
{
"id": "...", // 数据库 TSV 文件中的段落 ID
"score": "...", // 检索器分数
"has_answer": true|false // 该段落是否包含正确答案
}
]
}
]你可以通过 Rankify 轻松下载和使用预检索数据集。
要查看所有可用的数据集,请运行以下代码:
from rankify.dataset.dataset import Dataset
# 显示可用数据集
Dataset.available_dataset()BM25 检索器数据集
from rankify.dataset.dataset import Dataset
# 下载 nq-dev 数据集的 BM25 检索文档
dataset = Dataset(retriever="bm25", dataset_name="nq-dev", n_docs=100)
documents = dataset.download(force_download=False)
# 下载 2wikimultihopqa-train 数据集的 BM25 检索文档
dataset = Dataset(retriever="bm25", dataset_name="2wikimultihopqa-train", n_docs=100)
documents = dataset.download(force_download=False)
# 下载 archivialqa-dev 数据集的 BM25 检索文档
dataset = Dataset(retriever="bm25", dataset_name="archivialqa-dev", n_docs=100)
documents = dataset.download(force_download=False)
# 下载 archivialqa-test 数据集的 BM25 检索文档
dataset = Dataset(retriever="bm25", dataset_name="archivialqa-test", n_docs=100)
documents = dataset.download(force_download=False)
# 下载 chroniclingamericaqa-test 数据集的 BM25 检索文档
dataset = Dataset(retriever="bm25", dataset_name="chroniclingamericaqa-test", n_docs=100)
documents = dataset.download(force_download=False)
# 下载 chroniclingamericaqa-dev 数据集的 BM25 检索文档
dataset = Dataset(retriever="bm25", dataset_name="chroniclingamericaqa-dev", n_docs=100)
documents = dataset.download(force_download=False)
# 下载 entityquestions-test 数据集的 BM25 检索文档
dataset = Dataset(retriever="bm25", dataset_name="entityquestions-test", n_docs=100)
documents = dataset.download(force_download=False)
# 下载 ambig_qa-dev 数据集的 BM25 检索文档
dataset = Dataset(retriever="bm25", dataset_name="ambig_qa-dev", n_docs=100)
documents = dataset.download(force_download=False)
# 下载 ambig_qa-train 数据集的 BM25 检索文档
dataset = Dataset(retriever="bm25", dataset_name="ambig_qa-train", n_docs=100)
documents = dataset.download(force_download=False)
# 下载 arc-test 数据集的 BM25 检索文档
dataset = Dataset(retriever="bm25", dataset_name="arc-test", n_docs=100)
documents = dataset.download(force_download=False)
# 下载 arc-dev 数据集的 BM25 检索文档
dataset = Dataset(retriever="bm25", dataset_name="arc-dev", n_docs=100)
documents = dataset.download(force_download=False)BGE 检索器数据集
from rankify.dataset.dataset import Dataset
# 下载 nq-dev 数据集的 BGE 检索文档
dataset = Dataset(retriever="bge", dataset_name="nq-dev", n_docs=100)
documents = dataset.download(force_download=False)
# 下载 2wikimultihopqa-train 数据集的 BGE 检索文档
dataset = Dataset(retriever="bge", dataset_name="2wikimultihopqa-train", n_docs=100)
documents = dataset.download(force_download=False)
# 下载 archivialqa-dev 数据集的 BGE 检索文档
dataset = Dataset(retriever="bge", dataset_name="archivialqa-dev", n_docs=100)
documents = dataset.download(force_download=False)ColBERT 检索器数据集
from rankify.dataset.dataset import Dataset
# 下载 nq-dev 数据集的 ColBERT 检索文档
dataset = Dataset(retriever="colbert", dataset_name="nq-dev", n_docs=100)
documents = dataset.download(force_download=False)
# 下载 2wikimultihopqa-train 数据集的 ColBERT 检索文档
dataset = Dataset(retriever="colbert", dataset_name="2wikimultihopqa-train", n_docs=100)
documents = dataset.download(force_download=False)
# 下载 archivialqa-dev 数据集的 ColBERT 检索文档
dataset = Dataset(retriever="colbert", dataset_name="archivialqa-dev", n_docs=100)
documents = dataset.download(force_download=False)MSS-DPR 检索器数据集
from rankify.dataset.dataset import Dataset
# 下载 nq-dev 数据集的 MSS-DPR 检索文档
dataset = Dataset(retriever="mss-dpr", dataset_name="nq-dev", n_docs=100)
documents = dataset.download(force_download=False)
# 下载 2wikimultihopqa-train 数据集的 MSS-DPR 检索文档
dataset = Dataset(retriever="mss-dpr", dataset_name="2wikimultihopqa-train", n_docs=100)
documents = dataset.download(force_download=False)
# 下载 archivialqa-dev 数据集的 MSS-DPR 检索文档
dataset = Dataset(retriever="mss-dpr", dataset_name="archivialqa-dev", n_docs=100)
documents = dataset.download(force_download=False)MSS 检索器数据集
from rankify.dataset.dataset import Dataset
# 下载 nq-dev 数据集的 MSS 检索文档
dataset = Dataset(retriever="mss", dataset_name="nq-dev", n_docs=100)
documents = dataset.download(force_download=False)
# 下载 2wikimultihopqa-train 数据集的 MSS 检索文档
dataset = Dataset(retriever="mss", dataset_name="2wikimultihopqa-train", n_docs=100)
documents = dataset.download(force_download=False)
# 下载 archivialqa-dev 数据集的 MSS 检索文档
dataset = Dataset(retriever="mss", dataset_name="archivialqa-dev", n_docs=100)
documents = dataset.download(force_download=False)Contriever 检索器数据集
from rankify.dataset.dataset import Dataset
# 下载 nq-dev 数据集的 Contriever 检索文档
dataset = Dataset(retriever="contriever", dataset_name="nq-dev", n_docs=100)
documents = dataset.download(force_download=False)
# 下载 2wikimultihopqa-train 数据集的 Contriever 检索文档
dataset = Dataset(retriever="contriever", dataset_name="2wikimultihopqa-train", n_docs=100)
documents = dataset.download(force_download=False)
# 下载 archivialqa-dev 数据集的 Contriever 检索文档
dataset = Dataset(retriever="contriever", dataset_name="archivialqa-dev", n_docs=100)
documents = dataset.download(force_download=False)ANCE 检索器数据集
from rankify.dataset.dataset import Dataset
# 下载 nq-dev 数据集的 ANCE 检索文档
dataset = Dataset(retriever="ance", dataset_name="nq-dev", n_docs=100)
documents = dataset.download(force_download=False)
# 下载 2wikimultihopqa-train 数据集的 ANCE 检索文档
dataset = Dataset(retriever="ance", dataset_name="2wikimultihopqa-train", n_docs=100)
documents = dataset.download(force_download=False)
# 下载 archivialqa-dev 数据集的 ANCE 检索文档
dataset = Dataset(retriever="ance", dataset_name="archivialqa-dev", n_docs=100)
documents = dataset.download(force_download=False)从文件加载预检索数据集
如果你已经下载了数据集,可以直接加载它:
from rankify.dataset.dataset import Dataset
# 加载已下载的 WebQuestions 数据集(BM25 检索结果)
documents = Dataset.load_dataset('./tests/out-datasets/bm25/web_questions/test.json', 100)现在,你可以将 检索文档 与 重排序 和 RAG 工作流集成!🚀
下表概述了每个数据集在不同检索方法(BM25、DPR、ColBERT、ANCE、BGE、Contriever)的可用性。
✅ 已完成
🕒 待处理
| 数据集 | BM25 | DPR | ColBERT | ANCE | BGE | Contriever |
|---|---|---|---|---|---|---|
| 2WikimultihopQA | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| ArchivialQA | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| ChroniclingAmericaQA | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| EntityQuestions | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| AmbigQA | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| ARC | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| ASQA | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| MS MARCO | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| AY2 | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| Bamboogle | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| BoolQ | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| CommonSenseQA | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| CuratedTREC | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| ELI5 | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| FERMI | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| FEVER | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| HellaSwag | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| HotpotQA | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| MMLU | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| Musique | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| NarrativeQA | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| NQ | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| OpenbookQA | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| PIQA | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| PopQA | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| Quartz | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| SIQA | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| StrategyQA | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| TREX | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| TriviaQA | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| TruthfulQA | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| TruthfulQA | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| WebQ | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| WikiQA | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| WikiAsp | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| WikiPassageQA | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| WNED | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| WoW | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
| Zsre | ✅ | 🕒 | 🕒 | 🕒 | 🕒 | 🕒 |
使用 Rankify 进行检索时,您可以选择多种检索方法,例如 BM25、DPR、ANCE、Contriever、ColBERT 和 BGE。
示例:对示例查询运行检索
from rankify.dataset.dataset import Document, Question, Answer, Context
from rankify.retrievers.retriever import Retriever
# 示例文档
documents = [
Document(question=Question("《虎胆龙威5》的演员阵容?"), answers=Answer([
"Jai Courtney",
"Sebastian Koch",
"Radivoje Bukvić",
"Yuliya Snigir",
"Sergei Kolesnikov",
"Mary Elizabeth Winstead",
"Bruce Willis"
]), contexts=[]),
Document(question=Question("《哈姆雷特》的作者是谁?"), answers=Answer(["莎士比亚"]), contexts=[])
]# 在 Wikipedia 上使用 BM25 进行检索
bm25_retriever_wiki = Retriever(method="bm25", n_docs=5, index_type="wiki")
# 在 MS MARCO 上使用 BM25 进行检索
bm25_retriever_msmacro = Retriever(method="bm25", n_docs=5, index_type="msmarco")
# 在 Wikipedia 上使用 DPR(多编码器)进行检索
dpr_retriever_wiki = Retriever(method="dpr", model="dpr-multi", n_docs=5, index_type="wiki")
# 在 MS MARCO 上使用 DPR(多编码器)进行检索
dpr_retriever_msmacro = Retriever(method="dpr", model="dpr-multi", n_docs=5, index_type="msmarco")
# 在 Wikipedia 上使用 DPR(单编码器)进行检索
dpr_retriever_wiki = Retriever(method="dpr", model="dpr-single", n_docs=5, index_type="wiki")
# 在 MS MARCO 上使用 DPR(单编码器)进行检索
dpr_retriever_msmacro = Retriever(method="dpr", model="dpr-single", n_docs=5, index_type="msmarco")
# 在 Wikipedia 上使用 ANCE 进行检索
ance_retriever_wiki = Retriever(method="ance", model="ance-multi", n_docs=5, index_type="wiki")
# 在 MS MARCO 上使用 ANCE 进行检索
ance_retriever_msmacro = Retriever(method="ance", model="ance-multi", n_docs=5, index_type="msmarco")
# 在 Wikipedia 上使用 Contriever 进行检索
contriever_retriever_wiki = Retriever(method="contriever", model="facebook/contriever-msmarco", n_docs=5, index_type="wiki")
# 在 MS MARCO 上使用 Contriever 进行检索
contriever_retriever_msmacro = Retriever(method="contriever", model="facebook/contriever-msmarco", n_docs=5, index_type="msmarco")
# 在 Wikipedia 上使用 ColBERT 进行检索
colbert_retriever_wiki = Retriever(method="colbert", model="colbert-ir/colbertv2.0", n_docs=5, index_type="wiki")
# 在 MS MARCO 上使用 ColBERT 进行检索
colbert_retriever_msmacro = Retriever(method="colbert", model="colbert-ir/colbertv2.0", n_docs=5, index_type="msmarco")
# 在 Wikipedia 上使用 BGE 进行检索
bge_retriever_wiki = Retriever(method="bge", model="BAAI/bge-large-en-v1.5", n_docs=5, index_type="wiki")
# 在 MS MARCO 上使用 BGE 进行检索
bge_retriever_msmacro = Retriever(method="bge", model="BAAI/bge-large-en-v1.5", n_docs=5, index_type="msmarco")运行检索
定义检索器后,可以使用以下代码检索文档:
retrieved_documents = bm25_retriever_wiki.retrieve(documents)
for i, doc in enumerate(retrieved_documents):
print(f"\n文档 {i+1}:")
print(doc)Rankify 支持多种重排序模型。以下是使用每种模型的示例。
示例:对文档进行重排序
from rankify.dataset.dataset import Document, Question, Answer, Context
from rankify.models.reranking import Reranking
# 示例文档设置
question = Question("托马斯·爱迪生何时发明了灯泡?")
answers = Answer(["1879"])
contexts = [
Context(text="首尔国立大学发生雷击事件", id=1),
Context(text="托马斯·爱迪生曾尝试为汽车发明一种装置,但失败了", id=2),
Context(text="咖啡有助于减肥", id=3),
Context(text="托马斯·爱迪生于 1879 年发明了灯泡", id=4),
Context(text="托马斯·爱迪生研究电力", 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}")使用不同重排序模型的示例
# UPR
model = Reranking(method='upr', model_name='t5-base')
# 基于 API 的重排序器
model = Reranking(method='apiranker', model_name='voyage', api_key='your-api-key')
model = Reranking(method='apiranker', model_name='jina', api_key='your-api-key')
model = Reranking(method='apiranker', model_name='mixedbread.ai', api_key='your-api-key')
# Blender Reranker
model = Reranking(method='blender_reranker', model_name='PairRM')
# ColBERT Reranker
model = Reranking(method='colbert_ranker', model_name='Colbert')
# EchoRank
model = Reranking(method='echorank', model_name='flan-t5-large')
# First Ranker
model = Reranking(method='first_ranker', model_name='base')
# FlashRank
model = Reranking(method='flashrank', model_name='ms-marco-TinyBERT-L-2-v2')
# InContext Reranker
Reranking(method='incontext_reranker', model_name='llamav3.1-8b')
# InRanker
model = Reranking(method='inranker', model_name='inranker-small')
# ListT5
model = Reranking(method='listt5', model_name='listt5-base')
# LiT5 Distill
model = Reranking(method='lit5distill', model_name='LiT5-Distill-base')
# LiT5 Score
model = Reranking(method='lit5score', model_name='LiT5-Distill-base')
# LLM Layerwise Ranker
model = Reranking(method='llm_layerwise_ranker', model_name='bge-multilingual-gemma2')
# LLM2Vec
model = Reranking(method='llm2vec', model_name='Meta-Llama-31-8B')
# MonoBERT
model = Reranking(method='monobert', model_name='monobert-large')
# MonoT5
Reranking(method='monot5', model_name='monot5-base-msmarco')
# RankGPT
model = Reranking(method='rankgpt', model_name='llamav3.1-8b')
# RankGPT API
model = Reranking(method='rankgpt-api', model_name='gpt-3.5', api_key="gpt-api-key")
model = Reranking(method='rankgpt-api', model_name='gpt-4', api_key="gpt-api-key")
model = Reranking(method='rankgpt-api', model_name='llamav3.1-8b', api_key="together-api-key")
model = Reranking(method='rankgpt-api', model_name='claude-3-5', api_key="claude-api-key")
# RankT5
model = Reranking(method='rankt5', model_name='rankt5-base')
# Sentence Transformer Reranker
model = Reranking(method='sentence_transformer_reranker', model_name='all-MiniLM-L6-v2')
model = Reranking(method='sentence_transformer_reranker', model_name='gtr-t5-base')
model = Reranking(method='sentence_transformer_reranker', model_name='sentence-t5-base')
model = Reranking(method='sentence_transformer_reranker', model_name='distilbert-multilingual-nli-stsb-quora-ranking')
model = Reranking(method='sentence_transformer_reranker', model_name='msmarco-bert-co-condensor')
# SPLADE
model = Reranking(method='splade', model_name='splade-cocondenser')
# Transformer Ranker
model = Reranking(method='transformer_ranker', model_name='mxbai-rerank-xsmall')
model = Reranking(method='transformer_ranker', model_name='bge-reranker-base')
model = Reranking(method='transformer_ranker', model_name='bce-reranker-base')
model = Reranking(method='transformer_ranker', model_name='jina-reranker-tiny')
model = Reranking(method='transformer_ranker', model_name='gte-multilingual-reranker-base')
model = Reranking(method='transformer_ranker', model_name='nli-deberta-v3-large')
model = Reranking(method='transformer_ranker', model_name='ms-marco-TinyBERT-L-6')
model = Reranking(method='transformer_ranker', model_name='msmarco-MiniLM-L12-en-de-v1')
# TwoLAR
model = Reranking(method='twolar', model_name='twolar-xl')
# Vicuna Reranker
model = Reranking(method='vicuna_reranker', model_name='rank_vicuna_7b_v1')
# Zephyr Reranker
model = Reranking(method='zephyr_reranker', model_name='rank_zephyr_7b_v1_full')Rankify 提供了一个 生成器模块,用于 检索增强生成 (RAG),将检索到的文档集成到生成模型中,以生成答案。以下是如何使用不同生成方法的示例。
from rankify.dataset.dataset import Document, Question, Answer, Context
from rankify.generator.generator import Generator
# 定义问题和答案
question = Question("法国的首都是哪里?")
answers = Answer(["巴黎"])
contexts = [
Context(id=1, title="法国", text="法国的首都是巴黎。", score=0.9),
Context(id=2, title="德国", text="柏林是德国的首都。", 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) # 输出: ["巴黎"]Rankify 提供了内置的 评估指标,用于 检索、重排名和检索增强生成 (RAG)。这些指标有助于评估检索文档的质量、排名模型的有效性以及生成答案的准确性。
评估生成的答案
您可以通过将生成的答案与真实答案进行比较来评估 检索增强生成 (RAG) 结果 的质量。
from rankify.metrics.metrics import Metrics
from rankify.dataset.dataset import Dataset
# 加载数据集
dataset = Dataset('bm25', 'nq-test', 100)
documents = dataset.download(force_download=False)
# 初始化生成器
generator = Generator(method="in-context-ralm", model_name='meta-llama/Llama-3.1-8B')
# 生成答案
generated_answers = generator.generate(documents)
# 评估生成的答案
metrics = Metrics(documents)
print(metrics.calculate_generation_metrics(generated_answers))评估检索性能
# 计算重排序前的检索指标
metrics = Metrics(documents)
before_ranking_metrics = metrics.calculate_retrieval_metrics(ks=[1, 5, 10, 20, 50, 100], use_reordered=False)
print(before_ranking_metrics)评估重排序结果
# 计算重排序后的检索指标
after_ranking_metrics = metrics.calculate_retrieval_metrics(ks=[1, 5, 10, 20, 50, 100], use_reordered=True)
print(after_ranking_metrics)- ✅ BM25
- ✅ DPR
- ✅ ColBERT
- ✅ ANCE
- ✅ BGE
- ✅ Contriever
- ✅ BPR
- 🕒 Spar
- 🕒 Dragon
- 🕒 Hybird
- ✅ 交叉编码器(Cross-Encoders)
- ✅ RankGPT
- ✅ RankGPT-API
- ✅ MonoT5
- ✅ MonoBert
- ✅ RankT5
- ✅ ListT5
- ✅ LiT5Score
- ✅ LiT5Dist
- ✅ Vicuna 重新排序器
- ✅ Zephyr 重新排序器
- ✅ 基于句子转换器(Sentence Transformer-based)
- ✅ FlashRank 模型
- ✅ 基于 API 的重新排序器(API-Based Rerankers)
- ✅ ColBERT 重新排序器
- ✅ LLM 层次化排名器(Layerwise Ranker)
- ✅ Splade 重新排序器
- ✅ UPR 重新排序器
- ✅ Inranker 重新排序器
- ✅ Transformer 重新排序器
- ✅ FIRST 重新排序器
- ✅ Blender 重新排序器
- ✅ LLM2VEC 重新排序器
- ✅ ECHO 重新排序器
- ✅ Incontext 重新排序器
- 🕒 DynRank
- 🕒 ASRank
- ✅ 融合解码(Fusion-in-Decoder, FiD)与 T5
- ✅ 上下文学习 RLAM(In-Context Learning RLAM)
完整的 API 文档请访问 Rankify 文档。
按照以下步骤参与贡献:
-
Fork 这个仓库 到您的 GitHub 账户。
-
创建一个新分支 用于您的功能或修复:
git checkout -b feature/YourFeatureName- 进行更改 并 提交修改:
git commit -m "Add YourFeatureName"- 推送更改 到您的分支:
git push origin feature/YourFeatureName- 提交 Pull Request 以提议您的更改。
感谢您的贡献,让这个项目变得更好!
Rankify 采用 Apache-2.0 许可证 发布 - 详情请参阅 LICENSE 文件。
我们要向以下开源库表示衷心感谢,它们对 Rankify 的开发提供了巨大帮助:
-
Rerankers – 一个强大的 Python 库,用于集成各种重排序方法。
🔗 GitHub 仓库 -
Pyserini – 一个支持 BM25 检索并可与稀疏/稠密检索器集成的工具包。
🔗 GitHub 仓库 -
FlashRAG – 一个模块化框架,用于检索增强生成(RAG)研究。
🔗 GitHub 仓库
如果 Rankify 对您的研究有帮助,请引用我们的论文:
@article{abdallah2025rankify,
title={Rankify: A Comprehensive Python Toolkit for Retrieval, Re-Ranking, and Retrieval-Augmented Generation},
author={Abdallah, Abdelrahman and Mozafari, Jamshid and Piryani, Bhawna and Ali, Mohammed and Jatowt, Adam},
journal={arXiv preprint arXiv:2502.02464},
year={2025}
}

