pgvector

pgvector — расширение для PostgreSQL, добавляющее тип данных vector и набор операторов для хранения и поиска векторных эмбеддингов. Оно позволяет выполнять поиск ближайших соседей (nearest neighbor search) прямо в PostgreSQL — без специализированных векторных баз данных. pgvector стал стандартным инструментом для реализации семантического поиска, RAG (Retrieval-Augmented Generation) и систем рекомендаций в стеках, уже использующих PostgreSQL.

Что такое векторные эмбеддинги

Эмбеддинг — числовое представление объекта (текста, изображения, аудио) в многомерном векторном пространстве. Семантически похожие объекты оказываются рядом в этом пространстве. Модели вроде OpenAI text-embedding-3-small или sentence-transformers преобразуют текст в вектор из 1536 или 768 чисел. Расстояние между векторами отражает семантическую близость: «кот» и «кошка» будут ближе друг к другу, чем «кот» и «автомобиль».

Установка и базовое использование

pgvector устанавливается как расширение PostgreSQL:

CREATE EXTENSION vector;

После этого можно создавать столбцы типа vector(n), где n — размерность:

CREATE TABLE documents (id bigserial PRIMARY KEY, content text, embedding vector(1536));

Вставка данных: INSERT INTO documents (content, embedding) VALUES ('Пример текста', '[0.1, 0.2, ...]');

Метрики расстояния

pgvector поддерживает три метрики для поиска ближайших соседей:

  • Косинусное расстояние (<=>) — угол между векторами. Наиболее распространённая метрика для текстовых эмбеддингов: нечувствительна к длине вектора, измеряет только направление.
  • Евклидово расстояние (<->) — геометрическое расстояние в пространстве. Подходит, когда важна «абсолютная» близость.
  • Скалярное произведение (<#>, inner product) — для нормализованных векторов эквивалентно косинусному сходству. Используется в рекомендательных системах.
  • L1 (Manhattan distance) и Hamming distance — добавлены в версии 0.7.0.

Индексирование: IVFFlat и HNSW

Без индекса pgvector выполняет точный поиск полным перебором (exact KNN) — O(n). Для больших коллекций нужны приближённые алгоритмы (ANN):

  • IVFFlat (Inverted File with Flat compression) — разбивает векторное пространство на кластеры (lists). При поиске проверяет только ближайшие кластеры (probes). Меньший индекс, быстрая сборка, немного хуже recall. CREATE INDEX ON documents USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
  • HNSW (Hierarchical Navigable Small World) — граф навигации по иерархическим уровням. Более высокий recall, лучшая производительность запросов, но больший размер индекса и дольше строится. Добавлен в pgvector 0.5.0. CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops) WITH (m = 16, ef_construction = 64);

HNSW рекомендуется для большинства продуктовых сценариев; IVFFlat — когда важен размер индекса или частые массовые вставки.

Паттерн RAG с pgvector

Retrieval-Augmented Generation — архитектурный паттерн, при котором языковая модель дополняется релевантным контекстом из базы знаний. Реализация с pgvector:

  1. Разбить документы на чанки (chunks) и сохранить с эмбеддингами в PostgreSQL.
  2. При получении вопроса пользователя сгенерировать эмбеддинг вопроса через ту же модель.
  3. Найти K ближайших документов: SELECT content FROM documents ORDER BY embedding <=> $1 LIMIT 5;
  4. Передать найденные документы как контекст в промпт LLM.
  5. LLM генерирует ответ на основе предоставленного контекста.

Гибридный поиск: векторный + полнотекстовый

Чистый векторный поиск плохо работает с точными совпадениями (артикулы, имена, коды). Гибридный поиск комбинирует семантический (pgvector) и лексический (PostgreSQL tsvector) результаты через RRF (Reciprocal Rank Fusion) или взвешенное комбинирование. Это улучшает качество поиска в большинстве реальных сценариев.

pgvector vs специализированные векторные БД

pgvector интегрирован в существующую PostgreSQL-инфраструктуру: транзакции, JOIN, бэкапы, RBAC работают как обычно. Это главное преимущество для команд, уже использующих PostgreSQL. Специализированные векторные БД (Pinecone, Qdrant, Weaviate, Milvus) предлагают более высокую производительность на очень больших коллекциях (100M+ векторов), расширенные фильтры метаданных и управляемые облачные сервисы. Для большинства приложений с коллекциями до нескольких миллионов документов pgvector с HNSW обеспечивает достаточную производительность.

Частые вопросы

  • Сколько векторов может хранить pgvector?

    Теоретически pgvector ограничен только размером PostgreSQL-таблицы. Практически, HNSW-индекс на 1 миллионе 1536-мерных векторов занимает около 20–30 ГБ. Производительность поиска начинает деградировать при сотнях миллионов векторов — в этом случае рассматривают специализированные векторные базы данных или партиционирование.

  • Какую модель эмбеддингов использовать с pgvector?

    Выбор зависит от задачи и бюджета. OpenAI text-embedding-3-small (1536 измерений) — хороший баланс качества и стоимости для текстов на русском и английском. Sentence-transformers (например, multilingual-e5-large) — бесплатная локальная альтернатива. Важно: эмбеддинги запросов и документов должны генерироваться одной и той же моделью.

  • Как настроить параметры HNSW-индекса для лучшей производительности?

    Параметр m (степень связности графа, по умолчанию 16) влияет на качество поиска и размер индекса. ef_construction (по умолчанию 64) определяет точность построения. При поиске SET hnsw.ef_search = 100 увеличивает recall за счёт скорости. Оптимальные значения подбираются экспериментально на основе метрик recall@K и latency для конкретного датасета.

Не хватает деталей?

Напишите, что уточнить по теме «pgvector» — это помогает улучшать материал и подсказывает, какие термины добавить дальше. Email необязателен: укажите, если хотите ответ только для вас (мы не шлём рассылки).

Поделиться