bge-reranker

Open weights · BAAI · free to self-host ·

Open weightsSelf-hostMultilingual

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

ModelParametersLanguagesBest for
BAAI/bge-reranker-base278MChinese, EnglishFast CPU inference, good baseline
BAAI/bge-reranker-large560MChinese, EnglishStronger quality, same two languages
BAAI/bge-reranker-v2-m3568M100+ langsBest all-round; multilingual powerhouse
BAAI/bge-reranker-v2-gemma2.5B100+ langsHighest 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.

ModelBEIR NDCG@10 (avg)C-MTEB reranking (avg MAP)
bge-reranker-basenot published65.42*
bge-reranker-largenot published66.10*
bge-reranker-v2-m355.36*not published
bge-reranker-v2-gemma60.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 →

Other models