Векторные базы данных и семантический поиск
До сих пор мы рассматривали хранилища для структурированных чисел и документов, где поиск осуществляется по строгому совпадению или числовому диапазону (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:
- Евклидово расстояние (L_2 distance): Геометрическое расстояние между концами векторов: d_{L_2}(\mathbf{a}, \mathbf{b}) = \sqrt{\sum_{i=1}^d (a_i - b_i)^2}
- Манхэттенское расстояние (L_1 distance): Сумма модулей разностей координат: d_{L_1}(\mathbf{a}, \mathbf{b}) = \sum_{i=1}^d |a_i - b_i|
- Косинусное сходство (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 кластеров (центроидов). Каждый вектор базы привязывается к ближайшему центроиду (инвертированный список). При выполнении поиска:
- Вектор запроса \mathbf{q} сравнивается только с C центроидами, и выбирается n_{\text{probe}} наиболее близких кластеров.
- Сканируются только векторы, приписанные к этим 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).
Векторные СУБД: специализированные против расширений
В современной архитектуре существует два подхода к хранению векторов:
- Специализированные векторные СУБД (Qdrant, Milvus, Chroma, Weaviate): Написаны с нуля под векторные операции (например, Qdrant написан на Rust). Поддерживают динамическую фильтрацию по метаданным (Payload Filtering) прямо в процессе обхода графа HNSW, сегментирование и квантование векторов в оперативной памяти 5.
- Векторные расширения реляционных баз данных (
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.
Литература
- Wiggers G., Verberne S. Modern Information Retrieval and Vector Search. — Foundations and Trends in Information Retrieval, 2023 1.
- 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.
- 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.
- 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.
- Qdrant Team. Qdrant Vector Database Documentation: Architecture and Vector Indexing. — 2024. https://qdrant.tech/documentation/ 5.