Учебник

Векторные базы для RAG: от pgvector до Qdrant - как выбрать

У вас бизнес, данные разбросаны по документам, CRM и чатам. Чтобы AI искал по ним ответы, нужна векторная база данных. Разбираем pgvector, Qdrant, Weaviate, Pinecone и Milvus - что выбрать под объём данных, бюджет и без DevOps. Получите готовую схему выбора и код для старта за 15 минут.

Макс Космов··7 мин чтения

Вы вложили деньги в AI-помощника для ответов на вопросы по вашим документам. Но он тормозит, дорожает или выдаёт ерунду. Скорее всего, проблема в векторной базе данных - это хранилище, где AI ищет похожие куски текста. Выбрать неправильную на старте - значит через полгода перетаскивать миллионы записей. Разберём пять вариантов, чтобы вы сами или ваш менеджер выбрали нужный за вечер.

Разберём на примере стройфирмы с каталогом проектов, договорами и техдокументацией - но это пример, а не реальный кейс автора.

Что такое ANN-поиск и зачем это бизнесу

Когда AI ищет ответ, он не перебирает все документы подряд - это долго. Вместо этого он использует ANN (приближённый поиск ближайших соседей). Представьте, что у вас 10 000 файлов. Без ANN AI будет честно сравнивать ваш вопрос с каждым файлом - 300-500 миллисекунд на один запрос. С ANN - 8-15 миллисекунд. Разница в 30-60 раз.

Самый популярный механизм ANN - HNSW (иерархический граф). Работает как карта метро: сначала прыгаете на дальнюю станцию, потом уточняете до нужной. Настраивается тремя параметрами:

  • M (16-64) - сколько соседей у каждой точки. M=16 для старта, M=64 точнее, но жрёт в 4 раза больше памяти.
  • ef_construction (100-400) - как тщательно строить карту. Больше = дольше строить, но точнее.
  • ef (50-200) - как тщательно искать. Можно менять на лету без перестройки.

Для типичного бизнеса (100 000 - 5 миллионов кусков текста) HNSW с M=16 и ef=128 даёт задержку 8-15 мс на одном ядре процессора.

Есть альтернатива IVF-PQ - сжимает вектор с 6144 байт до 48 байт. Экономит память в 32 раза, но точность падает на 2-8%. Нужно для 10 миллионов+ векторов.

pgvector: когда у вас уже есть PostgreSQL

pgvector - это расширение для PostgreSQL. Если у вас уже стоит эта база данных (а она стоит у 90% бизнесов), вы получаете векторный поиск без новой инфраструктуры. Плюсы:

  • Никаких новых серверов и сервисов.
  • Можно делать SQL-запросы с фильтрацией по метаданным (например, «найди похожие документы, только за 2024 год и отдела продаж»).
  • Данные согласованы - если вы меняете запись, поиск сразу видит изменения.
  • Бесплатно (кроме самого PostgreSQL).

Минусы:

  • При 5 миллионах векторов начинает тормозить (35 мс против 12 мс у Qdrant).
  • Нет встроенного гибридного поиска (ключевые слова + векторы) - нужно добавлять отдельный текстовый индекс.
  • Сложно масштабировать на несколько серверов.

Вот как создать таблицу с векторами и искать похожие документы с фильтром по отделу:

-- Создаём таблицу с вектором
CREATE TABLE documents (
 id SERIAL PRIMARY KEY,
 content TEXT,
 embedding vector(1536),
 metadata JSONB,
 created_at TIMESTAMP DEFAULT NOW()
);

-- HNSW индекс
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 200);

-- Поиск ближайших соседей
SELECT id, content, 1 - (embedding <=> $1::vector) AS similarity
FROM documents
WHERE metadata->>'department' = 'legal' -- фильтр по метаданным
ORDER BY embedding <=> $1::vector
LIMIT 10;

Вывод: pgvector - идеальный старт для объёмов до 2-3 миллионов векторов, если PostgreSQL уже есть.

Qdrant: скорость и гибкость для продакшена

Qdrant написан на Rust - это значит предсказуемая скорость без «тормозов» из-за сборки мусора. Для RAG это критично: каждый запрос должен быть быстрым.

Ключевые фишки:

  • Фильтрация по метаданным прямо внутри поиска - не нужно сначала искать, потом отсеивать.
  • Встроенный гибридный поиск: можно искать одновременно по смыслу (векторы) и по ключевым словам (sparse vectors). Результаты объединяются через RRF.
  • Производительность: на 5 миллионах векторов задержка 4 мс в среднем, 12 мс в 95% случаев, 22 мс в 99%. Это на обычном сервере AWS за $200/мес.

Вот как выглядит гибридный поиск с фильтром по языку:

from qdrant_client import QdrantClient
from qdrant_client.models import (
 NamedVector, SearchRequest, Filter, FieldCondition, MatchValue
)

client = QdrantClient("http://localhost:6333")

# Hybrid search: dense + sparse
results = client.query_points(
 collection_name="docs",
 query=SearchRequest(
 vector=NamedVector(name="dense", vector=query_embedding),
 with_payload=True,
 limit=20,
 filter=Filter(
 must=[
 FieldCondition(
 key="language",
 match=MatchValue(value="ru")
 )
 ]
 )
 )
)

Вывод: Qdrant - лучший выбор для 1-10 миллионов векторов, если нужна скорость и фильтрация.

Weaviate: гибридный поиск из коробки

Weaviate - единственная векторная БД, где гибридный поиск (BM25 по ключевым словам + dense по смыслу) встроен на уровне архитектуры. Не нужно ничего донастраивать.

Плюсы:

  • Гибридный поиск одной строкой кода.
  • Встроенная схема данных - можно хранить объекты с типами без второй базы.
  • GraphQL API для сложных запросов.
  • Бесплатный облачный тариф до 1 миллиона векторов.

Минусы:

  • Для русского языка BM25 без стемминга работает хуже - словоформы «договор», «договора», «договору» считаются разными словами. Нужен отдельный токенизатор.
  • GraphQL требует привыкания.

Пример гибридного поиска с балансом между ключевыми словами и смыслом (параметр alpha):

import weaviate
from weaviate.classes.query import HybridFusion

client = weaviate.connect_to_local()
collection = client.collections.get("Document")

# Гибридный поиск с alpha = 0.5 (50% dense, 50% BM25)
result = collection.query.hybrid(
 query="HNSW настройка параметров",
 alpha=0.5,
 fusion_type=HybridFusion.RELATIVE_SCORE,
 limit=10
)

Вывод: Weaviate выбирайте, если хотите гибридный поиск «из коробки» и не боитесь GraphQL.

Pinecone: простота для старта, дорого для роста

Pinecone - это SaaS: ничего не устанавливаете, просто шлёте запросы по API. Бесплатно до 2 миллионов векторов. Serverless-архитектура: платите только за использование.

Но есть нюанс: при холодном старте (когда сервер «просыпается») задержка может быть 100-200 мс. Если вам нужно стабильно меньше 100 мс - берите Pod с зарезервированными ресурсами.

Цены 2026 года:

  • Serverless: $0.033 за 1 миллион чтений + $0.08 за гигабайт хранения.
  • Pod p1.x1 (1 млн векторов): $70/мес.
  • Pod p2.x8 (20 млн векторов): $560/мес.

Когда пора мигрировать: при 10 миллионах векторов и 100 запросах в секунду Pinecone обходится в $350-500/мес. Тот же объём на Qdrant Cloud или своём сервере - $180-250/мес.

Вывод: Pinecone - для быстрого старта без DevOps, но при росте готовьтесь к переезду.

Milvus: для гигантских объёмов (миллиарды векторов)

Milvus - единственное решение, которое тянет 1 миллиард+ векторов. Оно разделяет вычислительные мощности и хранилище, позволяя масштабировать их по отдельности. Версия 2.4 умеет использовать видеокарты (GPU) для ускорения - построение индекса на A100 в 10-50 раз быстрее, чем на процессоре.

Облачная версия Zilliz Cloud стоит $1200-2000/мес за 100 миллионов векторов.

Когда Milvus нужен реально:

  • У вас больше 50 миллионов документов.
  • Нужно масштабироваться без остановок.
  • Есть GPU для ускорения.

Для 99% бизнесов до 10 миллионов векторов Milvus - это избыточное усложнение.

Матрица выбора: что брать под свой объём

Объём данных Рекомендация Почему
< 1 млн, есть PostgreSQL pgvector Не нужна новая база
1-10 млн, продакшен Qdrant Лучшее соотношение скорость/точность
1-10 млн, нужен гибридный поиск Weaviate Встроенный BM25 + dense
Старт без DevOps Pinecone Serverless Просто, но дорого при росте
10-500 млн Qdrant Cluster или Weaviate Cloud Горизонтальное масштабирование
> 500 млн Milvus / Zilliz Cloud Единственный вариант

Как начать за 15 минут: pgvector + LangChain

Если у вас уже есть PostgreSQL, вот код, который добавляет документы в векторную базу и ищет по ним:

from langchain_community.vectorstores import PGVector
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

vectorstore = PGVector(
 connection_string="postgresql://user:pass@localhost/ragdb",
 embedding_function=embeddings,
 collection_name="documents",
)

vectorstore.add_texts(
 texts=["Документ 1", "Документ 2"],
 metadatas=[{"source": "manual.pdf"}, {"source": "faq.pdf"}]
)

results = vectorstore.similarity_search("как настроить?", k=5)

Этот код можно запустить на любом сервере с PostgreSQL. Менеджер справится за час.

Как мигрировать между базами данных без остановки бизнеса

Переезд с Pinecone на Qdrant для 5 миллионов векторов занимает 2-4 часа. Векторы не нужно пересчитывать, если модель та же. Алгоритм:

  1. Выгрузить все векторы из источника батчами по 10 000.
  2. Загрузить в новую базу параллельно.
  3. Новые записи писать в обе базы.
  4. Перевести 10% трафика на новую, проверить точность.
  5. Постепенно перевести весь трафик.

Вот скрипт для переноса из Pinecone в Qdrant:

# Дамп из Pinecone
import pinecone
import qdrant_client

pinecone_index = pinecone.Index("my-index")
qdrant = QdrantClient("http://localhost:6333")

batch_size = 10_000
for batch_start in range(0, total_count, batch_size):
 # Получаем батч из Pinecone
 fetch_response = pinecone_index.fetch(
 ids=[str(i) for i in range(batch_start, batch_start + batch_size)]
 )
 
 points = [
 PointStruct(
 id=int(id_),
 vector=v["values"],
 payload=v.get("metadata", {})
 )
 for id_, v in fetch_response.vectors.items()
 ]
 
 qdrant.upsert(collection_name="docs", points=points)

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

Можно ли использовать pgvector вместо отдельной векторной БД?

Да, до 2-3 миллионов векторов - это лучший вариант. Экономия на инфраструктуре, нативные SQL-запросы, транзакции. Но нет встроенного гибридного поиска и при 5 миллионах начинает тормозить.

Qdrant или Weaviate для русского языка с гибридным поиском?

Qdrant + внешний BM25 (Elasticsearch) даёт лучший контроль над морфологией. Weaviate проще, но BM25 без стемминга хуже обрабатывает русские словоформы. Если нет времени настраивать - берите Weaviate, если нужна максимальная точность - Qdrant + отдельный BM25.

Как настроить HNSW для оптимальной скорости и точности?

Начните с M=16, ef_construction=200, ef=128. Если точности не хватает - увеличьте ef до 256-512. Если нужна минимальная задержка - снизьте ef до 64 (потеря точности ~2%). M меняется только перестройкой индекса.

Pinecone или self-hosted Qdrant: что выгоднее?

Pinecone Pod для 10 миллионов векторов: ~$280/мес. Self-hosted Qdrant на двух серверах AWS: ~$200/мес + 2-5 часов DevOps в месяц. Если нет DevOps - Pinecone проще. Если есть - self-hosted выгоднее от 5 миллионов векторов.

Поддерживает ли Milvus фильтрацию по метаданным?

Да, с версии 2.1 - битовые маски для фильтрации. Скалярные индексы на строковых и числовых полях позволяют фильтровать до векторного поиска, без полного сканирования.

Что делать дальше

Ваш следующий шаг - не читать теорию, а взять pgvector (если есть PostgreSQL) или Qdrant (если нет) и загрузить туда первые 100 документов. Код выше - рабочий. Настройте его под свои данные за вечер.

Если хотите глубже разобраться в нарезке документов (чанках) - почитайте про стратегии чанкования. Качество RAG зависит от них не меньше, чем от базы данных.

AI Компас (t.me/kosmoslab_ai) - канал для предпринимателей в РФ и СНГ, которые применяют AI в своём бизнесе без программиста. Разбираем инструменты и схемы - без курсов и теории.