pgvector и векторные БД

Материал из llmdocs — справочник разработчика
Портал: Базы данных
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 чаще определяется нарезкой текста, выбором модели эмбеддингов и переранжированием, чем выбором хранилища.

См. также

Источники

  1. pgvector — README (GitHub)
  2. pgvector — CHANGELOG
  3. Yu. Malkov, D. Yashunin — Efficient and robust approximate nearest neighbor search using HNSW graphs (2016)
  4. FAISS — Facebook AI Similarity Search
  5. Qdrant Documentation — Concepts
  6. ANN-Benchmarks