Эмбеддинг это вектор фиксированной длины (обычно от 256 до 4096 чисел), который кодирует смысл текста. Тексты с похожим смыслом получают близкие векторы. На этом построены семантический поиск, RAG, кластеризация, дедупликация и рекомендации.
Откуда берутся эмбеддинги
Эмбеддинг-модель (обычно энкодер на базе трансформера) прогоняет текст и сворачивает выходы токенов в один вектор: усреднением (mean pooling) или берёт вектор специального токена. Модель дообучают контрастивно: пары «запрос и релевантный документ» сближают, случайные документы из батча отдаляют.
Важно:
- Запрос и документы кодируют одной и той же моделью. Векторы разных моделей несравнимы, при смене модели индекс пересчитывают целиком.
- Многие модели ждут префиксы или инструкции вроде
query:иpassage:. Без них качество падает. - У модели есть лимит длины входа. Длинный документ сначала режут на чанки.
- Для русского берут мультиязычные модели и проверяют на своих данных: место в общем рейтинге (например, MTEB) не гарантирует качество на вашем домене.
Метрики сходства
- Косинусное сходство:
cos(a, b) = a·b / (|a|·|b|), от -1 до 1. Смотрит только на направление. - Скалярное произведение:
a·b. Зависит и от длины векторов. - Евклидово расстояние:
|a - b|.
Если векторы нормализованы (длина 1), все три дают одинаковый порядок результатов: |a - b|² = 2 - 2·cos(a, b). Поэтому векторы часто нормализуют при записи и используют скалярное произведение как самое дешёвое.
Метрику берут ту, на которую обучали модель: это указано в её документации.
Точный и приближённый поиск
Точный поиск (brute force, flat index) сравнивает запрос со всеми векторами: O(N·d). На сотнях тысяч векторов это нормально, особенно на GPU. На десятках миллионов уже медленно, поэтому используют ANN (approximate nearest neighbors): жертвуем небольшой долей полноты ради скорости. Качество ANN меряют как recall@k относительно точного поиска: какая доля настоящих k ближайших найдена.
HNSW
Hierarchical Navigable Small World: многоуровневый граф. На верхних уровнях мало вершин и длинные связи, на нижнем все вершины и короткие связи. Поиск жадно спускается сверху вниз, как по скоростным дорогам к местным улицам.
Параметры:
M: число связей у вершины. Больше: лучше recall, больше памяти.ef_construction: ширина поиска при построении. Больше: качественнее граф, дольше построение.ef_search(в pgvectorhnsw.ef_search): ширина поиска при запросе. Главная ручка «скорость против полноты» в рантайме.
Плюсы: высокая полнота при малой задержке, можно добавлять векторы без перестроения. Минусы: граф держится в памяти, удаление сложное (обычно помечают и чистят позже).
IVF и квантование
IVF делит пространство на кластеры (k-means), при поиске смотрит только nprobe ближайших кластеров. Строится быстрее, памяти меньше, но нужна обучающая выборка для центроидов.
Product quantization (PQ) сжимает векторы в короткие коды, теряя точность. Комбинация IVF+PQ позволяет держать миллиарды векторов. Часто после грубого поиска делают пересчёт точных расстояний для топа (rescoring).
Где хранить
- pgvector в PostgreSQL: векторы рядом с данными, транзакции, фильтры SQL, индексы HNSW и IVFFlat. Хорош до десятков миллионов векторов.
- Специализированные БД: Qdrant, Milvus, Weaviate. Шардирование, фильтры по метаданным, гибридный поиск.
- Библиотеки: FAISS для поиска в памяти внутри своего сервиса.
Отдельная тема: фильтрация. Запрос «похожие документы, но только этого клиента» в ANN-индексе непрост: пост-фильтрация после поиска может вернуть мало результатов, поэтому нужны индексы с фильтрацией при обходе или раздельные индексы на арендатора.
Частые ошибки
- Смешать в одном индексе векторы двух разных моделей или версий модели.
- Забыть префиксы
query:иpassage:, если модель их требует. - Сравнивать ненормализованные векторы скалярным произведением, когда модель училась на косинусе.
- Хранить только векторы без исходного текста и метаданных: потом нечего показать и не по чему фильтровать.
Что спросят на собесе
- Что такое эмбеддинг и как модель учат делать близкие векторы для похожих текстов.
- Косинус против скалярного произведения, зачем нормализовать.
- Как работает HNSW и что делают
M,ef_construction,ef_search. - Точный поиск против ANN, как измерить качество ANN.
- pgvector или отдельная векторная БД: критерии выбора.