Дата публикации
ai_products

Ettin Reranker: шесть новых переклассификаторов для поиска, которые бьют MiniLM и BGE по качеству и скорости

Что нового

Hugging Face представила семейство из шести новых переклассификаторов (reranker’ов) Ettin Reranker — это CrossEncoder‑модели на базе энкодеров Ettin ModernBERT от Johns Hopkins University.

Главные факты:

  • Шесть размеров моделей:

    • cross-encoder/ettin-reranker-17m-v1 — 17,6M параметров
    • cross-encoder/ettin-reranker-32m-v1 — 32,8M
    • cross-encoder/ettin-reranker-68m-v1 — 68,6M
    • cross-encoder/ettin-reranker-150m-v1 — 150,9M
    • cross-encoder/ettin-reranker-400m-v1 — 401,6M
    • cross-encoder/ettin-reranker-1b-v1 — 1,00B
  • Контекст до 8K токенов у всех шести моделей благодаря ModernBERT‑предобучению (RoPE + long context).

  • Лицензия: Apache 2.0 (как и у энкодеров Ettin).

  • Скорость на H100 80GB (bfloat16):

    • 17M: 7517 пар (запрос, документ) в секунду — самый быстрый reranker в тесте
    • 32M: 6602 пар/с
    • 68M: 4913 пар/с
    • 150M: 3237 пар/с
    • 400M: 1738 пар/с
    • 1B: 928 пар/с
  • Скорость на RTX 3090 24GB (bfloat16):

    • 17M: 9008 пар/с — снова самый быстрый в сравнении
    • 32M: 4497 пар/с
    • 68M: 1916 пар/с
    • 150M: 982 пар/с
    • 400M: 429 пар/с
    • 1B: 189 пар/с
  • Скорость на CPU (Intel Core i7‑13700K):

    • 17M: 267,4 пар/с
    • 32M: 92,5 пар/с
    • 68M: 31,2 пар/с
    • 150M: 14,0 пар/с
    • 400M: 5,2 пар/с
  • Качество на MTEB(eng, v2) Retrieval (NDCG@10, среднее по 6 эмбеддерам):

    • 17M: 0,5576
    • 32M: 0,5779
    • 68M: 0,5915
    • 150M: 0,5994
    • 400M: 0,6091
    • 1B: 0,6114
    • Учитель mixedbread-ai/mxbai-rerank-large-v2 (1,54B): 0,6115
    • Лидер сравнения Qwen/Qwen3-Reranker-4B: 0,6367
  • Качество на NanoBEIR (mean NDCG@10):

    • 17M: 0,6746
    • 32M: 0,6825
    • 68M: 0,6915
    • 150M: 0,7086
    • 400M: 0,7193
    • 1B: 0,7237
    • Учитель mxbai-rerank-large-v2: 0,7318

Ключевые сравнения:

  • 17M Ettin обгоняет cross-encoder/ms-marco-MiniLM-L12-v2 (33M) на:

    • +0,051 NDCG@10 на MTEB (0,5576 против 0,5066)
    • +0,038 на NanoBEIR (0,6746 против 0,6369)
    • при примерно вдвое меньшем числе параметров.
  • 32M Ettin обгоняет BAAI/bge-reranker-v2-m3 (568M):

    • 0,5779 против 0,5526 на MTEB, разница +0,025
    • при ~17‑кратном различии в параметрах.
  • 68M Ettin почти догоняет Qwen/Qwen3-Reranker-0.6B (596M):

    • 0,5915 против 0,5940 на MTEB — при девятикратной разнице в параметрах.
  • 150M Ettin — лучший reranker до 600M параметров в этом сравнении на MTEB:

    • 0,5994 против 0,5940 у Qwen/Qwen3-Reranker-0.6B (596M).
  • 1B Ettin практически повторяет учителя mxbai-rerank-large-v2 (1,54B):

    • 0,6114 против 0,6115 на MTEB (разница 0,0001)
    • 0,7237 против 0,7318 на NanoBEIR (разница 0,008)
    • при ~2,4x большей скорости на H100 (928 против 387 пар/с).

Все шесть моделей используют Flash Attention 2 и sequence unpadding, что даёт 1,7–8,3x ускорение по сравнению с стандартной загрузкой (fp32 + SDPA), в зависимости от размера и длины последовательности.

Как это работает

Что такое reranker и зачем он нужен

Reranker (pointwise cross‑encoder) берёт пару (запрос, документ) и выдаёт один скор релевантности. В отличие от эмбеддинговых моделей:

  • эмбеддер кодирует запрос и документ раздельно и сравнивает два вектора;
  • reranker пропускает оба текста вместе через трансформер, и каждый слой "видит" и запрос, и документ.

Это даёт более точную оценку, но дороже по вычислениям: модель нужно запускать на каждую пару (query, doc), а не один раз на текст.

Поэтому в продакшене используют схему retrieve‑then‑rerank:

  1. Быстрый эмбеддер достаёт top‑K кандидатов из индекса (дёшево).
  2. Reranker пересортировывает только эти K документов (точно, но уже на малом K).

В результате итоговый топ ближе к тому, что дал бы полный прогон cross‑encoder’а по всему корпусу, но стоимость остаётся приемлемой.

Архитектура Ettin Reranker

Все шесть моделей построены одинаково и отличаются только размером бэкбона.

Бэкбон — один из шести энкодеров Ettin (от 17M до 1B):

  • ModernBERT‑подход:
    • распаддинг (unpadded attention) — не тратит вычисления на паддинг‑токены;
    • RoPE‑позиционные кодировки;
    • GeGLU в MLP;
    • предобучение на 2 триллионах токенов с открытой лицензией;
    • поддержка контекста до 8192 токенов.

Классификационная голова (поверх AutoModel):

  1. Transformer с Flash Attention 2 и распаддингом.
  2. Pooling по CLS‑токену.
  3. Dense(H, H, bias=False, GELU).
  4. LayerNorm(H).
  5. Dense(H, 1) — финальный скор.

Важно: используется AutoModel, а не AutoModelForSequenceClassification. Это позволяет:

  • передавать непаддинговые последовательности во все слои;
  • полноценно использовать Flash Attention 2;
  • экономить вычисления на паддинге.

В авторских экспериментах CLS‑pooling оказался лучше mean‑pooling, даже несмотря на то, что в ModernBERT глобальное внимание только в каждом третьем слое, а остальные два слоя используют локальное окно.

Обучение

Модели обучены по схеме distillation:

  • таргет — скоры учителя mixedbread-ai/mxbai-rerank-large-v2;
  • лосс — pointwise MSE между скором учителя и скором студента;
  • данные — cross-encoder/ettin-reranker-v1-data, собранный из:
    • подмножества lightonai/embeddings-pre-training;
    • плюс подвыборка lightonai/embeddings-fine-tuning, заранее отранжированная.

Рецепт обучения автор стартовал через новый Agent Skill train-sentence-transformers из Sentence Transformers v5.5.0:

hf skills add train-sentence-transformers [--global] [--claude]

После этого можно попросить своего AI‑агента (Claude Code, Codex, Cursor, Gemini CLI и т.п.) дообучить SentenceTransformer, CrossEncoder или SparseEncoder на своих данных.

Как устроен пайплайн retrieve‑then‑rerank

Типичный пример с эмбеддером sentence-transformers/static-retrieval-mrl-en-v1 и reranker’ом cross-encoder/ettin-reranker-68m-v1:

from sentence_transformers import SentenceTransformer, CrossEncoder

embedder = SentenceTransformer("sentence-transformers/static-retrieval-mrl-en-v1")
reranker = CrossEncoder("cross-encoder/ettin-reranker-68m-v1")

corpus = [
    "Apple Inc. was founded in Cupertino, California in 1976 by Steve Jobs, Steve Wozniak, and Ronald Wayne.",
    "The Fuji apple is an apple cultivar developed in the late 1930s.",
    "Steve Jobs introduced the iPhone in 2007 at Macworld.",
    "Macintosh computers were sold by Apple from 1984 onward.",
]

query = "Where was Apple founded?"

query_emb = embedder.encode_query(query, convert_to_tensor=True)
corpus_emb = embedder.encode_document(corpus, convert_to_tensor=True)

scores = embedder.similarity(query_emb, corpus_emb)[0]

# берём top-K кандидатов по эмбеддингам

top_k_idx = scores.topk(min(100, len(corpus))).indices.tolist()
top_k_docs = [corpus[i] for i in top_k_idx]

# финальное ранжирование reranker'ом

ranked = reranker.rank(query, top_k_docs, top_k=5, return_documents=True)

for r in ranked:
    print(f"({r['score']:.2f}): {r['text']}")

Эмбеддер решает, какие документы попадут в воронку, а reranker выбирает победителей в финальном списке.

Что это значит для вас

Когда Ettin Reranker вам полезен

1. Поисковые системы и RAG‑сценарии

Если вы строите поиск или Retrieval‑Augmented Generation поверх LLM, вам нужно:

  • быстро найти кандидатов по эмбеддингам;
  • точно отсортировать top‑K перед тем, как отдать их GPT‑классу моделей.

Ettin Reranker закрывает вторую часть:

  • 17M и 32M — для высоконагруженных сервисов, где важна скорость и низкая цена;
  • 68M и 150M — для балансировки качества и латентности;
  • 400M и 1B — для задач, где критично качество ответа и есть запас по GPU.

2. Поиск по длинным документам

Поддержка 8192 токенов позволяет:

  • ранжировать длинные статьи, отчёты, документацию без агрессивного чанкинга;
  • уменьшить количество эвристик вокруг нарезки текста и пост‑обработки.

3. Обновление старых стеков с MiniLM и BGE

Если вы используете cross-encoder/ms-marco-MiniLM-* как дефолтный reranker, переход на Ettin даёт двойную выгоду:

  • Больше качества:

    • 17M Ettin: 0,5576 против 0,5066 у MiniLM-L12-v2 на MTEB;
    • NanoBEIR: 0,6746 против 0,6369.
  • Больше скорости:

    • на H100: 7517 пар/с против 3311 у MiniLM-L12-v2 и 3817 у MiniLM-L6-v2;
    • на RTX 3090: 9008 пар/с против 2847 у MiniLM-L12-v2.

Если у вас сейчас BAAI/bge-reranker-v2-m3, 32M Ettin даёт:

  • +0,025 NDCG@10 на MTEB при ~17x меньшем размере.

4. Замена тяжёлых учителей на практичные модели

Если вы используете mixedbread-ai/mxbai-rerank-large-v2 как top‑tier reranker:

  • 1B Ettin даёт почти тот же скор (0,6114 против 0,6115);
  • но работает в 2,4 раза быстрее на H100 (928 против 387 пар/с) и в 2,7 раза быстрее на RTX 3090 (189 против 69 пар/с).

Это вариант для продакшена, где учитель слишком тяжёлый.

Когда Ettin Reranker не подойдёт

  • Если вам нужен только эмбеддер для ANN‑поиска без rerank‑шага — эти модели не про это, они именно cross‑encoder’ы.
  • Если вы работаете исключительно на CPU и без батчей, крупные модели (400M и 1B) могут быть слишком медленными. Для CPU лучше 17M или 32M.
  • Если ваш стек не поддерживает Flash Attention 2 и bfloat16, вы потеряете часть преимущества по скорости.

Доступность из России

Модели лежат на Hugging Face. В России к платформе иногда нужен VPN, особенно при работе из браузера. Через pip и transformers/sentence-transformers доступ тоже может зависеть от сетевых ограничений. Для продакшена лучше предусмотреть локальное кеширование моделей.

Место на рынке

Сравнение с MiniLM‑reranker’ами

По MTEB и NanoBEIR новые модели уверенно обгоняют линейку ms-marco-MiniLM-*:

  • Качество (MTEB, NDCG@10):

    • Ettin 17M: 0,5576
    • MiniLM‑L12‑v2 (33,4M): 0,5066
    • MiniLM‑L6‑v2 (22,7M): 0,5082
    • MiniLM‑L4‑v2 (19,2M): 0,4979
  • NanoBEIR:

    • Ettin 17M: 0,6746
    • MiniLM‑L12‑v2: 0,6369
    • MiniLM‑L6‑v2: 0,6312
    • MiniLM‑L4‑v2: 0,6298
  • Скорость (H100, bfloat16):

    • Ettin 17M: 7517 пар/с
    • MiniLM‑L4‑v2: 4029 пар/с
    • MiniLM‑L6‑v2: 3817 пар/с
    • MiniLM‑L12‑v2: 3311 пар/с

На RTX 3090 картина похожая: Ettin 17M выдаёт 9008 пар/с, MiniLM‑L4‑v2 — 5071.

Если вы сейчас используете MiniLM как дефолтный reranker в поиске, переход на Ettin 17M — это одна строка кода с выигрышем и в скорости, и в качестве.

Сравнение с BGE‑reranker’ами

Главные цифры по MTEB (mean NDCG@10 по 6 эмбеддерам):

  • Ettin 32M: 0,5779
  • Ettin 68M: 0,5915
  • Ettin 150M: 0,5994
  • BAAI/bge-reranker-v2-m3 (568M): 0,5526
  • BAAI/bge-reranker-large (560M): 0,5098
  • BAAI/bge-reranker-base (278M): 0,4890

При этом 32M Ettin даёт +0,025 к NDCG@10 относительно bge-reranker-v2-m3 при 17x меньшем числе параметров.

По скорости на H100:

  • Ettin 32M: 6602 пар/с
  • Ettin 68M: 4913 пар/с
  • Ettin 150M: 3237 пар/с
  • BGE‑base (278M): 2858 пар/с
  • BGE‑large (560M): 1659 пар/с
  • BGE‑v2‑m3 (568M): 1569 пар/с

На RTX 3090:

  • Ettin 32M: 4497 пар/с
  • Ettin 68M: 1916 пар/с
  • Ettin 150M: 982 пар/с
  • BGE‑base: 1329 пар/с
  • BGE‑large: 448 пар/с
  • BGE‑v2‑m3: 436 пар/с

Сравнение с ModernBERT‑reranker’ами Alibaba и IBM

Три модели на одном ModernBERT‑base‑бэкбоне, 150M параметров:

  • cross-encoder/ettin-reranker-150m-v1: 3237 пар/с (H100)
  • Alibaba-NLP/gte-reranker-modernbert-base: 1418 пар/с
  • ibm-granite/granite-embedding-reranker-english-r2: 1404 пар/с

Ettin 150M примерно в 2,3 раза быстрее двух конкурентов при одинаковом размере. Причина — последовательный распаддинг через AutoModel и модульную голову, а не AutoModelForSequenceClassification, который держит паддинг внутри.

По качеству (MTEB):

  • Ettin 150M: 0,5994
  • Alibaba gte‑modernbert‑base: 0,5843
  • IBM Granite reranker: 0,5656

Сравнение с Mixedbread‑reranker’ами

По NanoBEIR и MTEB Ettin‑линейка догоняет и частично обгоняет более тяжёлые модели Mixedbread:

  • Учитель mixedbread-ai/mxbai-rerank-large-v2 (1,54B):

    • MTEB: 0,6115
    • NanoBEIR: 0,7318
    • Скорость на H100: 387 пар/с
  • Ettin 1B:

    • MTEB: 0,6114 (разница 0,0001)
    • NanoBEIR: 0,7237 (разница 0,008)
    • Скорость на H100: 928 пар/с (в 2,4 раза быстрее)
    • Скорость на RTX 3090: 189 против 69 пар/с (в 2,7 раза быстрее)

Серия mxbai-rerank-{xsmall,base,large}-v1 на DeBERTa‑v2 заметно медленнее, потому что архитектура пока не поддерживает ни Flash Attention 2, ни SDPA в transformers:

  • mxbai-rerank-xsmall-v1 (70M): 2636 пар/с на H100
  • Ettin 68M: 4913 пар/с при сопоставимом размере.

Сравнение с Qwen3‑reranker’ами

По MTEB (mean NDCG@10):

  • Qwen/Qwen3-Reranker-4B: 0,6367 — лучший результат в таблице
  • Qwen/Qwen3-Reranker-0.6B: 0,5940
  • Ettin 1B: 0,6114
  • Ettin 150M: 0,5994

Qwen3‑4B остаётся топом по качеству, но в 4 раза крупнее Ettin 1B и заметно тяжелее в продакшене. Ettin 1B закрывает почти весь разрыв с учителем Mixedbread при четверти параметров относительно Qwen3‑4B.

Пары с эмбеддерами на MTEB

Ререйтеры тестировали в двухшаговом пайплайне с 6 эмбеддерами — от лёгких до тяжёлых:

  • sentence-transformers/static-retrieval-mrl-en-v1 — 0M активных параметров (статический индекс), NDCG@10 без rerank: 0,3495
  • sentence-transformers/all-MiniLM-L6-v2 — 23M, 0,4292
  • BAAI/bge-small-en-v1.5 — 33M, 0,5149
  • nomic-ai/nomic-embed-text-v1.5 — 137M, 0,5226
  • google/embeddinggemma-300m — 308M, 0,5463
  • jinaai/jina-embeddings-v5-text-small-retrieval — 596M, 0,5980

Новый Ettin‑ряд улучшает результаты всех этих эмбеддеров при rerank’е top‑100.

Установка

Модели — обычные CrossEncoder’ы из Sentence Transformers. Достаточно установить sentence-transformers и загрузить нужный чекпоинт с Hugging Face.

Пример установки (если у вас ещё нет библиотеки):

pip install -U sentence-transformers

Если вы хотите повторить рецепт обучения или использовать skill для автотренировки, добавьте skill в huggingface-cli:

hf skills add train-sentence-transformers [--global] [--claude]

Как запустить

Базовое использование CrossEncoder

Простейший пример: получить скоры релевантности для пары (запрос, документ).

from sentence_transformers import CrossEncoder

model = CrossEncoder("cross-encoder/ettin-reranker-32m-v1")

scores = model.predict([
    (
        "Where was Apple founded?",
        "Apple Inc. was founded in Cupertino, California in 1976 by Steve Jobs, Steve Wozniak, and Ronald Wayne.",
    ),
    (
        "Where was Apple founded?",
        "The Fuji apple is an apple cultivar developed in the late 1930s and brought to market in 1962.",
    ),
])

print(scores)

Ранжирование списка документов

Если у вас один запрос и список кандидатов, удобнее использовать rank.

from sentence_transformers import CrossEncoder

model = CrossEncoder("cross-encoder/ettin-reranker-32m-v1")

ranked = model.rank(
    query="Which planet is known as the Red Planet?",
    documents=[
        "Venus is often called Earth's twin because of its similar size and proximity.",
        "Mars, known for its reddish appearance, is often referred to as the Red Planet.",
        "Jupiter, the largest planet in our solar system, has a prominent red spot.",
        "Saturn, famous for its rings, is sometimes mistaken for the Red Planet.",
    ],
    top_k=4,
    return_documents=True,
)

for r in ranked:
    print(f"({r['score']:.2f}): {r['text']}")

Настройка под максимальную скорость

Для максимальной пропускной способности автор рекомендует:

  • использовать Flash Attention 2;
  • задавать dtype="bfloat16".

Пример:

from sentence_transformers import CrossEncoder

model = CrossEncoder(
    "cross-encoder/ettin-reranker-32m-v1",
    model_kwargs={
        "dtype": "bfloat16",
        "attn_implementation": "flash_attention_2",
    },
)

В зависимости от размера модели и длины последовательности можно получить 1,7–8,3x ускорение относительно стандартной загрузки (fp32 + SDPA).

Полный пайплайн retrieve‑then‑rerank

Пример с эмбеддером и reranker’ом — готовый шаблон для продакшена.

from sentence_transformers import SentenceTransformer, CrossEncoder

embedder = SentenceTransformer("sentence-transformers/static-retrieval-mrl-en-v1")
reranker = CrossEncoder("cross-encoder/ettin-reranker-68m-v1")

corpus = [
    "Apple Inc. was founded in Cupertino, California in 1976 by Steve Jobs, Steve Wozniak, and Ronald Wayne.",
    "The Fuji apple is an apple cultivar developed in the late 1930s.",
    "Steve Jobs introduced the iPhone in 2007 at Macworld.",
    "Macintosh computers were sold by Apple from 1984 onward.",
]

query = "Where was Apple founded?"

query_emb = embedder.encode_query(query, convert_to_tensor=True)
corpus_emb = embedder.encode_document(corpus, convert_to_tensor=True)

scores = embedder.similarity(query_emb, corpus_emb)[0]

top_k_idx = scores.topk(min(100, len(corpus))).indices.tolist()

top_k_docs = [corpus[i] for i in top_k_idx]

ranked = reranker.rank(query, top_k_docs, top_k=5, return_documents=True)

for r in ranked:
    print(f"({r['score']:.2f}): {r['text']}")

Если хотите обучить свой reranker

Рецепт, который использовали для Ettin Reranker, можно адаптировать под свои данные:

  1. Соберите датасет из пар (запрос, документ) с релевантностью.
  2. Возьмите сильного учителя, например mixedbread-ai/mxbai-rerank-large-v2.
  3. Посчитайте скоры учителя для всех пар.
  4. Обучайте студента (Ettin‑бэкбон нужного размера) по MSE между скором учителя и студента.
  5. Используйте NanoBEIR или MTEB как метрику metric_for_best_model.

Новый skill train-sentence-transformers в huggingface-cli упрощает этот процесс: можно описать задачу агенту (Claude Code, Cursor и т.д.), и он соберёт конфиг и код тренировки под ваш датасет.


Читайте также