Что такое candidate generation и какие подходы (BM25, dense, hybrid)?
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)
Пояснение кода:
В этом примере код показывает типичный конвейер поиска.
- Сначала запрос уходит в BM25, который быстро находит документы по совпадениям терминов.
- Затем тот же запрос преобразуется в эмбеддинг и ищется в векторном индексе.
- Результаты двух систем объединяются: это и есть hybrid-подход.
- После этого небольшой набор кандидатов отправляется в reranker, который уже может использовать более дорогие признаки и модель.
Код здесь иллюстративный: конкретные функции bm25_search, vector_search, merge_and_rerank, reranker.rank зависят от стека и библиотеки.
Ключевые моменты:
- Candidate generation — это этап быстрого отбора, а не финального качества ранжирования.
- BM25 хорош для точных лексических совпадений и прозрачной интерпретации.
- Dense retrieval лучше справляется с семантикой и перефразированием.
- Hybrid часто предпочтителен в продакшене, потому что снижает риск пропуска релевантных документов.
- На этом этапе обычно оптимизируют recall, а не precision.
- Чем лучше candidate generation, тем больше шансов у downstream-ranker получить качественный итоговый список.