Latest commit

History

24 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rerankers

Python VersionsDownloadsTwitter Follow

A lightweight unified API for various reranking models. Developed by @bclavie as a member of answer.ai


Welcome to rerankers! Our goal is to provide users with a simple API to use any reranking models.

Updates

  • v0.2.0: 🆕 FlashRank rerankers, Basic async support thanks to @tarunamasa, MixedBread.ai reranking API
  • v0.1.2: Voyage reranking API
  • v0.1.1: Langchain integration fixed!
  • v0.1.0: Initial release

Why rerankers?

Rerankers are an important part of any retrieval architecture, but they're also often more obscure than other parts of the pipeline.

Sometimes, 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.

Moreover, 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.

All 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!

rerankers seeks to address this problem by providing a simple API for all popular rerankers, no matter the architecture.

rerankers aims to be:

  • 🪶 Lightweight. It ships with only the bare necessities as dependencies.
  • 📖 Easy-to-understand. There's just a handful of calls to learn, and you can then use the full range of provided reranking models.
  • 🔗 Easy-to-integrate. It should fit in just about any existing pipelines, with only a few lines of code!
  • 💪 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.
  • 🐛 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.

Get Started

Installation is very simple. The core package ships with just two dependencies, tqdm and pydantic, so as to avoid any conflict with your current environment. You may then install only the dependencies required by the models you want to try out:

# 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[fastrank]"# All of the above
pip install "rerankers[all]"

Usage

Load any supported reranker in a single line, regardless of the architecture:

fromrerankersimportReranker# 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-xlarge-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" (checklitellmdocs), model_type="rankgpt", api_key=API_KEY)
# ColBERTv2 rerankerranker=Reranker("colbert")
# ... Or a non-default colbert model:ranker=Reranker(model_name_or_path, model_type="colbert")

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!

Then, regardless of which reranker is loaded, use the loaded model to rank a query against documents:

>results=ranker.rank(query="I love you", docs=["I hate you", "I really like you"], doc_ids=[0,1])
>resultsRankedResults(results=[Result(doc_id=1, text='I really like you', score=0.26170814, rank=1), Result(doc_id=0, text='I hate you', score=0.079210326, rank=2)], query='I love you', has_scores=True)

You 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.

You can also use rank_async, which is essentially just a wrapper to turn rank() into a coroutine. The result will be the same:

```python>results=awaitranker.rank_async(query="I love you", docs=["I hate you", "I really like you"], doc_ids=[0,1])
>resultsRankedResults(results=[Result(doc_id=1, text='I really like you', score=0.26170814, rank=1), Result(doc_id=0, text='I hate you', score=0.079210326, rank=2)], query='I love you', has_scores=True)

All rerankers will return a RankedResults object, which is a pydantic 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():

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

And 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.

Features

Legend:

  • ✅ Supported
  • 🟠 Implemented, but not fully fledged
  • 📍 Not supported but intended to be in the future
  • ⭐ Same as above, but important.
  • ❌ Not supported & not currently planned

Models:

  • ✅ Any standard SentenceTransformer or Transformers cross-encoder
  • 🟠 RankGPT (Implemented using original repo, but missing the rankllm's repo improvements)
  • ✅ T5-based pointwise rankers (InRanker, MonoT5...)
  • ✅ Cohere, Jina, Voyage and MixedBread API rerankers
  • FlashRank rerankers (ONNX-optimised models, very fast on CPU)
  • 🟠 ColBERT-based reranker - not a model initially designed for reranking, but quite strong (Implementation could be optimised and is from a third-party implementation.)
  • 📍 MixedBread API (Reranking API not yet released)
  • 📍⭐ RankLLM/RankZephyr (Proper RankLLM implementation will replace the RankGPT one, and introduce RankZephyr support)
  • 📍 LiT5

Features:

  • ✅ Reranking
  • ✅ Consistency notebooks to ensure performance on scifact matches the litterature for any given model implementation (Except RankGPT, where results are harder to reproduce).
  • 📍 Training on Python >=3.10 (via interfacing with other libraries)
  • 📍 ONNX runtime support --> Unlikely to be immediate
  • ❌(📍Maybe?) Training via rerankers directly

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

24 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rerankers

Python VersionsDownloadsTwitter Follow

A lightweight unified API for various reranking models. Developed by @bclavie as a member of answer.ai


Welcome to rerankers! Our goal is to provide users with a simple API to use any reranking models.

Updates

  • v0.2.0: 🆕 FlashRank rerankers, Basic async support thanks to @tarunamasa, MixedBread.ai reranking API
  • v0.1.2: Voyage reranking API
  • v0.1.1: Langchain integration fixed!
  • v0.1.0: Initial release

Why rerankers?

Rerankers are an important part of any retrieval architecture, but they're also often more obscure than other parts of the pipeline.

Sometimes, 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.

Moreover, 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.

All 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!

rerankers seeks to address this problem by providing a simple API for all popular rerankers, no matter the architecture.

rerankers aims to be:

  • 🪶 Lightweight. It ships with only the bare necessities as dependencies.
  • 📖 Easy-to-understand. There's just a handful of calls to learn, and you can then use the full range of provided reranking models.
  • 🔗 Easy-to-integrate. It should fit in just about any existing pipelines, with only a few lines of code!
  • 💪 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.
  • 🐛 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.

Get Started

Installation is very simple. The core package ships with just two dependencies, tqdm and pydantic, so as to avoid any conflict with your current environment. You may then install only the dependencies required by the models you want to try out:

# 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[fastrank]"# All of the above
pip install "rerankers[all]"

Usage

Load any supported reranker in a single line, regardless of the architecture:

fromrerankersimportReranker# 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-xlarge-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" (checklitellmdocs), model_type="rankgpt", api_key=API_KEY)
# ColBERTv2 rerankerranker=Reranker("colbert")
# ... Or a non-default colbert model:ranker=Reranker(model_name_or_path, model_type="colbert")

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!

Then, regardless of which reranker is loaded, use the loaded model to rank a query against documents:

>results=ranker.rank(query="I love you", docs=["I hate you", "I really like you"], doc_ids=[0,1])
>resultsRankedResults(results=[Result(doc_id=1, text='I really like you', score=0.26170814, rank=1), Result(doc_id=0, text='I hate you', score=0.079210326, rank=2)], query='I love you', has_scores=True)

You 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.

You can also use rank_async, which is essentially just a wrapper to turn rank() into a coroutine. The result will be the same:

```python>results=awaitranker.rank_async(query="I love you", docs=["I hate you", "I really like you"], doc_ids=[0,1])
>resultsRankedResults(results=[Result(doc_id=1, text='I really like you', score=0.26170814, rank=1), Result(doc_id=0, text='I hate you', score=0.079210326, rank=2)], query='I love you', has_scores=True)

All rerankers will return a RankedResults object, which is a pydantic 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():

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

And 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.

Features

Legend:

  • ✅ Supported
  • 🟠 Implemented, but not fully fledged
  • 📍 Not supported but intended to be in the future
  • ⭐ Same as above, but important.
  • ❌ Not supported & not currently planned

Models:

  • ✅ Any standard SentenceTransformer or Transformers cross-encoder
  • 🟠 RankGPT (Implemented using original repo, but missing the rankllm's repo improvements)
  • ✅ T5-based pointwise rankers (InRanker, MonoT5...)
  • ✅ Cohere, Jina, Voyage and MixedBread API rerankers
  • FlashRank rerankers (ONNX-optimised models, very fast on CPU)
  • 🟠 ColBERT-based reranker - not a model initially designed for reranking, but quite strong (Implementation could be optimised and is from a third-party implementation.)
  • 📍 MixedBread API (Reranking API not yet released)
  • 📍⭐ RankLLM/RankZephyr (Proper RankLLM implementation will replace the RankGPT one, and introduce RankZephyr support)
  • 📍 LiT5

Features:

  • ✅ Reranking
  • ✅ Consistency notebooks to ensure performance on scifact matches the litterature for any given model implementation (Except RankGPT, where results are harder to reproduce).
  • 📍 Training on Python >=3.10 (via interfacing with other libraries)
  • 📍 ONNX runtime support --> Unlikely to be immediate
  • ❌(📍Maybe?) Training via rerankers directly

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

24 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rerankers

Python VersionsDownloadsTwitter Follow

A lightweight unified API for various reranking models. Developed by @bclavie as a member of answer.ai


Welcome to rerankers! Our goal is to provide users with a simple API to use any reranking models.

Updates

  • v0.2.0: 🆕 FlashRank rerankers, Basic async support thanks to @tarunamasa, MixedBread.ai reranking API
  • v0.1.2: Voyage reranking API
  • v0.1.1: Langchain integration fixed!
  • v0.1.0: Initial release

Why rerankers?

Rerankers are an important part of any retrieval architecture, but they're also often more obscure than other parts of the pipeline.

Sometimes, 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.

Moreover, 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.

All 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!

rerankers seeks to address this problem by providing a simple API for all popular rerankers, no matter the architecture.

rerankers aims to be:

  • 🪶 Lightweight. It ships with only the bare necessities as dependencies.
  • 📖 Easy-to-understand. There's just a handful of calls to learn, and you can then use the full range of provided reranking models.
  • 🔗 Easy-to-integrate. It should fit in just about any existing pipelines, with only a few lines of code!
  • 💪 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.
  • 🐛 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.

Get Started

Installation is very simple. The core package ships with just two dependencies, tqdm and pydantic, so as to avoid any conflict with your current environment. You may then install only the dependencies required by the models you want to try out:

# 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[fastrank]"# All of the above
pip install "rerankers[all]"

Usage

Load any supported reranker in a single line, regardless of the architecture:

fromrerankersimportReranker# 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-xlarge-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" (checklitellmdocs), model_type="rankgpt", api_key=API_KEY)
# ColBERTv2 rerankerranker=Reranker("colbert")
# ... Or a non-default colbert model:ranker=Reranker(model_name_or_path, model_type="colbert")

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!

Then, regardless of which reranker is loaded, use the loaded model to rank a query against documents:

>results=ranker.rank(query="I love you", docs=["I hate you", "I really like you"], doc_ids=[0,1])
>resultsRankedResults(results=[Result(doc_id=1, text='I really like you', score=0.26170814, rank=1), Result(doc_id=0, text='I hate you', score=0.079210326, rank=2)], query='I love you', has_scores=True)

You 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.

You can also use rank_async, which is essentially just a wrapper to turn rank() into a coroutine. The result will be the same:

```python>results=awaitranker.rank_async(query="I love you", docs=["I hate you", "I really like you"], doc_ids=[0,1])
>resultsRankedResults(results=[Result(doc_id=1, text='I really like you', score=0.26170814, rank=1), Result(doc_id=0, text='I hate you', score=0.079210326, rank=2)], query='I love you', has_scores=True)

All rerankers will return a RankedResults object, which is a pydantic 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():

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

And 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.

Features

Legend:

  • ✅ Supported
  • 🟠 Implemented, but not fully fledged
  • 📍 Not supported but intended to be in the future
  • ⭐ Same as above, but important.
  • ❌ Not supported & not currently planned

Models:

  • ✅ Any standard SentenceTransformer or Transformers cross-encoder
  • 🟠 RankGPT (Implemented using original repo, but missing the rankllm's repo improvements)
  • ✅ T5-based pointwise rankers (InRanker, MonoT5...)
  • ✅ Cohere, Jina, Voyage and MixedBread API rerankers
  • FlashRank rerankers (ONNX-optimised models, very fast on CPU)
  • 🟠 ColBERT-based reranker - not a model initially designed for reranking, but quite strong (Implementation could be optimised and is from a third-party implementation.)
  • 📍 MixedBread API (Reranking API not yet released)
  • 📍⭐ RankLLM/RankZephyr (Proper RankLLM implementation will replace the RankGPT one, and introduce RankZephyr support)
  • 📍 LiT5

Features:

  • ✅ Reranking
  • ✅ Consistency notebooks to ensure performance on scifact matches the litterature for any given model implementation (Except RankGPT, where results are harder to reproduce).
  • 📍 Training on Python >=3.10 (via interfacing with other libraries)
  • 📍 ONNX runtime support --> Unlikely to be immediate
  • ❌(📍Maybe?) Training via rerankers directly

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

24 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rerankers

Python VersionsDownloadsTwitter Follow

A lightweight unified API for various reranking models. Developed by @bclavie as a member of answer.ai


Welcome to rerankers! Our goal is to provide users with a simple API to use any reranking models.

Updates

  • v0.2.0: 🆕 FlashRank rerankers, Basic async support thanks to @tarunamasa, MixedBread.ai reranking API
  • v0.1.2: Voyage reranking API
  • v0.1.1: Langchain integration fixed!
  • v0.1.0: Initial release

Why rerankers?

Rerankers are an important part of any retrieval architecture, but they're also often more obscure than other parts of the pipeline.

Sometimes, 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.

Moreover, 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.

All 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!

rerankers seeks to address this problem by providing a simple API for all popular rerankers, no matter the architecture.

rerankers aims to be:

  • 🪶 Lightweight. It ships with only the bare necessities as dependencies.
  • 📖 Easy-to-understand. There's just a handful of calls to learn, and you can then use the full range of provided reranking models.
  • 🔗 Easy-to-integrate. It should fit in just about any existing pipelines, with only a few lines of code!
  • 💪 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.
  • 🐛 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.

Get Started

Installation is very simple. The core package ships with just two dependencies, tqdm and pydantic, so as to avoid any conflict with your current environment. You may then install only the dependencies required by the models you want to try out:

# 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[fastrank]"# All of the above
pip install "rerankers[all]"

Usage

Load any supported reranker in a single line, regardless of the architecture:

fromrerankersimportReranker# 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-xlarge-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" (checklitellmdocs), model_type="rankgpt", api_key=API_KEY)
# ColBERTv2 rerankerranker=Reranker("colbert")
# ... Or a non-default colbert model:ranker=Reranker(model_name_or_path, model_type="colbert")

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!

Then, regardless of which reranker is loaded, use the loaded model to rank a query against documents:

>results=ranker.rank(query="I love you", docs=["I hate you", "I really like you"], doc_ids=[0,1])
>resultsRankedResults(results=[Result(doc_id=1, text='I really like you', score=0.26170814, rank=1), Result(doc_id=0, text='I hate you', score=0.079210326, rank=2)], query='I love you', has_scores=True)

You 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.

You can also use rank_async, which is essentially just a wrapper to turn rank() into a coroutine. The result will be the same:

```python>results=awaitranker.rank_async(query="I love you", docs=["I hate you", "I really like you"], doc_ids=[0,1])
>resultsRankedResults(results=[Result(doc_id=1, text='I really like you', score=0.26170814, rank=1), Result(doc_id=0, text='I hate you', score=0.079210326, rank=2)], query='I love you', has_scores=True)

All rerankers will return a RankedResults object, which is a pydantic 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():

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

And 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.

Features

Legend:

  • ✅ Supported
  • 🟠 Implemented, but not fully fledged
  • 📍 Not supported but intended to be in the future
  • ⭐ Same as above, but important.
  • ❌ Not supported & not currently planned

Models:

  • ✅ Any standard SentenceTransformer or Transformers cross-encoder
  • 🟠 RankGPT (Implemented using original repo, but missing the rankllm's repo improvements)
  • ✅ T5-based pointwise rankers (InRanker, MonoT5...)
  • ✅ Cohere, Jina, Voyage and MixedBread API rerankers
  • FlashRank rerankers (ONNX-optimised models, very fast on CPU)
  • 🟠 ColBERT-based reranker - not a model initially designed for reranking, but quite strong (Implementation could be optimised and is from a third-party implementation.)
  • 📍 MixedBread API (Reranking API not yet released)
  • 📍⭐ RankLLM/RankZephyr (Proper RankLLM implementation will replace the RankGPT one, and introduce RankZephyr support)
  • 📍 LiT5

Features:

  • ✅ Reranking
  • ✅ Consistency notebooks to ensure performance on scifact matches the litterature for any given model implementation (Except RankGPT, where results are harder to reproduce).
  • 📍 Training on Python >=3.10 (via interfacing with other libraries)
  • 📍 ONNX runtime support --> Unlikely to be immediate
  • ❌(📍Maybe?) Training via rerankers directly

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

24 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rerankers

Python VersionsDownloadsTwitter Follow

A lightweight unified API for various reranking models. Developed by @bclavie as a member of answer.ai


Welcome to rerankers! Our goal is to provide users with a simple API to use any reranking models.

Updates

  • v0.2.0: 🆕 FlashRank rerankers, Basic async support thanks to @tarunamasa, MixedBread.ai reranking API
  • v0.1.2: Voyage reranking API
  • v0.1.1: Langchain integration fixed!
  • v0.1.0: Initial release

Why rerankers?

Rerankers are an important part of any retrieval architecture, but they're also often more obscure than other parts of the pipeline.

Sometimes, 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.

Moreover, 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.

All 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!

rerankers seeks to address this problem by providing a simple API for all popular rerankers, no matter the architecture.

rerankers aims to be:

  • 🪶 Lightweight. It ships with only the bare necessities as dependencies.
  • 📖 Easy-to-understand. There's just a handful of calls to learn, and you can then use the full range of provided reranking models.
  • 🔗 Easy-to-integrate. It should fit in just about any existing pipelines, with only a few lines of code!
  • 💪 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.
  • 🐛 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.

Get Started

Installation is very simple. The core package ships with just two dependencies, tqdm and pydantic, so as to avoid any conflict with your current environment. You may then install only the dependencies required by the models you want to try out:

# 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[fastrank]"# All of the above
pip install "rerankers[all]"

Usage

Load any supported reranker in a single line, regardless of the architecture:

fromrerankersimportReranker# 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-xlarge-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" (checklitellmdocs), model_type="rankgpt", api_key=API_KEY)
# ColBERTv2 rerankerranker=Reranker("colbert")
# ... Or a non-default colbert model:ranker=Reranker(model_name_or_path, model_type="colbert")

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!

Then, regardless of which reranker is loaded, use the loaded model to rank a query against documents:

>results=ranker.rank(query="I love you", docs=["I hate you", "I really like you"], doc_ids=[0,1])
>resultsRankedResults(results=[Result(doc_id=1, text='I really like you', score=0.26170814, rank=1), Result(doc_id=0, text='I hate you', score=0.079210326, rank=2)], query='I love you', has_scores=True)

You 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.

You can also use rank_async, which is essentially just a wrapper to turn rank() into a coroutine. The result will be the same:

```python>results=awaitranker.rank_async(query="I love you", docs=["I hate you", "I really like you"], doc_ids=[0,1])
>resultsRankedResults(results=[Result(doc_id=1, text='I really like you', score=0.26170814, rank=1), Result(doc_id=0, text='I hate you', score=0.079210326, rank=2)], query='I love you', has_scores=True)

All rerankers will return a RankedResults object, which is a pydantic 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():

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

And 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.

Features

Legend:

  • ✅ Supported
  • 🟠 Implemented, but not fully fledged
  • 📍 Not supported but intended to be in the future
  • ⭐ Same as above, but important.
  • ❌ Not supported & not currently planned

Models:

  • ✅ Any standard SentenceTransformer or Transformers cross-encoder
  • 🟠 RankGPT (Implemented using original repo, but missing the rankllm's repo improvements)
  • ✅ T5-based pointwise rankers (InRanker, MonoT5...)
  • ✅ Cohere, Jina, Voyage and MixedBread API rerankers
  • FlashRank rerankers (ONNX-optimised models, very fast on CPU)
  • 🟠 ColBERT-based reranker - not a model initially designed for reranking, but quite strong (Implementation could be optimised and is from a third-party implementation.)
  • 📍 MixedBread API (Reranking API not yet released)
  • 📍⭐ RankLLM/RankZephyr (Proper RankLLM implementation will replace the RankGPT one, and introduce RankZephyr support)
  • 📍 LiT5

Features:

  • ✅ Reranking
  • ✅ Consistency notebooks to ensure performance on scifact matches the litterature for any given model implementation (Except RankGPT, where results are harder to reproduce).
  • 📍 Training on Python >=3.10 (via interfacing with other libraries)
  • 📍 ONNX runtime support --> Unlikely to be immediate
  • ❌(📍Maybe?) Training via rerankers directly

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

24 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rerankers

Python VersionsDownloadsTwitter Follow

A lightweight unified API for various reranking models. Developed by @bclavie as a member of answer.ai


Welcome to rerankers! Our goal is to provide users with a simple API to use any reranking models.

Updates

  • v0.2.0: 🆕 FlashRank rerankers, Basic async support thanks to @tarunamasa, MixedBread.ai reranking API
  • v0.1.2: Voyage reranking API
  • v0.1.1: Langchain integration fixed!
  • v0.1.0: Initial release

Why rerankers?

Rerankers are an important part of any retrieval architecture, but they're also often more obscure than other parts of the pipeline.

Sometimes, 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.

Moreover, 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.

All 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!

rerankers seeks to address this problem by providing a simple API for all popular rerankers, no matter the architecture.

rerankers aims to be:

  • 🪶 Lightweight. It ships with only the bare necessities as dependencies.
  • 📖 Easy-to-understand. There's just a handful of calls to learn, and you can then use the full range of provided reranking models.
  • 🔗 Easy-to-integrate. It should fit in just about any existing pipelines, with only a few lines of code!
  • 💪 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.
  • 🐛 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.

Get Started

Installation is very simple. The core package ships with just two dependencies, tqdm and pydantic, so as to avoid any conflict with your current environment. You may then install only the dependencies required by the models you want to try out:

# 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[fastrank]"# All of the above
pip install "rerankers[all]"

Usage

Load any supported reranker in a single line, regardless of the architecture:

fromrerankersimportReranker# 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-xlarge-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" (checklitellmdocs), model_type="rankgpt", api_key=API_KEY)
# ColBERTv2 rerankerranker=Reranker("colbert")
# ... Or a non-default colbert model:ranker=Reranker(model_name_or_path, model_type="colbert")

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!

Then, regardless of which reranker is loaded, use the loaded model to rank a query against documents:

>results=ranker.rank(query="I love you", docs=["I hate you", "I really like you"], doc_ids=[0,1])
>resultsRankedResults(results=[Result(doc_id=1, text='I really like you', score=0.26170814, rank=1), Result(doc_id=0, text='I hate you', score=0.079210326, rank=2)], query='I love you', has_scores=True)

You 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.

You can also use rank_async, which is essentially just a wrapper to turn rank() into a coroutine. The result will be the same:

```python>results=awaitranker.rank_async(query="I love you", docs=["I hate you", "I really like you"], doc_ids=[0,1])
>resultsRankedResults(results=[Result(doc_id=1, text='I really like you', score=0.26170814, rank=1), Result(doc_id=0, text='I hate you', score=0.079210326, rank=2)], query='I love you', has_scores=True)

All rerankers will return a RankedResults object, which is a pydantic 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():

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

And 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.

Features

Legend:

  • ✅ Supported
  • 🟠 Implemented, but not fully fledged
  • 📍 Not supported but intended to be in the future
  • ⭐ Same as above, but important.
  • ❌ Not supported & not currently planned

Models:

  • ✅ Any standard SentenceTransformer or Transformers cross-encoder
  • 🟠 RankGPT (Implemented using original repo, but missing the rankllm's repo improvements)
  • ✅ T5-based pointwise rankers (InRanker, MonoT5...)
  • ✅ Cohere, Jina, Voyage and MixedBread API rerankers
  • FlashRank rerankers (ONNX-optimised models, very fast on CPU)
  • 🟠 ColBERT-based reranker - not a model initially designed for reranking, but quite strong (Implementation could be optimised and is from a third-party implementation.)
  • 📍 MixedBread API (Reranking API not yet released)
  • 📍⭐ RankLLM/RankZephyr (Proper RankLLM implementation will replace the RankGPT one, and introduce RankZephyr support)
  • 📍 LiT5

Features:

  • ✅ Reranking
  • ✅ Consistency notebooks to ensure performance on scifact matches the litterature for any given model implementation (Except RankGPT, where results are harder to reproduce).
  • 📍 Training on Python >=3.10 (via interfacing with other libraries)
  • 📍 ONNX runtime support --> Unlikely to be immediate
  • ❌(📍Maybe?) Training via rerankers directly

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

24 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rerankers

Python VersionsDownloadsTwitter Follow

A lightweight unified API for various reranking models. Developed by @bclavie as a member of answer.ai


Welcome to rerankers! Our goal is to provide users with a simple API to use any reranking models.

Updates

  • v0.2.0: 🆕 FlashRank rerankers, Basic async support thanks to @tarunamasa, MixedBread.ai reranking API
  • v0.1.2: Voyage reranking API
  • v0.1.1: Langchain integration fixed!
  • v0.1.0: Initial release

Why rerankers?

Rerankers are an important part of any retrieval architecture, but they're also often more obscure than other parts of the pipeline.

Sometimes, 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.

Moreover, 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.

All 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!

rerankers seeks to address this problem by providing a simple API for all popular rerankers, no matter the architecture.

rerankers aims to be:

  • 🪶 Lightweight. It ships with only the bare necessities as dependencies.
  • 📖 Easy-to-understand. There's just a handful of calls to learn, and you can then use the full range of provided reranking models.
  • 🔗 Easy-to-integrate. It should fit in just about any existing pipelines, with only a few lines of code!
  • 💪 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.
  • 🐛 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.

Get Started

Installation is very simple. The core package ships with just two dependencies, tqdm and pydantic, so as to avoid any conflict with your current environment. You may then install only the dependencies required by the models you want to try out:

# 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[fastrank]"# All of the above
pip install "rerankers[all]"

Usage

Load any supported reranker in a single line, regardless of the architecture:

fromrerankersimportReranker# 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-xlarge-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" (checklitellmdocs), model_type="rankgpt", api_key=API_KEY)
# ColBERTv2 rerankerranker=Reranker("colbert")
# ... Or a non-default colbert model:ranker=Reranker(model_name_or_path, model_type="colbert")

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!

Then, regardless of which reranker is loaded, use the loaded model to rank a query against documents:

>results=ranker.rank(query="I love you", docs=["I hate you", "I really like you"], doc_ids=[0,1])
>resultsRankedResults(results=[Result(doc_id=1, text='I really like you', score=0.26170814, rank=1), Result(doc_id=0, text='I hate you', score=0.079210326, rank=2)], query='I love you', has_scores=True)

You 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.

You can also use rank_async, which is essentially just a wrapper to turn rank() into a coroutine. The result will be the same:

```python>results=awaitranker.rank_async(query="I love you", docs=["I hate you", "I really like you"], doc_ids=[0,1])
>resultsRankedResults(results=[Result(doc_id=1, text='I really like you', score=0.26170814, rank=1), Result(doc_id=0, text='I hate you', score=0.079210326, rank=2)], query='I love you', has_scores=True)

All rerankers will return a RankedResults object, which is a pydantic 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():

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

And 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.

Features

Legend:

  • ✅ Supported
  • 🟠 Implemented, but not fully fledged
  • 📍 Not supported but intended to be in the future
  • ⭐ Same as above, but important.
  • ❌ Not supported & not currently planned

Models:

  • ✅ Any standard SentenceTransformer or Transformers cross-encoder
  • 🟠 RankGPT (Implemented using original repo, but missing the rankllm's repo improvements)
  • ✅ T5-based pointwise rankers (InRanker, MonoT5...)
  • ✅ Cohere, Jina, Voyage and MixedBread API rerankers
  • FlashRank rerankers (ONNX-optimised models, very fast on CPU)
  • 🟠 ColBERT-based reranker - not a model initially designed for reranking, but quite strong (Implementation could be optimised and is from a third-party implementation.)
  • 📍 MixedBread API (Reranking API not yet released)
  • 📍⭐ RankLLM/RankZephyr (Proper RankLLM implementation will replace the RankGPT one, and introduce RankZephyr support)
  • 📍 LiT5

Features:

  • ✅ Reranking
  • ✅ Consistency notebooks to ensure performance on scifact matches the litterature for any given model implementation (Except RankGPT, where results are harder to reproduce).
  • 📍 Training on Python >=3.10 (via interfacing with other libraries)
  • 📍 ONNX runtime support --> Unlikely to be immediate
  • ❌(📍Maybe?) Training via rerankers directly

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

24 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rerankers

Python VersionsDownloadsTwitter Follow

A lightweight unified API for various reranking models. Developed by @bclavie as a member of answer.ai


Welcome to rerankers! Our goal is to provide users with a simple API to use any reranking models.

Updates

  • v0.2.0: 🆕 FlashRank rerankers, Basic async support thanks to @tarunamasa, MixedBread.ai reranking API
  • v0.1.2: Voyage reranking API
  • v0.1.1: Langchain integration fixed!
  • v0.1.0: Initial release

Why rerankers?

Rerankers are an important part of any retrieval architecture, but they're also often more obscure than other parts of the pipeline.

Sometimes, 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.

Moreover, 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.

All 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!

rerankers seeks to address this problem by providing a simple API for all popular rerankers, no matter the architecture.

rerankers aims to be:

  • 🪶 Lightweight. It ships with only the bare necessities as dependencies.
  • 📖 Easy-to-understand. There's just a handful of calls to learn, and you can then use the full range of provided reranking models.
  • 🔗 Easy-to-integrate. It should fit in just about any existing pipelines, with only a few lines of code!
  • 💪 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.
  • 🐛 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.

Get Started

Installation is very simple. The core package ships with just two dependencies, tqdm and pydantic, so as to avoid any conflict with your current environment. You may then install only the dependencies required by the models you want to try out:

# 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[fastrank]"# All of the above
pip install "rerankers[all]"

Usage

Load any supported reranker in a single line, regardless of the architecture:

fromrerankersimportReranker# 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-xlarge-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" (checklitellmdocs), model_type="rankgpt", api_key=API_KEY)
# ColBERTv2 rerankerranker=Reranker("colbert")
# ... Or a non-default colbert model:ranker=Reranker(model_name_or_path, model_type="colbert")

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!

Then, regardless of which reranker is loaded, use the loaded model to rank a query against documents:

>results=ranker.rank(query="I love you", docs=["I hate you", "I really like you"], doc_ids=[0,1])
>resultsRankedResults(results=[Result(doc_id=1, text='I really like you', score=0.26170814, rank=1), Result(doc_id=0, text='I hate you', score=0.079210326, rank=2)], query='I love you', has_scores=True)

You 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.

You can also use rank_async, which is essentially just a wrapper to turn rank() into a coroutine. The result will be the same:

```python>results=awaitranker.rank_async(query="I love you", docs=["I hate you", "I really like you"], doc_ids=[0,1])
>resultsRankedResults(results=[Result(doc_id=1, text='I really like you', score=0.26170814, rank=1), Result(doc_id=0, text='I hate you', score=0.079210326, rank=2)], query='I love you', has_scores=True)

All rerankers will return a RankedResults object, which is a pydantic 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():

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

And 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.

Features

Legend:

  • ✅ Supported
  • 🟠 Implemented, but not fully fledged
  • 📍 Not supported but intended to be in the future
  • ⭐ Same as above, but important.
  • ❌ Not supported & not currently planned

Models:

  • ✅ Any standard SentenceTransformer or Transformers cross-encoder
  • 🟠 RankGPT (Implemented using original repo, but missing the rankllm's repo improvements)
  • ✅ T5-based pointwise rankers (InRanker, MonoT5...)
  • ✅ Cohere, Jina, Voyage and MixedBread API rerankers
  • FlashRank rerankers (ONNX-optimised models, very fast on CPU)
  • 🟠 ColBERT-based reranker - not a model initially designed for reranking, but quite strong (Implementation could be optimised and is from a third-party implementation.)
  • 📍 MixedBread API (Reranking API not yet released)
  • 📍⭐ RankLLM/RankZephyr (Proper RankLLM implementation will replace the RankGPT one, and introduce RankZephyr support)
  • 📍 LiT5

Features:

  • ✅ Reranking
  • ✅ Consistency notebooks to ensure performance on scifact matches the litterature for any given model implementation (Except RankGPT, where results are harder to reproduce).
  • 📍 Training on Python >=3.10 (via interfacing with other libraries)
  • 📍 ONNX runtime support --> Unlikely to be immediate
  • ❌(📍Maybe?) Training via rerankers directly

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages