Sobes.tech
Back to questions
Middle — Senior
13

Что такое candidate generation и какие подходы (BM25, dense, hybrid)?

Companies where asked
ВТБВТБ
Лента
Тинькофф

Answer from AI

sobes.tech AI

Что хотят услышать интервьюеры:

Candidate generation — это первый этап поиска, где из огромного корпуса быстро отбирают небольшой набор наиболее вероятно релевантных документов. На этом этапе важнее полнота и скорость, чем идеальная точность ранжирования. Обычно дальше этот набор передают в reranker или LTR-модель.

Определение:

Candidate generation — это механизм предварительного отбора кандидатов для последующего более дорогого этапа ранжирования.
Цель — за миллисекунды сузить пространство поиска с миллионов документов до десятков или сотен, сохранив максимум релевантных вариантов.

Основные подходы:

  • BM25 — классический sparse-поиск по словам. Хорошо работает, когда запрос и документ пересекаются по терминам.
  • Dense retrieval — поиск по векторным эмбеддингам. Лучше ловит семантическое сходство, даже если слова в запросе и документе разные.
  • Hybrid — комбинация sparse и dense. Часто дает лучший баланс между точностью, полнотой и устойчивостью на разных типах запросов.

Пример использования:

В поиске по базе знаний пользователь вводит запрос: как сбросить пароль в postgres.

  • BM25 быстро находит документы, где встречаются слова сбросить, пароль, postgres.
  • Dense retrieval может дополнительно поднять статьи вроде recover access to database или reset credentials, даже если точных совпадений мало.
  • Hybrid объединяет оба списка, чтобы не потерять ни точные совпадения, ни семантически близкие документы.
query = "как сбросить пароль в postgres"

# 1) Sparse retrieval, например BM25
bm25_candidates = bm25_search(query, top_k=100)

# 2) Dense retrieval по эмбеддингам
dense_candidates = vector_search(embed(query), top_k=100)

# 3) Hybrid: объединение и/или взвешивание результатов
candidates = merge_and_rerank(bm25_candidates, dense_candidates)

# 4) Дальше более дорогой reranker/LTR
final_results = reranker.rank(query, candidates)

Пояснение кода:

В этом примере код показывает типичный конвейер поиска.

  1. Сначала запрос уходит в BM25, который быстро находит документы по совпадениям терминов.
  2. Затем тот же запрос преобразуется в эмбеддинг и ищется в векторном индексе.
  3. Результаты двух систем объединяются: это и есть hybrid-подход.
  4. После этого небольшой набор кандидатов отправляется в reranker, который уже может использовать более дорогие признаки и модель.

Код здесь иллюстративный: конкретные функции bm25_search, vector_search, merge_and_rerank, reranker.rank зависят от стека и библиотеки.

Ключевые моменты:

  • Candidate generation — это этап быстрого отбора, а не финального качества ранжирования.
  • BM25 хорош для точных лексических совпадений и прозрачной интерпретации.
  • Dense retrieval лучше справляется с семантикой и перефразированием.
  • Hybrid часто предпочтителен в продакшене, потому что снижает риск пропуска релевантных документов.
  • На этом этапе обычно оптимизируют recall, а не precision.
  • Чем лучше candidate generation, тем больше шансов у downstream-ranker получить качественный итоговый список.