Why eval sets go stale
An eval set built in March measures something else by June. The three things that drift — corpus, query distribution, judge — and how to catch each one.
10 posts tagged rag.
An eval set built in March measures something else by June. The three things that drift — corpus, query distribution, judge — and how to catch each one.
Most RAG evaluation advice stops at build a labelled set and use LLM-as-judge. This is the workflow: sampling real queries, and calibrating the judge.
Reranking top-50 down to top-5 routinely beats raw retrieval by 10+ recall points. What a cross-encoder does differently, and the 50 lines that call one.
Re-embedding the corpus is the easy part. What actually breaks when you change embedding models in production, and the evals I run on either side of the swap.
Vector search ranks by similarity, not permission. Why multi-tenant RAG leaks across tenants by default, and where the authorization check actually has to sit.
pgvector for embeddings, LISTEN/NOTIFY for jobs, row-level security for tenant isolation. One database instead of four services — and the signals to split.
Dense embeddings and BM25 fail on different queries, and real corpora have both. Reciprocal rank fusion in pgvector, and when pure vector search still wins.
Fixed-size, semantic, and structure-aware chunking all look fine in a demo. Here's how each one actually fails once real documents hit your production pipeline.
A practical comparison of pgvector, Pinecone, Qdrant, and Weaviate — real cost and latency numbers from production, and why pgvector is usually enough to start.
What separates a working RAG demo from a production RAG system isn't the retrieval — it's the evaluation, observability, and failure-mode handling around it.