Что такое эмбеддинг
Эмбеддинг — это плотный вектор фиксированной длины (например, 1536 или 3072 чисел), который кодирует смысл текста. Похожие по смыслу фрагменты лежат рядом в этом пространстве, даже если в них нет ни одного общего слова. На этом строится semantic search: вместо совпадения ключевых слов мы ищем близкие векторы.
import os
from openai import OpenAI
client = OpenAI()
resp = client.embeddings.create(
model="text-embedding-3-large",
input=["Как сбросить пароль?", "Восстановление доступа к аккаунту"],
dimensions=1536, # 3-large нативно 3072, можно усечь
)
v1 = resp.data[0].embedding
v2 = resp.data[1].embedding
print(len(v1)) # 1536
Метрики похожести
- Cosine similarity — угол между векторами, игнорирует длину. Дефолт для текстовых эмбеддингов.
- Dot product — учитывает и угол, и длину. Если векторы L2-нормированы, dot product == cosine. Большинство OpenAI/Cohere эмбеддингов нормированы, поэтому метрики совпадают и dot быстрее.
- Euclidean (L2) — расстояние по прямой. Для нормированных векторов монотонно связано с cosine, но в продакшене для текста почти всегда берут cosine или dot.
import numpy as np
def cosine(a, b):
a, b = np.array(a), np.array(b)
return a @ b / (np.linalg.norm(a) * np.linalg.norm(b))
print(round(cosine(v1, v2), 3)) # высокая близость: разные слова, один смысл
Какую модель брать
| Модель | Размерность | Заметки |
|---|---|---|
| text-embedding-3-large | до 3072 (усекаемая) | лучшее качество OpenAI, поддерживает Matryoshka-усечение |
| text-embedding-3-small | до 1536 | дешевле, качество близко к ada-002 |
| text-embedding-ada-002 | 1536 (фиксированная) | старая, не усекается, для нового кода не нужна |
| Cohere Embed v3 | 1024 | хорош для мультиязычности, есть input_type (search_document/search_query) |
| all-MiniLM-L6-v2 | 384 | локальная, бесплатная, sentence-transformers, для прототипов и приватных данных |
Ключевая особенность text-embedding-3-*: параметр dimensions усекает вектор (Matryoshka Representation Learning) — можно уменьшить размерность с малой потерей качества и сэкономить память и стоимость поиска. У ada-002 такой возможности нет.
Размерность: trade-off
Больше размерность — точнее, но дороже хранение и медленнее поиск. 3072 → 256 уменьшает память в 12 раз, recall падает обычно на единицы процентов. Для большинства продакшн-RAG 1024–1536 — разумный баланс.