Как выбрать модель эмбеддингов для RAG и семантического поиска
BGE-M3, Qwen3 Embedding, text-embedding-3, Gemini Embedding — чем отличаются, как влияет размерность вектора и почему для русского важна многоязычность.
Никита Барсуков
Как выбрать модель эмбеддингов для RAG и семантического поиска
Эмбеддинг превращает текст в вектор — набор чисел, где близкие по смыслу тексты оказываются рядом в пространстве. На этом стоит всё: семантический поиск, RAG, кластеризация, дедупликация, рекомендации. Модель тут выбирают один раз и надолго — сменить её потом больно, потому что придётся переиндексировать всю базу. Поэтому разберём выбор осознанно.
Что вообще есть в каталоге
- BGE-M3 (
bge-m3, BAAI) — многоязычная, хорошо работает с русским, разумная размерность, открытая. Дефолтный выбор, если сомневаетесь. - Qwen3 Embedding 8B / 4B — сильная многоязычная линейка; 8B точнее, 4B легче и дешевле.
- OpenAI text-embedding-3-small / large — small дешёвый и быстрый, large точнее; поддерживают усечение размерности.
- Gemini Embedding — конкурентная модель от Google, тоже многоязычная.
Размерность вектора: за что вы платите
Размерность — это длина вектора (например, 1024 или 3072 числа). Больше — как правило, точнее, но:
- Память и скорость. Векторов в базе миллионы; каждое лишнее измерение — это память в хранилище и время на поиск.
- Стоимость индекса. Векторные БД считают ресурсы примерно линейно от размерности.
Некоторые модели (например, text-embedding-3-large) позволяют усечь размерность — взять не все 3072 измерения, а, скажем, 1024, почти не потеряв в качестве. Это удобный рычаг: начните с полной размерности, замерьте качество, потом попробуйте усечь и посмотрите, просела ли точность.
Многоязычность: для русского это не опция
Главная ловушка русскоязычных проектов — взять модель, обученную в основном на английском. На английском бенчмарке она блистает, а на русском поиск проседает: близкие по смыслу русские фразы оказываются в пространстве дальше, чем должны. Для русской базы берите заведомо многоязычную модель — 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 или text-embedding-3-large и сравните на своих 30 парах. Нужно максимально дёшево на большом объёме — text-embedding-3-small или Qwen3 Embedding 4B. Разницу решают не бенчмарки, а ваши собственные данные — поэтому финальный выбор всегда за замером.