Qdrant - Vector Database
Discovery Search и Context Search
Рекомендации «ещё такое же» быстро надоедают. Discovery Search позволяет строить exploration - когда пользователь хочет что-то новое, но не случайное, а направленное его вкусом.
- Netflix-подобные рекомендации: «как это, но в другом жанре»
- Fashion recommendation: баланс между офисным и casual стилем
- Iterative RAG уточнение: пользователь отмечает нерелевантные результаты
Предварительные знания
Три режима exploration: search, recommend, discover
Qdrant предлагает три принципиально разных парадигмы поиска, решающие разные задачи exploration. Понимание разницы между ними позволяет выбрать правильный инструмент для каждого use case.
| Режим | Входные данные | Семантика | Use case |
|---|---|---|---|
| Search | query vector | Ближайшие к query в пространстве | Найти похожее на то, что я ищу |
| Recommend | positive + negative IDs | Похожее на positive, непохожее на negative | «Ещё такое» / «Не такое» |
| Discover | target + context pairs | target, направляемый context | Exploration: «похоже на A, но в духе B» |
| Context | только context pairs | Золотая середина между парами | Без конкретного запроса, только ограничения |
**Discovery** - самый нетривиальный режим. Он принимает `target` (желаемое направление) и `context` (пары positive/negative, задающие «зону»). Результаты находятся в области, где выполняются ограничения из context, при этом смещённые в сторону target. Это не просто recommend с ограничениями - алгоритм принципиально другой.
Discovery не требует query вектора из embedder - только ID существующих точек. Это делает его идеальным для UI-driven exploration: пользователь кликает «нравится/не нравится», система строит context без необходимости снова вычислять embeddings.
В чём принципиальное отличие Discovery от Recommend?
Context Search: поиск без target
**Context Search** - это Discovery без target. Только пары (positive, negative). Qdrant находит точки, которые находятся в «золотой середине»: ближе к positive, чем к negative, по всем парам одновременно. Это не рекомендация - это поиск баланса.
**Use cases для Context Search:** 1. **Персонализация без истории запросов**: пользователь только сказал что ему нравится и не нравится, без конкретного запроса 2. **Multimodal exploration**: positive - текстовые описания, negative - изображения (если multimodal embeddings) 3. **Creative search**: «как джаз, но не как классика» - помогает найти что-то новое в непривычной зоне 4. **Negative example driven**: иногда проще сказать что НЕ нужно, чем что нужно
Context Search особенно мощен в комбинации с фильтрами. Добавьте filter: `{must: [{key: 'price_range', match: {value: 'mid'}}]}` - и поиск баланса будет ограничен нужным ценовым диапазоном.
Context Search - это просто Recommend с несколькими negative примерами
Context Search определяет зону пространства через пары, а не отдельные positive/negative списки
В Recommend positive и negative - независимые списки. В Context - пары задают направления относительно друг друга. Результат: не «максимально похожее на все positive», а «точки внутри всех context-зон».
Какой результат возвращает чистый Context Search (Discovery без target)?
Discovery в production: MMR, diversity, Relevance Feedback
Три advanced механизма для production recommendation и RAG систем: **MMR** (Maximal Marginal Relevance) для diversity, **Relevance Feedback** для итеративного уточнения, и правильный выбор между recommend и discovery для разных задач.
**Когда что использовать:** - **ANN Search** → у вас есть чёткий query (текст/изображение) - **Recommend** → пользователь просматривал историю, есть лайки/дизлайки - **Discovery** → exploration: нужно что-то новое, но в определённом «духе» - **Context Search** → personalization feed без явного запроса
Какой режим наиболее подходит для персонализированного feed без явного поискового запроса?
Итоги
- Search → ANN ближайшие к query; Recommend → positive/negative списки; Discovery → target + context зоны
- Context Search (Discovery без target) находит «золотую середину» между всеми context парами
- Discovery не требует embedder — только ID существующих точек в коллекции
- Relevance Feedback (v1.17+): итеративное уточнение через Discovery с feedback от пользователя
- Production паттерн: Recommend для «ещё такое», Discovery для exploration, Context для personalized feed
Что дальше
Discovery - на уровне алгоритмов. Последний урок - внутренности Qdrant: ACORN, Inline Storage, Gridstore.
- ACORN, Inline Storage, Gridstore — Внутренние алгоритмы Qdrant v1.16-17: как они ускоряют filtered search
- Recommend API — Основы: recommend как предшественник discovery
- Universal Query — Unified API для всех режимов поиска включая discovery
Вопросы для размышления
- Как бы вы объяснили разницу между Recommend и Discovery продакт-менеджеру? Приведите реальный пример из вашего продукта.
- Что нужно учесть при построении Relevance Feedback системы, чтобы предотвратить filter bubble?
- Как Context Search можно использовать для A/B тестирования разных стилей рекомендаций?