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).
int8-квантизация: поканальная (per_channel=True, reduce_range=True, вместе с
таблицей эмбеддингов) ранжирование не портит — на отложенных 500 юридических делах
gold@5 0.720 против 0.702 у fp32 с длиной 512, при 149 МБ вместо 299 и длине 256.
Обычная (не поканальная) динамическая int8 действительно ломает скоры — с ней
Spearman падает до 0.77–0.95. Готовый int8-ONNX и скрипт экспорта лежат в
демо в браузере.
Ограничения
- Только русский язык (тексты на других языках не тестировались).
- Путь внимания ModernBERT в
transformersбез FlashAttention — узкое место;torch.compileего частично закрывает. - На юридическом корпусе с номерами статей один реранкер BM25 не обыгрывает. На отложенных 500 делах gold@5: BM25 0.736, реранкер 0.702. Запросы содержат номера статей, точное совпадение токенов сильнее семантики. Рабочий рецепт — смесь нормированных скоров 50/50: gold@5 0.760, gold@10 0.806 против 0.774 у BM25 (парный тест Макнемара p=0.0015). Одну модель как единственную первую стадию в таких доменах ставить не стоит.
- Оценка первой стадии —
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.