Все статьи
Статья
17 августа 2026 г.8 мин

Как выбрать модель эмбеддингов для 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 OpenAI
client = 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. Разницу решают не бенчмарки, а ваши собственные данные — поэтому финальный выбор всегда за замером.