Информационный поиск
Neural Ranking
2019 год. Google BERT для поиска. До BERT: keyword matching плюс PageRank. После: семантическое понимание запроса. CTR вырос на 10% при тех же документах. Пользователь: 'what is the best medicine for cough'. До: результаты по словам. После: результаты по смыслу. Но это только начало. BM25 (TF-IDF вариант): 1ms на миллион документов. Bi-encoder (dense): 5ms плюс ANN search. Cross-encoder: 100ms для 100 документов. RAG pipeline: BM25 плюс bi-encoder retrieval плюс cross-encoder rerank = 200ms end-to-end. Три уровня нейронного ранжирования - каждый со своим компромиссом между скоростью и качеством.
- **Google Search**: BERT для query understanding + MUM для multimodal - семантическое ранжирование с 2019 года
- **Perplexity.ai**: bi-encoder retrieval + cross-encoder rerank + LLM synthesis в единый pipeline
- **Qdrant + ColBERT**: late interaction для enterprise search с 5x меньшим индексом чем full cross-encoder
- **GitHub Copilot**: bi-encoder для code retrieval + cross-encoder для context selection в RAG pipeline
Bi-encoder: раздельное кодирование запроса и документа
2019 год. Google BERT для поиска. До BERT: keyword matching и PageRank. После: семантическое понимание запроса. CTR вырос на 10% при тех же документах. Пользователь пишет 'what is the best medicine for cough' - до BERT результаты по словам 'medicine' и 'cough', после - результаты по смыслу. Bi-encoder - архитектурная основа этого сдвига. Два трансформера (или один общий) кодируют запрос и документ независимо в векторы фиксированной размерности. Сходство - cosine или dot product между векторами. Документы можно закодировать заранее и сохранить в ANN-индексе (FAISS, HNSW). Обучение - contrastive loss: in-batch negatives (другие документы в батче как негативы) и hard negatives (добываются через BM25 mining). Библиотека sentence-transformers упрощает весь pipeline. Ключевые модели: BGE-M3, E5-large, GTR-XXL.
Latency профиль bi-encoder: кодирование документов - offline O(N). Кодирование запроса - online ~10ms. ANN поиск через HNSW - ~5ms для 1M документов. Итого на запрос: ~15ms. Это делает bi-encoder единственным вариантом для first-stage retrieval в больших корпусах. Qdrant, Pinecone, Weaviate - все реализуют именно этот паттерн.
Hard negative mining критичен для качества bi-encoder. Стратегия: BM25 возвращает топ-100 для запроса, из них выбираются документы с высоким BM25 score но низким relevance label. Такие hard negatives заставляют модель различать семантически близкие но нерелевантные документы.
Почему bi-encoder подходит для first-stage retrieval из миллиона документов, а cross-encoder - нет?
Cross-encoder: полное внимание между запросом и документом
Опасная иллюзия: 'bi-encoder достаточно для поиска'. Числа: bi-encoder MRR@10 на MS MARCO - 0.33. Cross-encoder на тех же данных - 0.39. Разница 18% в качестве. Cross-encoder конкатенирует запрос и документ в один вход: [CLS] query [SEP] document [SEP]. Трансформер обрабатывает это как единую последовательность - все токены запроса видят все токены документа через full self-attention. Выход: scalar score [0, 1] через [CLS]-токен + linear head. Проблема: нет precomputed embeddings, нельзя построить index. Для корпуса в 1M документов - 1M forward passes на каждый запрос. При 100ms на inference - 28 часов на один запрос. Модели: ms-marco-MiniLM-L-6-v2 (fast), MonoT5-3B (качество).
Cross-encoder с O(N) latency применим только к pre-filtered списку кандидатов. Стандартный паттерн: bi-encoder retrieves 100-1000 candidates, cross-encoder reranks to top-10. Попытка применить cross-encoder к полному корпусу без первого этапа - типичная ошибка при проектировании search pipeline.
Обучение cross-encoder: pointwise (BCE loss, один документ, binary relevance) или pairwise (margin ranking loss, два документа, сравнение). Pairwise показывает лучшие результаты на BEIR benchmark. Датасет MS MARCO Passage Ranking содержит 8.8M параграфов и используется как стандарт для обучения и оценки.
Почему cross-encoder качественнее bi-encoder при одинаковой базовой модели?
ColBERT: late interaction и per-token embeddings
Парадокс ColBERT: модель хранит embedding для каждого токена документа, а не один вектор. В 128 раз больше памяти чем bi-encoder. Но MaxSim matching превосходит нейронный cross-encoder на 5 NDCG points при той же latency. Как это работает: query encoder выдаёт матрицу [Lq, 128], document encoder - матрицу [Ld, 128]. Similarity score = MaxSim: для каждого токена запроса находится максимальное cosine с токенами документа, затем суммируется. Это поздняя (late) interaction - взаимодействие происходит не внутри трансформера, а после. PLAID index (ColBERT v2) решает проблему памяти: центроидный поиск + квантизация до 2 бит, эффективная MaxSim через IVFPQ. Stanford DSP (Demonstrate-Search-Predict) использует ColBERT для multi-hop reasoning в RAG пайплайнах.
ColBERT v2 (Santhanam et al., 2022) добавил residual compression: каждый token embedding аппроксимируется как centroid + residual, хранится 2 бита на измерение. PLAID retrieval: centroids сортируются по query-centroid similarity, только топ-K кластеров декодируются полностью. Результат: память сопоставима с bi-encoder, качество - выше cross-encoder на CoT-бенчмарках.
В чём преимущество MaxSim операции ColBERT перед dot product bi-encoder?
Reranking pipeline: от BM25 к нейронному топ-10
Bi-encoder fast retrieval и cross-encoder reranking - не конкуренты. Это пайплайн. Bi-encoder вытаскивает 100 кандидатов за 1ms. Cross-encoder выбирает топ-10 из 100 за 200ms. Только вместе они дают качество. Полный production pipeline: BM25 → топ-1000 (1ms, exact keyword match, recall@1000=0.85) → bi-encoder rerank → топ-100 (5ms, semantic filter) → cross-encoder rerank → топ-10 (200ms, precision). Конечный результат: ~207ms end-to-end, NDCG@10 ≈ 0.42 (vs 0.28 для чистого BM25). BM25 на первом этапе критичен: он дёшев и имеет высокий recall - не пропускает документы с точным вхождением ключевых слов. Cohere Rerank API предоставляет cross-encoder как сервис. BEIR benchmark оценивает zero-shot качество retrieval систем на 18 датасетах разных доменов.
Критическое заблуждение: 'reranking всегда улучшает результаты'. Если первый этап (BM25 + bi-encoder) пропустил релевантный документ, reranking его не вернёт. Recall@100 после первых двух стадий - это потолок качества всего пайплайна. Типичная ошибка: тюнить cross-encoder reranker при низком recall первой стадии.
LlamaIndex и LangChain предоставляют готовые интеграции: `CohereRerank`, `SentenceTransformerRerank`, `BGERerank`. Cohere Rerank API v3 на BEIR показывает NDCG@10 = 0.553 в среднем по 18 датасетам - лучший среди готовых API без fine-tuning.
Добавление reranker всегда улучшает поиск; достаточно поставить cross-encoder после bi-encoder
Reranker улучшает precision только если первая стадия обеспечивает достаточный recall. Recall@K первой стадии - жёсткий потолок качества pipeline.
Reranker переупорядочивает кандидатов, но не добавляет новых. Если релевантный документ не попал в top-K первого этапа, никакой reranker его не восстановит.
Recall@100 после bi-encoder retrieval = 0.70. Cross-encoder reranker показывает отличные метрики на train set. Какой будет реальный NDCG@10?
Ключевые идеи
- **Bi-encoder**: раздельное кодирование query и doc, precomputed embeddings + ANN - O(log N) retrieval, MRR@10 ≈ 0.33 на MS MARCO
- **Cross-encoder**: full self-attention query+doc, scalar score, O(N) latency - только для reranking кандидатов, MRR@10 ≈ 0.39
- **ColBERT**: per-token embeddings + MaxSim - захватывает exact-match и semantic одновременно, превосходит cross-encoder на 5 NDCG points
- **Pipeline**: BM25 → 1000 → bi-encoder → 100 → cross-encoder → 10; recall первой стадии - жёсткий потолок всего pipeline
Связанные темы
Neural ranking соединяет IR с NLP, ML и production search системами:
- Learning to Rank — Предшествующий подход - feature-based LtR, neural ranking его развивает
- BM25 и классическое IR — Первая стадия pipeline - без BM25 recall нейронный ranking теряет эффективность
- Qdrant Vector Search — Практическая реализация bi-encoder retrieval с HNSW индексом
- AI Engineering: API Integration — Cohere Rerank API и embedding APIs в production RAG пайплайнах
- ML Evaluation — NDCG, MRR, MAP - метрики оценки нейронных ranker'ов на BEIR benchmark
Вопросы для размышления
- ColBERT хранит в 128 раз больше данных чем bi-encoder, но превосходит cross-encoder по качеству при той же latency - какой архитектурный принцип это объясняет и где его пределы?
- BM25 остаётся первой стадией даже в самых современных нейронных pipeline - почему нейронный retrieval не заменяет его полностью на этом этапе?
- Recall@100 первой стадии является жёстким потолком для всего pipeline. Как бы изменилась стратегия улучшения системы при recall@100 = 0.65 vs recall@100 = 0.90?