Все уроки · 44
Путь 3 · Дорожная карта AI-инженера·Урок 12 из 33

Модели эмбеддингов и провайдеры

OpenAI, Cohere, Gemini, Jina или открытые Sentence Transformers? Размерность, стоимость, многоязычность — и практический способ выбрать модель эмбеддингов.

УровеньСреднийВремя~10 мин

Одна идея — много моделей

Эмбеддинг — это просто вектор чисел, но какие именно числа получит текст, целиком зависит от модели, которой вы его обрабатываете. А моделей много. Они различаются качеством, ценой, охватом языков, размером вектора и тем, где работают. Выбор модели — одно из первых серьёзных решений в любом проекте по семантическому поиску или RAG.

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

Одно правило

Эмбеддинги сравнимы только в пределах одной модели. Сначала выберите модель, постройте ею все эмбеддинги, а если когда-нибудь смените модель — пересчитайте всю коллекцию. Никакого смешивания.

Основные варианты

Модель / провайдер Тип Типичная размерность Цена Многоязычность
OpenAI text-embedding-3-small / -large API 1536 / 3072 низкая / умеренная хорошая
Cohere embed-v3 / embed-v4 API 1024 / до 1536 умеренная сильная, 100+ языков
Gemini embedding (gemini-embedding-001) API 3072 (можно уменьшать) щедрый бесплатный тариф сильная
Jina embeddings v3 API 1024 умеренная сильная, длинный контекст
Sentence Transformers открытый код, локально 384–1024 бесплатно, на вашем оборудовании зависит от модели

Два столбца, которые стоит расшифровать:

  • Тип. «API» значит, что модель работает на компьютерах провайдера: вы отправляете текст по интернету и получаете числа обратно — настраивать ничего не нужно, но текст покидает вашу инфраструктуру, а платить приходится за использование. «Открытый код, локально» значит, что модель работает на вашей собственной машине: ничего не уходит наружу и нет платы за использование, но оборудование — ваше.
  • Размерность. Единственный столбец, который с виду пугает, хотя бояться нечего: одна размерность — это просто одно число в списке. 1024-мерный эмбеддинг — это список из 1024 чисел, описывающих один текст. Больше чисел — больше места для оттенков смысла; меньше чисел — меньше места на диске и быстрее поиск. В вашем коде от этого ничего не меняется: что означают числа, определяет сама модель.

Краткий обзор:

  • OpenAI Embeddings API — выбор по умолчанию для многих команд: две строки кода, хорошее качество, оплата за токены. Малая модель настолько дешёвая, что пересчёт эмбеддингов всей базы знаний обходится в центы.
  • Cohere ориентирована именно на поиск и извлечение информации: сильная многоязычная поддержка и отдельные режимы для поиска, классификации и реранкинга (когда берут короткий список найденных кандидатов и заново оценивают их, чтобы лучшие оказались сверху).
  • Gemini Embedding предлагает качество высшего уровня и щедрый бесплатный тариф — отлично подходит для прототипов и побочных проектов.
  • Jina — сильный независимый вариант, популярный для длинных документов.
  • Sentence Transformers — библиотека для Python с открытым кодом. Модели работают локально — на вашем ноутбуке или сервере. Никаких счетов за API, данные не покидают вашу инфраструктуру, а для многих классических задач (сходство коротких текстов, кластеризация) качества достаточно.

Один смысл — разные языки

Многоязычные эмбеддинги держатся на одном свойстве: модель обучена так, что один и тот же смысл оказывается в одном и том же месте независимо от языка. Поводите курсором по карте: в каждом кластере одно понятие на четырёх языках, а запрос «merci» находит свой кластер, хотя во всех данных нет ни одного французского слова:

Один смысл, четыре языка — один кластер
? merci
hover any item to see its closest neighbors — this is how semantic search finds related things
приветствиепрощаниеблагодарность

Наведите курсор сначала на «hello», затем на «thank you»: соседи остаются внутри кластера — сразу на всех языках. Вся суть — в одной картинке.

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

Проверьте свои языки

Если ваш контент не на английском, проверьте модель именно на ваших языках, прежде чем на неё полагаться. На практике заявления о многоязычности сильно различаются, а «поддерживает 100 языков» редко означает «одинаково хорошо».

Как выбирать на практике

Не усложняйте: на это решение хватит пары часов.

  1. Сначала — чувствительность данных. Если текст не может покидать вашу инфраструктуру, выбор уже сузился до Sentence Transformers или модели на собственных серверах.
  2. Затем — языки. Если контент не на английском, составьте короткий список из Cohere, Gemini, Jina или многоязычной открытой модели — и проверьте на ваших реальных данных.
  3. Затем — стоимость в вашем масштабе. Прикиньте число токенов: эмбеддинги для базы знаний из 10 тыс. документов, построенные дешёвой API-моделью, — это погрешность округления. Огромные корпуса текстов склоняют к локальным моделям.
  4. Затем — размерность. Большие векторы немного выразительнее, но дороже в хранении и поиске. Для большинства проектов хватает 384–1536.
  5. И наконец, проверьте на своей задаче. Возьмите 20 реальных запросов, постройте эмбеддинги документов и просмотрите глазами лучшие результаты. Десять минут такой проверки ценнее любого рейтинга.

И помните: выбор обратим. Смена модели означает пересчёт всех эмбеддингов, поэтому оберните вызов эмбеддингов в одну функцию в вашей кодовой базе. Тогда модель превращается в обычное значение конфигурации:

Одна функция — один переключатель
# embed.py — ЕДИНСТВЕННОЕ место, которое знает, какую модель вы используете
MODEL = "text-embedding-3-small"

def embed(texts: list[str]) -> list[list[float]]:
  """Turn texts into vectors. Swap the provider here, nowhere else."""
  response = client.embeddings.create(model=MODEL, input=texts)
  return [item.embedding for item in response.data]

# Переходите на локальную модель? Меняйте тело функции, сигнатуру оставьте:
#
# from sentence_transformers import SentenceTransformer
# _m = SentenceTransformer("all-MiniLM-L6-v2")
# def embed(texts): return _m.encode(texts).tolist()

Где потом хранятся векторы и как искать среди миллионов из них — рассказывает следующий урок. А причина, по которой всё это стоит настраивать, — RAG: передача нужных фрагментов LLM в тот момент, когда они ей нужны.

Проверьте себя

Вы выбираете модель эмбеддингов для больницы: записи пациентов ни при каких условиях не могут покидать корпоративную сеть. С чего начинается выбор?

Вы переводите проект с эмбеддингов OpenAI на модель с открытым кодом. Что нужно сделать?

Что даёт многоязычная модель эмбеддингов?

Что такое «размерность» эмбеддинга?