bge-reranker
The bge-reranker family from BAAI (Beijing Academy of Artificial Intelligence) are open-weight cross-encoders trained specifically for passage reranking. They're the standard self-hosted option: free to download, drop into sentence-transformers, and the open-weight baseline most other rerankers measure themselves against.
Model variants
| Model | Parameters | Languages | Best for |
|---|---|---|---|
BAAI/bge-reranker-base | 278M | Chinese, English | Fast CPU inference, good baseline |
BAAI/bge-reranker-large | 560M | Chinese, English | Stronger quality, same two languages |
BAAI/bge-reranker-v2-m3 | 568M | 100+ langs | Best all-round; multilingual powerhouse |
BAAI/bge-reranker-v2-gemma | 2.5B | 100+ langs | Highest quality; needs GPU |
Recommendation: start with bge-reranker-v2-m3. It's multilingual, small enough for CPU, and works fine for moderate traffic. Upgrade to the Gemma variant only if you have GPU and need maximum quality.
Benchmarks
BAAI evaluated the two generations on different benchmarks, so neither column is complete: BEIR (English retrieval) for v2, C-MTEB reranking (mostly Chinese) for v1.
| Model | BEIR NDCG@10 (avg) | C-MTEB reranking (avg MAP) |
|---|---|---|
| bge-reranker-base | not published | 65.42* |
| bge-reranker-large | not published | 66.10* |
| bge-reranker-v2-m3 | 55.36* | not published |
| bge-reranker-v2-gemma | 60.71* | not published |
* All figures are BAAI's own. BEIR: 15 datasets, reranking the top 100 results from bge-large-en-v1.5 (FlagEmbedding llm_reranker evaluation). C-MTEB: average MAP over six reranking sets — T2Reranking, its two cross-language variants, MMarcoReranking, CMedQAv1 and CMedQAv2 (FlagEmbedding reranker README). Other evaluators get different BEIR numbers from their own setups — Jina's paper has v2-m3 at 56.51* — so compare models within one source. Until October 2026 this table showed BEIR and MS MARCO figures for all four models that we could not trace to any source; they have been removed.
Quick start
Install
pip install sentence-transformers
Rerank a list of passages
from sentence_transformers import CrossEncoder
model = CrossEncoder("BAAI/bge-reranker-v2-m3", max_length=512)
query = "How do I add reranking to my RAG pipeline?"
passages = [
"Rerankers score each query-passage pair with a cross-encoder.",
"BM25 is a classical keyword-based retrieval method.",
"London is the capital of the United Kingdom.",
"Two-stage retrieval: retrieve 50 candidates, rerank to top 5.",
]
scores = model.predict([(query, p) for p in passages])
ranked = sorted(zip(scores, passages), reverse=True)
for score, text in ranked:
print(f"{score:.4f} {text[:80]}")
In a RAG pipeline
from sentence_transformers import CrossEncoder
reranker = CrossEncoder("BAAI/bge-reranker-v2-m3")
def rag_answer(query: str, vector_db, llm) -> str:
# Stage 1: retrieve wide
candidates = vector_db.search(query, top_k=50)
# Stage 2: rerank tight
scores = reranker.predict([(query, c) for c in candidates])
top5 = [c for _, c in sorted(zip(scores, candidates), reverse=True)[:5]]
# Stage 3: generate
return llm.complete(f"Context:\n" + "\n\n".join(top5) + f"\n\nQ: {query}")
Pros and cons
Pros
- Completely free — no API key, no per-call cost
- Published BEIR results from BAAI, and widely used as the baseline in other vendors' evaluations
- Easy integration via sentence-transformers / HuggingFace
- Multilingual (v2-m3 covers 100+ languages)
- Full control: quantise, fine-tune, distil
- Active development from BAAI
Cons
- You host, you operate — infra overhead
- CPU inference is slow beyond ~50 candidates
- No SLA, no managed scaling
- Largest variants need a GPU to be practical
See a cross-encoder score live
Our demo uses a quantised open-weight cross-encoder — same family, running entirely in your browser.
Open the demo →