Урок по треку LLM-инженерия 6 мин

Эмбеддинги и векторный поиск

Что такое эмбеддинг, косинус и скалярное произведение, точный и приближённый поиск, HNSW и IVF, векторные БД.

Эмбеддинг это вектор фиксированной длины (обычно от 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 (в pgvector hnsw.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 или отдельная векторная БД: критерии выбора.

Закрепите за 5 минут

После урока в тренажёре 3-5 проверочных вопросов, дальше модуль уходит в повторения.