ЗАЧЕМ ВООБЩЕ РАЗБИРАТЬСЯ В EMBEDDINGS В 2026
Embedding — это перевод текста в вектор чисел так, чтобы близкие по смыслу куски оказались рядом в пространстве. На этой векторизации держится весь семантический поиск и вся retrieval-часть RAG. Меняете энкодер — меняется качество выдачи, latency и счёт за инфраструктуру. Это не тот компонент, где «любая модель сойдёт»: разница между удачным и неудачным выбором на реальном корпусе легко даёт 10-20 процентных пунктов recall@10.
При этом рынок за последние два года устаканился. Гонка размерностей замедлилась, MTEB перестал быть единственным ориентиром (по нему уже откровенно оверфитят), и практики сместились в сторону трёх вопросов: язык корпуса, бюджет на латентность и нужен ли reranker. Разберём по порядку.
КАК ЧИТАТЬ БЕНЧМАРКИ И НЕ ОБМАНУТЬСЯ
Главная ошибка новичка — выбирать модель по строчке в MTEB leaderboard. Проблема в том, что многие свежие модели тренировались с оглядкой на эти же датасеты, и цифра на бенчмарке слабо переносится на ваш домен. Юридические тексты, чат-логи поддержки и код ведут себя совершенно по-разному.
Что реально смотреть:
- Задача. Retrieval, clustering, классификация и STS — разные подтаблицы. Для RAG вас интересует именно retrieval.
- Язык. Средний балл по MTEB — это в основном английский. Для русского ищите MTEB(rus) или multilingual-срезы.
- Свой eval. Соберите 100-300 пар «вопрос — правильный документ» из своего корпуса и меряйте recall@k на них. Полдня работы окупается многократно.
Свежие релизы энкодеров и reranker'ов удобно отслеживать в каталоге REDDYX — там видно, что реально катят в прод, а не только пиарят в твиттере.
СРАВНЕНИЕ ОСНОВНЫХ EMBEDDING-МОДЕЛЕЙ 2026
Ниже — модели, которые реально встречаются в проде. Цифры MTEB привожу обобщённо (по замерам сообщества они плавают в пределах пары пунктов от ревизии к ревизии), поэтому ориентируйтесь на порядок, а не на второй знак после запятой.
| Модель | Тип | Размерность | Языки | Где сильна |
|---|---|---|---|---|
| BGE-M3 | Открытая | 1024 | 100+ | Мультиязык, dense+sparse+ColBERT в одной модели |
| multilingual-e5-large | Открытая | 1024 | 100+ | Надёжный дефолт, отличный русский |
| Qwen3-Embedding (0.6B / 4B / 8B) | Открытая | до 4096 | 100+ | Топ MTEB, инструкции, гибкая размерность |
| Voyage-3 | Проприетарная API | 1024 (Matryoshka) | Мульти | Качество retrieval, домены (код, финансы) |
| OpenAI text-embedding-3-large | Проприетарная API | до 3072 | Мульти | Простота интеграции, стабильность |
| Cohere Embed v3 | Проприетарная API | 1024 | Мульти | compression-aware, int8/binary из коробки |
Ключевой сдвиг 2026: открытые модели догнали проприетарные на большинстве retrieval-задач. Qwen3-Embedding-8B по замерам сообщества делит верхушку MTEB с платными API, а BGE-M3 остаётся рабочей лошадкой именно из-за трёх режимов сразу — dense-вектор для скорости, sparse для лексического матча и ColBERT-мультивектор для точности.
РУССКИЙ ЯЗЫК: ЧТО РЕАЛЬНО РАБОТАЕТ
Для русскоязычного корпуса расклад проще, чем кажется. Чисто русских SOTA-энкодеров мало, поэтому берут сильные мультиязычные:
- multilingual-e5-large — самый безопасный дефолт. Хорошо ловит русский, стабилен, легко хостится. Не забывайте про префиксы
query:иpassage:— без них качество проседает заметно. - BGE-M3 — когда нужен мультиязычный корпус (русский + английский + код) и гибридный поиск в одном флаконе.
- Qwen3-Embedding-4B — если готовы держать модель побольше ради качества и любите instruction-режим (можно задавать задачу текстом).
Отдельно про кириллицу: проверяйте токенизацию. Некоторые старые модели дробят русские слова на слишком мелкие сабворды, из-за чего длинные документы упираются в лимит контекста быстрее ожидаемого. На e5 и BGE-M3 с этим порядок.
РАБОЧИЙ ПРИМЕР: ВЕКТОРИЗАЦИЯ И ПОИСК
Минимальный, но честный пайплайн на открытой модели без внешних API. Считаем эмбеддинги локально и ищем косинусной близостью.
from sentence_transformers import SentenceTransformer
import numpy as np
model = SentenceTransformer("intfloat/multilingual-e5-large")
docs = [
"passage: RAG объединяет поиск по базе знаний с генерацией ответа LLM.",
"passage: Reranker переупорядочивает кандидатов после первичного поиска.",
"passage: Косинусная близость измеряет угол между векторами.",
]
query = "query: что делает реранкер в RAG"
# нормализуем — тогда dot product == косинус
doc_emb = model.encode(docs, normalize_embeddings=True)
q_emb = model.encode(query, normalize_embeddings=True)
scores = doc_emb @ q_emb
top = np.argsort(scores)[::-1]
for i in top:
print(round(float(scores[i]), 3), docs[i][:60])
Обратите внимание на префиксы query:/passage: — для семейства E5 это не косметика, а часть протокола. Для BGE-M3 префиксы не нужны, зато можно включить sparse-режим и склеить скоры. В проде дальше эти векторы уезжают в Qdrant, pgvector или Milvus, а не в numpy — но логика та же.
RERANKER: ГЛАВНЫЙ ЛАЙФХАК 2026
Если у вас ограничен бюджет — не гонитесь за самым жирным энкодером. Возьмите быстрый bi-encoder для первичного отбора топ-50-100 кандидатов, а поверх поставьте cross-encoder reranker. Это архитектурно правильнее и почти всегда даёт больший прирост качества на единицу затрат.
Почему это работает: bi-encoder кодирует запрос и документ независимо, теряя часть взаимодействия между словами. Cross-encoder (например, bge-reranker-v2-m3 или Qwen3-Reranker) прогоняет пару «запрос+документ» вместе и оценивает релевантность точнее — но дорого, поэтому его применяют только к небольшому шортлисту.
- Первый этап: dense-поиск, дёшево, охват тысячи документов.
- Второй этап: reranker по топ-50, дорого за штуку, но штук мало.
- Итог: recall@5 нередко подскакивает на 10-15 п.п. без замены основного энкодера.
РАЗМЕРНОСТЬ, MATRYOSHKA И ЭКОНОМИЯ НА ХРАНЕНИИ
Вектор размерностью 3072 float32 — это 12 КБ на документ. На 10 млн чанков вылезает 120 ГБ только под индекс. Отсюда два тренда 2026:
- Matryoshka-эмбеддинги. Модель обучена так, что первые N измерений уже несут основной смысл. Можно обрезать 1024→256 с минимальной потерей качества и урезать хранилище в 4 раза. Поддерживают Voyage, OpenAI-3, Qwen3.
- Квантизация. int8 режет память в 4 раза при потере обычно менее пары процентов recall, binary — в 32 раза для грубого первичного отбора с последующим rerank. Cohere и Qdrant умеют это из коробки.
Практический рецепт для больших корпусов: binary-вектора для мгновенного первичного отбора, затем rescoring полными или int8-векторами на шортлисте. Экономия на RAM драматическая, качество почти не страдает.
КАК ВЫБРАТЬ ПОД СВОЙ КЕЙС: КОРОТКИЙ АЛГОРИТМ
- Стартап, MVP, надо вчера: OpenAI text-embedding-3-small или Voyage — минимум инфраструктуры, платите по API.
- Русский/мультиязык, свой сервер: multilingual-e5-large или BGE-M3 + bge-reranker-v2-m3.
- Максимум качества, есть GPU: Qwen3-Embedding-8B + Qwen3-Reranker.
- Огромный корпус, экономия: Matryoshka + int8/binary квантизация, гибридный dense+sparse.
- Домен (код, юр, мед): сначала измерьте на своём eval; иногда специализированная средняя модель бьёт крупную общую.
И повторю главное: сделайте свой мини-бенчмарк из 100-300 пар. Любая таблица, включая эту, — только стартовая точка, а не приговор.
Частые вопросы
Какая embedding-модель лучшая для русского языка в 2026?
Для русского корпуса надёжный дефолт — multilingual-e5-large (не забудьте префиксы query:/passage:). Если корпус смешанный или нужен гибридный поиск — BGE-M3. За максимальным качеством при наличии GPU — Qwen3-Embedding-4B/8B.
Нужен ли reranker, если у меня хорошая embedding-модель?
Почти всегда да. Cross-encoder reranker поверх топ-50 кандидатов обычно даёт +10-15 п.п. к recall@5 и стоит дешевле, чем переход на более крупный энкодер. Это лучший способ поднять качество RAG на единицу затрат.
Открытые embeddings хуже проприетарных API?
В 2026 разрыв на retrieval-задачах практически исчез. BGE-M3, E5 и Qwen3-Embedding конкурируют с платными API. Проприетарные решения выигрывают в основном простотой интеграции и отдельными доменами, а не абсолютным качеством.
Какую размерность вектора выбрать?
Для большинства задач хватает 768-1024. Если корпус большой — используйте Matryoshka-модели и обрезайте до 256-512 с квантизацией int8: память падает в разы, качество почти не страдает.
Векторизация и retrieval меняются быстрее, чем успевают устареть туториалы: новые энкодеры и reranker'ы выходят чуть ли не еженедельно. Чтобы не собирать это руками по твиттеру — залетайте в Telegram-канал REDDYX AI — новые репозитории каждые 30-60 минут.