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}]) - тонкая навигация по каталогу

Предварительные знания

  • First Search: Search API

Поиск по примерам без 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_scoremax(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
Recommendations API

0

1

Войти