Postgres + pgvector vs специализированный векторный store: бенчмарк 2025
Перед выбором векторного хранилища для RAG-системы юрфирмы «ПравоВектор» мы прогнали 4 кандидата на 1.2 млн чанков. Делимся честными цифрами: где pgvector выигрывает, где сдаётся.
Дайджест Креастры
- До 2 млн векторов pgvector с HNSW не уступает по скорости специализированным store
- Преимущество pgvector — JOIN с реляционными данными в одном запросе, у Pinecone и Weaviate этого нет
- Выше 5 млн векторов или с фильтрами по метаданным >5 полей — переходите на Qdrant
Юрфирма «ПравоВектор» строит внутренний AI-ассистент для юристов: задаёшь вопрос, получаешь ответ с цитатами из своей базы — 1.2 миллиона документов, 8.4 миллиона чанков с эмбеддингами. Вопрос «где это хранить?» из академического превратился в «не ошибиться на 4 млн рублей в год за инфраструктуру». Мы прогнали четыре кандидата: pgvector, Qdrant, Weaviate, Pinecone. Делюсь цифрами без маркетинга.
Конфигурация бенчмарка
- Эмбеддинги: text-embedding-3-large, 3072 измерения
- Объём данных: 1.2 млн чанков, средний размер чанка 380 токенов
- Запросы: 5000 реальных запросов юристов из логов прошлой системы
- Железо: 16 vCPU, 64 ГБ RAM, NVMe SSD; для облачных — стандартные тарифы поставщика
- Метрики: p95 latency, recall@10, цена в месяц при 10 млн запросов
Результаты по latency
pgvector с HNSW (m=16, ef_construction=200) — p95 38 мс. Qdrant — p95 24 мс. Weaviate — p95 31 мс. Pinecone (s1.x1) — p95 42 мс. На объёме 1.2 млн все четыре дают приемлемую скорость, разница не критична для ассистента, где LLM-ответ всё равно занимает 1.5–3 секунды.
Recall и качество
Все четыре дают recall@10 в коридоре 0.94–0.97 при правильной настройке индекса. Тонкость: у pgvector recall сильно зависит от ef_search — мы остановились на 80, что даёт 0.96. У Qdrant из коробки 0.97 без подкрутки. Pinecone и Weaviate — между ними.
JOIN с метаданными — главный аргумент за pgvector
У «ПравоВектора» каждый чанк связан с делом, клиентом, юрисдикцией, годом и десятком других полей. Юристы фильтруют запросы: «найди прецеденты в Арбитражном суде Санкт-Петербурга за 2022–2024, где судья N выносил решение по 53.1 ГК». В pgvector это один SQL-запрос, в Pinecone — два сетевых хопа и склейка на стороне приложения.
-- pgvector: семантический поиск + реляционные фильтры в одном запросе
SELECT c.id, c.text, d.case_no, d.judge_name,
1 - (c.embedding <=> $1) AS score
FROM chunks c
JOIN documents d ON d.id = c.document_id
WHERE d.court_code = 'SPB_ARB'
AND d.decision_date BETWEEN '2022-01-01' AND '2024-12-31'
AND d.judge_name = 'Иванов И.И.'
AND d.articles @> ARRAY['ГК-53.1']
ORDER BY c.embedding <=> $1
LIMIT 10;Цена в месяц при 10 млн запросов
- pgvector на собственном Postgres (RDS db.r6g.4xlarge) — около 980 USD
- Qdrant Cloud — около 1240 USD
- Weaviate Cloud (standard) — около 1380 USD
- Pinecone (s1.x1, 1 pod) — около 1700 USD
- Сэкономили клиенту 8.6 тысяч долларов в год по сравнению с Pinecone — за это деньги на разработку другой части агента
Когда pgvector не подходит
Выше 5 миллионов векторов индекс HNSW начинает «жирнеть» в RAM, и время сборки растёт нелинейно. Если у вас гигантский каталог (миллионы товаров с описаниями), несколько jurisdictions с фильтрами по 8+ полям одновременно или строгие требования к latency p99 < 30 мс — берите Qdrant. Pinecone — если у вас уже Vendor-locked стек на AWS и нет ресурса на DevOps.
Что мы выбрали
Для «ПравоВектора» — pgvector. Объём 1.2 млн чанков с горизонтом до 4 млн через 18 месяцев, тяжёлые фильтры по метаданным, команда уже знает Postgres. Заложили в архитектуру миграцию на Qdrant, если объём превысит 5 млн или появится сценарий, где p95 не должен быть выше 25 мс.