Вы вложили деньги в 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 часа. Векторы не нужно пересчитывать, если модель та же. Алгоритм:
- Выгрузить все векторы из источника батчами по 10 000.
- Загрузить в новую базу параллельно.
- Новые записи писать в обе базы.
- Перевести 10% трафика на новую, проверить точность.
- Постепенно перевести весь трафик.
Вот скрипт для переноса из 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 в своём бизнесе без программиста. Разбираем инструменты и схемы - без курсов и теории.