Rerankers标准化重排序过程,一行代码就能拥有

文摘   2024-09-09 22:50   北京  
在这个信息爆炸的时代,如何从海量数据中快速准确地找到所需信息,成为了一个日益紧迫的挑战。由于模型计算成本和延迟问题,常见的做法是采用两阶段检索。首先,使用计算效率高的检索方法(如BM25或DPR)检索出一小部分候选文档,然后再由更强大的模型进行重排序。这种方法不仅能缓解延迟问题,还能显著提升检索效果。就比如,你正在图书馆里寻找一本特定的书。首先,你可能会根据分类快速定位到可能存在的书架(这就像是初步检索)。然后,你会仔细查看这些书架上的书,根据书名、作者等信息找出最相关的那本(这就是重排序的过程)。
由此可见,重排序(re-ranking)是提升检索系统性能的关键步骤。尽管现有的重排序方法众多,但其实现方式各异,导致研究人员和实践者在选择和切换方法时面临诸多挑战。为了解决这一问题,Benjamin Clavié及其团队推出了一款名为rerankers的轻量级Python库[1],旨在统一各种重排序方法,简化其使用过程。
rerankers库提供了一个易于使用的接口,涵盖了当前最常用的重排序方法。无论是研究人员还是实践者,只需修改一行Python代码,即可在不同的重排序方法之间进行切换。更重要的是,rerankers库在实现时尽量减少依赖,并尽可能重用原始实现,确保简化后的接口不会导致性能下降。
rerankers库基于以下三大核心原则:
  1. 提供简便的加载、使用和切换各种重排序方法的方式。
  2. 尽量减少对用户环境和代码库的侵入性修改。
  3. 确保与现有实现相比,不会导致排序性能下降。
该库适用于大多数常见的重排序方法。此外,rerankers还提供了实用工具,以满足不同的使用场景,如仅检索前k个候选文档或仅输出用于知识蒸馏的分数。
rerankers库的核心是一个名为Reranker的类。无论底层实现或需求如何,所有模型都通过这个类加载。Reranker类提供了一个公开的方法rank,该方法接收查询和文档集,并返回一个包含重排序文档的RankedResults对象。值得一提的是不仅使用方法一致,输出的结果也是标准化的,无论使用哪种方法,最终得到的结果都以相同的格式呈现,大大简化了后续的分析工作。

# 不管什么模型,仅需一行代码就能初始化一个重排器
ranker = Reranker('cross-encoder')
#可以通过名称自动推断,也可以显式通过model_type指定!
ranker = Reranker(MODEL_NAME_OR_PATH, model_type='cross-encoder')
ranker = Reranker(MODEL_NAME_OR_PATH, model_type='t5', dtype=torch.float32)
ranker = Reranker("jina", api_key = API_KEY)

# 重排序一组文档返回一个RankedResults对象,保留元数据和文档ID
results = ranker.rank(query="I love you", docs=["I hate you""I really like you"], doc_ids=[01], metadata=[{'source''twitter'}, {'source''reddit'}])

results.top_k(1)

rerankers库完全集成到HuggingFace transformers生态系统中,可以直接从HuggingFace hub加载任何兼容的模型,也可以加载本地存储的模型,并通过langchain可以无缝的集成到现有应用中.

from rerankers import Reranker
from langchain.retrievers import ContextualCompressionRetriever
from langchain_openai import OpenAI

text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
retriever = FAISS.from_documents(texts, OpenAIEmbeddings()).as_retriever()

ranker = Reranker("mixedbread-ai/mxbai-rerank-base-v1", verbose=0)
compressor = ranker.as_langchain_compressor(k=3)
compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor, base_retriever=retriever
)


compressed_docs = compression_retriever.get_relevant_documents(
     "What did the president say about the minimum wage?"
)

pretty_print_docs(compressed_docs)

rerankers库专为易于扩展而设计。所有方法都是独立实现的,并具有各自定义的依赖集,用户可以根据需要选择安装。添加新方法只需使其输入和输出与rerankers定义的格式兼容,并对主Reranker类进行简单修改以指定默认模型。
为了确保与现有实现的性能一致性,rerankers库在三个常用数据集上进行了top-1000重排序评估[2]。大多数模型在5次运行中都达到了与现有实现代码和文献报告结果的性能一致性。

总结

rerankers库通过提供一个简单、统一的接口,支持几乎所有常见的重排序方法,极大地降低了使用门槛。未来,rerankers库还计划支持微调以简化领域内模型的训练和对比过程。

参考资料

[1]

Python库: https://github.com/answerdotai/rerankers

[2]

评估: https://arxiv.org/abs/2408.17344

后台回复“进群”入群讨论

AI工程化
专注于AI领域(大模型、MLOPS/LLMOPS 、AI应用开发、AI infra)前沿产品技术信息和实践经验分享。
 最新文章