AI Engineer LabexplainerINTERMEDIATEDifficulty: INTERMEDIATE

Why Your RAG Evaluation Is Wrong

Four measurement mistakes that make a worse system look better

By Renjith, Data & AI Engineer3 min readUpdated 29 Aug 2026

Almost every RAG evaluation I have reviewed had at least two of the following four problems. Each one makes the system look better than it is, which is why they survive: nobody goes looking for a bug that flatters them.

1. Measuring the pipeline end to end and nothing else#

A single answer-quality score cannot tell you which half of your system failed. There are two entirely different failure modes hiding behind one number:

  • The passage was never retrieved. No prompt will fix this. The information is not in the context.
  • The passage was retrieved and ignored. No amount of retrieval tuning will fix this.

They demand opposite work, and an aggregate score hides which one you have. Measure retrieval on its own — recall@k, MRR, hit rate, with no generation involved — before you measure anything else.

The diagnostic that costs nothing

Feed the model the known-correct passage directly and score the answer. If it is still bad, your problem is generation. If it is good, every remaining point of loss is retrieval. This takes an hour and redirects weeks of work.

2. Evaluating on questions you wrote while building#

Questions written by the person who built the system are contaminated in a specific way: they are phrased the way the system expects. Real users ask sideways. They use internal jargon, abbreviate, and ask compound questions that span three documents.

An evaluation set drawn from your own head measures how well the system handles your phrasing. Pull questions from real logs, support tickets, or — at minimum — have someone who did not build it write them.

3. Using a language model as judge without checking the judge#

LLM-as-judge is a reasonable technique with a known failure mode: judges reward fluency and surface similarity to the source. An answer that copies the source phrasing scores well. An answer that is correct but reworded scores worse.

That bias interacts badly with the thing you are usually tuning. Prompt changes that make the model quote more verbatim will improve your judge score without improving the answer.

The fix is not to abandon LLM judges — it is to calibrate one. Label 50 answers by hand, run the judge on the same 50, and measure agreement. If agreement is poor, the judge scores are not evidence.

4. Reporting a mean over a set that is not homogeneous#

"Average faithfulness: 0.84" across a question set containing lookups, comparisons, aggregations and multi-hop reasoning is close to meaningless. Those categories have wildly different difficulty, and the mean moves whenever the mix changes.

Report by category:

Question type Faithfulness Recall@5
Single-fact lookup 0.94 0.91
Comparison across two docs 0.81 0.68
Aggregation over many docs 0.62 0.44
Multi-hop reasoning 0.58 0.39

Now the picture is actionable. Lookups are solved. Aggregation and multi-hop are not, and the recall column shows why: the passages are not being retrieved in the first place.

What a defensible evaluation looks like#

evaluate.pypython
def evaluate(config: RagConfig, questions: list[Question]) -> Report:
    # 1. Retrieval in isolation — cheapest and most diagnostic.
    retrieval = score_retrieval(config, questions)

    # 2. Generation given perfect retrieval — isolates the other half.
    generation = score_generation(config, questions, use_gold_context=True)

    # 3. End to end. The gap against the two above is where the loss is.
    end_to_end = score_pipeline(config, questions)

    return Report(
        retrieval=retrieval,
        generation=generation,
        end_to_end=end_to_end,
        by_category=group_by(questions, lambda q: q.category),
    )

Three numbers instead of one, reported per category. It is more work to set up once, and it is the difference between tuning a system and guessing at it.

The uncomfortable part#

Doing this properly will usually reveal that your system is worse than you thought. That is the value. An evaluation that only ever confirms your system is good is not an evaluation — it is a reassurance mechanism, and it will let a regression reach production untouched.

Free resource

RAG Evaluation Checklist

A one-page checklist covering the four measurement mistakes that make a worse RAG system look better.

Related course

Production AI Engineering: RAG, Agents, Evals & MCP

Retrieval that holds up, agents that fail safely, evaluation that catches regressions, and MCP for tool integration.

Get new projects, datasets, notebooks and system builds.

One email a week. Source code and files included. No fluff, no recycled LinkedIn posts.

No spam. Unsubscribe in one click.

Keep going

AI Systems

RAG Evaluation Lab

Most RAG systems are tuned by vibes. This is a reproducible harness that measures retrieval and generation separately, so you can see which half is failing.

IntermediateDifficulty: Intermediate~12h buildPython · Ragas · DuckDB
Code
ChecklistsFree

RAG Evaluation Checklist

A one-page checklist covering the four measurement mistakes that make a worse RAG system look better.

270 downloads
Email required
UDEMY$119

Production AI Engineering: RAG, Agents, Evals & MCP

Retrieval that holds up, agents that fail safely, evaluation that catches regressions, and MCP for tool integration.

AdvancedDifficulty: Advanced★ 4.914h480 studentsPython · LangGraph · Ragas
Evaluation

Six RAG Chunking Strategies Compared

Fixed, recursive, semantic, structural, sentence-window and parent-document chunking measured on retrieval recall across three corpora.

IntermediateDifficulty: IntermediatePython · Ragas · pgvector
Notebook
AI Engineering

Diagnose a RAG system returning wrong answers

A RAG system over internal documentation returns confident answers that are often wrong. The team has spent two weeks on prompt engineering with no…

IntermediateDifficulty: Intermediate12 min
AI Engineer

How would you evaluate a RAG system?

Measure retrieval and generation separately against an annotated golden set, then measure the pipeline end to end — the gaps tell you where the loss is.

AdvancedDifficulty: Advanced