Qdrant - Vector Database
Qdrant + LangChain
У вас уже есть Qdrant коллекция с тысячами документов. Теперь вы хотите добавить «Спроси у своей базы знаний» - чат который отвечает на вопросы. LangChain делает это за 15 строк кода. Разберём как.
- **Корпоративный поиск:** документация компании → QdrantVectorStore → RetrievalQA → сотрудники спрашивают на естественном языке
- **Поддержка клиентов:** база тикетов и FAQ → retriever с фильтром по продукту → автоматические ответы на похожие вопросы
- **Исследовательский инструмент:** база научных статей → MMR поиск для разнообразных результатов → LLM синтезирует обзор темы
Предварительные знания
Установка и инициализация QdrantVectorStore
**LangChain** - самый популярный фреймворк для построения LLM-приложений. Qdrant имеет нативную интеграцию через `@langchain/qdrant`. Это позволяет использовать все возможности Qdrant (фильтрацию, hybrid search) через привычный LangChain API.
**`collectionName`** - если коллекция не существует, LangChain создаёт её автоматически с размерностью вектора, соответствующей выбранной модели embeddings. OpenAI `text-embedding-3-small` → 1536 dim, `text-embedding-3-large` → 3072 dim.
Вам нужно подключиться к уже существующей коллекции Qdrant через LangChain. Какой метод использовать?
addDocuments, similaritySearch и MMR поиск
**QdrantVectorStore** реализует стандартный LangChain интерфейс `VectorStore` с тремя ключевыми методами поиска: `similaritySearch` - базовый поиск по схожести, `similaritySearchWithScore` - с возвратом scores, `maxMarginalRelevanceSearch` (MMR) - поиск с учётом разнообразия результатов.
**MMR (Maximal Marginal Relevance)** особенно полезен в RAG: если в базе 10 похожих документов про один факт, MMR вернёт их разнообразное подмножество. Это позволяет LLM получить более широкий контекст. `lambda: 0.7` - хороший стартовый баланс.
Вы строите RAG для документации. Пользователь спрашивает про 'установку'. В базе 15 документов про установку, но они очень похожи. Какой метод поиска предпочесть?
RetrievalQA цепочка и кастомный Retriever
**Retriever** - абстракция LangChain для источника документов. `QdrantVectorStore.asRetriever()` создаёт retriever, который можно использовать в любой LangChain цепочке: `RetrievalQA`, `ConversationalRetrievalChain`, LCEL pipelines.
**LCEL vs RetrievalQAChain:** `RetrievalQAChain` - legacy API, удобный но менее гибкий. LCEL (LangChain Expression Language) - современный подход: composable, streaming-ready, легко кастомизировать промпт и логику. Для новых проектов рекомендуется LCEL.
«LangChain полностью скрывает Qdrant - нельзя использовать нативные возможности вроде фильтров»
LangChain передаёт filter напрямую в Qdrant, поддерживая полный синтаксис фильтрации: must/should/must_not, range, geo, nested filters.
QdrantVectorStore - тонкая обёртка над @qdrant/js-client-rest. Параметр filter передаётся as-is в Qdrant запрос. Можно использовать любые Qdrant фильтры включая вложенные условия и геопоиск.
Вы хотите, чтобы RetrievalQA возвращал только документы из категории 'technical'. Где нужно задать фильтр?
Ключевые идеи
- **QdrantVectorStore** - LangChain-обёртка над Qdrant: fromExistingCollection, fromDocuments, fromTexts
- **addDocuments** - добавление с автоматической генерацией embeddings; возвращает ID точек
- **similaritySearch** - базовый поиск; **maxMarginalRelevanceSearch** - с разнообразием результатов
- **Фильтры** - передаются напрямую в Qdrant синтаксис через третий аргумент поиска или в asRetriever()
- **asRetriever()** → **RetrievalQA** / LCEL pipeline - стандартный паттерн для RAG приложений
Что дальше
LangChain - не единственный фреймворк для работы с Qdrant. LlamaIndex предлагает другой подход с фокусом на data ingestion и structured retrieval.
- Qdrant + LlamaIndex — Альтернативный фреймворк: более структурированный подход к ingestion и retrieval
- Production RAG Pipeline — Полный pipeline: chunking → embeddings → upsert → search → reranking → LLM
- Фильтрация с payload — Глубокое понимание Qdrant фильтров используемых в LangChain
Вопросы для размышления
- В чём разница между similaritySearch и maxMarginalRelevanceSearch? Для каких задач каждый из них подходит лучше?
- Как LCEL pipeline отличается от RetrievalQAChain? Какие преимущества даёт LCEL для production систем?
- Вы используете LangChain + Qdrant в production. Как организовать обновление документов - addDocuments для новых, или удаление + переиндексация для изменённых?