微信扫码
与创始人交个朋友
我要投稿
在基于检索的生成(Retrieval-Augmented Generation, RAG)系统中,Reranker 是用于提升检索文档质量的一个关键组件。首先,我们来分解一下 Reranker 的定义及其必要性。
Reranker 是对初步检索出的候选文档集进行重新排序的模型或算法。它在初始检索(通常基于简单的匹配算法,如 TF-IDF、BM25 或 Dense Embedding)之后,对结果进行二次处理,确保最相关的内容排在前面。Reranker 通常利用更复杂的语义理解和深度模型,比如 BERT 或其他 Transformer 模型,来更好地衡量候选文档与查询之间的相关性。
在大多数检索任务中,初次检索的文档集往往包含了许多相关性较低或不完全匹配的内容。这是因为初步检索模型通常基于词频或简单的向量匹配,难以精准捕捉查询和文档之间的深层次语义关系。因此,即使初始结果能找到一些相关文档,也无法保证这些文档是最优的答案。
引入 Reranker 的好处
提升相关性:通过对初步结果进行重新排序,Reranker 可以确保将最相关的文档排在前列,提升用户体验。
减少噪声:Reranker 能有效过滤掉不太相关的文档,减少冗余信息。
增强模型理解能力:相比于初级的词频或稀疏向量模型,Reranker 利用深度语言模型进行更深层次的文本理解。
提升生成质量:在 RAG 系统中,生成部分依赖于检索出的信息。如果检索内容的质量得到提升,生成的回答或文档也会更加准确和丰富。
初次检索:使用如 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 installed
pip install rerankers
# All transformers-based approaches (cross-encoders, t5, colbert)
pip install "rerankers[transformers]"
# RankGPT
pip 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.9
pip install "rerankers[rankllm]"
# To support LLM-Layerwise rerankers (which need flash-attention installed)
pip install "rerankers[llmlayerwise]"
# 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')
# Specific cross-encoder
ranker = 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 reranker
ranker = Reranker("t5")
# Specific T5 Seq2Seq reranker
ranker = 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-turbo
ranker = Reranker("rankgpt", api_key = API_KEY)
# RankGPT3-turbo
ranker = Reranker("rankgpt3", api_key = API_KEY)
# RankGPT with another LLM provider
ranker = 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 models
ranker = Reranker('gpt-4-turbo', model_type="rankllm", api_key = API_KEY)
# ColBERTv2 reranker
ranker = Reranker("colbert")
# LLM Layerwise Reranker
ranker = 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 提供了一个简单、统一的接口,可以在一个轻量级包中使用几乎所有常见的方法重新排名,而不会对性能造成任何损害。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-11-23
FastRAG半结构化RAG实现思路及OpenAI O1-long COT蒸馏路线思考
2024-11-23
检索增强生成(RAG):解密AI如何融合记忆与搜索
2024-11-23
如何提高RAG系统准确率?12大常见痛点及巧妙解!
2024-11-23
RAG 2.0性能提升:优化索引与召回机制的策略与实践
2024-11-22
RAG技术在实际应用中的挑战与解决方案
2024-11-22
从普通RAG到RAPTOR,10个最新的RAG框架
2024-11-22
如何使用 RAG 提高 LLM 成绩
2024-11-21
提升RAG性能的全攻略:优化检索增强生成系统的策略大揭秘 | 深度好文
2024-07-18
2024-05-05
2024-07-09
2024-05-19
2024-07-09
2024-06-20
2024-07-07
2024-07-07
2024-07-08
2024-07-09
2024-11-06
2024-11-06
2024-11-05
2024-11-04
2024-10-27
2024-10-25
2024-10-21
2024-10-21