lenec ru

← все посты

Embeddings: OpenAI vs Voyage vs локальные модели — что брать в 2026

17K

У меня дома стоит PC с RTX 4090 и Mac Studio M2 Ultra. Всё, что описываю — гоняю руками на этом железе. Тема — embeddings. Вектора, которые ложатся в Pinecone/pgvector/Qdrant и решают, насколько умно ищет твой RAG.

Эту статью я держала в голове полгода: всё ждала, когда отдадут стабильные релизы Voyage 3 и Stella, и можно будет говорить не «вот цифры из README», а «вот как у меня лежит и работает». Сейчас этот момент пришёл.

Что вообще такое embeddings и зачем

Embedding — это вектор фиксированной длины, который описывает кусок текста. Похожие по смыслу куски дают близкие вектора. Это база любого семантического поиска: ты заранее посчитала вектора всех документов, кладёшь их в индекс, на запрос пользователя считаешь вектор и ищешь ближайших соседей по cosine.

Качество embedding влияет напрямую на то, что увидит пользователь. Плохой embedding — и на запрос «как настроить SSL» ты получаешь статью «как настроить SMTP», потому что у обеих много общих токенов.

Что я тестировала

  • OpenAI text-embedding-3-large (3072 dim).
  • Voyage voyage-3 и voyage-3-large.
  • BGE-M3 локально через FastEmbed.
  • Stella 1.5b локально через sentence-transformers.
  • YandexGPT embeddings и GigaChat embeddings.

Тестовый набор: 1500 пар «вопрос-документ» из реальных тикетов техподдержки и FAQ нашего продукта. Метрики — Recall@5, MRR. И, что мне важнее всего как практику, — задержка и стоимость.

Качество

В моих тестах разница в Recall@5 между топом и серединой — около 4–6 процентных пунктов. Это много для прода: если у тебя 100 запросов, 5 из них раньше уходили в «не нашёл», а теперь находят релевант.

Лидеры почти вровень: voyage-3-large и BGE-M3 (локальный, что приятно). OpenAI 3-large чуть проигрывает на узкоспециализированных текстах (у меня — тех. документация на русском с терминами), но обходит почти всех на общем тексте. Stella 1.5b приятно удивила — на русском она держит уровень OpenAI и проигрывает совсем чуть-чуть Voyage.

Локальные модели — реальная альтернатива

Я три года назад писала «локальные embeddings — игрушка, в проде только OpenAI». Это уже не так. BGE-M3 на 4090 даёт 600+ embeddings в секунду на 512 токенов и качество на уровне платных. На Mac Studio через MLX — 200 в секунду, что для большинства проектов более чем хватает.

from FlagEmbedding import BGEM3FlagModel

model = BGEM3FlagModel('BAAI/bge-m3', use_fp16=True)
embeddings = model.encode(
    ["Как сбросить пароль в админке", "Как восстановить доступ к аккаунту"],
    batch_size=32,
    max_length=512,
)['dense_vecs']

Один раз поставила, один раз обернула в FastAPI, один раз закинула в Docker — и не платишь за каждый embed. На моём проекте это была экономия около 800 долларов в месяц после переезда с OpenAI на BGE-M3.

Voyage 3 — для тех, кто не хочет возиться с GPU

Voyage заточен под retrieval, и это видно по числам. У них есть отдельные модели под код, английский, мультиязычный — это не одна универсальная штука. Если ты не готова держать GPU и тебе важен максимум качества — Voyage 3-large.

Цена: ниже OpenAI, выше Cohere. Для среднего проекта это десятки долларов в месяц.

const res = await fetch('https://api.voyageai.com/v1/embeddings', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${VOYAGE_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    input: texts,
    model: 'voyage-3-large',
    input_type: 'document', // 'document' для индекса, 'query' для запроса
  }),
});

OpenAI — крепкий середнячок

text-embedding-3-large — то, что ставишь, когда не хочешь думать. SDK уже есть, цена терпимая, качество среднее-высокое. Если у тебя стек уже на OpenAI — нет смысла куда-то прыгать. Если ты только начинаешь и хочешь лучшее — рассмотри Voyage или локальное.

Российские embeddings

YandexGPT и GigaChat дают свои embeddings. Я гоняла оба. На русских текстах они работают как BGE-M3 примерно, но индекс дороже из-за лимитов. Брать имеет смысл, если у тебя жёсткие требования по локации данных и отсутствию интернет-выхода.

Размер вектора и как с ним жить

3072-мерный вектор от OpenAI 3-large — это 12 КБ на одну запись. На миллионе документов это 12 ГБ только под вектора, без остального. Voyage 3 даёт 1024, BGE-M3 — 1024. Stella 1.5b — 1024. Если индекс растёт — переходи на меньшую размерность, разница в качестве часто незначительна, экономия в памяти и скорости поиска — серьёзная.

Что в итоге

На своём проекте я остановилась на BGE-M3 локально для основной массы запросов и Voyage 3-large для «премиум» сценариев, где важен максимум качества. OpenAI остался только в тех частях, где исторически был, но новые фичи я туда не пишу.

Главное — мерь на своих данных. Бенчмарки общего качества врут на узкой задаче. Возьми 200–300 пар из своих логов, прогони пять моделей, посчитай Recall@5 и сделай выбор по числу. У меня этот эксперимент занял один вечер и сэкономил годовую подписку на дорогой API.

Комментарии 0

  • Будьте первым, кто оставит комментарий.

Войдите, чтобы оставить комментарий.