Тема 06

Векторные базы данных и семантический поиск

Векторные базы данных и семантический поиск

До сих пор мы рассматривали хранилища для структурированных чисел и документов, где поиск осуществляется по строгому совпадению или числовому диапазону (val > 100, status = 'активен'). Однако значительная часть информации в современных системах интернета вещей и диспетчеризации представлена в неструктурированном виде: текстовые описания поломок от диспетчеров, аудиозаписи звонков граждан, тепловизионные снимки трансформаторов и спектрограммы вибродиагностики турбин.

Классический полнотекстовый поиск (построенный на сопоставлении подстрок и ключевых слов в B-дереве или инвертированном индексе BM25) бессилен, если пользователь ищет «прорыв трубы отопления», а в журнале зафиксировано «разгерметизация магистрального теплопровода диаметром 500 мм». Слова разные, но смысл (семантика) идентичен.

Решением этой проблемы стало появление векторных баз данных (Vector Databases) и методов семантического поиска 1. В этой теме мы изучим векторные представления (эмбеддинги), метрики расстояния в многомерных пространствах, алгоритмы приближенного поиска ближайших соседей (ANN: HNSW, IVF) и архитектуру векторных СУБД (Qdrant, расширение pgvector для PostgreSQL).

Векторные эмбеддинги (Embeddings)

Эмбеддинг (Embedding) — это отображение неструктурированного объекта (текста, изображения, временного ряда) в плотный вектор вещественных чисел фиксированной размерности d:

\mathbf{v} \in \mathbb{R}^d, \quad d \in [128, 1536]

Нейросетевая модель (например, трансформеры семейства BERT или мини-модели вроде all-MiniLM-L6-v2) обучается таким образом, чтобы семантически близкие концепты проецировались в близкие точки многомерного векторного пространства:

\text{dist}(\mathbf{v}_{\text{прорыв трубы}}, \mathbf{v}_{\text{разгерметизация теплопровода}}) \ll \text{dist}(\mathbf{v}_{\text{прорыв трубы}}, \mathbf{v}_{\text{замена лампы освещения}})

Метрики расстояния и сходства

Для сравнения двух векторов \mathbf{a}, \mathbf{b} \in \mathbb{R}^d применяются фундаментальные метрики линейной алгебры 2:

  1. Евклидово расстояние (L_2 distance): Геометрическое расстояние между концами векторов: d_{L_2}(\mathbf{a}, \mathbf{b}) = \sqrt{\sum_{i=1}^d (a_i - b_i)^2}
  2. Манхэттенское расстояние (L_1 distance): Сумма модулей разностей координат: d_{L_1}(\mathbf{a}, \mathbf{b}) = \sum_{i=1}^d |a_i - b_i|
  3. Косинусное сходство (Cosine Similarity) и косинусное расстояние: Косинус угла между векторами, не зависящий от их длины (нормы): \cos(\theta) = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \|\mathbf{b}\|} = \frac{\sum_{i=1}^d a_i b_i}{\sqrt{\sum a_i^2} \sqrt{\sum b_i^2}} Косинусное расстояние определяется как d_{\text{cos}}(\mathbf{a}, \mathbf{b}) = 1 - \cos(\theta). Если векторы предварительно нормализованы (\|\mathbf{a}\| = 1), вычисление косинусного сходства сводится к быстрому скалярному произведению (Dot Product): \mathbf{a} \cdot \mathbf{b} = \sum a_i b_i.

Проблема точного поиска и «проклятие размерности»

Задача поиска k ближайших соседей (k-Nearest Neighbors, k-NN) формулируется так: найти в базе из N векторов k векторов, имеющих минимальное расстояние до вектора запроса \mathbf{q}.

Точный поиск (Flat / Brute-force scan) требует последовательного вычисления расстояния от запроса до всех N векторов базы. При миллионе векторов размерности d=768 это требует миллиарда операций с плавающей точкой на каждый запрос.

Классические пространственные деревья (KD-деревья, R-деревья), эффективные на плоскости при d=2 или d=3, перестают работать в пространствах высокой размерности (d > 50) из-за математического феномена, известного как проклятие размерности (Curse of Dimensionality): все точки пространства становятся почти равноудаленными друг от друга, и поиск по дереву вырождается в полный перебор всех листьев 3.

Приближённый поиск ближайших соседей (ANN)

Чтобы обеспечить время ответа за миллисекунды, в векторных базах данных жертвуют 1–2 % точности, переходя к алгоритмам приближенного поиска ближайших соседей (Approximate Nearest Neighbors, ANN). Качество поиска оценивается метрикой полноты:

\text{Recall@}k = \frac{|\text{найденные ANN соседи} \cap \text{истинные соседи KNN}|}{k}

Существует два главных класса алгоритмов ANN:

1. Метод инвертированных списков файлов (Inverted File Index, IVF)

Пространство векторов предварительно кластеризуется алгоритмом k-средних (k-means) на C кластеров (центроидов). Каждый вектор базы привязывается к ближайшему центроиду (инвертированный список). При выполнении поиска:

  1. Вектор запроса \mathbf{q} сравнивается только с C центроидами, и выбирается n_{\text{probe}} наиболее близких кластеров.
  2. Сканируются только векторы, приписанные к этим n_{\text{probe}} кластерам, отсекая 95–99 % базы.

Для дополнительного сжатия векторов в памяти применяется производное квантование (Product Quantization, PQ), разбивающее вектор на подвекторы и заменяющее их кодами центроидов.

2. Иерархический граф малого мира (Hierarchical Navigable Small World, HNSW)

На сегодняшний день алгоритм HNSW, разработанный Ю. Малковым и Д. Яшковым 4, является золотым стандартом векторной индексации по соотношению скорости и полноты поиска.

В основе лежит идея графов малого мира (теория шести рукопожатий) и многоуровневой структуры списка с пропусками (Skip-List):

  • Создается многоуровневый граф: нижний уровень (Layer 0) содержит все векторы базы данных, а каждый последующий более высокий уровень содержит экспоненциально меньше случайных вершин.
  • На верхних разреженных уровнях алгоритм совершает «длинные прыжки» через всё векторное пространство, быстро приближаясь к окрестности запроса.
  • На нижних уровнях выполняется точечный жадный спуск к ближайшим соседям.

Параметры HNSW:

  • M — количество связей у каждой вершины (обычно 16–64);
  • ef\_construction — размер очереди кандидатов при построении индекса;
  • ef\_search — размер очереди кандидатов при выполнении поиска (регулирует баланс между скоростью и Recall).

Векторные СУБД: специализированные против расширений

В современной архитектуре существует два подхода к хранению векторов:

  1. Специализированные векторные СУБД (Qdrant, Milvus, Chroma, Weaviate): Написаны с нуля под векторные операции (например, Qdrant написан на Rust). Поддерживают динамическую фильтрацию по метаданным (Payload Filtering) прямо в процессе обхода графа HNSW, сегментирование и квантование векторов в оперативной памяти 5.
  2. Векторные расширения реляционных баз данных (pgvector для PostgreSQL): Добавляют тип данных vector(d) и индексные методы hnsw и ivfflat в существующую реляционную СУБД. Позволяют объединять векторный семантический поиск со строгими реляционными соединениями, транзакциями ACID и фильтрами по внешним ключам в одном SQL-запросе.

Пример семантического поиска в PostgreSQL с расширением pgvector:

-- Создание таблицы инцидентов с эмбеддингами размерности 384:
CREATE TABLE incident_embeddings (
    incident_id INT REFERENCES incidents(incident_id),
    description TEXT,
    embedding vector(384)
);

-- Построение индекса HNSW для косинусного расстояния:
CREATE INDEX ON incident_embeddings USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);

-- Семантический поиск 5 наиболее похожих инцидентов:
SELECT incident_id, description,
       1 - (embedding <=> '[0.024, -0.115, ..., 0.089]') AS similarity
FROM incident_embeddings
ORDER BY embedding <=> '[0.024, -0.115, ..., 0.089]'
LIMIT 5;

Оператор <=> обозначает вычисление косинусного расстояния, <-> — евклидова расстояния, а <#> — отрицательного скалярного произведения.

Итоги темы

Векторные хранилища открыли эру семантического анализа неструктурированных данных. Перевод текстов, показаний датчиков и инцидентов в плотные векторные эмбеддинги позволяет сопоставлять события по смыслу, а не по буквальному совпадению слов. Алгоритмы приближенного поиска ANN (прежде всего графы HNSW) преодолели проклятие размерности, обеспечив поиск среди миллионов объектов за миллисекунды как в специализированных движках (Qdrant), так и внутри реляционных СУБД с pgvector.

Литература

  1. Wiggers G., Verberne S. Modern Information Retrieval and Vector Search. — Foundations and Trends in Information Retrieval, 2023 1.
  2. Manning C. D., Raghavan P., Schütze H. Introduction to Information Retrieval. — Cambridge University Press, 2008. — Chapter 6: Scoring, Term Weighting, and the Vector Space Model 2.
  3. Indyk P., Motwani R. Approximate Nearest Neighbors: Towards Removing the Curse of Dimensionality. — Proceedings of the Thirtieth Annual ACM Symposium on Theory of Computing, 1998, С. 604–613 3.
  4. Malkov Y. A., Yashunin D. A. Efficient and Robust Approximate Nearest Neighbor Search Using Hierarchical Navigable Small World Graphs. — IEEE Transactions on Pattern Analysis and Machine Intelligence, 2020, Vol. 42, No. 4, С. 824–836 4.
  5. Qdrant Team. Qdrant Vector Database Documentation: Architecture and Vector Indexing. — 2024. https://qdrant.tech/documentation/ 5.