Перейти к основному содержанию
Qdrant — векторная база: она хранит векторы вместе с payload и отвечает на запрос «дай k ближайших к этому вектору». В RAG-конвейере Qdrant занимает одну конкретную роль — возвращает релевантные фрагменты до вызова языковой модели. Саму генерацию выполняет LLM, и именно её вы поручаете SpeShu.AI: Qdrant не знает ни про какие модели, ни про ключи, а LangChain-обёртка над ним умеет ходить в любой OpenAI-совместимый чат-эндпоинт.

Что понадобится

Всё подключение сводится к двум значениям: base_url = "https://speshu.ai/api/v1" и API-ключ. langchain-openai говорит по протоколу OpenAI Chat Completions, поэтому достаточно подставить свой адрес — код клиента переписывать не нужно.
cURL

Установка

1

Установите пакеты

langchain-qdrant — обёртка Qdrant с интерфейсом LangChain, qdrant-client — сам клиент, langchain-openai — чат-модель через OpenAI-совместимый эндпоинт.
2

Возьмите идентификатор модели из каталога

Идентификаторы текстовых моделей не зашивайте в код: состав каталога меняется, и зашитый в код идентификатор падает с 404 model_not_found без предупреждения. Прочитайте каталог один раз при развёртывании и сохраните идентификатор в переменную окружения.
cURL
Формат ответа — в разделе Каталог моделей, как выбрать модель под задачу — в Модели и цены.
3

Поднимите Qdrant

Для локального режима сервер не нужен: клиент работает и в памяти, и в файле. Для продакшена нужен настоящий сервер — локально или в Qdrant Cloud.

Эмбеддинги: честное ограничение

В API SpeShu.AI нет эндпоинта /embeddings. Вектор для запроса Qdrant отдать нечем: QdrantVectorStore сам считает вектор запроса вызываемой вами моделью эмбеддингов, и подменить её генерацией текста нельзя. Два рабочих варианта — выберите один.
Вариант A — векторы от другого провайдера. Это предпочтительный путь: генерация остаётся в SpeShu.AI, эмбеддинги считаются отдельным сервисом с отдельной конфигурацией.
Python
Вариант B — без эмбеддингов вообще. Qdrant умеет отдавать записи по фильтру payload без вычисления расстояний. Такой конвейер не семантический, но он полностью рабочий и не требует ни одного вектора: QdrantClient.scroll возвращает записи, подходящие под scroll_filter.
Python

Настройка

QdrantVectorStore принимает готовый клиент Qdrant, имя коллекции и объект эмбеддингов. Чат-модель настраивается отдельно — через ChatOpenAI, где base_url указывает на SpeShu.AI.
VectorParams(size=...) обязан совпадать с размерностью вектора вашей модели эмбеддингов. Несовпадение даёт ошибку при записи, а не при поиске, и выясняется это обычно на середине загрузки индекса.
Python
Если сервера Qdrant нет, замените QdrantClient(url=...) на QdrantClient(path="/tmp/qdrant_data") — данные переживут перезапуск процесса, но останутся на этой машине. QdrantVectorStore.from_documents(...) делает те же шаги за вас, включая создание коллекции, если укажете collection_name и embedding.

Рабочий пример

Индексация документов, поиск и ответ с опорой на найденное.
Python
Поиск в Qdrant не тарифицируется — деньги списываются только за генерацию. Сумма за один вызов чата приходит в поле usage.cost.total_cost ответа; StrOutputParser её отбрасывает, поэтому за расходом удобнее следить на уровне HTTP-клиента. Разбор — в разделе Тарификация и оплата.

Что ещё поддерживает стек

Генерация медиа в Qdrant не встраивается — это отдельный асинхронный API с оплатой при создании задачи. Идентификаторы медиа-моделей берутся из GET /api/v1/media/models и указываются буквально: этот каталог публичный и стабильный.

Типичные проблемы

Проверьте адрес. Нужен ровно https://speshu.ai/api/v1, с суффиксом /v1 и без слэша в конце. Значение https://speshu.ai/api даст 404, а https://speshu.ai/api/v1/ даст 404 на самом маршруте — клиент склеит путь в вид .../v1//chat/completions.
Ключ не ушёл в запрос. У ChatOpenAI он передаётся параметром api_key, у переменной окружения проверьте её значение — оно начинается с sk- и не содержит кавычек и переноса строки. Отладка: echo "$SPESHU_API_KEY" | wc -c.
Идентификатор модели зашит в коде и устарел. Возьмите его из GET /api/v1/models и положите в SPESHU_MODEL при развёртывании. Зашитый в исходник идентификатор ломается молча, без предупреждения при сборке.
Размерность вектора не совпадает с VectorParams(size=...). Возьмите её из документации модели эмбеддингов и либо создайте коллекцию заново, либо перезапишите коллекцию в правильном размере — сменить размерность существующей коллекции нельзя.
Клиент буферизует тело ответа. В curl помогает флаг -N, в коде — чтение потока по мере прихода. Разбор кадров SSE — на странице Потоковая передача.
Такого эндпоинта в API нет. Уберите вызов и перейдите на вариант A или B из раздела «Эмбеддинги: честное ограничение». Полная таблица кодов — на странице Ошибки.

Что дальше

Модели и цены

Каталог текстовых и медиа-моделей, стоимость в рублях

Тарификация и оплата

Как читать usage.cost.total_cost и контролировать расход

Потоковая передача

SSE, кадры и [DONE]

Вызов функций

Инструменты, которые Qdrant отдаёт модели как контекст