Retrieval recall is the RAG metric that actually decides quality
Retrieval recall - the share of answerable questions whose correct source passage appears in the retrieved set - is the ceiling on a RAG system's answer quality. If recall@10 is 62%, no prompt change can lift accuracy above 62%, because 38% of the time the model never sees the answer. Measure recall first, fix ingestion and retrieval, and only then tune generation.
The failure everyone misdiagnoses
A RAG system gives a wrong answer. The team's first instinct is to rewrite the prompt. Then to try a bigger model. Then to add a second agent that checks the first one.
None of that helps if the source passage was never retrieved. The model was asked a question with the answer absent from its context, and it did what models do - produced the most plausible text available. The bug is upstream, and every hour spent on the prompt is an hour spent on the wrong component.
So before touching generation, answer one question with a number: when the answer exists in the corpus, how often does it make it into the context window?
How to measure recall@k on your own corpus
You do not need a labelling team. You need fifty to two hundred real questions with a known source, which most organisations can assemble from support tickets, internal wikis, or the questions users have already asked.
For each question, record the document and passage that genuinely answers it. Then run your retriever and check whether that passage appears in the top k results. The percentage that do is recall@k.
- Build the evaluation set from real questions, not invented ones - invented questions accidentally use corpus vocabulary and inflate the score
- Record the ground-truth passage identifier, not just the document, or you will not notice chunking failures
- Measure at the k you actually pass to the model, then again at a much larger k - the gap tells you whether the problem is retrieval or ranking
- Re-run the whole set on every ingestion change; it takes seconds and catches regressions that user reports would surface weeks later
Reading the two numbers
Recall@k at your production k and recall at a large k (say 100) form a diagnosis pair.
If both are low, the passage is not being found at all - an ingestion or embedding problem. Chunking is splitting the answer across boundaries, the document never made it into the index, or the embedding model is a poor fit for the domain vocabulary.
If large-k recall is high but production-k recall is low, retrieval works and ranking does not. That is the easier problem: add a reranking pass over the top candidates and most of the gap closes.
The fixes, in the order they pay
Chunking first. Structure-aware splitting that respects headings, table boundaries, and list items beats fixed-token windows on almost every real corpus, because the answer and the heading that gives it meaning stay together.
Then hybrid retrieval. Dense vectors handle paraphrase; lexical search handles exact identifiers, part numbers, error codes, and names - the things users actually search for and embeddings routinely miss. Running both and merging is a larger single improvement than any embedding-model upgrade we have measured.
Then reranking. A cross-encoder over the top fifty candidates, keeping ten. It costs latency, so measure whether your recall gap justifies it.
Query rewriting last. It helps with conversational follow-ups where the question is unintelligible standalone, and helps very little otherwise.
Why we keep this in Postgres
We default to pgvector on PostgreSQL rather than a dedicated vector store. Not because it is faster - for very large corpora it is not - but because the embedding rows live in the same transaction as the source rows.
When a document is updated, its chunks and vectors update in the same commit. There is no sync job, no eventual-consistency window where the system confidently cites a paragraph that was deleted yesterday. That class of bug is expensive to debug and invisible in every dashboard.
Below roughly ten million chunks with a properly tuned HNSW index, this holds comfortably. Above that, measure before moving.
Then, and only then, generation
Once recall is where it needs to be, generation quality becomes a real target rather than a proxy for retrieval failure. Citations become verifiable, because the cited passage is genuinely in context.
This is also the point at which an evaluation harness starts paying for itself: golden questions, expected sources, a regression threshold, and a CI gate. It is the only thing that lets a team change a prompt on a Friday.
Questions this raises
What is a good recall@k for a RAG system?
It depends on consequence, not on a universal number. For internal search, high-eighties is usually workable. For anything where a wrong answer costs money or safety, you want recall in the high nineties at your production k, plus a confidence threshold that routes the remainder to a human rather than answering anyway.
Can a better embedding model fix low recall?
Sometimes, and it is rarely the largest available win. In our experience chunking and hybrid retrieval move the number more than swapping embedding models, and they are cheaper to change.
How many evaluation questions do we need?
Fifty is enough to find the obvious failures; one to two hundred is enough to trust the number between releases. Beyond that you are refining precision on a metric you should already be acting on.
Related
When not to build an AI agent
Multi-agent architectures are oversold. A practical test for whether a workload needs an agent, a single model with tools, or ordinary deterministic code.
pgvector or a dedicated vector database
When PostgreSQL with pgvector is the right default for RAG, what actually breaks at scale, and the specific signals that justify moving to a dedicated vector store.
Production AI Systems
We design and ship production AI systems: retrieval-augmented generation on pgvector, deterministic multi-agent supervisors, evaluation harnesses, and guardrails. Built in Kolkata, deployed for teams across India, the US, the UK and the UAE.
Published 22 August 2026 · Last reviewed 22 August 2026 · Written by Manish Meena in Kolkata, India.
