A comprehensive Python library for testing and comparing state-of-the-art reranker models. This project provides unified interfaces to multiple reranking models, making it easy to evaluate and compare their performance on your specific use cases.
| Model | Provider | Model ID | Strengths |
|---|---|---|---|
| Jina Reranker | Jina AI | jinaai/jina-reranker-v2-base-multilingual | Fast inference, multilingual |
| MixedBread AI v1 | MixedBread AI | mixedbread-ai/mxbai-rerank-large-v1 | Balanced performance |
| MixedBread AI v2 | MixedBread AI | mixedbread-ai/mxbai-rerank-large-v2 | Latest generation, high accuracy |
| Qwen Reranker 0.6B | Alibaba | Qwen/Qwen3-Reranker-0.6B | Fastest, smallest model |
| Qwen Reranker 4B | Alibaba | Qwen/Qwen3-Reranker-4B | Balanced size and quality |
| Qwen Reranker 8B | Alibaba | Qwen/Qwen3-Reranker-8B | Largest, highest accuracy |
| MS MARCO | Microsoft | cross-encoder/ms-marco-MiniLM-L12-v2 | Fast, well-established |
| BGE Base | BAAI | BAAI/bge-reranker-base | Fast, lightweight baseline |
| BGE Large | BAAI | BAAI/bge-reranker-large | Larger, more accurate |
| BGE V2-M3 | BAAI | BAAI/bge-reranker-v2-m3 | Latest multilingual model |
| BGE V2-Gemma | BAAI | BAAI/bge-reranker-v2-gemma | LLM-based reranker |
| BGE V2-MiniCPM-Layerwise | BAAI | BAAI/bge-reranker-v2-minicpm-layerwise | Advanced layerwise model |
| BGE V2.5-Gemma2-Lightweight | BAAI | BAAI/bge-reranker-v2.5-gemma2-lightweight | Lightweight LLM reranker* |
# Clone the repository
git clone https://github.com/your-username/py-reranker.git
cd py-reranker
# Install dependencies using uv (recommended)
uv sync
# Or using pip
pip install -r requirements.txt
# Run all rerankers on machine learning test data
uv run python main.py --test-file tests/data/test_ml.json --top-k 3
# Test only MixedBread AI v2 reranker
uv run python main.py --test-file tests/data/test_qa.json --reranker mxbai-v2
# Test with your own query and documents
uv run python main.py \
--query "What is artificial intelligence?" \
--documents \
"AI is machine intelligence" \
"Cooking is an art" \
"Neural networks are powerful" \
--reranker mxbai-v2 \
--top-k 2
# Test different Qwen model sizes
uv run python main.py \
--query "What is machine learning?" \
--documents \
"AI is machine intelligence" \
"Cooking is an art" \
"Neural networks are powerful" \
--reranker qwen-0.6b # Fastest Qwen model
uv run python main.py \
--query "What is machine learning?" \
--documents \
"AI is machine intelligence" \
"Cooking is an art" \
"Neural networks are powerful" \
--reranker qwen-8b # Most accurate Qwen model
Using device: cpu
Query: What is machine learning?
Number of documents: 3
=== MixedBread AI Reranker V2 Results ===
1. Score: 9.8525
Document: Machine learning is a subset of artificial intelligence.
2. Score: 1.3604
Document: Deep learning uses neural networks.
3. Score: -4.7962
Document: The weather today is sunny.
The BGE (BAAI General Embedding) rerankers offer multiple model sizes and architectures:
| Model | CLI Option | Model Size | Type | Best For |
|---|---|---|---|---|
| BGE Base | bge-base | ~110M params | Standard | Fast inference, baseline |
| BGE Large | bge-large | ~340M params | Standard | Better accuracy |
| BGE V2-M3 | bge-v2-m3 | 568M params | Standard | Multilingual, lightweight, fast inference |
| BGE V2-Gemma | bge-v2-gemma | 2.51B params | LLM-based | Multilingual, strong performance |
| BGE V2-MiniCPM-Layerwise | bge-v2-minicpm-layerwise | 2.72B params | Layerwise | Layer selection, accelerated inference |
| BGE V2.5-Gemma2-Lightweight | bge-v2.5-gemma2-lightweight | 2.72B params | Lightweight LLM | Layer selection, compression, efficiency* |
Choose your BGE model based on your requirements:
bge-v2-m3, bge-v2-gemma, or bge-v2.5-gemma2-lightweightbge-v2-m3 or bge-v2-minicpm-layerwisebge-v2-m3 or low layers of bge-v2-minicpm-layerwisebge-v2-minicpm-layerwise or bge-v2-gemmaπ‘ Tip: Always test on your real use case and choose the model with the best speed-quality balance!
# Fast baseline model
uv run python main.py \
--query "What is machine learning?" \
--documents "ML is AI subset" "Deep learning uses neural networks" \
--reranker bge-base
# High accuracy model
uv run python main.py \
--query "What is machine learning?" \
--documents "ML is AI subset" "Deep learning uses neural networks" \
--reranker bge-large
# Latest multilingual model (default BGE)
uv run python main.py \
--query "What is machine learning?" \
--documents "ML is AI subset" "Deep learning uses neural networks" \
--reranker bge-v2-m3
# LLM-based reranker for complex queries
uv run python main.py \
--query "Explain the relationship between neural networks and deep learning" \
--documents "Neural networks are the foundation" "Deep learning uses multiple layers" \
--reranker bge-v2-gemma
# Lightweight LLM reranker (requires newer transformers)
uv run python main.py \
--query "What is machine learning?" \
--documents "ML is AI subset" "Deep learning uses neural networks" \
--reranker bge-v2.5-gemma2-lightweight
from rerankers import (
BGEReranker, # Generic class with model_size parameter
BGERerankerBase, # Convenience class for base model
BGERerankerLarge, # Convenience class for large model
BGERerankerV2M3, # Convenience class for V2-M3 model
BGERerankerV2Gemma, # Convenience class for V2-Gemma model
BGERerankerV2MiniCPMLayerwise, # Convenience class for layerwise model
BGERerankerV25Gemma2Lightweight # Convenience class for lightweight model
)
# Method 1: Using generic class with model_size parameter
reranker = BGEReranker(model_size='base') # or 'large', 'v2-m3', 'v2-gemma', 'v2-minicpm-layerwise', 'v2.5-gemma2-lightweight'
# Method 2: Using convenience classes
base_reranker = BGERerankerBase()
large_reranker = BGERerankerLarge()
v2m3_reranker = BGERerankerV2M3()
gemma_reranker = BGERerankerV2Gemma(use_bf16=True) # Enable bf16 for faster inference
layerwise_reranker = BGERerankerV2MiniCPMLayerwise() # Uses bf16 by default
lightweight_reranker = BGERerankerV25Gemma2Lightweight() # Requires newer transformers
# Compute scores
query = "What is machine learning?"
documents = [
"Machine learning is a subset of artificial intelligence",
"Deep learning uses neural networks with multiple layers",
"The weather today is sunny"
]
scores = base_reranker.compute_score(query, documents)
print(f"Base model scores: {scores}")
# Rank documents
ranked = large_reranker.rank(query, documents, top_n=2)
for i, (doc, score) in enumerate(ranked, 1):
print(f"{i}. Score: {score:.4f} - {doc[:50]}...")
# For layerwise model, you can specify which layers to use
layerwise_scores = layerwise_reranker.compute_score(
query, documents, cutoff_layers=[28] # Use layer 28 for scoring
)
# For lightweight model, you can specify compression parameters
try:
lightweight_scores = lightweight_reranker.compute_score(
query, documents,
cutoff_layers=[28],
compress_ratio=2,
compress_layer=[24, 40]
)
except ImportError as e:
print(f"Lightweight model requires newer transformers: {e}")
If you prefer to use the official FlagEmbedding library directly (requires pip install -U FlagEmbedding):
from FlagEmbedding import FlagReranker, FlagLLMReranker, LayerWiseFlagLLMReranker, LightWeightFlagLLMReranker
# Standard models (bge-reranker-v2-m3, bge-reranker-base, bge-reranker-large)
reranker = FlagReranker('BAAI/bge-reranker-v2-m3', use_fp16=True)
score = reranker.compute_score(['query', 'passage'])
# LLM-based model (bge-reranker-v2-gemma)
llm_reranker = FlagLLMReranker('BAAI/bge-reranker-v2-gemma', use_fp16=True)
score = llm_reranker.compute_score(['query', 'passage'])
# Layerwise model (bge-reranker-v2-minicpm-layerwise)
layerwise_reranker = LayerWiseFlagLLMReranker('BAAI/bge-reranker-v2-minicpm-layerwise', use_fp16=True)
score = layerwise_reranker.compute_score(['query', 'passage'], cutoff_layers=[28])
# Lightweight model (bge-reranker-v2.5-gemma2-lightweight)
lightweight_reranker = LightWeightFlagLLMReranker('BAAI/bge-reranker-v2.5-gemma2-lightweight', use_fp16=True)
score = lightweight_reranker.compute_score(['query', 'passage'], cutoff_layers=[28], compress_ratio=2, compress_layer=[24, 40])
Note: Our implementation uses transformers directly for better compatibility and unified API, but both approaches produce equivalent results.
The main CLI tool supports various options:
uv run python main.py [OPTIONS]
Options:
--test-file PATH Path to JSON test file
--query TEXT Query string (alternative to test file)
--documents TEXT [TEXT ...] Document strings to rank
--reranker {jina,mxbai,mxbai-v2,qwen,qwen-0.6b,qwen-4b,qwen-8b,msmarco,msmarco-v2,bge,bge-base,bge-large,bge-v2-m3,bge-v2-gemma,bge-v2-minicpm-layerwise,bge-v2.5-gemma2-lightweight}
Specific reranker to use (default: all)
--top-k INTEGER Number of top results to return (default: 3)
--benchmark Run performance benchmark instead of normal ranking
--help Show help message
Create JSON files with the following structure:
{
"query": "What is machine learning?",
"documents": [
"Machine learning is a subset of artificial intelligence.",
"The weather today is sunny.",
"Deep learning uses neural networks."
]
}
# Comprehensive testing across all models and test files
./test-all.sh
# Performance benchmarking with timing analysis
uv run python main.py --benchmark --test-file tests/data/test_qa.json
# Benchmark specific reranker
uv run python main.py --benchmark --reranker mxbai-v2 --test-file tests/data/test_ml.json
# Benchmark all rerankers with inline query/documents
uv run python main.py --benchmark --query "What is machine learning?" --documents "ML is AI" "Deep learning uses neural networks"
This project maintains high code quality with comprehensive testing:
# Run all tests with coverage report
uv run pytest --cov=. --cov-report=term-missing
# Run specific test categories
uv run pytest tests/test_main.py -v
uv run pytest tests/test_utils.py -v
uv run pytest tests/test_rerankers.py -v
Test Coverage: 97% β
main.py: 98% coverageutils/common.py: 86% coveragepy-reranker/
βββ π rerankers/ # Reranker model implementations
β βββ jina_reranker.py
β βββ mxbai_reranker.py
β βββ mxbai_v2_reranker.py
β βββ qwen_reranker.py
β βββ msmarco_reranker.py
β βββ bge_reranker.py
βββ π tests/ # Test suite
β βββ π data/ # JSON test files
β βββ conftest.py
β βββ test_main.py
β βββ test_utils.py
β βββ test_rerankers.py
βββ test-all.sh # Shell script for batch testing
βββ π utils/ # Common utilities
β βββ common.py
βββ main.py # Main CLI interface
βββ pyproject.toml # Project configuration
βββ README.md # This file
Based on our benchmarking tests:
| Rank | Model | Relative Speed | Model Size | Best Use Case |
|---|---|---|---|---|
| π₯ | Jina Reranker | Fastest | Small | Real-time applications |
| π₯ | MS MARCO | Fast | Small | Production systems |
| π₯ | MixedBread AI v1 | Moderate | Medium | Balanced performance |
| 4οΈβ£ | MixedBread AI v2 | Moderate | Medium | Latest accuracy |
| 5οΈβ£ | BGE Reranker | Slower | Large | Research/Quality focus |
| 6οΈβ£ | Qwen Reranker | Slowest | Largest | Maximum accuracy |
git checkout -b feature-nameuv run pytestrerankers/ following the existing patterntests/test_rerankers.pypyproject.toml for complete dependenciespip install --upgrade transformers
This project is licensed under the MIT License - see the LICENSE file for details.
If you encounter any issues or have questions:
β Star this repository if you find it helpful! β
12 commits
Python
99.4%
A comprehensive Python library for testing and comparing state-of-the-art reranker models. This project provides unified interfaces to multiple reranking models, making it easy to evaluate and compare their performance on your specific use cases.
| Model | Provider | Model ID | Strengths |
|---|---|---|---|
| Jina Reranker | Jina AI | jinaai/jina-reranker-v2-base-multilingual | Fast inference, multilingual |
| MixedBread AI v1 | MixedBread AI | mixedbread-ai/mxbai-rerank-large-v1 | Balanced performance |
| MixedBread AI v2 | MixedBread AI | mixedbread-ai/mxbai-rerank-large-v2 | Latest generation, high accuracy |
| Qwen Reranker 0.6B | Alibaba | Qwen/Qwen3-Reranker-0.6B | Fastest, smallest model |
| Qwen Reranker 4B | Alibaba | Qwen/Qwen3-Reranker-4B | Balanced size and quality |
| Qwen Reranker 8B | Alibaba | Qwen/Qwen3-Reranker-8B | Largest, highest accuracy |
| MS MARCO | Microsoft | cross-encoder/ms-marco-MiniLM-L12-v2 | Fast, well-established |
| BGE Base | BAAI | BAAI/bge-reranker-base | Fast, lightweight baseline |
| BGE Large | BAAI | BAAI/bge-reranker-large | Larger, more accurate |
| BGE V2-M3 | BAAI | BAAI/bge-reranker-v2-m3 | Latest multilingual model |
| BGE V2-Gemma | BAAI | BAAI/bge-reranker-v2-gemma | LLM-based reranker |
| BGE V2-MiniCPM-Layerwise | BAAI | BAAI/bge-reranker-v2-minicpm-layerwise | Advanced layerwise model |
| BGE V2.5-Gemma2-Lightweight | BAAI | BAAI/bge-reranker-v2.5-gemma2-lightweight | Lightweight LLM reranker* |
# Clone the repository
git clone https://github.com/your-username/py-reranker.git
cd py-reranker
# Install dependencies using uv (recommended)
uv sync
# Or using pip
pip install -r requirements.txt
# Run all rerankers on machine learning test data
uv run python main.py --test-file tests/data/test_ml.json --top-k 3
# Test only MixedBread AI v2 reranker
uv run python main.py --test-file tests/data/test_qa.json --reranker mxbai-v2
# Test with your own query and documents
uv run python main.py \
--query "What is artificial intelligence?" \
--documents \
"AI is machine intelligence" \
"Cooking is an art" \
"Neural networks are powerful" \
--reranker mxbai-v2 \
--top-k 2
# Test different Qwen model sizes
uv run python main.py \
--query "What is machine learning?" \
--documents \
"AI is machine intelligence" \
"Cooking is an art" \
"Neural networks are powerful" \
--reranker qwen-0.6b # Fastest Qwen model
uv run python main.py \
--query "What is machine learning?" \
--documents \
"AI is machine intelligence" \
"Cooking is an art" \
"Neural networks are powerful" \
--reranker qwen-8b # Most accurate Qwen model
Using device: cpu
Query: What is machine learning?
Number of documents: 3
=== MixedBread AI Reranker V2 Results ===
1. Score: 9.8525
Document: Machine learning is a subset of artificial intelligence.
2. Score: 1.3604
Document: Deep learning uses neural networks.
3. Score: -4.7962
Document: The weather today is sunny.
The BGE (BAAI General Embedding) rerankers offer multiple model sizes and architectures:
| Model | CLI Option | Model Size | Type | Best For |
|---|---|---|---|---|
| BGE Base | bge-base | ~110M params | Standard | Fast inference, baseline |
| BGE Large | bge-large | ~340M params | Standard | Better accuracy |
| BGE V2-M3 | bge-v2-m3 | 568M params | Standard | Multilingual, lightweight, fast inference |
| BGE V2-Gemma | bge-v2-gemma | 2.51B params | LLM-based | Multilingual, strong performance |
| BGE V2-MiniCPM-Layerwise | bge-v2-minicpm-layerwise | 2.72B params | Layerwise | Layer selection, accelerated inference |
| BGE V2.5-Gemma2-Lightweight | bge-v2.5-gemma2-lightweight | 2.72B params | Lightweight LLM | Layer selection, compression, efficiency* |
Choose your BGE model based on your requirements:
bge-v2-m3, bge-v2-gemma, or bge-v2.5-gemma2-lightweightbge-v2-m3 or bge-v2-minicpm-layerwisebge-v2-m3 or low layers of bge-v2-minicpm-layerwisebge-v2-minicpm-layerwise or bge-v2-gemmaπ‘ Tip: Always test on your real use case and choose the model with the best speed-quality balance!
# Fast baseline model
uv run python main.py \
--query "What is machine learning?" \
--documents "ML is AI subset" "Deep learning uses neural networks" \
--reranker bge-base
# High accuracy model
uv run python main.py \
--query "What is machine learning?" \
--documents "ML is AI subset" "Deep learning uses neural networks" \
--reranker bge-large
# Latest multilingual model (default BGE)
uv run python main.py \
--query "What is machine learning?" \
--documents "ML is AI subset" "Deep learning uses neural networks" \
--reranker bge-v2-m3
# LLM-based reranker for complex queries
uv run python main.py \
--query "Explain the relationship between neural networks and deep learning" \
--documents "Neural networks are the foundation" "Deep learning uses multiple layers" \
--reranker bge-v2-gemma
# Lightweight LLM reranker (requires newer transformers)
uv run python main.py \
--query "What is machine learning?" \
--documents "ML is AI subset" "Deep learning uses neural networks" \
--reranker bge-v2.5-gemma2-lightweight
from rerankers import (
BGEReranker, # Generic class with model_size parameter
BGERerankerBase, # Convenience class for base model
BGERerankerLarge, # Convenience class for large model
BGERerankerV2M3, # Convenience class for V2-M3 model
BGERerankerV2Gemma, # Convenience class for V2-Gemma model
BGERerankerV2MiniCPMLayerwise, # Convenience class for layerwise model
BGERerankerV25Gemma2Lightweight # Convenience class for lightweight model
)
# Method 1: Using generic class with model_size parameter
reranker = BGEReranker(model_size='base') # or 'large', 'v2-m3', 'v2-gemma', 'v2-minicpm-layerwise', 'v2.5-gemma2-lightweight'
# Method 2: Using convenience classes
base_reranker = BGERerankerBase()
large_reranker = BGERerankerLarge()
v2m3_reranker = BGERerankerV2M3()
gemma_reranker = BGERerankerV2Gemma(use_bf16=True) # Enable bf16 for faster inference
layerwise_reranker = BGERerankerV2MiniCPMLayerwise() # Uses bf16 by default
lightweight_reranker = BGERerankerV25Gemma2Lightweight() # Requires newer transformers
# Compute scores
query = "What is machine learning?"
documents = [
"Machine learning is a subset of artificial intelligence",
"Deep learning uses neural networks with multiple layers",
"The weather today is sunny"
]
scores = base_reranker.compute_score(query, documents)
print(f"Base model scores: {scores}")
# Rank documents
ranked = large_reranker.rank(query, documents, top_n=2)
for i, (doc, score) in enumerate(ranked, 1):
print(f"{i}. Score: {score:.4f} - {doc[:50]}...")
# For layerwise model, you can specify which layers to use
layerwise_scores = layerwise_reranker.compute_score(
query, documents, cutoff_layers=[28] # Use layer 28 for scoring
)
# For lightweight model, you can specify compression parameters
try:
lightweight_scores = lightweight_reranker.compute_score(
query, documents,
cutoff_layers=[28],
compress_ratio=2,
compress_layer=[24, 40]
)
except ImportError as e:
print(f"Lightweight model requires newer transformers: {e}")
If you prefer to use the official FlagEmbedding library directly (requires pip install -U FlagEmbedding):
from FlagEmbedding import FlagReranker, FlagLLMReranker, LayerWiseFlagLLMReranker, LightWeightFlagLLMReranker
# Standard models (bge-reranker-v2-m3, bge-reranker-base, bge-reranker-large)
reranker = FlagReranker('BAAI/bge-reranker-v2-m3', use_fp16=True)
score = reranker.compute_score(['query', 'passage'])
# LLM-based model (bge-reranker-v2-gemma)
llm_reranker = FlagLLMReranker('BAAI/bge-reranker-v2-gemma', use_fp16=True)
score = llm_reranker.compute_score(['query', 'passage'])
# Layerwise model (bge-reranker-v2-minicpm-layerwise)
layerwise_reranker = LayerWiseFlagLLMReranker('BAAI/bge-reranker-v2-minicpm-layerwise', use_fp16=True)
score = layerwise_reranker.compute_score(['query', 'passage'], cutoff_layers=[28])
# Lightweight model (bge-reranker-v2.5-gemma2-lightweight)
lightweight_reranker = LightWeightFlagLLMReranker('BAAI/bge-reranker-v2.5-gemma2-lightweight', use_fp16=True)
score = lightweight_reranker.compute_score(['query', 'passage'], cutoff_layers=[28], compress_ratio=2, compress_layer=[24, 40])
Note: Our implementation uses transformers directly for better compatibility and unified API, but both approaches produce equivalent results.
The main CLI tool supports various options:
uv run python main.py [OPTIONS]
Options:
--test-file PATH Path to JSON test file
--query TEXT Query string (alternative to test file)
--documents TEXT [TEXT ...] Document strings to rank
--reranker {jina,mxbai,mxbai-v2,qwen,qwen-0.6b,qwen-4b,qwen-8b,msmarco,msmarco-v2,bge,bge-base,bge-large,bge-v2-m3,bge-v2-gemma,bge-v2-minicpm-layerwise,bge-v2.5-gemma2-lightweight}
Specific reranker to use (default: all)
--top-k INTEGER Number of top results to return (default: 3)
--benchmark Run performance benchmark instead of normal ranking
--help Show help message
Create JSON files with the following structure:
{
"query": "What is machine learning?",
"documents": [
"Machine learning is a subset of artificial intelligence.",
"The weather today is sunny.",
"Deep learning uses neural networks."
]
}
# Comprehensive testing across all models and test files
./test-all.sh
# Performance benchmarking with timing analysis
uv run python main.py --benchmark --test-file tests/data/test_qa.json
# Benchmark specific reranker
uv run python main.py --benchmark --reranker mxbai-v2 --test-file tests/data/test_ml.json
# Benchmark all rerankers with inline query/documents
uv run python main.py --benchmark --query "What is machine learning?" --documents "ML is AI" "Deep learning uses neural networks"
This project maintains high code quality with comprehensive testing:
# Run all tests with coverage report
uv run pytest --cov=. --cov-report=term-missing
# Run specific test categories
uv run pytest tests/test_main.py -v
uv run pytest tests/test_utils.py -v
uv run pytest tests/test_rerankers.py -v
Test Coverage: 97% β
main.py: 98% coverageutils/common.py: 86% coveragepy-reranker/
βββ π rerankers/ # Reranker model implementations
β βββ jina_reranker.py
β βββ mxbai_reranker.py
β βββ mxbai_v2_reranker.py
β βββ qwen_reranker.py
β βββ msmarco_reranker.py
β βββ bge_reranker.py
βββ π tests/ # Test suite
β βββ π data/ # JSON test files
β βββ conftest.py
β βββ test_main.py
β βββ test_utils.py
β βββ test_rerankers.py
βββ test-all.sh # Shell script for batch testing
βββ π utils/ # Common utilities
β βββ common.py
βββ main.py # Main CLI interface
βββ pyproject.toml # Project configuration
βββ README.md # This file
Based on our benchmarking tests:
| Rank | Model | Relative Speed | Model Size | Best Use Case |
|---|---|---|---|---|
| π₯ | Jina Reranker | Fastest | Small | Real-time applications |
| π₯ | MS MARCO | Fast | Small | Production systems |
| π₯ | MixedBread AI v1 | Moderate | Medium | Balanced performance |
| 4οΈβ£ | MixedBread AI v2 | Moderate | Medium | Latest accuracy |
| 5οΈβ£ | BGE Reranker | Slower | Large | Research/Quality focus |
| 6οΈβ£ | Qwen Reranker | Slowest | Largest | Maximum accuracy |
git checkout -b feature-nameuv run pytestrerankers/ following the existing patterntests/test_rerankers.pypyproject.toml for complete dependenciespip install --upgrade transformers
This project is licensed under the MIT License - see the LICENSE file for details.
If you encounter any issues or have questions:
β Star this repository if you find it helpful! β
12 commits
Python
99.4%