一款好用的開源工具,高效實現(xiàn)Reranker 原創(chuàng)
Reranker 是任何檢索架構(RAG、Agent等)的重要組成部分,但它們通常也比PipeLine中其他部分更模糊。有時,甚至很難知道該使用哪一個。每個問題都是不同的,使用 X 的最佳模型不一定與使用 Y 的模型相同;新的重新排名方法不斷涌現(xiàn),該如何兼容他們呢?今天介紹一款高效擴展工具rerankers:
設計目標
新的重新排名方法不斷涌現(xiàn):例如,RankGPT 使用 LLM 對文檔進行重新排序,就在去年出現(xiàn),取得了非常有希望的零樣本基準測試結果。
所有不同的重新排名方法往往都在自己的庫中完成,具有不同級別的文檔。這導致了更高的進入門檻。新用戶需要在多種不熟悉的輸入/輸出格式之間切換,所有這些格式都有自己的怪癖!
rerankers目標是:
- ??輕。它僅提供作為依賴項的基本必需品。
- ?? 易于理解。只需學習少數(shù)幾個calls,然后您可以使用提供的所有重新排名模型。
- ??易于集成。它應該適合幾乎任何現(xiàn)有的管道,只需幾行代碼!
- ??易于擴展。只需對代碼庫知之甚少,即可添加任何新的重新排名模型。您所需要的只是一個新類,其中包含一個將 (query, [documents]) 輸入映射到output.rank()
- ??易于調試。這是一個測試版,可能會有問題,但代碼庫的構思方式使大多數(shù)問題都應該易于跟蹤并盡快修復。
支持的模型
目前項目庫支持各類rerank模型:
- ? 任何標準的 SentenceTransformer 或 Transformers 交叉編碼器
- ? RankGPT (可通過原始 RankGPT 實現(xiàn)和改進的 RankLLM 實現(xiàn)獲得)
- ? 基于T5 的pointwise排名器(InRanker、MonoT5...)
- ? 基于LLM 的pointwise排名器(BAAI/bge-reranker-v2.5-gemma2-lightweight 等)
- ? Cohere、Jina、Voyage 和 MixedBread API 重新排名器
- ? FlashRank 重新排序器(ONNX 優(yōu)化模型,在 CPU 上非??欤?/li>
- ? 基于 ColBERT 的 reranker - 不是最初為重新排序而設計的模型,但在某些情況下確實表現(xiàn)得相當強大。實現(xiàn)是輕量級的,僅基于 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?
? 參數(shù)總是更安全的!?
模型推理
無論加載了哪個 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
