Corrective RAG and Self-RAG: Architecture Patterns (2026)

Corrective RAG and Self-RAG: Architecture Patterns (2026)

Corrective RAG and Self-RAG: Architecture Patterns (2026)

Naive retrieval-augmented generation breaks in a predictable way: the retriever returns documents that are topically adjacent but factually unhelpful, and the generator, lacking any mechanism to notice the problem, hallucinates confidently anyway. The fix sounds obvious in hindsight — add a grading step between retrieval and generation — but how that grading step is designed, trained, and integrated turns out to matter enormously. Two patterns have crystallized as the leading approaches: corrective RAG (CRAG), which uses an external lightweight evaluator to score retrieved documents and trigger a web-search fallback or knowledge-refinement step, and Self-RAG, which bakes the decision to retrieve and the critique of retrieved content directly into the language model itself via special reflection tokens.

This post makes one central argument: both patterns are fundamentally about adding a feedback and grading loop to retrieval. The cost of that loop is real — added latency, added complexity, added training or orchestration overhead. That cost is only justified when retrieval quality is the dominant source of error in your system. Understanding when that condition holds, and how each pattern addresses it differently, is the practical engineering question this post answers.

What this covers: the mechanics of CRAG and Self-RAG from first principles; a unified adaptive-RAG reference design combining both; honest trade-offs and failure modes; and a decision framework for when adaptive RAG is worth the investment.


Context: Why Naive RAG Fails and What the 2026 Adaptive-RAG Landscape Looks Like

Retrieval-augmented generation in its canonical form is a two-stage pipeline: a retrieval stage that fetches k documents from a vector store or keyword index, followed by a generation stage that conditions on those documents to produce an answer. This architecture solved a genuine problem — it dramatically reduced hallucination rates on knowledge-intensive tasks compared to closed-book generation — and it scaled well because the retrieval and generation components could be improved independently.

The failure mode that has become increasingly visible at production scale is what practitioners now call the “garbage in, gospel out” problem. When the retrieval stage returns documents that are off-topic, outdated, or merely superficially relevant to the query, the generator treats them as authoritative context. Dense retrieval models trained on semantic similarity do not have a clean notion of factual sufficiency: a passage can have high cosine similarity to a query while containing no information that actually answers it. The generator, conditioned on a context window full of misleadingly relevant but ultimately unhelpful content, often produces confident, fluent, and wrong answers.

The 2026 adaptive-RAG landscape has responded to this failure mode with a cluster of patterns that all share the same structural insight: retrieval quality must be assessed before generation proceeds, not inferred from the quality of the generated output after the fact. CRAG and Self-RAG are the two most architecturally distinct implementations of this insight, and they represent different engineering trade-offs between flexibility (CRAG externalizes evaluation, making it system-composable) and integration (Self-RAG internalizes evaluation, making it faster at inference time once the model is trained).

For context on how reranking fits into this landscape before the evaluator stage, the post on reranker benchmarks for Cohere, BGE, Jina, and ColBERT is a useful reference. The broader agentic patterns that orchestrate multiple retrieval calls sit one layer above what is covered here, and are addressed in the agentic RAG architecture patterns post.

Naive RAG pipeline versus adaptive RAG with an evaluation and feedback layer
Figure 1: Naive RAG (top path) routes directly from retrieval to generation with no quality gate. Adaptive RAG (bottom path) inserts an evaluator that can trigger fallback retrieval or knowledge refinement before generation proceeds.


Corrective RAG: The Retrieval Evaluator and Its Consequences

Corrective RAG was introduced in the paper “Corrective Retrieval Augmented Generation” (Yan et al., 2024, arXiv:2401.15884). The core contribution is a lightweight retrieval evaluator — a separate model component, not the main generator — that assesses the quality of retrieved documents with respect to the input query and returns a confidence score that maps to one of three action triggers: Correct, Incorrect, or Ambiguous.

The Retrieval Evaluator

The evaluator in CRAG is deliberately lightweight. It is not the large language model doing self-assessment in natural language; it is a smaller, faster scorer trained specifically to classify retrieval quality. This distinction matters for system design. Because the evaluator is separate from the generator, it can be swapped, fine-tuned on domain-specific data, or replaced with a different scoring mechanism without touching the generation pipeline. It is also fast: the evaluation step adds latency measured in tens of milliseconds rather than seconds.

The three-way confidence classification drives qualitatively different downstream behaviors:

When the evaluator scores retrieved documents as Correct (high confidence that the documents are relevant and sufficient), the pipeline proceeds to a decompose-then-recompose step. Rather than passing the raw retrieved documents directly to the generator, CRAG applies a knowledge-strip algorithm that decomposes each document into fine-grained knowledge units, scores each unit for relevance independently, and then recomposes only the high-relevance units into a filtered context. This matters because even a high-quality retrieved document typically contains substantial irrelevant material — headers, boilerplate, tangential context — that can dilute the signal for the generator.

When the evaluator scores documents as Incorrect (low confidence), CRAG abandons the corpus-retrieved content entirely and triggers a web-search fallback. The original query (or a reformulated version of it) is submitted to a web search API, and the returned results are processed through the same decompose-recompose pipeline. This is the mechanism that gives CRAG its robustness against out-of-domain or out-of-date queries: when the static corpus cannot provide useful content, the system gracefully degrades to the open web.

When documents are scored as Ambiguous (medium confidence), CRAG takes a blended path: it retains the corpus-retrieved content and augments it with web-search results, then applies the knowledge-strip step to the combined pool.

The Decompose-Then-Recompose Algorithm

The decompose-then-recompose step deserves its own treatment because it is often underemphasized relative to the evaluator in descriptions of CRAG. The algorithm proceeds in three passes. First, each retrieved document is segmented into fine-grained knowledge units — sentence-level or clause-level chunks, depending on the implementation. Second, each unit is scored by the evaluator for relevance to the query; units below a relevance threshold are discarded. Third, the surviving units are recomposed — concatenated with structural markers — into a refined knowledge strip that serves as the actual generation context.

The practical effect of this step is significant. It means that even when the evaluator’s overall confidence is moderate, the generator receives a context that has been actively filtered for relevance rather than passively accepted from the retriever. This is the CRAG answer to the “topically adjacent but factually irrelevant” retrieval failure mode.

# Illustrative pseudocode — not from the paper
def crag_pipeline(query, retriever, evaluator, web_search, generator):
    docs = retriever.fetch(query, k=5)
    confidence = evaluator.score(query, docs)  # returns "correct" | "ambiguous" | "incorrect"

    if confidence == "incorrect":
        docs = web_search.fetch(query)
    elif confidence == "ambiguous":
        web_docs = web_search.fetch(query)
        docs = docs + web_docs

    # Decompose-then-recompose regardless of source
    knowledge_strip = evaluator.decompose_recompose(query, docs)
    return generator.generate(query, context=knowledge_strip)

CRAG flow: retrieve, evaluate confidence, branch to correct or web fallback, decompose-recompose, generate
Figure 2: CRAG flow. The retrieval evaluator scores documents and triggers one of three action branches. All branches converge on the decompose-then-recompose step before the generator receives any context.


Self-RAG: Reflection Tokens and On-Demand Retrieval

Self-RAG, introduced in “Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection” (Asai et al., 2023, arXiv:2310.11511), takes a structurally different approach. Rather than adding an external evaluator component, Self-RAG trains the language model itself to emit special tokens — called reflection tokens — that encode retrieval and critique decisions inline with the generated text.

Reflection Tokens: The Mechanism

The Self-RAG training procedure augments a standard language model with four categories of reflection tokens. These tokens are not generated by a separate model; they are part of the output vocabulary of the fine-tuned model itself, produced inline as the model generates.

The Retrieve token appears at the beginning of a generation step and encodes the model’s decision about whether to retrieve additional evidence at all. This is the mechanism that makes Self-RAG adaptive rather than always-on: the model can decide that retrieval is unnecessary for a given query or for a given segment of a longer response, and it signals this by emitting [No Retrieve]. When it determines that evidence is needed, it emits [Retrieve] and the inference loop triggers an actual retrieval call.

The ISREL token (Is Relevant) appears after a retrieved passage is injected into the context. It encodes the model’s assessment of whether the passage is actually relevant to the question being answered. A passage can be retrieved and then assessed as irrelevant, in which case the model’s subsequent generation discounts that passage.

The ISSUP token (Is Supported) appears after each generated segment and encodes whether the segment’s claims are supported by the retrieved passage. This is the model performing inline fact-checking against its own context. The token can take three values: Fully Supported, Partially Supported, or Contradicted. When a segment is flagged as Contradicted, the inference loop can discard that segment and regenerate.

The ISUSE token (Is Useful) appears at the end of a response and encodes an overall utility assessment. During inference, multiple candidate generations can be produced and ranked using ISUSE scores, with the highest-scoring candidate selected as the final output.

Training Self-RAG

The training procedure is what makes Self-RAG architecturally interesting and also what makes it expensive to deploy. The model is trained on a corpus where reflection tokens have been injected by a separate critic model (also a language model). The critic processes training examples and inserts appropriate reflection tokens based on whether retrieval was necessary, whether retrieved passages were relevant, and whether generated claims were supported. The main model is then trained on this annotated corpus using standard next-token prediction.

The consequence of this training procedure is that the model learns to reason about retrieval necessity and output quality without any inference-time scaffolding. The grading loop is not an external orchestrator checking the model’s output — it is built into the model’s generation process itself. This makes Self-RAG inference-efficient once the model is trained: there is no separate evaluator making API calls, no orchestration logic routing between branches.

The trade-off is that the evaluation logic is now tied to the model weights. Fine-tuning a new model or changing the evaluation criteria requires retraining. The decomposability that CRAG achieves by externalizing the evaluator is not available in Self-RAG’s base architecture.

# Illustrative pseudocode — not from the paper
def selfrag_inference(query, retriever, model):
    tokens = []
    retrieve_decision = model.predict_retrieve_token(query)

    if retrieve_decision == "[Retrieve]":
        passages = retriever.fetch(query, k=3)
        for passage in passages:
            isrel = model.predict_isrel(query, passage)
            if isrel == "Relevant":
                segment, issup = model.generate_with_critique(query, passage)
                isuse = model.predict_isuse(segment)
                tokens.append((segment, issup, isuse))

    # Select best segment by ISSUP then ISUSE score
    best = max(tokens, key=lambda t: (t[1], t[2]))
    return best[0]

Self-RAG flow: retrieve-on-demand decision, ISREL assessment, generation with ISSUP critique, ISUSE selection
Figure 3: Self-RAG inference flow. The model emits reflection tokens at each decision point. Multiple candidates can be generated and ranked; the ISSUP and ISUSE scores drive candidate selection.


A Unified Adaptive-RAG Reference Design

Having examined CRAG and Self-RAG separately, it is useful to abstract a reference design that captures the shared architectural logic while preserving the flexibility to instantiate either pattern — or a hybrid of both.

The central insight is that adaptive RAG is a feedback-controlled pipeline, not a linear one. The retrieval stage is no longer a single fixed call that happens once per query. It is a component that can be called conditionally, re-called on failure, and whose output is subject to quality assessment before it reaches the generator. The generator’s output is similarly subject to assessment before it is returned to the user.

Layer 1: Query Analysis and Retrieval Planning

Before any retrieval occurs, an adaptive RAG system benefits from a query analysis layer that makes a coarse classification: is retrieval likely to be necessary for this query, and if so, what retrieval strategy is appropriate? This layer maps cleanly to Self-RAG’s Retrieve token at the model level and to an orchestration decision at the system level. For factual, time-sensitive, or domain-specific queries, retrieval is nearly always warranted. For procedural, creative, or highly general queries, retrieval may add noise without adding value.

At the system level, this can be as simple as a classifier routing queries to a retrieval-required or retrieval-optional branch. At the model level, if using a Self-RAG-style trained model, this decision emerges from the model’s own token predictions.

Layer 2: Retrieval and Quality Evaluation

The retrieval layer fetches candidate documents from one or more sources. In a CRAG-style architecture, this is followed immediately by the lightweight evaluator that produces a confidence score and triggers the appropriate action branch. In a Self-RAG-style architecture, the retrieved passages are injected into the model’s context and the model emits ISREL tokens.

A practical hybrid approach separates the concerns: use a fast, domain-specific lightweight evaluator (as in CRAG) to handle the Incorrect branch early, before any generation compute is spent, and then use a self-critique mechanism (as in Self-RAG) for finer-grained ISSUP assessment during generation. This layered evaluation catches coarse retrieval failures cheaply and fine-grained factual errors more thoroughly.

The GraphRAG pattern, discussed in GraphRAG and hybrid retrieval with knowledge graphs, adds another dimension here: for queries that require multi-hop reasoning across related entities, graph-structured retrieval can provide documents that a flat vector search would miss entirely. The evaluator in an adaptive RAG system should ideally be aware of retrieval source quality differences.

Layer 3: Context Preparation

Regardless of whether the evaluator is external (CRAG) or internal (Self-RAG), the refined context that reaches the generator should be processed, not raw. The CRAG decompose-then-recompose step is a concrete implementation of this principle. In a reference design, this layer is responsible for filtering, deduplicating, and structuring the knowledge that will appear in the generator’s context window.

At production scale, this step also handles the practical problem of context length limits. A naive RAG implementation that concatenates k=10 retrieved documents can easily exceed the context window of the generator and require truncation strategies that themselves introduce quality loss. The context preparation layer in adaptive RAG can be more selective, passing only the highest-relevance knowledge units.

Layer 4: Generation and Critique

The generation layer produces output conditioned on the prepared context. In a Self-RAG architecture, critique (ISSUP, ISUSE) happens inline. In a CRAG-style architecture, critique is external — a separate model or rule-based system checks the generated output for consistency with the source documents.

The feedback loop closes here: if the critique layer flags the output as unsupported or low-quality, the system can route back to Layer 1 with a reformulated query or back to Layer 2 to trigger a different retrieval strategy. This loop is bounded by a maximum-iteration guard to prevent infinite cycling on hard queries.

Layer 5: Feedback Logging

An often-omitted but operationally critical layer is the feedback logger. Every pipeline run that produces an output should record the retrieval confidence score, the evaluation decision, the context that was used, and the final response. This data feeds the ongoing improvement of the retrieval evaluator and, in CRAG-style systems, the training data for fine-tuned variants of the evaluator. Without this layer, the system cannot learn from its own failures.

LangGraph provides a practical orchestration substrate for implementing the conditional branching and state management that layers 1-5 require, and its documentation on retrieval workflows is a useful reference for concrete implementation patterns.

Unified adaptive-RAG reference design with query analysis, retrieval evaluation, context preparation, generation critique, and feedback logging
Figure 4: Unified adaptive-RAG reference design. The grading and feedback loop spans both the retrieval quality evaluator (Layer 2) and the generation critique layer (Layer 4). The feedback logger connects run-time behavior to evaluator improvement over time.


Trade-offs and What Goes Wrong

Both CRAG and Self-RAG add a grading loop to the retrieval-generation pipeline. That loop has costs that are not always proportionate to the benefits, and there are failure modes specific to each pattern that practitioners should understand before committing to either architecture.

Latency budget expansion. CRAG’s retrieval evaluator adds a model inference call between retrieval and generation. The web-search fallback path adds a network round-trip and additional retrieval. For interactive applications with sub-second latency budgets, the Incorrect branch — which runs evaluator, web search, decompose-recompose, and then generation — can easily triple end-to-end latency relative to naive RAG. Self-RAG avoids the external evaluator call but generates more tokens per response (due to reflection tokens), which increases generation time proportionally to the number of retrievals and critiques.

Evaluator calibration drift. The CRAG retrieval evaluator is trained on a particular distribution of queries and documents. When deployed against a domain that differs substantially from training distribution — specialized industrial terminology, domain-specific abbreviations, niche scientific vocabulary — the evaluator’s confidence scores become unreliable. Importantly, miscalibration in the direction of overconfidence (scoring an actually poor retrieval as Correct) is worse than underconfidence (triggering unnecessary web-search fallback), because overconfident mis-scoring lets bad context reach the generator silently.

Self-RAG’s rigidity after training. Self-RAG’s internalized evaluation is both its strength and its primary limitation. Once trained, the model’s retrieval and critique thresholds are fixed in its weights. Changing them requires fine-tuning. This makes Self-RAG ill-suited for use cases where the acceptable threshold for “good enough” retrieval changes dynamically — for example, a system where some queries require high factual precision while others tolerate more approximate answers. CRAG’s external evaluator can be reconfigured or replaced without touching the generator.

Cascade failures at the web-search fallback. The CRAG Incorrect branch assumes that web search will return better content than the corpus retrieval. This assumption fails when the query is highly specialized, when the web results are dominated by low-quality SEO content, or when the query touches proprietary or confidential information that is not web-indexed. A fallback that returns worse content than the original corpus retrieval is a silent failure: the pipeline proceeds to generate, the evaluator has already signaled Incorrect, and there is no second evaluation pass on the web-search results.

Reflection token leakage. In Self-RAG, the reflection tokens are part of the model’s output vocabulary. In some deployment configurations, these tokens can appear in the final generated text, particularly when the model’s output is not post-processed to strip special tokens. This is a minor but real production artifact that requires attention during deployment.

Over-retrieval on long-form generation. Self-RAG’s on-demand retrieval means that for a long multi-paragraph response, the model may trigger multiple retrieval calls, one for each segment it decides needs external support. The cumulative latency of multiple retrieval rounds can make Self-RAG significantly slower than CRAG on long-form generation tasks, even though CRAG always triggers at least one retrieval.


Practical Recommendations

The core decision in adopting corrective RAG or Self-RAG is not a question of which pattern is better in the abstract. It is a question of whether retrieval quality is actually the dominant error source in your current system.

Before investing in adaptive RAG architecture, measure where errors originate in your existing pipeline. If your retrieval recall is high but your generated answers are still hallucinated, the problem likely lies in the generator or the context preparation, not the retrieval mechanism. Adaptive RAG will not fix a generator that ignores its context. If, on the other hand, you can trace a significant fraction of errors to cases where retrieved documents are irrelevant or off-topic, then the grading loop pays for itself.

For teams with clear domain boundaries and the ability to fine-tune, Self-RAG is architecturally elegant: the critique is inseparable from the generation, which simplifies the deployment surface. For teams working across multiple domains with evolving data sources, or who need to audit and swap the evaluation logic independently of the generator, CRAG’s external evaluator is the more flexible choice. The two patterns are not mutually exclusive: a practical hybrid uses a CRAG-style evaluator for the coarse pass (triggering the web-search fallback when corpus retrieval clearly fails) and Self-RAG-style ISSUP checking at the segment level during generation.

The decompose-then-recompose step from CRAG is worth adopting regardless of which overall pattern you choose. Passing raw retrieved documents to a generator is almost always suboptimal. Fine-grained knowledge filtering improves generation quality while also reducing context length, which has positive effects on latency and cost.

Implementation checklist:

  • Baseline first: instrument your current pipeline and measure retrieval precision, recall, and error attribution before adding evaluation overhead
  • Deploy the retrieval evaluator as a separate service so it can be updated without redeploying the generator
  • Set confidence thresholds empirically on a held-out evaluation set; do not use the paper defaults without validating against your domain
  • Implement the web-search fallback with its own quality gate — do not assume web results are better than corpus results without checking
  • Add a maximum-iteration guard on the feedback loop (two iterations maximum in most cases)
  • Log every evaluation decision with the confidence score, the action branch taken, and the final response quality; use this data to retrain the evaluator quarterly
  • Test the Incorrect branch explicitly under domain-shift conditions
  • Post-process Self-RAG outputs to strip reflection tokens before serving to users

FAQ

What is corrective RAG and how does it differ from standard RAG?

Corrective RAG extends standard RAG by adding a lightweight retrieval evaluator between the retrieval and generation stages. Standard RAG passes whatever documents the retriever returns directly to the generator, regardless of their relevance. Corrective RAG evaluates retrieval quality first — assigning a Correct, Ambiguous, or Incorrect score — and triggers different actions based on that score, including a web-search fallback when corpus retrieval fails. The key architectural difference is the feedback loop: the generator only receives context that has passed a quality gate, and that context has been filtered through a decompose-then-recompose step to remove irrelevant material.

What are Self-RAG’s reflection tokens and why do they matter?

Self-RAG introduces four types of reflection tokens that the language model emits inline during generation. The Retrieve token decides whether to call the retriever at all. ISREL (Is Relevant) assesses whether a retrieved passage actually addresses the query. ISSUP (Is Supported) checks whether a generated claim is supported by the retrieved passage. ISUSE (Is Useful) scores the overall utility of a response segment. These tokens matter because they make retrieval and critique decisions part of the model’s generative process rather than external orchestration logic — the model can decide mid-generation to retrieve additional evidence, assess that evidence, and grade its own output, all without a separate evaluator service.

When should you use adaptive RAG instead of naive RAG?

Adaptive RAG is justified when retrieval quality is the dominant error source in your system. Concretely, this means a significant fraction of your error cases trace back to retrieved documents being irrelevant, outdated, or insufficient, rather than to the generator misusing good context. Adaptive RAG adds latency and complexity — the CRAG Incorrect branch in particular involves multiple additional steps. If your retrieval precision is already high or if your error analysis points to generator-side issues, the overhead of the grading loop is unlikely to deliver proportionate quality gains.

Can CRAG and Self-RAG be combined in a single system?

Yes, and this is arguably the most robust production architecture. A hybrid system uses a CRAG-style external evaluator for the coarse retrieval quality gate — triggering web-search fallback when the corpus clearly cannot serve the query — and Self-RAG-style ISSUP checking at the segment level during generation. This layered approach catches gross retrieval failures cheaply (the CRAG evaluator is fast and inexpensive) and fine-grained factual errors more thoroughly (ISSUP operates on individual generated claims). The main cost is increased architectural complexity: you now have both an external evaluator service and a Self-RAG-trained generator to deploy and maintain.

What are the latency implications of CRAG’s web-search fallback?

The web-search fallback path in CRAG adds at minimum one network round-trip to a search API plus the compute for re-running the decompose-then-recompose step on web results. In practice, this makes the Incorrect branch the slowest path in the pipeline by a substantial margin. For synchronous applications where users are waiting for a response, this is a real user-experience concern. Mitigation strategies include running web search in parallel with corpus retrieval and using the evaluator to decide which result set to use rather than sequencing retrieval and search, though this increases backend compute.

How does the retrieval evaluator in CRAG get trained?

The retrieval evaluator in CRAG is a fine-tuned model trained to classify query-document pairs by retrieval quality. Training data consists of query-document pairs labeled by whether the document adequately supports an answer to the query. The paper uses a T5-based evaluator fine-tuned on a labeled dataset. In practice, organizations deploying CRAG typically fine-tune the evaluator on domain-specific examples, since an evaluator trained on general web content can be poorly calibrated on specialized vocabulary. Ongoing retraining using feedback from production pipeline runs — where the final response quality provides a weak supervision signal for evaluator calibration — is the standard operational approach.


Further Reading

On this site:

External references:

  • Yan, Shi-Qi et al., “Corrective Retrieval Augmented Generation,” arXiv:2401.15884 (2024) — the original CRAG paper; covers the retrieval evaluator design, decompose-then-recompose algorithm, and empirical evaluation across four datasets
  • Asai, Akari et al., “Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection,” arXiv:2310.11511 (2023) — the original Self-RAG paper; covers the reflection token training procedure, inference-time candidate selection, and comparisons against retrieval-augmented and non-retrieval baselines
  • LangGraph documentation on retrieval workflows — practical orchestration patterns for implementing the conditional branching and state management that adaptive RAG pipelines require

Riju writes about applied AI architecture and industrial AI systems at iotdigitaltwinplm.com. About the author.

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *