A user complaining that the assistant gave the wrong refund window, or cited an outdated policy page, hands you three things at once: a real query in real phrasing, a known correct target, and evidence that the current pipeline fails on it. A sample of traffic gives you the first, rarely the second, and almost never the third. That asymmetry is the entire argument for incident-driven test growth.
The general reasoning holds across software. Regression testing exists to verify that changes do not reintroduce defects in functionality that already worked, and the tests are written from defects that were actually found, not from hypothetical inputs (IBM). Retrieval adds a complication: the pipeline is nondeterministic, so a passing suite does not guarantee safe production behavior, and a prompt change tested against a fixed set of examples tells you little about the long tail of real user input (MLflow on LLM feature flags).
Retrieval evaluation itself is well specified. Recall@k tracks what fraction of relevant documents appear in the top k results, mean reciprocal rank rewards placing the most relevant result highest, and NDCG handles graded relevance where some results matter more than others (Openlayer). You do not need all three to start. You need a labeled query and a threshold.
The failure mode this article addresses is the most common one in practice: an engineer reads the complaint, tweaks the system prompt or the chunk size, confirms the one broken example now works in a notebook, and closes the ticket. Nothing prevents the bug from returning after the next embedding model swap, because nothing recorded what "working" meant. Evidently's guide to RAG evaluation makes the same point about silent failures: if you do not evaluate retrieval and generation separately, you cannot tell whether a bad answer came from a hallucination or from the model never receiving the right passage (Evidently AI).
So the habit to build is short: no incident closes until it exists as a judged query and an assertion.



