Key takeaway: You cannot tell whether a retrieval change — a new chunker, a re-ranker, a bigger k, a different embedding model — made your RAG system better by reading a handful of answers and nodding. "Better" has to be measured in two independent layers (did retrieval fetch the right chunks, and did the model actually use them), on a frozen evaluation set, and then gated on a paired statistical test so you're not shipping noise. The decision this post helps you make: replace "the answers look nicer" with a repeatable eval harness that tells you, with a number and a confidence interval, whether to ship the change or revert it — and recognize that the harness is only trustworthy if the two runs were comparable in the first place.
If you ship RAG, you have made this call: someone swaps the embedding model or bumps top-k from 5 to 10, runs the same three demo questions, the answers "feel" sharper, and it goes to prod. Two weeks later a different set of questions is worse and nobody can say why. The problem isn't the change. The problem is that "feels sharper on three questions" is not evidence, and you have no mechanism to convert a retrieval tweak into a decision.
So the "so what" is about shipping discipline, not model quality: a RAG change is a hypothesis, and a hypothesis needs an experiment. Eyeballing answers conflates two failures that need different fixes — retrieval that fetched the wrong context, and generation that ignored the right context — and it hides variance, so a change that helped by luck on your demo set looks like a win. This post gives you the harness: the two metric layers, the frozen eval set, the de-biased judge, and the significance gate that separates a real improvement from noise.
Previous post: KV Caching Is Not Deterministic Retrieval.
What this post covers
By the end, you should be able to take one proposed retrieval change and return a defensible yes/no — with a metric, a delta, and a significance test — instead of an impression.
- Why "the answers look better" isn't evidence — the two conflated failure modes and the variance you can't see.
- Split the metric into two layers — retrieval quality (recall@k, MRR, nDCG) vs generation quality (faithfulness, answer relevance, citations).
- Build a frozen evaluation set — the one asset that makes any two runs comparable, and how to avoid contaminating it.
- LLM-as-a-judge, used honestly — the biases that make it unreliable and the cheap controls that fix them.
- Offline gate, then online guardrail — a paired significance test before ship, live metrics after.
- A RAG-change decision scorecard — a worksheet to run on your next retrieval tweak.
- Where Inherent fits — why a trustworthy eval needs comparable runs, and what supplies them.
Why "the answers look better" isn't evidence
Start with the answer, because it reframes everything downstream: reading answers can't tell you what to fix, and it can't tell you whether you fixed anything. It fails on two axes at once — attribution and variance.
The attribution failure: a RAG answer is the product of two systems in series. Retrieval selects context; the model generates over it. When an answer is wrong, "it looks bad" doesn't tell you which stage failed. Did retrieval miss the chunk that held the answer (a recall failure), or did retrieval surface the right chunk and the model ignore it or contradict it (a faithfulness failure)? These have opposite fixes — tune the retriever versus tune the prompt or model — and a naked read of the output can't separate them. You end up tuning the layer that wasn't broken.
The variance failure is subtler and does more damage. RAG output is noisy: sampling temperature, tie-breaks in the retriever, and non-deterministic ANN all move the answer run to run. If you judge a change on three or five questions, you are sampling from that noise. A change that does nothing can look like a win, and a change that genuinely helps can look flat, purely on which questions you happened to pick and which way the dice fell. Small demo sets don't just give weak evidence — they give confidently wrong evidence, because a lucky delta on five questions feels real.
The implication: to make a ship decision you need to measure each layer separately (fix attribution) across enough questions to see through the noise (fix variance). That's the whole harness. The rest of this post builds it.
Split the metric into two layers
Here's the answer first: evaluate retrieval and generation as two separate scoreboards, because a RAG system can fail at either independently and the fixes don't transfer. Collapsing them into one "quality" score is the attribution error in metric form.
Layer 1 — retrieval quality. Before the model sees anything, ask whether the retriever put the right chunks in front of it. The standard metrics, all computed against a set of queries with known-relevant chunks (reference ranges from RAG-eval practice):
- Recall@k — of the chunks that are relevant, what fraction showed up in the top k? This is the ceiling on your whole system: context you never retrieved, the model can never use.
- Precision@k — of the top k you retrieved, what fraction were actually relevant? Low precision floods the context window with distractors.
- MRR (mean reciprocal rank) — how high did the first relevant chunk land? Rewards getting the right thing to the top, which matters when the model attends more to early context.
- nDCG@k — a position-weighted, graded-relevance score; it tends to track end-to-end RAG quality better than binary hit/miss metrics because it cares about order, not just presence.
Layer 2 — generation quality. Given the retrieved context, did the model use it correctly? Here the metrics shift from ranking to grounding (Ragas-style framing works even without gold answers):
- Faithfulness — is every claim in the answer supported by the retrieved context, or did the model invent unsupported text? This is your hallucination gauge.
- Answer relevance — does the response actually address the question, or is it grounded-but-off-topic?
- Citation coverage — are the load-bearing claims traceable to specific sources? Uncited claims are unverifiable claims.
The reason this split is load-bearing: it turns a retrieval change into a testable prediction. A better chunker or re-ranker should move Layer 1 (recall, nDCG). If Layer 1 moves and Layer 2 doesn't, the model isn't using the better context — a prompt problem, not a retrieval problem. If Layer 1 is flat and you only "improved" Layer 2, your retrieval change did nothing and something else moved. The exhibit below is the whole model on one page.

Build a frozen evaluation set
The answer first: the single asset that makes any two RAG runs comparable is a fixed set of questions with known-good answers, versioned and held still while everything around it changes. Without it you are comparing two different tests and calling the difference progress.
An evaluation set is a list of representative queries, each paired with the chunk(s) that should be retrieved (for Layer 1) and a reference answer or a rubric (for Layer 2). Three rules keep it honest:
- Cover the real distribution, not the easy path. Include the queries that actually break in production — ambiguous phrasings, multi-hop questions, questions whose answer lives in a recently updated document, and questions that have no answer in the corpus (the model should say so, not invent one). A set of softballs makes every change look fine.
- Freeze it and version it. The eval set changes only on purpose, with a version bump. If you edit the questions between two runs, the delta is meaningless. This is the same discipline as a locked test set in ML: the moment it moves silently, your comparison is fiction.
- Keep it out of the system under test. Don't let eval questions leak into few-shot exemplars or into any cache the pipeline reuses, or you're grading the model on its own answer key.
The business-life version: think of it as the standardized exam your RAG system re-sits every time an engineer proposes a change. If the exam is the same each time, a higher score means something. If someone quietly swaps in easier questions the day of the test, the score is theater. Most teams that "can't tell if changes help" simply never built the exam — they grade off whatever three questions are top of mind that afternoon.
You do not need thousands of questions to start. A carefully chosen 50–100 that span your real failure modes will surface far more than an ad-hoc demo, and — critically — gives you enough samples for the significance test that comes next.
LLM-as-a-judge, used honestly
Here's the answer: an LLM judge is the only practical way to score faithfulness and relevance at scale, but an off-the-shelf judge is biased enough to invert your result if you use it naively — so you spend a little effort making it reliable. Grading generation quality by hand doesn't scale past a few dozen questions; a model judge does. The catch is that the judge has thumb-on-the-scale tendencies you have to neutralize.
The documented failure modes are consistent across the literature: position bias (in a side-by-side comparison the judge systematically favors whichever answer is shown first, independent of quality), verbosity bias (longer answers score higher), and self-enhancement bias (a judge prefers outputs from its own model family). And a judge validated on open-ended chat is not automatically valid for RAG — grounding judgments are a different task.
The controls are cheap and they matter more than the choice of judge model:
- Swap the order and average. For any pairwise comparison, run it twice with the two answers in both positions and average; presenting each answer first in half the cases controls for position bias. A judge whose verdict flips when you swap the order was never measuring quality.
- Give it a structured rubric, not a vibe. "Score faithfulness 1–5 against these criteria, citing the supporting sentence" beats "which is better?" — structured rubrics and explicit bias-mitigation strategies measurably reduce judge bias, which is dominated by style and verbosity effects, not just position.
- Prefer pointwise grounding checks over pure preference. "Is claim X supported by the retrieved context — yes/no, quote the support" is more stable and more auditable than a holistic A-vs-B taste test.
- Calibrate the judge against humans once. Hand-label a small slice, confirm the judge agrees, and re-check when you change judge models. An uncalibrated judge is an opinion with a temperature setting.
The implication: treat the judge as an instrument that needs calibration, not an oracle. A biased judge doesn't just add noise — it can hand you a confident, backwards answer about whether your change helped.
Offline gate, then online guardrail
The answer first: decide whether to ship offline with a paired significance test on your frozen set, then confirm it in production with live guardrail metrics — two gates, two jobs. Offline tells you whether to ship; online tells you whether reality agrees.
Offline — the ship gate. Run the current system (control) and the changed system (variant) over the same frozen eval set and compute each metric for both. Because both runs saw identical questions, you can pair them question-by-question and ask the only question that matters: is the average improvement bigger than the run-to-run noise? A paired test (paired t-test, or a bootstrap over per-question deltas) gives you a p-value and a confidence interval on the delta. The rule is blunt and worth stating: a positive average delta that isn't statistically distinguishable from zero is not a win — it's noise wearing a nice number. This is exactly the discipline the three-question demo skips, and it's why the three-question demo ships regressions.
Online — the guardrail. Offline sets can't capture everything: real traffic drifts, the corpus changes, users ask things you didn't anticipate. Once shipped, watch a few live signals — retrieval-hit rate, citation coverage, thumbs-down or escalation rate, latency — and alert on regressions. Where the risk is high, ship behind an A/B split so the variant proves itself on live traffic before full rollout. Online is where you catch the change that aced the exam and still fails the street.
One honest caveat: the offline gate is only as trustworthy as the comparability of the two runs. If retrieval is non-deterministic — the index rebuilt between control and variant, the embedding model version drifted, tie-breaks broke differently — then part of your measured "delta" is just the system disagreeing with itself, and the significance test is measuring the wrong thing. Comparable runs are a precondition for trustworthy eval, which is the thread that ties this back to everything upstream.
A RAG-change decision scorecard
Run this on the next retrieval change someone proposes, before it ships. Each row is a gate; a change that can't clear a row doesn't advance to the next.
| Gate |
The question |
Pass condition |
If it fails |
| Hypothesis |
What layer should this change move, and by how much? |
A written prediction ("re-ranker should raise nDCG@10") |
If you can't predict it, you can't test it — sharpen the change |
| Eval set |
Do you have a frozen, versioned set covering real failure modes? |
50+ questions, held constant across both runs |
Build the set first; everything below is meaningless without it |
| Layer 1 |
Did retrieval metrics move as predicted? |
recall@k / nDCG@k improve, precision not tanked |
Change didn't help retrieval — revert or rethink |
| Layer 2 |
Did generation quality hold or improve? |
faithfulness + citation coverage flat or up |
Model isn't using the new context — it's a prompt problem |
| Judge |
Is the judge de-biased and calibrated? |
Order-swapped, rubric-scored, human-checked |
Un-trust the numbers until the judge is fixed |
| Significance |
Is the delta bigger than the noise? |
Paired test clears your p-threshold |
Positive but not significant = don't ship |
| Comparability |
Were control and variant runs actually comparable? |
Same corpus version, pinned embeddings, deterministic retrieval |
Your delta is partly self-disagreement — pin the runs first |
The pattern the scorecard exposes: six of the seven gates are about making the comparison valid, and only one is about the change itself. That ratio is the point. Most "we can't tell if it helped" problems are not hard eval problems — they're missing-harness problems.
Where Inherent fits
Only now, with the harness built, does the product framing earn its place. Look at the bottom two rows of the scorecard — Significance and Comparability. The significance test assumes your control and variant runs differ only because of the change you made. The moment retrieval is non-deterministic, that assumption breaks: the index rebuilt, a document re-embedded under a new model version, tie-breaks resolved differently, and now your measured delta is a mix of "the change" and "the system disagreeing with itself." You can't run a clean A/B on a system that won't hold still.
That comparability is exactly what a managed context layer supplies, and it's what Inherent is — it sits above your vector storage and below your orchestration. The truth layer version-stamps and hashes each source at ingestion, so "the corpus the variant saw" is a pinned, replayable fact rather than whatever the index held that afternoon. The memory layer makes retrieval deterministic and tenant-safe: the same query over the same corpus version returns the same chunks, which is the precondition that makes a before/after actually before-and-after. The audit layer issues a retrieval receipt — which sources, versions, and chunks produced the context — so a regression you catch in eval can be traced to the exact retrieval decision that caused it. Evaluation tells you whether a change helped; deterministic retrieval is what makes that verdict trustworthy instead of accidental.
To be clear about where we are: Inherent is early, and this is an architecture argument, not a benchmark claim. If your retrieval is already fully pinned and reproducible, then your eval harness is already trustworthy and this framing is just confirmation. But if you've been struggling to tell whether changes help, check whether your two runs were ever comparable in the first place — that's usually where the fog comes from.
The bottom line, and where to start
"The answers look better" is not evidence, and it never was. A retrieval change is a hypothesis; proving it takes two metric layers, a frozen eval set, a de-biased judge, and a paired test that separates a real gain from noise — all resting on runs that are comparable enough to compare. Build the harness once and every future change becomes a decision instead of an argument.
Small task for today: take one recent retrieval change you shipped on vibes. Assemble 30 questions that span your real failure modes, run the old and new configs over all 30, and compute recall@k and a faithfulness check for both. If the delta doesn't clear a paired test, you just learned you shipped noise — and you built the start of a harness. Then pin the two runs so the next comparison is clean: start with the Inherent Public API — get started in the docs. Building this eval loop yourself and hitting the "my two runs aren't comparable" wall? DM Flow on X with where it breaks — that determinism gap is exactly what we're building against.
Next read: Production RAG Needs Truth and Memory.