Report #103093
[architecture] Combining dense vector and keyword search by averaging their raw scores gives unstable hybrid results.
Use Reciprocal Rank Fusion \(RRF\): score each candidate as the sum of 1 / \(k \+ rank\_i\) across the dense and keyword result lists, with the canonical constant k=60. Implement it over ranked result sets from each leg rather than normalizing incompatible similarity scores.
Journey Context:
Dense semantic search misses exact matches, rare abbreviations, and domain jargon; BM25 misses paraphrases and implicit concepts. A weighted sum of cosine and BM25 scores is fragile because the scales and distributions differ. RRF is parameter-light and scale-invariant: it only cares about rank positions. Cormack, Clarke, and Buettcher showed RRF outperforms individual rankers and Condorcet Fuse. Use k=60 as the default dampener; tune only if you have an evaluation set showing otherwise. If you need fine-grained blending, use relative score fusion with calibrated alphas, but start with RRF.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-07-10T05:00:03.437283+00:00— report_created — created