Модели эмбеддингов и размерность
Какие бывают модели эмбеддингов, что значит «размерность 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 млн чанков
Видно, почему размерность — это деньги: на миллионах чанков разница в памяти (и в скорости поиска) ощутимая.
Итог
- Размерность — длина вектора; больше = тоньше смысл, но дороже.
- Облачные модели сильнее, локальные приватнее и бесплатнее.
- Эмбеддинги разных моделей несравнимы — при смене модели переиндексируйте.