Как выбрать модель эмбеддингов для RAG и семантического поиска
BGE-M3 и Qwen3 Embedding — чем отличаются, как влияет размерность вектора и почему для русского важна многоязычность.
Никита Барсуков
Как выбрать модель эмбеддингов для RAG и семантического поиска
Эмбеддинг превращает текст в вектор — набор чисел, где близкие по смыслу тексты оказываются рядом в пространстве. На этом стоит всё: семантический поиск, RAG, кластеризация, дедупликация, рекомендации. Модель тут выбирают один раз и надолго — сменить её потом больно, потому что придётся переиндексировать всю базу. Поэтому выбирать стоит внимательно.
Что вообще есть в каталоге
- BGE-M3 (
bge-m3, BAAI) — многоязычная, хорошо работает с русским, разумная размерность, открытая. Выбор по умолчанию, если сомневаетесь. - Qwen3 Embedding 8B (
qwen3-embedding-8b) — сильная многоязычная модель, когда нужна максимальная точность. - Qwen3 Embedding 4B (
qwen3-embedding-4b) — та же линейка, легче.
Все три — с открытыми весами. Закрытых моделей эмбеддингов (text-embedding-3 от OpenAI, Gemini Embedding от Google) в каталоге Yenisei нет.
Размерность вектора: за что вы платите
Размерность — это длина вектора (например, 1024 или 3072 числа). Больше — как правило, точнее, но:
- Память и скорость. Векторов в базе миллионы; каждое лишнее измерение — это память в хранилище и время на поиск.
- Стоимость индекса. Векторные БД считают ресурсы примерно линейно от размерности.
Некоторые модели обучены так, что вектор можно усечь — взять только первые измерения, почти не потеряв в качестве. Если пользуетесь этим, решение принимайте по замеру: посчитайте качество на полной длине, потом на усечённой, и сравните.
Многоязычность: для русского это обязательно
Главная ловушка русскоязычных проектов — взять модель, обученную в основном на английском. На английском бенчмарке она блистает, а на русском поиск проседает: близкие по смыслу русские фразы оказываются в пространстве дальше, чем должны. Для русской базы берите заведомо многоязычную модель — BGE-M3 или Qwen3 Embedding. От этого зависит, будет ли поиск работать вообще.
Как считать эмбеддинги
Через стандартный эндпоинт /v1/embeddings:
curl https://api.yenisei.ru/v1/embeddings \ -H "Authorization: Bearer $YENISEI_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "bge-m3", "input": ["первый фрагмент текста", "второй фрагмент текста"] }'На Python — пачками, чтобы не гонять по одному:
from openai import OpenAIclient = OpenAI(base_url="https://api.yenisei.ru/v1", api_key="YENISEI_KEY")def embed(texts, model="bge-m3"): r = client.embeddings.create(model=model, input=texts) return [d.embedding for d in r.data]# batch по 64-256 текстов за запрос — так дешевле и быстрееvectors = embed(chunks_batch)Правила, которые сэкономят вам переиндексацию
- Одна модель на индекс и на запрос. Вектор запроса и векторы базы обязаны считаться одной и той же моделью — иначе они несопоставимы, и поиск ломается молча.
- Нормализуйте и меряйте косинус. Для большинства эмбеддингов косинусное сходство — правильная метрика близости.
- Не смешивайте версии. Обновили модель эмбеддингов — переиндексируйте всё, а не половину.
- Тестируйте на своих данных. Соберите 30–50 пар «запрос — правильный документ» и посмотрите, на какой позиции находится нужное. Это честнее любого внешнего бенчмарка.
Что брать по умолчанию
Для русскоязычного RAG начните с BGE-M3: многоязычная, открытая, предсказуемая, без сюрпризов по цене. Нужна точность повыше — попробуйте Qwen3 Embedding 8B и сравните с BGE-M3 на своих 30 парах. Нужна модель полегче на большом объёме — Qwen3 Embedding 4B. Окончательный выбор делайте по замеру на своих данных, а не по бенчмаркам.