RRF is such an underrated trick, glad to see it get a clear writeup. I run a hybrid setup in production on a fairly large 3D-model catalog and the thing that surprised me is how little the fusion math matters compared to everything around it. RRF basically just works out of the box, the k constant barely moves the needle. Where I actually spend my time is the embedding model choice, and the fact that BM25 keeps saving me on exact part names and model IDs that the vector side blurs together, your CVE example is the same failure mode. One thing worth adding for anyone going to production, watch your latency budget: running both retrievers and then fusing is fine at lab scale but you feel it once the corpus grows, so precompute and cache aggresively. Nice clean explanation of a topic people usually overcomplicate.
Appreciate the detailed insight! You hit the nail on the head regarding the embedding model choice—it really dictates the semantic ceiling. And that's exactly why BM25 is non-negotiable for systems dealing with strict identifiers or part IDs where vectors lose precision. Thanks for the production latency tip as well, aggressive caching is definitely the way to scale this up properly!
RRF is such an underrated trick, glad to see it get a clear writeup. I run a hybrid setup in production on a fairly large 3D-model catalog and the thing that surprised me is how little the fusion math matters compared to everything around it. RRF basically just works out of the box, the k constant barely moves the needle. Where I actually spend my time is the embedding model choice, and the fact that BM25 keeps saving me on exact part names and model IDs that the vector side blurs together, your CVE example is the same failure mode. One thing worth adding for anyone going to production, watch your latency budget: running both retrievers and then fusing is fine at lab scale but you feel it once the corpus grows, so precompute and cache aggresively. Nice clean explanation of a topic people usually overcomplicate.