{"id":17526860,"url":"https://github.com/AnswerDotAI/rerankers","last_synced_at":"2025-03-06T06:30:57.496Z","repository":{"id":226622667,"uuid":"768186962","full_name":"AnswerDotAI/rerankers","owner":"AnswerDotAI","description":"A lightweight, low-dependency, unified API to use all common reranking and cross-encoder models.","archived":false,"fork":false,"pushed_at":"2025-02-21T07:09:24.000Z","size":468,"stargazers_count":1310,"open_issues_count":13,"forks_count":75,"subscribers_count":15,"default_branch":"main","last_synced_at":"2025-02-28T22:19:23.826Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AnswerDotAI.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-03-06T16:18:57.000Z","updated_at":"2025-02-28T08:45:47.000Z","dependencies_parsed_at":"2024-04-12T16:35:59.553Z","dependency_job_id":"d18b8b09-9fd3-4f69-a14b-4ad40f17ed56","html_url":"https://github.com/AnswerDotAI/rerankers","commit_stats":null,"previous_names":["bclavie/rerankers","answerdotai/rerankers"],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AnswerDotAI%2Frerankers","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AnswerDotAI%2Frerankers/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AnswerDotAI%2Frerankers/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AnswerDotAI%2Frerankers/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AnswerDotAI","download_url":"https://codeload.github.com/AnswerDotAI/rerankers/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242161446,"owners_count":20081873,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-20T15:02:34.452Z","updated_at":"2025-03-06T06:30:57.480Z","avatar_url":"https://github.com/AnswerDotAI.png","language":"Python","readme":"\n# rerankers\n\n![Python Versions](https://img.shields.io/badge/Python-3.8_3.9_3.10_3.11-blue)\n[![Downloads](https://static.pepy.tech/badge/rerankers/month)](https://pepy.tech/project/rerankers)\n[![Twitter Follow](https://img.shields.io/twitter/follow/bclavie?style=social)](https://twitter.com/bclavie)\n\n\n_A lightweight unified API for various reranking models. Developed by [@bclavie](https://twitter.com/bclavie) as a member of [answer.ai](https://www.answer.ai)_\n\n---\n\nWelcome to `rerankers`! Our goal is to provide users with a simple API to use any reranking models.\n\n## Recent Updates\n_A longer release history can be found in the [Release History](#release-history) section of this README._\n\n- v0.7.0: Removing `pydantic` and `tqdm` dependencies, so `rerankers` is now dependency-free by default, avoiding any issues with Pydantic v1/v2!\n- v0.6.1: Added support for Pinecone's new rerankers via their API.\n- v0.6.0: `rerankers` goes multi-modal, with the support of the first MonoVLMRanker model, [MonoQwen2-VL-v0.1!](https://huggingface.co/lightonai/MonoQwen2-VL-v0.1)! + Many QoL fixes.\n- v0.5.*: ColBERT fixes (0.5.1) \u0026 Minor change making RankedResults subscribable, meaning results[0] will return the result for the first document (0.5.2), etc... ⚠️ This is sorted by **passed document order**, not by results, you should use `.top_k()` to get sorted results!\n- v0.5.0: Added support for the current state-of-the-art rerankers, BAAI's series of `BGE` layerwise LLM rerankers, based on [Gemma](https://huggingface.co/BAAI/bge-reranker-v2.5-gemma2-lightweight) and MiniCPM. These are different from RankGPT, as they're not listwise: the models are repurposed as \"cross-encoders\", and do output logit scores.\n\n## Why `rerankers`?\n\nRerankers are an important part of any retrieval architecture, but they're also often more obscure than other parts of the pipeline.\n\nSometimes, it can be hard to even know which one to use. Every problem is different, and the best model for use X is not necessarily the same one as for use Y.\n\nMoreover, new reranking methods keep popping up: for example, RankGPT, using LLMs to rerank documents, appeared just last year, with very promising zero-shot benchmark results.\n\nAll the different reranking approaches tend to be done in their own library, with varying levels of documentation. This results in an even higher barrier to entry. New users are required to swap between multiple unfamiliar input/output formats, all with their own quirks!\n\n`rerankers` seeks to address this problem by providing a simple API for all popular rerankers, no matter the architecture.\n\n`rerankers` aims to be:\n- 🪶 Lightweight. It ships with only the bare necessities as dependencies.\n- 📖 Easy-to-understand. There's just a handful of calls to learn, and you can then use the full range of provided reranking models.\n- 🔗 Easy-to-integrate. It should fit in just about any existing pipelines, with only a few lines of code!\n- 💪 Easy-to-expand. Any new reranking models can be added with very little knowledge of the codebase. All you need is a new class with a `rank()` function call mapping a (query, [documents]) input to a `RankedResults` output.\n- 🐛 Easy-to-debug. This is a beta release and there might be issues, but the codebase is conceived in such a way that most issues should be easy to track and fix ASAP.\n\n## Get Started\n\nInstallation is very simple. The core package ships with no dependencies, so as to avoid any conflict with your current environment.\nYou may then install only the dependencies required by the models you want to try out:\n\n```sh\n# Core package only, will require other dependencies already installed\npip install rerankers\n\n# All transformers-based approaches (cross-encoders, t5, colbert)\npip install \"rerankers[transformers]\"\n\n# RankGPT\npip install \"rerankers[gpt]\"\n\n# API-based rerankers (Cohere, Jina, MixedBread, Pinecone)\npip install \"rerankers[api]\"\n\n# FlashRank rerankers (ONNX-optimised, very fast on CPU)\npip install \"rerankers[flashrank]\"\n\n# RankLLM rerankers (better RankGPT + support for local models such as RankZephyr and RankVicuna)\n# Note: RankLLM is only supported on Python 3.10+! This will not work with Python 3.9\npip install \"rerankers[rankllm]\"\n\n# To support Multi-Modal rerankers such as MonoQwen2-VL and other MonoVLM models, which require flash-attention, peft, accelerate, and recent versions of `transformers`\npip install \"rerankers[monovlm]\"\n\n\n# To support LLM-Layerwise rerankers (which need flash-attention installed)\npip install \"rerankers[llmlayerwise]\"\n\n# All of the above\npip install \"rerankers[all]\"\n```\n\n## Usage\n\nLoad any supported reranker in a single line, regardless of the architecture:\n```python\nfrom rerankers import Reranker\n\n# Cross-encoder default. You can specify a 'lang' parameter to load a multilingual version!\nranker = Reranker('cross-encoder')\n\n# Specific cross-encoder\nranker = Reranker('mixedbread-ai/mxbai-rerank-large-v1', model_type='cross-encoder')\n\n# FlashRank default. You can specify a 'lang' parameter to load a multilingual version!\nranker = Reranker('flashrank')\n\n# Specific flashrank model.\nranker = Reranker('ce-esci-MiniLM-L12-v2', model_type='flashrank')\n\n# Default T5 Seq2Seq reranker\nranker = Reranker(\"t5\")\n\n# Specific T5 Seq2Seq reranker\nranker = Reranker(\"unicamp-dl/InRanker-base\", model_type = \"t5\")\n\n# API (Cohere)\nranker = Reranker(\"cohere\", lang='en' (or 'other'), api_key = API_KEY)\n\n# Custom Cohere model? No problem!\nranker = Reranker(\"my_model_name\", api_provider = \"cohere\", api_key = API_KEY)\n\n# API (Pinecone)\nranker = Reranker(\"pinecone\", api_key = API_KEY)\n\n# API (Jina)\nranker = Reranker(\"jina\", api_key = API_KEY)\n\n# RankGPT4-turbo\nranker = Reranker(\"rankgpt\", api_key = API_KEY)\n\n# RankGPT3-turbo\nranker = Reranker(\"rankgpt3\", api_key = API_KEY)\n\n# RankGPT with another LLM provider\nranker = Reranker(\"MY_LLM_NAME\" (check litellm docs), model_type = \"rankgpt\", api_key = API_KEY)\n\n# RankLLM with default GPT (GPT-4o)\nranker = Reranker(\"rankllm\", api_key = API_KEY)\n\n# RankLLM with specified GPT models\nranker = Reranker('gpt-4-turbo', model_type=\"rankllm\", api_key = API_KEY)\n\n# ColBERTv2 reranker\nranker = Reranker(\"colbert\")\n\n# LLM Layerwise Reranker\nranker = Reranker('llm-layerwise')\n\n# ... Or a non-default colbert model:\nranker = Reranker(model_name_or_path, model_type = \"colbert\")\n\n```\n\n_Rerankers will always try to infer the model you're trying to use based on its name, but it's always safer to pass a `model_type` argument to it if you can!_\n\nThen, regardless of which reranker is loaded, use the loaded model to rank a query against documents:\n\n```python\n\u003e results = ranker.rank(query=\"I love you\", docs=[\"I hate you\", \"I really like you\"], doc_ids=[0,1])\n\u003e results\nRankedResults(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)\n```\n\nYou don't need to pass `doc_ids`! If not provided, they'll be auto-generated as integers corresponding to the index of a document in `docs`.\n\n\nYou're free to pass metadata too, and it'll be stored with the documents. It'll also be accessible in the results object:\n\n```python\n\u003e results = ranker.rank(query=\"I love you\", docs=[\"I hate you\", \"I really like you\"], doc_ids=[0,1], metadata=[{'source': 'twitter'}, {'source': 'reddit'}])\n\u003e results\nRankedResults(results=[Result(document=Document(text='I really like you', doc_id=1, metadata={'source': 'twitter'}), score=-2.453125, rank=1), Result(document=Document(text='I hate you', doc_id=0, metadata={'source': 'reddit'}), score=-4.14453125, rank=2)], query='I love you', has_scores=True)\n```\n\nIf you'd like your code to be a bit cleaner, you can also directly construct `Document` objects yourself, and pass those instead. In that case, you don't need to pass separate `doc_ids` and `metadata`:\n\n```python\n\u003e from rerankers import Document\n\u003e docs = [Document(text=\"I really like you\", doc_id=0, metadata={'source': 'twitter'}), Document(text=\"I hate you\", doc_id=1, metadata={'source': 'reddit'})]\n\u003e results = ranker.rank(query=\"I love you\", docs=docs)\n\u003e results\nRankedResults(results=[Result(document=Document(text='I really like you', doc_id=0, metadata={'source': 'twitter'}), score=-2.453125, rank=1), Result(document=Document(text='I hate you', doc_id=1, metadata={'source': 'reddit'}), score=-4.14453125, rank=2)], query='I love you', has_scores=True)\n```\n\nYou can also use `rank_async`, which is essentially just a wrapper to turn `rank()` into a coroutine. The result will be the same:\n\n```python\n\u003e results = await ranker.rank_async(query=\"I love you\", docs=[\"I hate you\", \"I really like you\"], doc_ids=[0,1])\n\u003e results\nRankedResults(results=[Result(document=Document(text='I really like you', doc_id=1, metadata={'source': 'twitter'}), score=-2.453125, rank=1), Result(document=Document(text='I hate you', doc_id=0, metadata={'source': 'reddit'}), score=-4.14453125, rank=2)], query='I love you', has_scores=True)\n```\n\nAll rerankers will return a `RankedResults` object, which is a Python object containing a list of `Result` objects and some other useful information, such as the original query. You can retrieve the top `k` results from it by running `top_k()`:\n\n```python\n\u003e results.top_k(1)\n[Result(Document(doc_id=1, text='I really like you', metadata={}), score=0.26170814, rank=1)]\n```\n\nThe Result objects are transparent when trying to access the documents they store, as `Document` objects simply exist as an easy way to store IDs and metadata. If you want to access a given result's text or metadata, you can directly access it as a property:\n\n```python\n\u003e results.top_k(1)[0].text\n'I really like you'\n```\n\nAnd that's all you need to know to get started quickly! Check out the overview notebook for more information on the API and the different models, or the langchain example to see how to integrate this in your langchain pipeline.\n\n\n## Features\n\nLegend:\n- ✅ Supported\n- 🟠 Implemented, but not fully fledged\n- 📍 Not supported but intended to be in the future\n- ⭐ Same as above, but **important**.\n- ❌ Not supported \u0026 not currently planned\n\nModels:\n- ✅ Any standard SentenceTransformer or Transformers cross-encoder\n- ✅ RankGPT (Available both via the original RankGPT implementation and the improved RankLLM one)\n- ✅ T5-based pointwise rankers (InRanker, MonoT5...)\n- ✅ LLM-based pointwise rankers (BAAI/bge-reranker-v2.5-gemma2-lightweight, etc...)\n- ✅ Cohere, Jina, Voyage,  MixedBread, and Pinecone API rerankers\n- ✅ [FlashRank](https://github.com/PrithivirajDamodaran/FlashRank) rerankers (ONNX-optimised models, very fast on CPU)\n- ✅ ColBERT-based reranker - not a model initially designed for reranking, but does perform quite strongly in some cases. Implementation is lightweight, based only on transformers.\n- 🟠⭐ RankLLM/RankZephyr: supported by wrapping the [rank-llm library](https://github.com/castorini/rank_llm) library! Support for RankZephyr/RankVicuna is untested, but RankLLM + GPT models fully works!\n- ✅ 🆕 v0.6.0: MonoVLMRanker, multi-modal image reranker employing the MonoT5 method with a VLM backnd.\n- 📍 LiT5\n\nFeatures:\n- ✅ Metadata!\n- ✅ Reranking \n- ✅ Consistency notebooks to ensure performance on `scifact` matches the litterature for any given model implementation (Except RankGPT, where results are harder to reproduce).\n- ✅ ONNX runtime support --\u003e Offered through [FlashRank](https://github.com/PrithivirajDamodaran/FlashRank) -- in line with the philosophy of the lib, we won't reinvent the wheel when @PrithivirajDamodaran is doing amazing work!\n- 📍 Training on Python \u003e=3.10 (via interfacing with other libraries)\n- ❌(📍Maybe?) Training via rerankers directly\n\n## Reference\n\nIf rerankers has been useful to you in academic work, please do feel free to cite the work below!\n\n```\n@misc{clavié2024rerankers,\n      title={rerankers: A Lightweight Python Library to Unify Ranking Methods}, \n      author={Benjamin Clavié},\n      year={2024},\n      eprint={2408.17344},\n      archivePrefix={arXiv},\n      primaryClass={cs.IR},\n      url={https://arxiv.org/abs/2408.17344}, \n}\n```\n\n## Release History\n\n- v0.4.0: ColBERT performance improvement! It should now be faster and result in stronger results following implementation of the JaColBERTv2.5 dynamic query length method. This version also now supports HuggingFace's Text-Embedding-Server (TEI) inference as an API reranker option, thanks to [@srisudarsan](https://github.com/srisudarsan).\n- v0.3.1: T5 bugfix and native default support for new Portuguese T5 rerankers.\n- v0.3.0: Many changes! Experimental support for RankLLM, directly backed by the [rank-llm library](https://github.com/castorini/rank_llm). A new `Document` object, courtesy of joint-work by [@bclavie](https://github.com/bclavie) and [Anmol6](https://github.com/Anmol6). This object is transparent, but now offers support for `metadata` stored alongside each document. Many small QoL changes (RankedResults can be itered on directly...)\n- v0.2.0: [FlashRank](https://github.com/PrithivirajDamodaran/FlashRank) rerankers, Basic async support thanks to [@tarunamasa](https://github.com/tarunamasa), MixedBread.ai reranking API\n- v0.1.2: Voyage reranking API\n- v0.1.1: Langchain integration fixed!\n- v0.1.0: Initial release\n","funding_links":[],"categories":["Python"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FAnswerDotAI%2Frerankers","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FAnswerDotAI%2Frerankers","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FAnswerDotAI%2Frerankers/lists"}