🔎Combine BM25 and Semantic Search (Hybrid Search)
Build hybrid search layer by layer — BM25 alone, vectors alone, then RRF fusion — so you can debug retrieval failures and predict which query types each layer fixes before you ship.
Phase 1Why One Retriever Is Always Wrong About Half Your Queries
Watch BM25 and vectors fail at opposite query shapes
Vectors forget the literal token — that's the entire problem
6 minVectors forget the literal token — that's the entire problem
BM25 is a thirty-year-old formula your vector DB is hiding from you
6 minBM25 is a thirty-year-old formula your vector DB is hiding from you
Vector search is fuzzy intent matching dressed as math
6 minVector search is fuzzy intent matching dressed as math
Two retrievers, one ranking — the simplest fix nobody runs first
6 minTwo retrievers, one ranking — the simplest fix nobody runs first
Phase 2Running BM25 and Vectors Side by Side, Then Fusing Them
Run both retrievers on the same query and fuse the lists
Twenty docs is the smallest corpus that teaches you everything
5 minTwenty docs is the smallest corpus that teaches you everything
Run BM25 first and watch the literal queries snap into place
6 minRun BM25 first and watch the literal queries snap into place
Run vectors next and feel the paraphrase query come unstuck
6 minRun vectors next and feel the paraphrase query come unstuck
Reciprocal Rank Fusion in five lines — the part everyone overthinks
7 minReciprocal Rank Fusion in five lines — the part everyone overthinks
Print three columns and watch hybrid pick up both halves
6 minPrint three columns and watch hybrid pick up both halves
Phase 3Where Hybrid Earns Its Keep — and Where It Doesn't
Map where hybrid earns its keep and where it doesn't
Hybrid wins on the queries you didn't think to test
6 minHybrid wins on the queries you didn't think to test
Hybrid wins more on heterogeneous corpora than uniform ones
6 minHybrid wins more on heterogeneous corpora than uniform ones
Sometimes hybrid is the wrong answer — and that's the most useful insight
6 minSometimes hybrid is the wrong answer — and that's the most useful insight
Three production patterns cover almost every hybrid deployment
7 minThree production patterns cover almost every hybrid deployment
Phase 4Ship Hybrid Retrieval and Predict the Lift Per Query Type
Add hybrid retrieval to a docs RAG and predict the lift
Wire hybrid into a docs RAG and predict the lift by query type
8 minWire hybrid into a docs RAG and predict the lift by query type
Frequently asked questions
- What is hybrid search and how does it combine BM25 with vector search?
- This is covered in the “Combine BM25 and Semantic Search (Hybrid Search)” learning path. Start with daily 5-minute micro-lessons that build from fundamentals to hands-on application.
- Why does pure semantic search miss exact-keyword queries like error codes and SKUs?
- This is covered in the “Combine BM25 and Semantic Search (Hybrid Search)” learning path. Start with daily 5-minute micro-lessons that build from fundamentals to hands-on application.
- What is reciprocal rank fusion (RRF) and why is it the default fusion method?
- This is covered in the “Combine BM25 and Semantic Search (Hybrid Search)” learning path. Start with daily 5-minute micro-lessons that build from fundamentals to hands-on application.
- When should I weight BM25 over vectors in a hybrid retriever?
- This is covered in the “Combine BM25 and Semantic Search (Hybrid Search)” learning path. Start with daily 5-minute micro-lessons that build from fundamentals to hands-on application.
- How do I tell if my RAG actually needs hybrid search or just better embeddings?
- This is covered in the “Combine BM25 and Semantic Search (Hybrid Search)” learning path. Start with daily 5-minute micro-lessons that build from fundamentals to hands-on application.
Related paths
🐍Python Decorators Introduction
Build one mental model for Python decorators that covers closures, argument passing, functools.wraps, and stacking — then ship a working caching or logging decorator from scratch in under 30 lines.
🦀Rust Lifetimes Explained
Stop reading `'a` as line noise and start reading it as scope arithmetic — one failing snippet at a time — until you can thread lifetimes through a small parser or iterator adapter without fighting the borrow checker.
☸️Kubernetes Core Concepts
Stop drowning in 30+ resource types. Build the mental model one primitive at a time -- pods, deployments, services, ingress, config -- then deploy a real app with rolling updates and health checks.
📈Big O Intuition
Stop treating Big O as math you memorized for an interview — build the intuition to spot O(n²) disasters, pick the right data structure without thinking, and rewrite a slow function from O(n²) to O(n) in under five minutes.