Skip to content
← all posts
·7 min read·by Dru Edwards·#ai #rag #agentic-engineering #craft #architecture

RAG Styles, Ranked by What Actually Works

Most people implement naive RAG, get mediocre results, and blame the model. The bottleneck is almost always retrieval. Here are the five RAG architectures that matter and when to reach for each one.

The average RAG pipeline fails not because the language model is wrong. It fails because the retrieval was bad. Everything downstream is just amplified noise from a bad retrieval layer.

Here's the answer up front: there are five meaningfully distinct RAG architectures in active use right now, and most teams are stuck on the first one. The jump from naive RAG to advanced RAG is 80% of the quality gain for about 20% of the engineering effort. Everything beyond that is solving specific problems, not default better. The 2026 production pattern that ties all five together is Adaptive RAG — a query classifier that routes each query to the right pipeline based on complexity, keeping costs low for simple questions while deploying the full agentic or graph-based stack for queries that need it. RAGAS has become the standard evaluation framework for measuring retrieval quality before you even look at generation quality.

If your RAG outputs are mediocre, there's a 90% chance the fix isn't your prompt or your model. It's what you're feeding the model before it ever starts generating.

The five styles

Naive RAG is what most people build first — and keep running longer than they should. You chunk your documents, embed them, store them in a vector database, and at query time you embed the question, pull the top-K chunks by cosine similarity, and hand them to the model. Works fine for simple Q&A on clean, well-structured documents. Falls apart the moment queries get complex, documents have relationships, or your chunks cut across important context boundaries.

Advanced RAG is where most teams should be living. It adds meaningful work on both sides of retrieval. Pre-retrieval: query rewriting (the question the user asked isn't always the best retrieval query), HyDE (generate a hypothetical document that would answer the question, embed that, retrieve against it), and routing (different query types need different retrieval strategies). Post-retrieval: cross-encoder reranking (re-score retrieved chunks with a slower but more precise model), context compression (strip the noise from retrieved chunks before they go into the prompt), and deduplication. Each of these individually improves output quality. Together they're the difference between a demo and a product.

Modular RAG is for when you've accepted that no single retrieval approach works for all your query types. You build a pipeline that routes: conversational queries go one way, factual lookups another, multi-document synthesis a third. The retriever becomes a component you can swap, combine, and extend without rebuilding the whole system. This is the architecture you migrate toward as your use case matures.

Agentic RAG hands retrieval decisions to the model itself. Instead of always retrieving on the first turn, the LLM decides whether it needs to retrieve, what to retrieve, and whether to retrieve again after seeing the first batch. It can run iterative loops — retrieve, reason, decide it needs more, retrieve again — before generating a final answer. The quality ceiling is high. The latency cost is real. Right for complex reasoning over large corpora. Wrong for anything that needs to be fast.

GraphRAG stores your knowledge as a graph of entities and relationships, not just a flat pile of chunks. When the query involves connections — "what did person X say about topic Y that relates to decision Z" — graph traversal outperforms vector similarity retrieval by a wide margin. Microsoft's GraphRAG implementation is public and worth reading. It's not the default choice, but for knowledge-dense domains with rich entity relationships, it's the only choice that actually works.

The decision you actually need to make

Use naive RAG only if you're prototyping. If this is going anywhere near users, you should be on advanced RAG at minimum.

The 2026 best practice: build Adaptive RAG from the start. Add a lightweight query classifier that routes: simple factual lookups → advanced RAG with reranking, complex multi-step questions → agentic RAG, relationship-heavy knowledge queries → GraphRAG. You don't have to build all three pipelines on day one — but designing the router early means you can add pipelines incrementally as the use case demands them.

The signal for agentic: your users' questions require multi-step reasoning that a single retrieval pass can't support. The signal for graph: your knowledge domain has dense entity relationships (legal networks, medical comorbidities, org charts, product dependencies). Either of these is significant engineering work — start with advanced RAG and add complexity only when you have evidence the simpler version is the bottleneck.

Why retrieval quality beats model quality

This is the part worth sitting with: a GPT-4-class model with bad retrieval will produce worse outputs than a GPT-3.5-class model with excellent retrieval. The model can only work with what you give it. If the retrieved context is wrong, irrelevant, or cuts across the meaningful boundaries of your knowledge, the model will either hallucinate to fill the gap or synthesize something superficially coherent that's actually wrong.

Chunk size and K are the two variables most teams set once and never revisit. Too-large chunks dilute signal. Too-small chunks lose context. K too high floods the model with noise. K too low misses relevant content. These should be tuned against actual query data, not set to a default and forgotten.

From my own bench

I've built RAG pipelines for a few different domains — agent memory stores, document retrieval for business operations, knowledge systems that need to work offline. The pattern I've seen consistently: when outputs are bad, the instinct is to reach for a bigger model. But every time I've diagnosed the actual failure, it's a retrieval problem. Wrong chunks, wrong K, no reranking, embeddings trained on a different domain than the documents.

The fix that moved the needle most: adding a cross-encoder reranker after initial vector retrieval. You retrieve a larger pool (K=20), score each candidate with the reranker against the actual query, take the top 5. The initial retrieval is fast and approximate; the reranker is slower and precise. That combination consistently outperforms just raising K.

Try it today

StepWhat you doWhy it pays off
1. Audit your chunk boundariesPrint 5 retrieved chunks for a query you know should work. Read them as if you're the model — does each chunk contain everything needed to answer?Chunk boundary problems are invisible until you read the actual chunks. Most teams never do.
2. Add a rerankerDrop a cross-encoder reranker (Cohere Rerank or a local cross-encoder/ms-marco-MiniLM model) after your vector retrieval, expand K, take top 3-5Single highest-ROI RAG improvement for most pipelines, 30 minutes to add
3. Try HyDE on one query typeFor a query where the user's words don't match your document vocabulary, generate a hypothetical answer first and embed that instead of the raw queryEspecially powerful when query language and document language diverge — legal, medical, technical domains

Where people get burned

  • Setting chunk size to 512 tokens and never revisiting it. It's a default, not a decision. Fix: measure retrieval precision at your actual query distribution and tune from there.
  • Evaluating on "does it sound right." The model's confidence is not accuracy. Fix: build a small evaluation set of real questions with known correct answers and measure retrieval recall before you measure generation quality.
  • Adding agentic loops before you've nailed basic retrieval. If the first retrieval pass is bad, iterating on it just gives you more bad retrievals. Fix: get retrieval right first. Agentic loops compound good retrieval, not bad.
  • Treating all queries as equal. A conversational clarification needs different retrieval than a deep synthesis question. Fix: classify query type and route to the appropriate retrieval strategy.

Tools, and a question worth sitting with

  • A thing to try: LlamaIndex and LangChain both have modular retriever components that make it straightforward to bolt a reranker onto an existing pipeline. The Cohere Rerank API is the fastest path; cross-encoder/ms-marco-MiniLM-L-6-v2 from Hugging Face is the fastest offline path.
  • A read: Microsoft's GraphRAG paper and implementation on GitHub is worth reading even if you don't need graph retrieval — the reasoning about why vector similarity alone fails for relationship-dense knowledge is the clearest write-up of the failure mode I've seen.
  • A question to actually sit with: When did you last read the actual chunks your RAG pipeline retrieved for a real user query?

The bottom line

RAG quality is retrieval quality. The model is the last step in a pipeline where the hard work already happened — or didn't. Naive RAG is where you start. Advanced RAG is where you stay. Graph and agentic are tools for specific problems, not upgrades you apply universally.

Read your chunks. Add a reranker. Evaluate on real queries. That sequence will outperform switching models every time.

— Dru Edwards