The short version: naive RAG takes whatever the retriever hands back and answers from it — no step in the pipeline is allowed to say this context is junk. Three published methods fix that, and the trick to choosing is noticing they check three different things. Self-RAG checks the model's own answer against its evidence. Corrective RAG (CRAG) checks the retrieved documents. Adaptive-RAG checks the question — before it retrieves at all. Grade the answer, grade the documents, or grade the query: that's the whole map.
A year ago we compared the first two head to head. Here's the third, and how all three fit together.
The one failure they all attack#
Every retrieval-augmented system rests on a quiet assumption that is often wrong: that the top-k passages are worth conditioning on. When retrieval misses, naive RAG doesn't fail loudly — it hallucinates fluently on top of bad evidence, which is worse than an honest "I don't know." Self-RAG, CRAG, and Adaptive-RAG each insert a checkpoint that naive RAG lacks. They just put it in different places.
Self-RAG: grade the answer#
Self-RAG (Asai et al., ICLR 2024) fine-tunes the generator itself to emit reflection tokens. A Retrieve token decides, on demand, whether the next segment even needs a passage — so retrieval becomes adaptive rather than a fixed top-k every time. Then three critique tokens grade the work: IsREL (is this passage relevant?), IsSUP (is my statement actually supported by it?), and IsUSE (how useful is the response overall?). The model critiques itself token by token, and the reflection-token probabilities can be weighted at inference to tune how cautious it is.
The defining trait: the judgment lives in the weights. That's the strength — no external moving parts at inference — and the cost: you need a model fine-tuned to produce these tokens, which locks you to it. Self-RAG fixes over- and under-retrieval and unsupported claims.
CRAG: grade the documents#
Corrective RAG (Yan et al., 2024) leaves the LLM untouched and bolts a lightweight retrieval evaluator in front of it. The evaluator scores the retrieved documents and returns a confidence that maps to three actions:
- Correct → refine the docs: decompose each into "knowledge strips," score every strip, and keep only the relevant ones (a decompose-then-recompose pass that strips noise).
- Incorrect → discard the retrieved docs and fall back to a large-scale web search for fresh evidence.
- Ambiguous → combine both refined internal knowledge and web results.
All of this happens before the generator runs. Because the check lives outside the model, CRAG is plug-and-play over any black-box API — the trade is one evaluator pass per query and a web dependency on the fallback path. CRAG fixes irrelevant or wrong retrieved documents.
Adaptive-RAG: grade the question#
Adaptive-RAG (Jeong et al., NAACL 2024) checks the one thing the other two ignore: how hard the query actually is. A small classifier predicts query complexity and routes to one of three strategies — no retrieval (let the model answer a simple, known-answer question directly), single-step retrieval (one fetch for a moderate query), or multi-step iterative retrieval (for genuinely multi-hop questions).
The motivation is cost, not just accuracy: always doing single-step retrieval under-serves hard queries, and always doing multi-step burns compute and latency on easy ones. The router matches the accuracy of the expensive path where it's needed while skipping it where it isn't. Adaptive-RAG fixes over-spending on easy queries — a failure that never shows up in an accuracy number but dominates your bill and your p95 latency.
Self-RAG grades the answer. CRAG grades the documents. Adaptive-RAG grades the question. Once you see that, "which one is best?" is the wrong question — they don't compete, they cover different holes.
How to choose — and how to stack#
- Do you control the weights? If not, Self-RAG is out; both CRAG and Adaptive-RAG wrap a hosted model as-is.
- What's actually failing? Bad retrieval quality → CRAG. Wasted cost and latency on easy queries → Adaptive-RAG. Confident, unsupported claims even when retrieval is fine → Self-RAG.
- They compose. Adaptive-RAG decides whether and how much to retrieve; CRAG or Self-RAG decides whether what you retrieved was any good. A real system can route with Adaptive-RAG and run CRAG's evaluator on the branch that retrieves. Stack them when more than one failure is real — not by default.
All three have official reference implementations on LangGraph, which is the fastest way to feel the difference before you commit to one. But start cheaper than any of them: if your corpus is clean, a reranker plus a relevance threshold is the first move, and you add self-checking RAG only when that stops being enough. When you do add it, the next thing to get right is reading the benchmark that tells you it worked — because the leaderboard number is easier to move than production.



