Rutvik Acharya

Back

Hybrid retrieval became the default for a good reason. BM25 is still excellent at exact terms, names, acronyms, IDs, and rare phrases. Dense retrieval is better when the user and the document say the same thing in different words. Re-rankers can then look at the best candidates more carefully.

The problem is not that these signals are weak. The problem is that they do not speak the same language.

A strong BM25 score, a high vector similarity, and a large re-ranker logit are not three versions of the same quantity. They come from different scoring systems, with different ranges, different distributions, and different meanings. You cannot safely add them together. You cannot average them. You cannot set one global threshold and expect it to mean “relevant enough.”

That is the quiet reason so many production RAG systems end up using Reciprocal Rank Fusion.

Why RRF Became the Default#

Reciprocal Rank Fusion, or RRF, avoids score calibration by ignoring the scores almost completely. It only looks at rank positions.

rrf_score(document) = sum(1 / (k + rank_i))
text

If a document ranks highly in BM25 and also ranks decently in dense search, RRF pushes it upward. If a document appears in only one list, it can still survive, but it has to be very high in that list.

This is a wonderfully practical idea. It is simple, robust, hard to completely break, and does not require relevance labels. That matters. Most teams do not have a clean training set for every corpus, domain, and query type they care about.

RRF also solves the immediate scale problem. BM25 and cosine similarity may be incomparable, but rank 1 and rank 10 are at least easy to reason about. Instead of asking, “Is this keyword score stronger than that vector score?”, RRF asks, “Did this document show up near the top of multiple result lists?”

For many systems, that is enough to get a useful hybrid search baseline.

The Issue With RRF#

RRF throws away magnitude.

That sounds harmless until you look at what ranking lists actually contain. Imagine two BM25 result lists:

CaseRank 1 ScoreRank 2 ScoreWhat the scores suggest
Clear winnerVery highMuch lowerRank 1 is much stronger
Close callHighAlmost the sameRank 1 and Rank 2 are basically tied

To RRF, both cases look identical. Rank 1 is rank 1. Rank 2 is rank 2. The size of the gap disappears.

The same problem happens in dense retrieval. Sometimes the top vector result is meaningfully separated from the rest. Sometimes a long list of results is packed into a tiny similarity band. RRF cannot tell the difference because it does not use the score distribution.

This creates a few practical issues:

  • A barely-won rank can be treated like a confident win.
  • A document with overwhelming evidence from one retriever may be underweighted because it appears in only one list.
  • A document with mediocre evidence from several noisy retrievers may be overpromoted.
  • The fused score is not a probability, so it cannot support a meaningful relevance threshold.
  • Downstream systems still have to guess how many chunks to include.

That last point matters a lot for RAG. In a RAG pipeline, retrieval is not just ranking. Retrieval is a decision layer. It decides what evidence the model sees, what evidence it misses, and how much noise gets shoved into the context window.

RRF can say, “This document should be above that document.” It cannot say, “This document is likely enough to include,” or “No retrieved document is reliable enough, so abstain.”

The Real Problem Is Calibration#

The deeper issue is calibration.

In a calibrated retrieval system, a score has a stable interpretation. If the system assigns a high relevance probability to a group of documents, that group should actually be relevant at roughly that rate.

That sounds basic, but most retrieval scores do not behave this way.

BM25 is not a probability. Cosine similarity is not a probability. Cross-encoder logits are not automatically probabilities. Even normalized scores often only look clean because we forced them into a convenient range.

This is why score fusion becomes messy. If each retriever emits arbitrary numbers, the fusion layer has to choose between bad options:

  • Normalize scores with min-max or z-score tricks.
  • Tune weights on a labeled validation set that may not match production.
  • Ignore magnitude and use rank fusion.
  • Train a separate learned ranker, which adds data requirements and operational complexity.

RRF chooses the third option. It is often the most practical. But it is still an admission that the raw signals are not comparable.

A Cleaner Direction: Convert Scores Into Evidence#

The more principled alternative is to treat each retrieval score as evidence for a simple binary question:

Is this document relevant to this query?
text

Instead of asking whether BM25 and cosine similarity can be directly combined, we first convert each score into evidence about relevance. The natural language for that is probability, and the clean mathematical space for combining probabilities is log-odds.

In log-odds space, Bayesian updates become addition.

posterior log-odds = prior log-odds + evidence from BM25 + evidence from dense retrieval + ...
text

This is the important shift. We are no longer adding BM25 to cosine similarity. We are adding evidence terms after each score has been mapped onto a shared scale.

For BM25, that mapping might be a sigmoid-like likelihood model plus a corpus-level base rate. For dense retrieval, it might compare the local distance distribution around the query against the background distance distribution in the index. For a re-ranker, it might be temperature scaling or another calibration method over its logits.

The exact calibration method can vary. The principle is the same: each retriever produces evidence, not just a rank.

Why Log-Odds Fusion Is Attractive#

Once signals live on the same log-odds scale, fusion becomes additive.

That gives you a few things RRF cannot provide:

FeatureRRFCalibrated log-odds fusion
Works without score normalizationYesYes, after per-signal calibration
Uses rank positionYesOptional
Uses score magnitudeNoYes
Produces relevance probabilityNoYes
Supports meaningful thresholdsNoYes
Can adapt per queryIndirectlyYes

The probability output is not just nice to have. It changes what the retriever can do.

Instead of always taking a fixed number of results, a RAG system can include all documents above a relevance probability threshold. For a clear query, that might be only a few chunks. For a broad query, it might be many more. For a query where the corpus has no good answer, it might be none.

That is a better interface between retrieval and generation. The language model should not receive a fixed bundle of chunks just because the retriever API has a convenient default. It should receive evidence that is likely enough to be useful.

The Hard Part: Independence Is Usually False#

The clean Bayesian version assumes that each signal contributes independent evidence given relevance. That is convenient, but it is not fully true.

BM25 and dense retrieval are correlated. Dense models are trained on text where lexical overlap often matters. Re-rankers are trained on candidates retrieved by earlier systems. Signals in a retrieval stack are not independent witnesses. They often learned from the same world.

If we simply add all evidence terms, we may double-count. A document that gets high BM25 and high dense scores partly because of the same lexical match may look more certain than it really is.

This is where the next layer of research gets interesting. A few options:

  • Add a residual correction term that learns interactions between calibrated signals.
  • Use query-adaptive weights so BM25 is trusted more for exact identifier queries and dense retrieval is trusted more for semantic paraphrases.
  • Model dependence directly with a joint distribution or copula over calibrated scores.
  • Keep RRF as a fallback when calibration confidence is low.

The goal is not to make the system mathematically pretty at the expense of usefulness. The goal is to preserve what RRF gets right while recovering the information it discards.

What This Means for RAG#

The most useful application is not simply “slightly better NDCG.” It is better retrieval decisions.

Calibrated probabilities let the RAG layer ask questions that rank-only fusion cannot answer:

  • Is the best document relevant enough to trust?
  • Should this query retrieve only a few chunks or a much larger evidence set?
  • Should the system abstain because the corpus probably does not contain the answer?
  • Should evidence from one retriever override weak agreement from several others?
  • Should documents be weighted differently inside the prompt or context packer?

This is where RRF starts to feel incomplete. It gives a ranking, but RAG needs ranking plus confidence.

A practical pipeline might look like this:

  1. Retrieve candidates from BM25 and dense indexes.
  2. Calibrate each score into relevance evidence.
  3. Fuse evidence in log-odds space, with query-adaptive weights.
  4. Re-rank the most promising candidates with a cross-encoder or late-interaction model.
  5. Include documents only if their calibrated probability clears a threshold.
  6. Abstain or ask a clarifying question when confidence is low.

That kind of system is harder than plain RRF, but it gives the application a much cleaner control surface.

Potential Options Beyond RRF#

There are a few sensible paths depending on how much data, latency budget, and engineering appetite you have.

1. Keep RRF as the baseline#

Use RRF when you need a robust, tuning-free hybrid search system quickly. It is still the best default when you do not trust your score scales and do not have labels.

2. Add lightweight score calibration#

Calibrate BM25, dense similarity, and re-ranker scores separately. Even simple calibration can make thresholds less arbitrary. This is the first step toward replacing rank-only fusion with evidence fusion.

3. Use log-odds fusion for calibrated signals#

Once each retriever produces evidence on the same scale, combine those evidence terms additively. This keeps the system modular: improving one retriever’s calibration does not require retraining the whole fusion stack.

4. Make fusion query-adaptive#

Different queries need different retrievers. Exact SKU queries, legal clause lookups, natural-language support questions, and broad research questions should not use the same fusion weights. Query features can decide how much to trust each signal.

5. Use calibrated retrieval as a RAG policy layer#

This is the most practical payoff. Use calibrated probabilities to decide inclusion, abstention, dynamic k, and context weighting. That turns retrieval from a ranked list generator into a decision system.

The Takeaway#

RRF is popular because it solves a real problem: hybrid retrieval scores are not naturally comparable. It is simple, strong, and often the right baseline.

But RRF pays for that robustness by discarding magnitude. It knows where a document ranked, not how much evidence the score carried. For classic search, that may be acceptable. For RAG systems that need to decide what evidence to trust, it is limiting.

The next step is calibrated retrieval: convert heterogeneous scores into relevance evidence, combine them in a shared probabilistic space, and expose meaningful confidence to the rest of the system.

RRF helped hybrid retrieval become practical. Calibration is how hybrid retrieval becomes controllable.