一款好用的开源工具,高效实现Reranker 原创

发布于 2024-9-14 14:25
浏览
0收藏

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

原文链接:​​https://mp.weixin.qq.com/s/NrbqFRkOtOa8z3rt8c0KKw​

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
收藏
回复
举报
回复
相关推荐