Что такое Qdrant?
Qdrant — высокопроизводительная open-source векторная база данных, написанная на Rust. Поддерживает миллиарды векторов, гибкую фильтрацию по метаданным и работает как отдельный сервис с REST и gRPC API.
Установка через Docker
docker run -d \
--name qdrant \
-p 6333:6333 \
-p 6334:6334 \
-v qdrant_storage:/qdrant/storage \
--restart always \
qdrant/qdrantРабота с Qdrant из Python
>pip install qdrant-clientfrom qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
client = QdrantClient(host="localhost", port=6333)
# Создание коллекции
client.create_collection(
collection_name="kb_articles",
vectors_config=VectorParams(size=768, distance=Distance.COSINE)
)
# Добавление векторов
client.upsert(
collection_name="kb_articles",
points=[
PointStruct(id=1, vector=[0.1]*768, payload={"text": "Установка VDS"}),
]
)
# Поиск
results = client.search(
collection_name="kb_articles",
query_vector=[0.1]*768,
limit=5
)
for r in results:
print(r.payload["text"], r.score)Интеграция с LangChain
from langchain_community.vectorstores import Qdrant
from langchain_community.embeddings import OllamaEmbeddings
embeddings = OllamaEmbeddings(model="nomic-embed-text")
db = Qdrant.from_documents(
docs,
embeddings,
url="http://localhost:6333",
collection_name="my_docs"
)
retriever = db.as_retriever(search_kwargs={"k": 4})http://IP:6333/dashboard для визуального управления коллекциями и поиска векторов.Частые ошибки при работе с Qdrant
«Wrong input: Vector dimension error»
Bad request: Wrong input: Vector dimension error: expected dim: 768, got 1536Размерность вектора в коллекции жёстко задаётся при её создании через VectorParams(size=...) и не может отличаться от размерности эмбеддингов, которые вы реально отправляете. Ошибка возникает, если сменили модель эмбеддингов (например, с 768-мерной на 1536-мерную), но не пересоздали коллекцию.
Контейнер стартует, но порт 6333 недоступен снаружи
curl: (7) Failed to connect to IP port 6333: Connection refusedПроверьте, что порт действительно проброшен в команде запуска (-p 6333:6333), а не только объявлен в конфиге, и что firewall на VDS не блокирует внешние подключения к этому порту.
Данные исчезли после пересоздания контейнера
Если контейнер запущен без volume для /qdrant/storage, все коллекции живут только внутри контейнера и теряются при его удалении. Проверяйте флаг -v qdrant_storage:/qdrant/storage в команде запуска перед тем, как загружать в базу продакшн-данные.
gRPC-клиент не может подключиться, хотя REST работает
grpc._channel._InactiveRpcError: failed to connect to all addressesУ Qdrant два независимых порта: 6333 для REST и 6334 для gRPC. Если клиентская библиотека настроена на gRPC-режим, а проброшен и открыт только порт 6333, соединение падает именно так. Проверьте, какой протокол реально использует ваш клиент, и откройте оба порта, если нужен gRPC.
Qdrant, Chroma и pgvector: что выбрать
Все три хранилища решают задачу поиска по векторам, но рассчитаны на разный объём данных и разную степень интеграции с уже существующей базой.
| Критерий | Qdrant | Chroma | pgvector |
|---|---|---|---|
| Целевой объём данных | Миллионы и больше | Небольшие и средние | Средние, вместе с реляционными данными |
| Отдельный сервис | Да | Опционально | Нет, расширение PostgreSQL |
| Фильтрация по метаданным | Гибкая | Базовая | Через обычный SQL |
| Протоколы доступа | REST и gRPC | Python-клиент или HTTP | SQL |
Когда Qdrant избыточен
Мощь продакшн-ориентированной базы на Rust становится накладными расходами там, где хватило бы значительно более простого решения.
- Прототип или пет-проект с парой тысяч документов — держать отдельный сервис ради такого объёма нерационально, хватит embedded-режима Chroma
- Данные уже живут в PostgreSQL и векторный поиск нужен как дополнение — логичнее взять pgvector и не плодить лишнюю инфраструктуру
- На VDS и так впритык с ресурсами — Qdrant как отдельный процесс требует дополнительной памяти сверх приложения
- Нет задачи с фильтрацией по сложным метаданным при поиске — простого векторного индекса в существующей базе достаточно
- Команда не готова администрировать ещё один отдельный сервис с собственным жизненным циклом и бэкапами
Проверка результата
Перед подключением продакшн-нагрузки стоит проверить не только сам поиск, но и устойчивость данных к перезапуску.
- Создайте коллекцию и добавьте тестовый набор векторов
- Выполните поиск и убедитесь, что возвращаются ожидаемые ближайшие соседи с разумным score
- Откройте дашборд
/dashboardи проверьте, что коллекция и число точек в ней отображаются верно - Перезапустите контейнер и убедитесь, что данные не пропали
- Проверьте оба порта — 6333 и 6334 — если приложение использует и REST, и gRPC
По теме: более простая база для старта — Chroma DB на VDS, полное сравнение вариантов — векторные базы данных, поиск прямо в PostgreSQL — pgvector.