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