Одна модель на 740 млн параметров, которая кладёт текст, картинки, видео и звук в общее 768-мерное пространство и ужимает вектор до 128 измерений почти без потерь. Пошаговая настройка для RAG без облачных эмбеддингов.
EmbeddingGemma 2 — открытая мультимодальная модель эмбеддингов Google DeepMind на 740 млн параметров, опубликованная 14 сентября 2026 года. Она переводит текст (включая код), изображения, видео и аудио в одно общее пространство на 768 измерений, поддерживает усечение вектора до 128 измерений и работает на ноутбуке. За месяц репозиторий набрал 167 750 загрузок и 2 718 лайков (снято 19.10.2026) — это лучший результат среди открытых моделей эмбеддингов такой размерности.
sentence-transformers, грузите google/embeddinggemma-2, считайте запросы с префиксом SearchQuery, документы — с префиксом Document. Для хранения хватит 256 измерений вместо 768: по MTEB мультиязычный балл падает с 61,36 до 60,41, а объём индекса — втрое. Не используйте float16: активации модели выходят за его диапазон и вы получите NaN вместо ошибки.Эмбеддинги — самая недооценённая часть RAG. Генеративную модель можно менять хоть каждую неделю, но если поиск по базе знаний находит не те фрагменты, ответ будет плохим при любой LLM. Облачные embedding-API решают вопрос быстро, но у них есть три цены: деньги за каждый миллион токенов, задержка на каждом запросе и передача содержимого документов наружу. Локальная модель снимает все три, если железо тянет инференс.
EmbeddingGemma 2 сделана по модульному принципу: текстовый бэкбон на 130M параметров и эмбеддер на 140M дают базовые 270M, а зрительный кодировщик на 170M и аудиокодировщик на 300M подключаются по необходимости. Если вы строите обычный текстовый поиск, качайте только текст — получите модель на 270M, которая помещается в память рядом с любым приложением.
| Активные модальности | config_kwargs | Размер |
|---|---|---|
| Только текст | {"vision_config": None, "audio_config": None} | 270M |
| Текст и изображения | {"audio_config": None} | 440M |
| Текст и аудио | {"vision_config": None} | 570M |
| Всё сразу | {} | 740M |
Минимальный путь — библиотека sentence-transformers. Она сама скачает веса и разложит их по кэшу, а API из двух строк закрывает 90% задач RAG. Для продакшена с батчами и GPU имеет смысл смотреть в сторону vLLM, но начинать точно стоит здесь.
pip install -U sentence-transformers transformers
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("google/embeddinggemma-2")
query = "Как оплатить API из России?"
document = "Оплата идёт через посредника, расчёт в рублях."
q = model.encode(query, prompt_name="SearchQuery")
d = model.encode(document, prompt_name="Document")
print(model.similarity(q, d))doc_emb = model.encode(
document,
prompt_name="Document",
truncate_dim=256,
normalize_embeddings=True,
)Есть нюанс с документами, у которых есть заголовок. Префикс Document подставляет title: none, поэтому для статей с заголовком карточка советует собирать строку вручную: title: {title} | text: {document}. Иначе модель не увидит заголовок и качество поиска по коротким документам просядет.
Matryoshka Representation Learning обучает модель так, чтобы первые N чисел вектора сами по себе были осмысленным эмбеддингом. Это даёт редкую возможность: один раз посчитать вектор, а хранить его в усечённом виде. По карточке модели качество почти не падает до 256 измерений, а 128 годятся прежде всего для текстовых задач.
| Размерность | Сжатие | MTEB multi | MIEB lite | MMEB overall |
|---|---|---|---|---|
| 768d | 1:1 | 61,36 | 64,64 | 59,01 |
| 512d | 1:1,5 | 61,17 | 64,32 | 58,38 |
| 256d | 1:3 | 60,41 | 63,13 | 56,24 |
| 128d | 1:6 | 57,89 | 59,06 | 45,65 |
Два правила, без которых MRL приносит вред. Первое: после усечения вектор нужно заново нормализовать — срез единичного вектора не сохраняет единичную длину, и косинус начинает врать. Второе: запрос и документы должны иметь одинаковую размерность; запрос на 768 измерений против индекса на 128 просто не посчитается корректно. В sentence-transformers оба правила закрываются параметрами truncate_dim и normalize_embeddings=True.
Главное отличие второй версии от первой — единое пространство для четырёх модальностей. Текстовый запрос можно сравнивать с эмбеддингом картинки или видеофрагмента напрямую, без отдельной модели-моста. Для интернет-магазина это означает поиск «водонепроницаемые кроссовки для трейла» по фотографиям товаров, для архива — поиск по расшифровкам и звукам одновременно.
Технически смешанный вход собирается словарём: в тексте ставятся маркеры <|image|>, <|video|> и <|audio|>, а значения передаются списками файлов. Каждый маркер заполняется по порядку, на выходе — один вектор, который можно сравнивать с любым другим эмбеддингом модели.
| Модальность | Стоимость | Максимум |
|---|---|---|
| Текст | 1 токен на слово-кусок | 8 192 токена |
| Изображение | 280 токенов (по умолчанию) | около 29 картинок |
| Видео | 140 токенов на кадр | около 58 кадров |
| Аудио | 25 токенов в секунду | около 327 секунд |
Все числа ниже — из карточки модели, то есть замеры Google DeepMind на полной точности весов. Независимого прогона MTEB на момент публикации мы не видели, поэтому относитесь к ним как к ориентиру, а не как к гарантии.
| Бенчмарк | EmbeddingGemma 2 | EmbeddingGemma 1 | Комментарий |
|---|---|---|---|
| MTEB multilingual v2 | 61,36 | 61,15 | текст: прирост небольшой |
| MTEB code v1 | 78,68 | 68,76 | +9,9 пункта — главный рывок |
| MIEB lite | 64,64 | — | первая версия не умела картинки |
| MMEB v2 image | 57,28 | — | Hit@1 |
| MMEB v2 VisDoc | 67,84 | — | документы и сканы |
| MMEB v2 video | 50,67 | — | самый слабый мультимодальный блок |
| MSEB retrieval | 69,54 | — | аудиопоиск |
Из таблицы видно, где модель сильна, а где нет. Код и визуальные документы — явно приоритетные направления: прирост по коду почти десять пунктов, а VisDoc обгоняет общий MMEB. Видео и общий аудиобенчмарк выглядят скромнее, и если ваш RAG строится вокруг видеархива, стоит протестировать модель на своих данных до того, как закладывать её в архитектуру.
Усечение до 256 измерений — не абстрактная экономия. В float32 один вектор на 768 чисел занимает около 3 КБ, на 256 — около 1 КБ. На миллионе фрагментов это разница между 3 ГБ и 1 ГБ только на векторах, без учёта HNSW-графа и метаданных.
Для локального прототипа достаточно Chroma: она ставится в одно действие и хранит данные файлом. Для нагрузки и фильтрации по метаданным лучше Qdrant — у него есть бесплатный тариф навсегда и usage-based облако, конкретные суммы смотрите на официальной странице цен. Обзор вариантов с таблицей характеристик у нас в гайде сравнение векторных баз.
Важный момент при переходе с облачных эмбеддингов: размерность и метрика должны совпадать у индекса и у модели. Если вы раньше писали векторы OpenAI на 1536 измерений, а теперь перешли на EmbeddingGemma 2, индекс придётся пересчитать целиком — частичная миграция даст мусор в результатах без явной ошибки.