ru-reranker-edge-150m

Русский кросс-энкодер-реранкер на 150M параметров. Обучен дистилляцией из BAAI/bge-reranker-v2-m3 (568M) и на русских задачах даёт 95–99% его качества при в 3.8 раза меньшем размере.

Что это

  • База: deepvk/RuModernBERT-base (контекст до 8192 токенов, обучали и оценивали при 512).
  • Как обучали: листвайз-дистилляция — модель учится повторять распределение скоров учителя внутри группы «запрос + 16 документов». Меток релевантности не требуется.
  • На чём обучали: русский mMARCO (train), MIRACL-ru (train), статьи русской Википедии, фрагменты кодексов и нормативных актов РФ, синтетические пары «аргумент → контраргумент» (Qwen3-27B). Ни один из оценочных датасетов ниже в обучение не попадал.
  • Вход: пара (запрос, документ) → один скор (логит). Чем больше, тем релевантнее.

Качество

nDCG@10 на подмножестве RusBEIR (зеро-шот, реранк BM25 top-100, одинаковые кандидаты во всех строках):

scifact nfcorpus arguana tydiqa xquad среднее
BM25 0.657 0.302 0.325 0.351 0.952 0.517
ru-reranker-edge-150m 0.742 0.346 0.386 0.583 0.987 0.609
bge-reranker-v2-m3 (568M, учитель) 0.733 0.340 0.381 0.592 0.989 0.607

RuBQReranking (ruMTEB, официальный mteb, зеро-шот): MAP 0.773, nDCG@10 0.839 (учитель: 0.785 / 0.848).

Среднее по пяти датасетам — выше учителя; ArguAna (поиск контраргументов) закрыт синтетическими парами «аргумент → контраргумент» (0.249 → 0.386).

Как использовать

from sentence_transformers import CrossEncoder

model = CrossEncoder("sshalimov04/ru-reranker-edge-150m", max_length=512)
query = "Что может вызвать цунами?"
docs = [
    "Землетрясения, извержения вулканов и подводные оползни обладают потенциалом вызвать цунами.",
    "Флаг муниципального округа утверждён решением совета депутатов.",
]
scores = model.predict([(query, d) for d in docs])
ranked = sorted(zip(scores, docs), reverse=True)

Или через transformers: AutoModelForSequenceClassification с num_labels=1, на вход tokenizer(query, document, truncation=True, max_length=512).

Скорость

На NVIDIA GB10 (bf16, batch 32, длина 512) реранк 100 документов: 0.8 с в обычном transformers-пути и **0.35–0.4 с с torch.compile** (2.2× быстрее, без потерь):

model.model = torch.compile(model.model, dynamic=True)   # для CrossEncoder

ONNX (папка onnx/): model_fp16.onnx — экспорт opset 17, паритет с torch (Spearman 0.997 по скорам). Вход: input_ids, attention_mask; выход: logits [batch, 1]. На CUDA через ONNX Runtime он медленнее torch (часть узлов ModernBERT падает на CPU), поэтому предназначен для переноса на другие рантаймы/устройства, а не для ускорения на GPU. int8-квантизация не выложена: динамическая int8 заметно портит ранжирование (Spearman 0.77–0.95).

Ограничения

  • Только русский язык (тексты на других языках не тестировались).
  • Путь внимания ModernBERT в transformers без FlashAttention — узкое место; torch.compile его частично закрывает.
  • Оценка первой стадии — bm25s, а не Elasticsearch, поэтому абсолютные числа могут отличаться от лидерборда RusBEIR; сравнения внутри таблицы точны.

Данные для воспроизведения

Кэш скоров учителя и тексты всех обучающих групп опубликованы как датасет: sshalimov04/ru-reranker-teacher-scores.


English. A 150M Russian cross-encoder reranker (RuModernBERT-base) distilled listwise from BAAI/bge-reranker-v2-m3. Zero-shot on a RusBEIR subset it averages 0.609 nDCG@10 (BM25 0.517, teacher 0.607) and reaches MAP 0.773 on RuBQReranking (teacher 0.785). Use with sentence_transformers.CrossEncoder; input is a (query, document) pair, output a relevance logit. Teacher scores and training groups are released as sshalimov04/ru-reranker-teacher-scores.

Downloads last month
58
Safetensors
Model size
0.1B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for sshalimov04/ru-reranker-edge-150m

Quantized
(4)
this model

Space using sshalimov04/ru-reranker-edge-150m 1