RAG优化神器:rerankers重新排名模型的终极方案,提供轻量级统一API

文摘   2024-09-15 08:00   新加坡  

在基于检索的生成(Retrieval-Augmented Generation, RAG)系统中,Reranker 是用于提升检索文档质量的一个关键组件。首先,我们来分解一下 Reranker 的定义及其必要性。

什么是 Reranker?

Reranker 是对初步检索出的候选文档集进行重新排序的模型或算法。它在初始检索(通常基于简单的匹配算法,如 TF-IDF、BM25 或 Dense Embedding)之后,对结果进行二次处理,确保最相关的内容排在前面。Reranker 通常利用更复杂的语义理解和深度模型,比如 BERT 或其他 Transformer 模型,来更好地衡量候选文档与查询之间的相关性。

为什么需要 Reranker?

在大多数检索任务中,初次检索的文档集往往包含了许多相关性较低或不完全匹配的内容。这是因为初步检索模型通常基于词频或简单的向量匹配,难以精准捕捉查询和文档之间的深层次语义关系。因此,即使初始结果能找到一些相关文档,也无法保证这些文档是最优的答案。

引入 Reranker 的好处

提升相关性通过对初步结果进行重新排序,Reranker 可以确保将最相关的文档排在前列,提升用户体验。

减少噪声:Reranker 能有效过滤掉不太相关的文档,减少冗余信息。

增强模型理解能力:相比于初级的词频或稀疏向量模型,Reranker 利用深度语言模型进行更深层次的文本理解。

提升生成质量:在 RAG 系统中,生成部分依赖于检索出的信息。如果检索内容的质量得到提升,生成的回答或文档也会更加准确和丰富。

Reranker 如何应用?

初次检索使用如 TF-IDF 或 Dense Embedding 模型快速从大规模知识库中检索出一组候选文档。这一步需要快速响应,通常优先考虑速度。

二次排序:将初次检索得到的候选文档输入到 Reranker 模型中。Reranker 基于深度模型(如 BERT)重新评估每个文档的相关性,生成一个新的排序。

结果选择:基于 Reranker 生成的新排序,选择前 N 个最相关的文档,提供给下游的生成模型或直接展示给用户。

生成或展示:在 RAG 系统中,最终生成的回答是基于重排序后的文档,因此其质量会更高。如果用于信息检索系统,用户会得到最相关的检索结果。

本文介绍了 rerankers,这是一个 Python 库,它为最常用的重新排序方法提供了一个易于使用的界面。重新排序是许多检索管道不可或缺的组成部分;但是,有许多方法,依赖于不同的实现方法。

rerankers 将这些方法统一到一个用户友好的界面中,允许从业者和研究人员探索不同的方法,同时只需更改一行 Python 代码。此外,rerankers 确保其实现以尽可能少的依赖项完成,并尽可能重用原始实现,从而保证我们的简化界面与更复杂的界面相比不会降低性能。

完整的源代码和支持模型列表会定期更新,并在 https://github.com/answerdotai/rerankers 上提供。

论文地址:https://arxiv.org/pdf/2408.17344

Reranker 是任何检索架构的重要组成部分,但它们通常也比管道的其他部分更模糊。最近的一些方法开始探索使用大型语言模型(LLMs)作为重新排序器,这是一个备受关注的研究方向。

一些方法利用了非常强大的 LLMs,如 GPT-4,来执行零样本的列表重新排序,而另一些方法则通过在大型模型的输出上微调较小模型,达成了一种知识蒸馏的效果,从而创建了更高效的列表重新排序器,如 RankZephyr。

此外,最新的研究还探索了在推理阶段引入模型压缩技术,以便使用像 Gemma2 这样的 LLM 作为重新排序器,大幅降低计算成本的同时保持高性能。

Reranker 类有一个公开的方法 rank,它接受一个查询和一组文档,并返回一个 RankedResults 对象,如 Section 2.2 所示,其中包含重新排名的文档。

在开展这项工作时,没有现成的库能够提供一致的 API 来访问常见的重新排序方法,因此,现有的 reranker 没有直接的等效实现。虽然像 Terrier 和 Anserini 这样的广泛信息检索框架确实集成了重新排序功能,但它们旨在作为功能全面的检索平台,采用的开发方法与轻量级的重新排序器截然不同。

对于大多数 reranker 中集成的单个方法,通常已经有现成的在线 API 或实现可供使用。Reranker 并不与这些实现直接竞争,事实上,如果某个现有库足够成熟且依赖适中,我们的库通常会重用原作者的部分代码,或者作为这些库的封装器。

开始使用rerankers

安装非常简单。核心包只附带两个依赖项,tqdm 和 pydantic,以避免与当前环境发生任何冲突。然后,您可以仅安装要试用的模型所需的依赖项:

# Core package only, will require other dependencies already installedpip install rerankers
# All transformers-based approaches (cross-encoders, t5, colbert)pip install "rerankers[transformers]"
# RankGPTpip install "rerankers[gpt]"
# API-based rerankers (Cohere, Jina, soon MixedBread)pip install "rerankers[api]"
# FlashRank rerankers (ONNX-optimised, very fast on CPU)pip install "rerankers[flashrank]"
# RankLLM rerankers (better RankGPT + support for local models such as RankZephyr and RankVicuna)# Note: RankLLM is only supported on Python 3.10+! This will not work with Python 3.9pip install "rerankers[rankllm]"
# To support LLM-Layerwise rerankers (which need flash-attention installed)pip install "rerankers[llmlayerwise]"
# All of the abovepip 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')
# Specific cross-encoderranker = Reranker('mixedbread-ai/mxbai-rerank-large-v1', model_type='cross-encoder')
# FlashRank default. You can specify a 'lang' parameter to load a multilingual version!ranker = Reranker('flashrank')
# Specific flashrank model.ranker = Reranker('ce-esci-MiniLM-L12-v2', model_type='flashrank')
# Default T5 Seq2Seq rerankerranker = Reranker("t5")
# Specific T5 Seq2Seq rerankerranker = Reranker("unicamp-dl/InRanker-base", model_type = "t5")
# API (Cohere)ranker = Reranker("cohere", lang='en' (or 'other'), api_key = API_KEY)
# Custom Cohere model? No problem!ranker = Reranker("my_model_name", api_provider = "cohere", api_key = API_KEY)
# API (Jina)ranker = Reranker("jina", api_key = API_KEY)
# RankGPT4-turboranker = Reranker("rankgpt", api_key = API_KEY)
# RankGPT3-turboranker = Reranker("rankgpt3", api_key = API_KEY)
# RankGPT with another LLM providerranker = Reranker("MY_LLM_NAME" (check litellm docs), model_type = "rankgpt", api_key = API_KEY)
# RankLLM with default GPT (GPT-4o)ranker = Reranker("rankllm", api_key = API_KEY)
# RankLLM with specified GPT modelsranker = Reranker('gpt-4-turbo', model_type="rankllm", api_key = API_KEY)
# ColBERTv2 rerankerranker = Reranker("colbert")
# LLM Layerwise Rerankerranker = Reranker('llm-layerwise')
# ... 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])> resultsRankedResults(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)

所有重新排序器都将返回一个 RankedResults 对象,这是一个 pydantic 对象,其中包含 Result 对象列表和一些其他有用信息,例如原始查询。您可以通过运行 top_k() 从中检索前 k 个结果:

> results.top_k(1)[Result(Document(doc_id=1, text='I really like you', metadata={}), score=0.26170814, rank=1)]

Result 对象在尝试访问它们存储的文档时是透明的,因为 Document 对象只是作为存储 ID 和元数据的一种简单方法而存在。如果要访问给定结果的文本或元数据,可以直接将其作为属性访问:

> results.top_k(1)[0].text'I really like you'

Rerankers,这是一个轻量级的 python 库,支持在各种检索用例中使用各种重新排名方法。Rerankers 提供了一个简单、统一的接口,可以在一个轻量级包中使用几乎所有常见的方法重新排名,而不会对性能造成任何损害。

参考资料:

1.https://github.com/AnswerDotAI/rerankers

AI技术研习社
专注分享人工智能、大模型、算法、大数据开发、数据分析领域的技术干货和落地实践!
 最新文章