When RAG fails

Hallucination, stale chunks, and lost context — the three failure modes that account for almost every bad RAG answer.

0/4 done

Overview

Hallucination, stale chunks, and lost context — the three failure modes that account for almost every bad RAG answer.

Why it matters

Once you've shipped a RAG system, the failures cluster into a small, recognisable set. Naming them correctly is what turns a vague 'the bot is dumb' bug report into a fixable engineering task:

  • Hallucination — the LLM generates a fluent, confident answer that isn't actually supported by the retrieved chunks. This often happens when top-k retrieval returns nothing relevant, but the LLM answers from its own parametric memory anyway instead of admitting it doesn't know. Fix: instruct the model to say 'I don't know' when the context is insufficient, and measure this explicitly in evaluation.
  • Stale chunks — the vector store still holds an embedding of a document that has since been edited or deleted upstream (e.g. a return-policy PDF was updated last month, but nobody re-ran the ingestion pipeline). The retriever confidently returns the old chunk because nothing tells it the chunk is outdated — the embedding itself carries no notion of 'as-of' time. Fix: incremental reindexing triggered by source-document changes.
  • Lost context — the answer needs information from two different chunks (or two different parts of one long chunk), but top-k retrieval only surfaced one of them, or chunking split the relevant sentence away from the sentence that qualifies it. Fix: better chunking, larger k, or moving to a retrieval method that can compose facts across chunks (GraphRAG, Level 2).

Notice these three are almost always retrieval bugs wearing a generation costume — the LLM did exactly what you'd expect with the (wrong, missing, or outdated) context it was handed.

How it actually works

Most RAG outages are not exotic — they're a handful of named failure modes. Naming them turns a vague 'the bot is wrong sometimes' into a tractable engineering checklist with a detection signal and an owner per mode.

Failure modeSymptomDetection signalFix
Stale chunkAnswer quotes a deleted/old policychunk.version < source.versionEvent-driven reindex + freshness alarm
Lost contextAnswer misses an exception in a neighbouring sectionGolden question fails only at small top_kOverlap, parent-child, or graph expansion
Hallucinated bridgeModel invents a relation between two true factsClaim unsupported by any retrieved spanCitation-required generation + KG edge check
Distractor poisoningA high-similarity but irrelevant chunk derails the answerDrop in context precisionRe-ranking, threshold cutoffs
Lost-in-the-middleCorrect chunk retrieved but ignoredRight answer only when chunk is near topRe-rank to front, reduce k

The discipline: every failure mode needs (1) a symptom a user would report, (2) a signal you can alarm on, and (3) an owner. An unlabeled failure becomes a recurring incident because nobody can tell whether it regressed. This taxonomy is also the map for the rest of the track — each later lesson is a fix for one of these rows.

Analogy

RAG failure modes are aircraft incident categories. Pilots don't say 'the plane felt wrong' — they classify (stall, bird strike, instrument failure) because each class has a checklist and a fix. Treat your bot's wrong answers the same way: classify before you 'fix'.

Pitfalls & how to avoid them

  • One bucket called 'hallucination'. Symptom: no actionable fix. Fix: split into the named modes above.
  • No detection signal. Symptom: you find failures only via user complaints. Fix: a metric/alarm per mode.
  • No owner. Symptom: the same failure recurs each quarter. Fix: assign each mode to a person/team.
  • Fixing symptoms not causes. Symptom: whack-a-mole. Fix: map symptom → root cause via the table.

Apply it to your system

Audit your last three bad answers.

  • Which named failure mode did each one belong to?
  • For each, what telemetry signal would have caught it before the user did?
  • Which mode currently has no owner on your team?

Reading in progress · 0 of 4 activities done