一款好用的开源工具,高效实现Reranker 原创
Reranker 是任何检索架构(RAG、Agent等)的重要组成部分,但它们通常也比PipeLine中其他部分更模糊。有时,甚至很难知道该使用哪一个。每个问题都是不同的,使用 X 的最佳模型不一定与使用 Y 的模型相同;新的重新排名方法不断涌现,该如何兼容他们呢?今天介绍一款高效扩展工具rerankers:
设计目标
新的重新排名方法不断涌现:例如,RankGPT 使用 LLM 对文档进行重新排序,就在去年出现,取得了非常有希望的零样本基准测试结果。
所有不同的重新排名方法往往都在自己的库中完成,具有不同级别的文档。这导致了更高的进入门槛。新用户需要在多种不熟悉的输入/输出格式之间切换,所有这些格式都有自己的怪癖!
rerankers目标是:
- 🪶轻。它仅提供作为依赖项的基本必需品。
- 📖 易于理解。只需学习少数几个calls,然后您可以使用提供的所有重新排名模型。
- 🔗易于集成。它应该适合几乎任何现有的管道,只需几行代码!
- 💪易于扩展。只需对代码库知之甚少,即可添加任何新的重新排名模型。您所需要的只是一个新类,其中包含一个将 (query, [documents]) 输入映射到output.rank()
- 🐛易于调试。这是一个测试版,可能会有问题,但代码库的构思方式使大多数问题都应该易于跟踪并尽快修复。
支持的模型
目前项目库支持各类rerank模型:
- ✅ 任何标准的 SentenceTransformer 或 Transformers 交叉编码器
- ✅ RankGPT (可通过原始 RankGPT 实现和改进的 RankLLM 实现获得)
- ✅ 基于T5 的pointwise排名器(InRanker、MonoT5...)
- ✅ 基于LLM 的pointwise排名器(BAAI/bge-reranker-v2.5-gemma2-lightweight 等)
- ✅ Cohere、Jina、Voyage 和 MixedBread API 重新排名器
- ✅ FlashRank 重新排序器(ONNX 优化模型,在 CPU 上非常快)
- ✅ 基于 ColBERT 的 reranker - 不是最初为重新排序而设计的模型,但在某些情况下确实表现得相当强大。实现是轻量级的,仅基于 transformers。
- 🟠⭐ RankLLM/RankZephyr:通过包装 rank-llm 库库来支持!对 RankZephyr/RankVicuna 的支持未经测试,但 RankLLM + GPT 模型完全有效!
工具安装
工具安装比较简单,一行即可:
# All transformers-based approaches (cross-encoders, t5, colbert)
pip install "rerankers[transformers]"
# API-based rerankers (Cohere, Jina, soon MixedBread)
pip install "rerankers[api]"
# FlashRank rerankers (ONNX-optimised, very fast on CPU)
pip install "rerankers[flashrank]"
# All of the above
pip install "rerankers[all]"
工具调用
模型加载
无论架构如何,都可以在一行中加载任何受支持的 reranker:
from rerankers import Reranker
# Cross-encoder default. You can specify a 'lang' parameter to load a multilingual version!
ranker = Reranker('cross-encoder')
# RankLLM with specified GPT models
ranker = Reranker('gpt-4-turbo', model_type="rankllm", api_key = API_KEY)
# ColBERTv2 reranker
ranker = Reranker("colbert")
# ... Or a non-default colbert model:
ranker = Reranker(model_name_or_path, model_type = "colbert")
Rerankers 将始终尝试根据其名称推断您尝试使用的模型,但如果可以,向其传递 model_type
参数总是更安全的!
模型推理
无论加载了哪个 reranker,都使用加载的模型对 documents 的查询进行排名,也支持异步调用:
results = ranker.rank(query="I love you", docs=["I hate you", "I really like you"], doc_ids=[0,1])
# 异步用法
results = await ranker.rank_async(query="I love you", docs=["I hate you", "I really like you"], doc_ids=[0,1])
results
result:
RankedResults(results=[
Result(document=Document(text='I really like you', doc_id=1), score=-2.453125, rank=1),
Result(document=Document(text='I hate you', doc_id=0), score=-4.14453125, rank=2)],
query='I love you', has_scores=True)
所有 reranker 都将返回一个对象,这是一个 pydantic 对象,其中包含对象列表和一些其他有用信息,例如原始查询。您可以通过运行 :RankedResults
Result
k
top_k()
results.top_k(1)
# [Result(Document(doc_id=1, text='I really like you', metadata={}), score=0.26170814, rank=1)]
langchain中也能用,只需一行就可转换:
compressor = ranker.as_langchain_compressor(k=3)
好啦,介绍到这里,更多用法等你去探索吧:
https://github.com/answerdotai/rerankers
本文转载自公众号哎呀AIYA
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
赞
收藏
回复
回复
相关推荐