Модели эмбеддингов и размерность

Какие бывают модели эмбеддингов, что значит «размерность 1536» и на что смотреть при выборе.

Размерность эмбеддинга — длина вектора, то есть сколько чисел описывают один текст. Типичные значения: 384, 768, 1024, 1536.

Что значит размерность

Если эмбеддинг имеет размерность 768, значит каждый текст — это точка в 768-мерном пространстве. Больше измерений — больше «ёмкость» для оттенков смысла, но и больше памяти и вычислений на поиск. Это компромисс: качество против стоимости.

РазмерностьПлюсыМинусы
384быстро, мало памятичуть грубее различает смысл
768–1024хороший баланссредние затраты
1536+тоньше ловит нюансыдороже хранить и искать

Популярные модели (для чтения)

Ниже — типичные варианты. Это вызовы реальных библиотек/API, поэтому код помечен как текст (запускать в браузере его нельзя).

# OpenAID API (облако)
from openai import OpenAI
client = OpenAI()
resp = client.embeddings.create(
    model="text-embedding-3-small",  # 1536 измерений
    input="Возврат товара возможен в течение 14 дней",
)
vector = resp.data[0].embedding

# Локально, бесплатно: sentence-transformers
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")  # 384 измерения
vector = model.encode("Возврат товара возможен в течение 14 дней")

Облачные модели (OpenAI, Cohere, Voyage) обычно сильнее и не требуют инфраструктуры, но стоят денег и шлют текст наружу. Локальные (sentence-transformers, BGE, E5) бесплатны, работают офлайн и приватны, но требуют железа и чуть уступают по качеству.

На что смотреть при выборе

  • Язык: модель должна хорошо знать русский (или быть многоязычной).
  • Качество: ориентир — публичные бенчмарки вроде MTEB.
  • Размерность: баланс качества и стоимости поиска.
  • Приватность и цена: облако или локально.
  • Длина входа: сколько токенов модель принимает за раз.

Золотое правило совместимости

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

Прикинем «бюджет» хранения

def storage_mb(num_chunks, dim, bytes_per_number=4):
    total_bytes = num_chunks * dim * bytes_per_number
    return total_bytes / (1024 * 1024)

for dim in (384, 768, 1536):
    mb = storage_mb(num_chunks=1_000_000, dim=dim)
    print(f"dim={dim:4}: {mb:7.1f} МБ на 1 млн чанков")

Вывод:

dim= 384:  1464.8 МБ на 1 млн чанков
dim= 768:  2929.7 МБ на 1 млн чанков
dim=1536:  5859.4 МБ на 1 млн чанков

Видно, почему размерность — это деньги: на миллионах чанков разница в памяти (и в скорости поиска) ощутимая.

Итог

  • Размерность — длина вектора; больше = тоньше смысл, но дороже.
  • Облачные модели сильнее, локальные приватнее и бесплатнее.
  • Эмбеддинги разных моделей несравнимы — при смене модели переиндексируйте.
Проверьте себя
1. Что такое размерность эмбеддинга?
AЧисло документов в базе
BДлина вектора — сколько чисел описывают один текст
CСкорость генерации в токенах
DРазмер модели в гигабайтах
2. Что будет, если базу проэмбеддить одной моделью, а запросы — другой?
AНичего, эмбеддинги универсальны
BПоиск сломается: пространства разных моделей несравнимы
CУскорится поиск
DУменьшится размерность
3. Чем больше размерность вектора, тем...
Aдешевле хранение и быстрее поиск
Bтоньше различается смысл, но дороже хранение и поиск
Cменьше нужно документов
Dточнее работает токенизатор
Поддержать проект