RuModernBERT-small Russian Cross-Encoder Reranker
A compact yet powerful Russian cross-encoder reranker fine-tuned from deepvk/RuModernBERT-small (34M parameters) on the ARGA100/ru-reranker-mega dataset (3.2M query-document pairs).
Achieves NDCG@10=0.74444 on MTEB RuBQReranking — competitive with models 8–16× larger, making it the most efficient Russian reranker available.
Benchmark Results (MTEB RuBQReranking)
| Model | Params | NDCG@10 | Params/Eff. |
|---|---|---|---|
bge-reranker-v2-m3-en-ru | 375M | 0.84387 | 1.0 |
BAAI/bge-reranker-v2-m3 | 568M | 0.84384 | 1.0 |
DiTy/cross-encoder-russian-msmarco | 178M | 0.78572 | 2.3× |
mxbai-rerank-large-v1 | 435M | 0.77927 | 2.1× |
bce-reranker-base_v1 | 278M | 0.74599 | 2.7× |
ARGA100/ru-reranker-modernbert-small (ours) | 34M | 0.74444 | 11.0× |
mxbai-rerank-base-v2 | 494M | 0.71268 | 1.9× |
mxbai-rerank-base-v1 | 184M | 0.71159 | 2.5× |
BAAI/bge-reranker-base | 278M | 0.70550 | 2.4× |
BAAI/bge-reranker-large | 560M | 0.69430 | 1.9× |
gte-reranker-modernbert-base | 150M | 0.65751 | 3.0× |
mxbai-rerank-xsmall-v1 | 71M | 0.62594 | 4.7× |
Params/Eff. = relative NDCG@10 per million parameters vs. the top model.
Our 34M model delivers 98% of BCE-reranker-base_v1's performance (0.74444 vs 0.74599) while being 8× smaller and 3× faster at inference.
Model Details
- Base model: deepvk/RuModernBERT-small (34M params)
- Architecture: CrossEncoder with ModernBertForSequenceClassification
- Max sequence length: 2048 tokens
- Training data: ARGA100/ru-reranker-mega — 3.2M Russian query-document pairs
- Loss: BinaryCrossEntropyLoss with label smoothing
- Training: 3 epochs, greedy soup of top checkpoints
- Language: Russian
Usage
from sentence_transformers import CrossEncoder
model = CrossEncoder("ARGA100/ru-reranker-modernbert-small", max_length=2048)
# Score a query-document pair
pairs = [
["сколько калорий в яйце", "В одном курином яйце содержится около 70-80 ккал"],
["сколько калорий в яйце", "Яичный белок практически не содержит жиров"],
]
scores = model.predict(pairs)
print(scores) # Higher = more relevant
# Rerank documents
query = "лучшие рестораны москвы"
documents = [
"Топ-10 ресторанов Москвы с авторской кухней",
"Как приготовить борщ дома",
"Ресторан White Rabbit вошел в рейтинг лучших",
]
ranks = model.rank(query, documents, top_k=3)
for r in ranks:
print(f"Score: {r['score']:.4f} | Doc: {documents[r['corpus_id']]}")
Training Details
- Hardware: NVIDIA Tesla V100 16GB
- Framework: sentence-transformers 5.6.0, transformers 5.12.1
- Batch size: 16
- Learning rate: 4.7e-5
- Optimizer: AdamW
- Warmup: 500 steps
- Epochs: 3
- Checkpoint selection: Greedy soup of all 5 checkpoints (best single ckpt: 0.72704, best soup: 0.74444)
Dataset
The model was trained on ARGA100/ru-reranker-mega — a deduplicated collection of 3.2M Russian query-document relevance pairs assembled from multiple public sources.
Citation
If you use this model, please cite:
@misc{ru-reranker-modernbert-small,
author = {ARGA100},
title = {RuModernBERT-small Russian Cross-Encoder Reranker},
year = {2026},
publisher = {Hugging Face},
howpublished = {\url{https://huggingface.co/ARGA100/ru-reranker-modernbert-small}}
}