Представьте, что вы зашли в интернет-магазин купить пару кроссовок. Вы открываете описание модели, которая вам нравится, и сайт тут же предлагает похожие товары — и они действительно похожи. Как это работает?

Ответ прост и сложен одновременно: это векторный поиск — одна из самых перспективных технологий, меняющих подходы к работе с информацией.

От слов и цифр к векторам

Традиционные базы данных отлично справляются с поиском по точным значениям: числам, датам, строкам. Но как быть, если нужно найти не точные совпадения, а похожие по смыслу объекты?

Представим, что у нас есть два слова: «автомобиль» и «машина». Для человека очевидно, что это синонимы. Но для компьютера — это просто разные наборы символов. С помощью векторного представления каждое такое слово или даже целый текст, изображение, товар, фильм, пользователь можно представить в виде набора чисел — вектора.

Каждое число в таком векторе — это характеристика объекта в многомерном пространстве признаков. Чем ближе расположены два вектора друг к другу, тем более похожи объекты, которые они представляют.

Зачем это нужно? 

Чтобы понять, насколько важен векторный поиск в реальной жизни, рассмотрим несколько конкретных сценариев.

  • Семантический поиск. Обычный поиск по ключевым словам теряет много контекста. Например, запрос «как починить автомобиль» проигнорирует статью «ремонт машины своими руками». Векторный поиск же понимает смысл и находит релевантные материалы, даже если слова не совпадают буквально.

  • Рекомендательные системы. Сервисы «Кинопоиска», «Дзена», VK успешно используют векторный поиск для рекомендаций контента. Они сравнивают интересы пользователей и характеристики контента, предлагая максимально подходящие рекомендации.

  • Компьютерное зрение и распознавание изображений. Например, вы загружаете фото красивой футболки в приложение магазина, а оно тут же предлагает похожие модели из каталога. Это тоже работает за счёт векторного представления изображений.

  • Генеративный ИИ и RAG (Retrieval-Augmented Generation). Современные чат-боты (например, ChatGPT + RAG) используют векторный поиск, чтобы быстро находить релевантную информацию перед генерацией ответа, делая его более точным и информативным.

Как работает векторный поиск?

Сам процесс поиска ближайших соседей (Nearest Neighbor Search) в огромном массиве данных по векторам — это сложная задача. Наивный подход, который предлагает перебирать и сравнивать все векторы подряд, неэффективен и требует огромных вычислительных ресурсов.

Именно поэтому используются специальные алгоритмы поиска приблизительных ближайших соседей (сокращенно ANN — Approximate Nearest Neighbor), и в частности, HNSW (Hierarchical Navigable Small World). Они позволяют находить близкие векторы быстро за счет иерархической структуры данных и приблизительных вычислений, немного жертвуя точностью, но значительно выигрывая в скорости.

Как работает ANN

Представьте, что у вас есть миллионы или даже миллиарды векторов. Например, вектор для каждого товара в огромном маркетплейсе или для каждой статьи в интернете. Если для каждого поискового запроса, например, вектора товара, который смотрит пользователь, нужно будет вычислить расстояние до каждого другого вектора в базе, чтобы найти абсолютно самый похожий — это будет невероятно медленно. Такой точный поиск (Exact Nearest Neighbor, ENN) просто не масштабируется для реальных задач. Именно здесь на сцену выходят алгоритмы приблизительного поиска ближайших соседей (Approximate Nearest Neighbors, ANN). Их основная идея — найти очень близких соседей, возможно, не гарантируя на 100%, что найденный сосед будет самым близким, но делая это на порядки быстрее. Для большинства практических задач (рекомендации, семантический поиск) небольшая вероятность упустить идеальное совпадение с лихвой компенсируется колоссальным выигрышем в скорости и возможности обрабатывать огромные объемы данных в реальном времени.

Как работает HNSW

Один из самых популярных и эффективных ANN-алгоритмов сегодня — это HNSW (Hierarchical Navigable Small World). Его хитрость заключается в построении особой многоуровневой структуры данных, похожей на граф. Представьте себе несколько слоев: на самом верхнем слое находится очень мало «узлов» (векторов), но связи между ними «длинные», позволяющие быстро перемещаться между отдаленными областями векторного пространства. С каждым следующим уровнем вниз узлов становится больше, а связи между ними — короче, обеспечивая более детальную навигацию в локальной области. Когда поступает поисковый запрос (новый вектор), поиск начинается на самом верхнем, разреженном слое. Алгоритм быстро находит ближайший узел на этом уровне, а затем «спускается» на уровень ниже, продолжая поиск уже в окрестности найденного узла. Этот процесс повторяется, позволяя эффективно «приближаться» к цели, пропуская огромные части пространства, где заведомо нет близких векторов. Благодаря такой иерархической структуре и «навигации по миру с короткими связями» (Small World), HNSW достигает отличного баланса между скоростью поиска и точностью нахождения действительно близких соседей. Именно этот алгоритм, адаптированный для работы с диском и фильтрами, лежит в основе индексов pgpro_vector.

Векторный поиск внутри Postgres Pro: pgpro_vector

Раньше для реализации векторного поиска требовалось использовать отдельные специализированные базы данных, например, FAISS, Milvus или Qdrant. А это значит — дополнительные инфраструктурные затраты, сложность интеграции и поддержки.

Теперь в Postgres Pro доступно расширение pgpro_vector, которое добавляет мощный векторный поиск прямо в привычную среду PostgreSQL. Это расширение:

  • реализует алгоритм HNSW;

  • позволяет создавать специальные индексы для быстрого поиска ближайших соседей;

  • поддерживает работу с фильтрами и многоколоночными условиями.

Простой пример использования pgpro_vector:

Рассмотрим простой пример использования pgpro_vector, вдохновленный работой с эмбеддингами слов, такими как GloVe. Подобные примеры могут быть очень полезны для понимания возможностей расширения.

Перед созданием таблицы и индекса необходимо установить нужные расширения. Важно отметить архитектурную особенность pgpro_vector: тип данных ganntype вынесен в отдельное расширение. Это гарантирует, что ваши векторные данные в таблицах останутся в безопасности, даже если вы решите изменить или удалить расширения, реализующие конкретные алгоритмы поиска (например, gannhnsw). Это повышает надежность хранения данных.

  1. Установка расширений

-- Сначала устанавливаем расширение с базовым типом данных
CREATE EXTENSION ganntype;
-- Затем устанавливаем основное расширение gann (требуется для индексных методов)
CREATE EXTENSION gann;
-- Далее - расширения для конкретных типов индексов HNSW
CREATE EXTENSION gannhnsw CASCADE;
CREATE EXTENSION hnswstream CASCADE;
CREATE EXTENSION mc_hnsw CASCADE;

2. Создание таблицы:

CREATE TABLE word_embeddings (

    id BIGSERIAL PRIMARY KEY,

    word TEXT UNIQUE,

    embedding ganntype(50) -- Размерность 50 для примера GloVe

);

3. Генерация и импорт векторов. Сгенерировать векторы слов с помощью GloVe (или любой другой модели) и загрузить их в таблицу. В документации есть скрипт на Python для импорта из файла vectors.txt.

4. Создание индекса. Выбрать подходящий тип индекса и метрику. Для поиска похожих слов часто используют косинусное расстояние. Если нужна фильтрация, подойдет hnsw_stream или mc_hnsw.

-- Пример индекса hnsw_stream для косинусного расстояния

CREATE INDEX idx_word_embeddings_hnsw_stream_cos ON word_embeddings

USING gann (embedding hnsw_stream_a) -- hnsw_stream_a для косинусного

WITH (M = 16, ef_construction = 100); -- Параметры HNSW

5. Поиск. Выполнить поиск ближайших соседей с помощью SQL.

-- Найти 10 слов, наиболее похожих на 'king'

SELECT word, embedding <=> (SELECT embedding FROM word_embeddings WHERE word = 'king') AS distance

FROM word_embeddings

ORDER BY embedding <=> (SELECT embedding FROM word_embeddings WHERE word = 'king')

LIMIT 10;




-- Пример "король - мужчина + женщина = королева"

SELECT word, embedding <=> (

    (SELECT embedding FROM word_embeddings WHERE word = 'king')

    - (SELECT embedding FROM word_embeddings WHERE word = 'man')

    + (SELECT embedding FROM word_embeddings WHERE word = 'woman')

) AS distance

FROM word_embeddings

ORDER BY distance

LIMIT 10;

Этот классический пример векторной арифметики показывает, как можно выявлять семантические отношения. В результатах поиска слово 'queen' (королева) окажется среди наиболее близких векторов. Если 'queen' не занимает первую строчку, это часто объясняется многозначностью слова в обучающем корпусе (например, 'queen' как монарх, музыкальная группа или шахматная фигура). Тем не менее, само его появление в топе наглядно демонстрирует работу векторных аналогий.

6. Не забудьте установить параметр gann.hnsw_stream.efsearch (или аналогичный для других типов индексов) для контроля качества поиска перед выполнением запросов:

SET gann.hnsw_stream.efsearch = 100; -- Чем выше, тем точнее, но медленнее

Технические детали: разные сценарии и разные индексы

pgpro_vector предоставляет три типа индексов, оптимизированных под разные задачи:

  • gannhnsw — максимально быстрый поиск без фильтрации. Подходит для задач вроде распознавания изображений.

  • hnsw_stream — позволяет использовать условия WHERE и возвращать неограниченное количество результатов. Хороший выбор для рекомендаций товаров с фильтрацией по категориям.

  • mc_hnsw (multi-column) — многоколоночный индекс, идеально подходит для поиска по векторным данным с дополнительными атрибутами. Например, поиск похожих пользователей определенного возраста и региона.

Это делает pgpro_vector универсальным инструментом для самых разных задач.

На что обратить внимание

Как и любая технология, векторный поиск имеет свои нюансы:

  • ANN-поиск приблизительный. Чем выше вы хотите точность, тем ниже может быть скорость поиска. Это тонкий баланс, который настраивается под конкретную задачу.

  • На больших объемах данных создание и использование индексов требуют значительных объёмов оперативной памяти. Если памяти недостаточно, индексы разбиваются на части (кластеры), что может снизить скорость запросов.

  • Чем выше размерность векторов, тем больше ресурсов для их обработки требуется. Для высокоразмерных векторов (например, >1000) используется метод бинарного квантования, уменьшающий размер и ускоряющий поиск.

Почему векторный поиск — это будущее

Главный вызов для бизнеса сегодня  — найти релевантные данные быстро и эффективно. Векторный поиск решает эту задачу, переходя от простого совпадения символов к пониманию смысла данных.

Расширение pgpro_vector делает эту технологию доступной каждому пользователю Postgres Pro прямо сейчас. Теперь не нужны отдельные сложные системы: вся мощь векторного поиска может быть реализована прямо в привычной и надежной СУБД.

Внедрив векторный поиск в свои проекты, вы сможете:

  • повысить релевантность выдачи;

  • улучшить качество рекомендаций;

  • сделать пользовательский опыт более персональным и приятным.

Комментарии (4)


  1. 2mik
    18.06.2025 13:47

    Можно ли ожидать в будущем мержа векторного поиска в ванильный PostgreSQL?


    1. graf4444
      18.06.2025 13:47

      del


    1. LesnoyChelovek Автор
      18.06.2025 13:47

      Всё будет зависеть от спроса на подобные решения и наши возможности


  1. petropavel
    18.06.2025 13:47

    а где сравнение с pg_embedding, pgvector и pgvecto.rs?