Qdrant - Vector Database
Recommendations API
«Вам также понравится» на Netflix работает без запросов - только по истории просмотров. Recommendations API в Qdrant делает то же самое: не нужна embedding модель в runtime, только ID точек, которые уже в коллекции.
- **Netflix-style рекомендации:** recommend(positive=[watched_ids], negative=[disliked_ids]) - персонализация без embed-запросов
- **'Похожие товары':** recommend(positive=[current_product_id]) - один запрос, нет API вызовов
- **Exploration:** discover(target=genre_vector, context=[{style_A, not_style_B}]) - тонкая навигация по каталогу
Предварительные знания
Поиск по примерам без embedding модели
**Обычный поиск** требует embedding модели: query → embed → vector → search. **Recommendations API** работает иначе: «найди похожее на эти точки», используя уже существующие векторы в коллекции. Embedding модель не нужна.
**Когда использовать Recommendations:** 1. «похожие статьи» на странице материала 2. «вам может понравиться» в e-commerce 3. персонализация по истории лайков 4. когда embedding модель недоступна или дорогая.
| Сценарий | Метод | Почему |
|---|---|---|
| Текстовый поиск по запросу | search() | Нужна семантика запроса |
| 'Похожие на этот товар' | recommend() | Вектор товара уже есть в коллекции |
| 'На основе ваших лайков' | recommend(positive=[...ids]) | Несколько примеров без embed-запроса |
| 'Это мне понравилось, вот это нет' | recommend(positive, negative) | Притянуть и оттолкнуть по векторам |
| Exploration без явного запроса | discover() | Поиск по контексту: цель + отрицания |
Пользователь лайкнул 3 статьи на сайте (id: 15, 28, 67). Как показать ему похожие статьи?
Positive и negative examples
**Positive примеры** - точки, к которым хотим быть ближе. **Negative примеры** - точки, от которых хотим быть дальше. Комбинируя их, можно точно выразить «хочу вот такое, но не вот это».
**Стратегии агрегации positive:** Qdrant поддерживает `average_vector` (усреднить векторы всех positive) и `best_score` (взять лучший score из каждого positive). По умолчанию `average_vector`. Для нескольких разных positive примеров `best_score` часто лучше.
Пользователь лайкнул фантастику и детектив. С стратегией average_vector что произойдёт с рекомендациями?
Recommend с best_score стратегией
**strategy: best_score** vs **average_vector** - принципиально разные режимы рекомендаций. Выбор влияет на то, что попадёт в топ результатов.
| Стратегия | Алгоритм | Когда использовать |
|---|---|---|
| average_vector | Среднее positive → ближайшие соседи | Похожие positive (один жанр, один стиль) |
| best_score | max(score к любому positive) | Разнообразные positive (разные жанры/темы) |
E-commerce: пользователь купил кроссовки Nike (спорт) и галстук Armani (формальный стиль). Какая стратегия лучше для рекомендаций?
Discover API: поиск по контексту
**Discover API** - самый мощный режим, предназначен для exploration. Принимает `target` (что ищем) и `context` (пары positive/negative для сужения пространства поиска). Ищет точки, которые ближе к target чем negative, и дальше от negative чем positive.
**Разница recommend vs discover:** `recommend` ищет ближайших к positive (с отталкиванием от negative). `discover` ищет точки похожие на `target`, но использует `context` для навигации в векторном пространстве - это тонкое различие важно для exploration tasks.
**recommend vs discover - кратко:** recommend('похожее на это') - для 'вам также может понравиться'. discover('похожее на target, учитывая контекст') - для тонкой навигации в векторном пространстве, exploration, и когда нужно задать «направление» поиска через контраст.
Использовать recommend() для всех случаев 'похожего поиска' - это же Recommendations API
recommend() для 'похожее на ID-примеры', discover() для 'похожее на target с контекстными ограничениями'
recommend и discover решают разные задачи. recommend - «есть лайки, найди похожее». discover - «есть цель + контекст, найди тонко». Использование правильного API даёт лучшее качество рекомендаций
Нужно найти статьи про «машинное обучение» (target), которые написаны просто (как beginner-friendly статья id:5), но не академически (как сложная статья id:8). Какой API использовать?
Ключевые идеи
- **recommend()** - поиск похожего по ID существующих точек. Embedding модель не нужна в runtime
- **positive** притягивают, **negative** отталкивают - выражаем «хочу вот это, но не вот это»
- **average_vector** - для похожих positive; **best_score** - для разнообразных positive
- **discover()** - поиск по target + context пары. Тонкая навигация в векторном пространстве
- recommend = 'похожее на примеры'; discover = 'целевое + контекстные ограничения'
- Помните hook? Никаких API вызовов в runtime - быстрее, дешевле, элегантнее
Что дальше
Recommendations API освоен. Вы прошли весь цикл Hybrid & Advanced Search.
- Hybrid Search — Комбинировать recommend с hybrid для ещё лучшего качества
- Группировка результатов — Группировать recommend результаты по документу
- Фильтрация — Ограничивать рекомендации по payload условиям
Вопросы для размышления
- Для какого сценария в вашем проекте подходит recommend(), а для какого - обычный search()? Где граница?
- Как собирать positive/negative сигналы от пользователей (лайки, дизлайки, время на странице)?
- Как измерить качество рекомендаций? Какие метрики использовать?
Связанные уроки
- qd-06-hnsw — Recommend API строится поверх HNSW для ANN поиска
- qd-11-hybrid-search — Recommendations можно обогатить hybrid search стратегией
- ml-12 — Collaborative filtering в ML - та же идея: похожие объекты
- aie-12-rag-fundamentals — RAG retrieval - частный случай recommendation по семантической близости
- ml-01-intro