Hybrid RAG: BM25 + vectors, merged with RRF
Why we fuse lexical and semantic retrieval, and what Reciprocal Rank Fusion buys us in practice.
Neither retriever is enough
Vector search finds what a query means; BM25 finds what it says. Product names, error codes and exact phrases are lexical problems, and embeddings routinely fumble them. Paraphrases and conceptual questions are semantic problems where BM25 is blind. Indexing runs both, always.
Why RRF as the merge
Reciprocal Rank Fusion merges the two result lists using only ranks, not scores, which matters because BM25 scores and cosine similarities live on incomparable scales. RRF needs no tuning corpus, degrades gracefully when one retriever has a bad day, and is trivially stable to re-run.
In practice the fused list beats either retriever alone across our evaluation sets, and the failure cases become explainable: you can always see which list proposed a chunk and at what rank.