pgvector и векторные БД
| Тип | расширение PostgreSQL |
|---|---|
| Автор | Эндрю Кейн |
| Первый выпуск | 2021 |
| Лицензия | PostgreSQL License |
| Типы данных | vector, halfvec, bit, sparsevec |
| Индексы | HNSW, IVFFlat |
| Метрики | L2, скалярное произведение, косинусное расстояние, L1, Хэмминг, Жаккар |
| Альтернативы | Qdrant, Milvus, Weaviate, Chroma, Pinecone, FAISS |
pgvector — расширение для PostgreSQL, добавляющее тип данных для векторов и операторы поиска ближайших соседей. С его помощью в обычной таблице можно хранить эмбеддинги — числовые представления текстов, изображений или товаров — и находить записи, наиболее похожие на запрос. Векторными базами данных называют системы, специально созданные для хранения векторов и быстрого векторного поиска: Qdrant, Milvus, Weaviate, Chroma, Pinecone и другие.
Интерес к обоим подходам резко вырос с распространением больших языковых моделей: векторный поиск — основа RAG, семантического поиска, рекомендаций и поиска дубликатов.
Зачем нужен векторный поиск
Модель-кодировщик превращает фрагмент текста в вектор из сотен или тысяч чисел так, что близкие по смыслу тексты дают близкие векторы. Поиск «похожих документов» сводится к поиску векторов, ближайших к вектору запроса. Точный перебор всех векторов надёжен, но на миллионах записей медленный, поэтому применяют приближённый поиск ближайших соседей (ANN, approximate nearest neighbor): он жертвует небольшой долей точности (recall) ради ускорения на порядки.
pgvector
Расширение создал Эндрю Кейн в 2021 году; распространяется под той же лицензией, что и PostgreSQL, и доступно у большинства облачных провайдеров.[1]
Типы и операторы
| Тип | Описание |
|---|---|
vector(n) |
вектор из n чисел одинарной точности |
halfvec(n) |
половинная точность — вдвое меньше места |
bit(n) |
двоичный вектор (для бинарной квантизации) |
sparsevec(n) |
разреженный вектор, хранит только ненулевые элементы |
| Оператор | Расстояние |
|---|---|
<-> |
евклидово (L2) |
<#> |
отрицательное скалярное произведение |
<=> |
косинусное расстояние |
<+> |
манхэттенское (L1) |
Типы halfvec, sparsevec и оператор L1 появились в версии 0.7.0 (2024).[2]
Индексы
Без индекса pgvector выполняет точный поиск полным перебором. Для приближённого поиска есть два вида индексов:
- HNSW (Hierarchical Navigable Small World) — многоуровневый граф близости, в котором поиск спускается от редких «дальних» связей к плотным локальным.[3] Даёт лучшее соотношение скорости и точности, но строится дольше и занимает больше памяти. Добавлен в версии 0.5.0 (2023).
- IVFFlat — векторы разбиваются на кластеры (списки), и поиск просматривает только несколько ближайших кластеров. Строится быстрее, но индекс нужно создавать после загрузки данных, а точность сильнее зависит от параметров.
Пример
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE chunks (
id bigserial PRIMARY KEY,
doc_id bigint NOT NULL,
content text NOT NULL,
embedding vector(1024)
);
CREATE INDEX ON chunks USING hnsw (embedding vector_cosine_ops);
-- 5 фрагментов, ближайших к вектору запроса, только из нужного документа
SELECT id, content, embedding <=> $1 AS distance
FROM chunks
WHERE doc_id = 42
ORDER BY embedding <=> $1
LIMIT 5;
-- точность/скорость HNSW во время запроса
SET hnsw.ef_search = 100;
Главное преимущество pgvector — векторы живут рядом с остальными данными: в одном запросе можно сочетать векторную близость с фильтрами по обычным столбцам, соединениями и полнотекстовым поиском, а изменения подчиняются транзакциям, резервному копированию и репликации PostgreSQL. Ограничение — индексы поддерживают векторы до 2000 измерений для vector и до 4000 для halfvec.[1]
Специализированные векторные БД
| Система | Особенности |
|---|---|
| Qdrant | на Rust, фильтрация по полезной нагрузке, квантизация[5] |
| Milvus | распределённая, рассчитана на миллиарды векторов |
| Weaviate | встроенные модули векторизации, гибридный поиск |
| Chroma | лёгкая встраиваемая база для прототипов |
| Pinecone | управляемый облачный сервис |
| FAISS | не база, а библиотека ANN-поиска от Meta[4] |
Векторные функции добавили и универсальные системы: Elasticsearch и OpenSearch, Redis, MongoDB (Atlas Vector Search), ClickHouse, SQLite (расширение sqlite-vec).
Как выбирать
- До нескольких миллионов векторов, данные уже в PostgreSQL — pgvector обычно достаточно и избавляет от второй системы, синхронизации и отдельного бэкапа.
- Сотни миллионов и миллиарды векторов, высокая нагрузка, сложная квантизация — специализированная векторная БД.
- Прототип или локальный эксперимент — Chroma, sqlite-vec или FAISS в памяти.
Сравнивать производительность алгоритмов помогает открытый набор тестов ANN-Benchmarks.[6] На практике качество RAG чаще определяется нарезкой текста, выбором модели эмбеддингов и переранжированием, чем выбором хранилища.