Векторные базы данных стали одной из ключевых технологий эпохи генеративного ИИ. Именно они позволяют создавать системы семантического поиска, рекомендательные движки, Retrieval-Augmented Generation (RAG) и интеллектуальных помощников.
Многие разработчики используют для этих задач специализированные решения вроде Pinecone, Weaviate или Qdrant. Однако существует менее очевидный вариант — обычный PostgreSQL с расширением pgvector.
На практике это означает, что привычная реляционная база данных может одновременно хранить обычные таблицы и выполнять высокопроизводительный поиск по эмбеддингам. Такой подход особенно интересен тем, кто хочет построить полноценную систему поиска без дополнительных сервисов и сложной инфраструктуры.
В этом руководстве мы создадим полноценную лабораторию для экспериментов с pgvector в Google Colab, настроим PostgreSQL, загрузим эмбеддинги, построим HNSW-индексы и реализуем различные варианты поиска — от семантического до гибридного.
Подготовка PostgreSQL и установка pgvector
Первый этап отвечает за развёртывание среды.
Этот код:
- устанавливает PostgreSQL;
- устанавливает инструменты сборки;
- загружает исходники pgvector;
- компилирует расширение;
- запускает сервер PostgreSQL;
- устанавливает необходимые Python-библиотеки.
Именно здесь создаётся фундамент для всей дальнейшей работы.
После выполнения этого блока в системе появляется рабочий PostgreSQL с поддержкой векторных операций через pgvector. Кроме того, устанавливаются библиотеки SentenceTransformers, Psycopg и NumPy, которые понадобятся для работы с эмбеддингами.
Подключение к PostgreSQL и загрузка эмбеддингов
Теперь необходимо подключиться к базе данных и подготовить данные для поиска.
На этом этапе происходит:
- подключение к PostgreSQL;
- активация расширения vector;
- загрузка модели SentenceTransformer;
- создание тестового набора документов;
- генерация эмбеддингов;
- создание таблицы documents;
- сохранение векторов в PostgreSQL.
В результате база получает набор документов и соответствующие им векторные представления. Теперь PostgreSQL способен выполнять не только обычные SQL-запросы, но и поиск по смыслу текста.
Создание HNSW-индекса и семантический поиск
После загрузки данных можно переходить к самой интересной части — поиску похожих документов.
Для ускорения поиска pgvector использует индекс HNSW (Hierarchical Navigable Small World). Это один из самых популярных алгоритмов Approximate Nearest Neighbor Search, который позволяет находить похожие векторы значительно быстрее полного перебора.
Следующий код:
- создаёт HNSW-индекс;
- задаёт параметры поиска;
- реализует функцию семантического поиска;
- выполняет поиск наиболее близких документов.
Оператор <=> вычисляет косинусное расстояние между векторами. Чем меньше значение, тем ближе документы по смыслу.
После выполнения этого этапа база способна находить похожие тексты даже тогда, когда запрос и документ не содержат одинаковых слов.
Фильтрация результатов по метаданным
Во многих реальных проектах недостаточно просто найти похожие документы.
Например, пользователь может искать информацию только среди научных публикаций или только среди определённой категории данных.
Следующий код демонстрирует комбинирование векторного поиска с обычными SQL-фильтрами.
Здесь поиск выполняется только среди записей категории space.
Именно возможность объединять SQL и векторный поиск делает PostgreSQL особенно удобным для производственных систем.
Сравнение различных метрик расстояния
Не все задачи одинаково хорошо работают с косинусным расстоянием.
В некоторых случаях лучше подходит евклидово расстояние, в других — внутреннее произведение.
Следующий пример показывает работу разных операторов pgvector.
Используемые операторы:
- <-> — евклидово расстояние (L2);
- <=> — косинусное расстояние;
- <#> — отрицательное внутреннее произведение;
- <+> — Manhattan Distance (L1).
Это позволяет подобрать оптимальную метрику под конкретную задачу поиска или рекомендаций.
Экономия памяти с halfvec
При работе с миллионами эмбеддингов объём хранения становится серьёзной проблемой.
pgvector поддерживает тип halfvec, который хранит значения в половинной точности.
Следующий код создаёт дополнительный столбец и индекс для halfvec.
Использование halfvec позволяет существенно уменьшить размер индекса и ускорить работу системы при незначительной потере точности поиска.
Бинарная квантизация и ускоренный поиск
Следующий шаг показывает ещё один способ оптимизации хранения и поиска.
Бинарная квантизация преобразует эмбеддинги в компактный бинарный формат, после чего поиск выполняется по расстоянию Хэмминга.
Здесь сначала быстро отбираются кандидаты при помощи бинарного индекса, после чего выполняется повторная сортировка по исходным полноточным векторам.
Такой подход широко используется в крупных поисковых системах и RAG-платформах.
Разреженные векторы: когда не все признаки важны
До этого момента мы работали с плотными эмбеддингами, где каждое измерение содержит значение.
Однако существуют модели и сценарии, в которых большинство признаков равны нулю. Для таких случаев pgvector поддерживает тип sparsevec.
Разреженные векторы особенно полезны для:
- SPLADE-подобных систем поиска;
- поисковых движков;
- гибридных поисковых платформ;
- систем с большим количеством признаков.
Следующий код создаёт отдельную таблицу с разреженными векторами и выполняет поиск по внутреннему произведению.
В этом примере используется оператор <#>, который вычисляет внутреннее произведение между разреженными векторами.
Подобный подход позволяет эффективно работать с высокоразмерными данными без лишних затрат памяти.
Гибридный поиск: объединяем семантику и ключевые слова
Чистый семантический поиск отлично понимает смысл текста.
Полнотекстовый поиск прекрасно работает с точными словами и фразами.
Но что если объединить оба подхода?
Именно это делает гибридный поиск — одна из самых востребованных технологий в современных RAG-системах.
В примере ниже используется метод Reciprocal Rank Fusion (RRF), который объединяет результаты двух независимых поисковых систем.
Что здесь происходит?
Сначала система получает рейтинг документов на основе эмбеддингов.
Затем отдельно выполняется полнотекстовый поиск PostgreSQL.
После этого результаты объединяются при помощи Reciprocal Rank Fusion.
На практике гибридный поиск часто показывает лучшие результаты, чем любой из методов по отдельности.
Поиск «типичного» документа через центроиды
Ещё одна интересная возможность pgvector — работа с агрегатными функциями.
Например, можно вычислить средний вектор категории и определить документ, который лучше всего представляет всю группу.
Следующий код вычисляет центроид категории food.
Средний вектор категории становится своеобразным «центром тяжести» всех документов.
Затем находится документ, максимально близкий к этому центру.
Подобная техника применяется в:
- рекомендательных системах;
- кластеризации;
- анализе коллекций документов;
- поиске типичных представителей классов.
Итоги
Ещё несколько лет назад для построения серьёзной системы векторного поиска приходилось поднимать отдельные специализированные базы данных.
Сегодня ситуация изменилась.
Расширение pgvector превращает PostgreSQL в полноценный движок для работы с эмбеддингами, сохраняя все преимущества классической реляционной СУБД. В одном проекте можно одновременно использовать SQL-запросы, полнотекстовый поиск, фильтрацию по метаданным и высокопроизводительный поиск по векторам.
В рамках этого руководства была построена полноценная тестовая площадка в Google Colab, которая демонстрирует:
- хранение плотных векторов;
- HNSW-индексацию;
- семантический поиск;
- фильтрацию по метаданным;
- работу с различными метриками расстояния;
- halfvec-хранилище;
- бинарную квантизацию;
- sparsevec-векторы;
- гибридный поиск через RRF;
- агрегацию эмбеддингов и центроиды.
Самое интересное заключается в том, что всё это работает внутри обычного PostgreSQL без внешних сервисов, дополнительных API и специализированной инфраструктуры. Именно поэтому pgvector становится всё более популярным инструментом для построения современных AI-поисковых систем, RAG-платформ и интеллектуальных рекомендательных сервисов.