Question presented to candidate: "You have a BM25 result list and a vector-search result list for the same query, and you need one ranking to send to the reranker. Why can you not just add the scores, how does Reciprocal Rank Fusion combine the lists, and what are its knobs and its alternatives?"
What a strong answer should cover:
- The scale problem: BM25 scores are unbounded and corpus-dependent while cosine similarities sit in a narrow band, so a raw sum is decided by BM25, and normalised scores are distorted by outliers
- RRF itself: each document gets the sum over lists of 1 / (k + rank), with documents missing from a list contributing nothing; it uses only ranks, rewards agreement between retrievers, and needs no training (Cormack, Clarke and BΓΌttcher, SIGIR 2009, with k = 60)
- The knobs: the rank constant k (small k favours each list top results, large k flattens toward counting appearances), per-retriever weights (weighted RRF), and the rank window, meaning how deep each list is read before fusing
- The main alternative: normalise each list (min-max, z-score or distribution-based) and take a weighted convex combination; it keeps score margins and can beat RRF when tuned on labelled data (Bruch et al.), at the cost of tuning and outlier sensitivity
- Engines expose these as parameters (for example Elasticsearch rank_constant and rank_window_size, Weaviate fusion types and alpha), so defaults should be checked per version and tuned on a labelled set
Code / implementation expected: Yes β implementing RRF over two ranked lists (a few lines) and working one example by hand is expected; comparing it with min-max fusion is a plus.