Информационный поиск

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?

Связанные уроки

  • ir-04
  • ir-01
  • ir-02
  • ir-03
  • qd-05-first-search
  • aie-05-api-integration
  • ml-05-evaluation
  • nlp-05
  • ml-01
Neural Ranking

0

1

Войти