After auditing more than 30 RAG systems in production β customer support bots, internal knowledge assistants, document Q&A tools β the same 5 failure modes keep showing up. None of them are about chunking strategy. None of them are about which vector store you chose. All of them are about engineering discipline: evaluation rigor, retrieval architecture, and production observability.
The teams who shipped working RAG had one thing in common: they treated it like any other software system. They defined metrics before they wrote code, they built eval pipelines before they built features, and they instrumented for production from day one. The teams who failed did the opposite. If you need a refresher on how RAG works before diving in, see our RAG primer. If you've already shipped something and it's not working as well as you hoped, read on.
This is not a tutorial. It is a post-mortem pattern document. I will describe each failure mode, what it looks like from the inside when you're living in it, and what actually fixes it β not what sounds good in theory.
1. Retrieval looks fine, answers don't
This is the most common one, and it's insidious because your metrics look healthy. Retrieval recall@5 is 0.87. Precision@3 is solid. The eval dashboard is green. Users are still churning.
The problem is a fundamental mismatch between what you're measuring and what users actually care about. Retrieval recall tells you whether the right chunk was in the top-k results. It does not tell you whether the LLM used it faithfully, whether the answer was correct, or whether it addressed the user's actual intent. A model can retrieve the perfect chunk and still hallucinate the answer. It can get the right document and then fabricate a number that wasn't in it. Recall@k is a useful proxy metric, but it is not your product metric.
What you actually want to measure:
- Faithfulness: Does the generated answer stay within the bounds of the retrieved context? (RAGAS faithfulness score)
- Answer relevance: Does the answer actually address the question asked?
- Context precision: Of the chunks retrieved, how many were actually needed to answer the question?
The fix has two parts. First, build a golden evaluation set of 50β200 question/answer pairs representative of real user queries. This set should be assembled from actual production traffic, not invented in a vacuum. Second, run RAGAS or an equivalent LLM-as-judge pipeline against it on every significant code change. Treat it like a test suite β failing faithfulness is a failing build.
The third part people skip: production-sampled evals. Every week, sample 50 real production queries you've never seen before and run them through the same eval pipeline. Retrieval drift is real β query patterns shift, new document types get added, user language evolves. A static eval set goes stale. Production sampling is how you catch it.
Lesson learned
The team that first shipped our customer support RAG had retrieval recall@5 of 0.91 and a 34% user dissatisfaction rate. When we added faithfulness eval, we discovered the LLM was ignoring retrieved context and generating plausible-but-wrong policy details in 28% of responses. The retrieval was fine. The problem was upstream of retrieval in the system prompt, and we never would have found it without end-to-end eval.
2. Chunks are too clever or too dumb
Chunking occupies an outsized amount of engineering time relative to the ROI it delivers. I have watched teams spend three weeks implementing custom semantic chunking β sentence boundary detection, discourse parsing, hierarchical segmentation β and then ship a system that performs marginally better than naive 800-token chunks with 150-token overlap. I have also watched teams ship 200-token chunks because someone read a blog post about "granular retrieval" and watch their system lose all context from any technical document.
Here is what actually moves the needle and what doesn't.
What doesn't move the needle much: fine-tuning your chunk size from 600 to 800 tokens, semantic chunking based on sentence embeddings, experimenting with 5 different overlap sizes. These are valid marginal improvements but they are not the bottleneck.
What actually moves the needle: adding document context to your chunk metadata. Specifically, parent-document retrieval and contextual chunk headers.
Parent-document retrieval works like this: you index small chunks for precise retrieval, but when a chunk is retrieved, you return its parent document (or parent section) to the LLM instead of just the chunk. The small chunk finds the right place; the larger context gives the model enough to reason from. LlamaIndex has a built-in implementation. It is not exotic. It is one of the highest-ROI retrieval improvements available.
Contextual chunk headers are even simpler. Before indexing each chunk, prepend a few sentences of document-level context: the document title, section heading, date, and source. Anthropic's research showed this alone improved retrieval recall meaningfully for long technical documents. It costs almost nothing to implement.
If you are currently on fixed-size chunking and considering a full semantic chunking rewrite: don't. Add contextual headers first, implement parent-doc retrieval second, measure the delta, and then decide if the semantic chunking investment is worth it. In most cases, it won't be.
3. Single-shot retrieval can't handle multi-hop queries
Here is a query that breaks naive RAG: "What was the revenue impact of the pricing policy change we implemented in Q2?"
To answer this correctly, you need: (a) the Q2 pricing policy change document, and (b) the Q2 financial report that shows revenue figures. Single-shot retrieval β embed the query, retrieve top-k chunks β will likely find one but not both. The query embedding is a blend of both concepts, which means it often lands close to neither in the vector space. The model gets partial context and either hallucinates the missing piece or gives a hedge answer that's useless.
This is the multi-hop query problem, and it affects any domain where answering a question requires synthesizing information from multiple independent documents β legal, finance, technical compliance, strategic planning.
There are several patterns that address it:
- Query decomposition: Use an LLM to break a complex query into 2β4 sub-queries, retrieve for each independently, then merge the contexts before generating. Simple to implement, works well for structured multi-hop questions.
- HyDE (Hypothetical Document Embeddings): Generate a hypothetical answer to the question, embed that answer, and use it as the retrieval query. Works well when the knowledge base has dense coverage but the user query is sparse or oblique.
- Small-to-big retrieval: Retrieve at the sentence or paragraph level, then expand to the surrounding section. Helps when the relevant signal is in a specific sentence but the model needs surrounding context to interpret it.
- Agentic retrieval: Give an LLM agent a retrieval tool and let it decide when and how many times to call it, with planning over intermediate results. The highest ceiling, but also the highest complexity. For a full treatment of this pattern, see our article on Agentic RAG.
The practical advice: if more than 15% of your real user queries are multi-hop (check your production logs β you probably haven't), query decomposition is the first thing to try. It is cheap to implement, easy to debug, and eliminates the majority of multi-hop failures before you need to go agentic.
4. No production eval means no idea what production looks like
This one is less about the RAG pipeline and more about engineering culture. Teams build a fixed eval set, run it, get 0.82 faithfulness, ship, and never look at it again. Six months later the system is quietly degrading and nobody knows because nobody is looking.
Query drift is real. When you ship a customer support RAG for a SaaS product, you build your eval set around the queries users are asking today. Three months later there's a new pricing tier, a new feature, a regulatory change in a key market, and a batch of new PDF documents added to the knowledge base. Your eval set doesn't cover any of it. Your faithfulness score on the old eval set is still 0.82. Your users are getting wrong answers about the new stuff at a rate you can't see.
The fix is treating evaluation as a continuous system, not a one-time gate:
- Eval in CI: Your golden set runs on every PR that touches the retrieval pipeline, the system prompt, or the chunking logic. Faithfulness regression blocks the merge. This is table stakes.
- Weekly production sampling: Sample 50β100 real queries from the past week, run them through your LLM-as-judge pipeline, compute faithfulness and answer relevance, add them to a dashboard. You want a time-series view of quality, not a point-in-time snapshot.
- Bi-weekly human review: Pick 20 production samples and have a domain expert review them. LLM-as-judge catches a lot but it has systematic blind spots β it tends to be too lenient on plausible-sounding but factually wrong answers in specialized domains. Human review catches what the automated judge misses.
- Rolling eval set refresh: Every month, add the 20 most interesting production failures to your golden set. Your eval set should grow to reflect the real query distribution, not stay frozen at launch day.
Key insight
The teams with the best production RAG quality are not the ones with the most sophisticated retrieval architecture. They are the ones with the most disciplined evaluation loops. Eval is what gives you the confidence to ship improvements without breaking existing behavior. Without it you are flying blind.
5. Ignoring the boring parts: latency, cost, observability
The fifth failure mode is the one that gets the least attention in the literature and causes the most production incidents in practice. Teams spend months optimizing faithfulness from 0.78 to 0.86 while running a pipeline with 6-second P95 latency and $0.50 per query cost. At 10,000 daily active users, that's $5,000/day in inference cost. Most enterprise users churn on any response that takes longer than 2 seconds.
A few concrete areas where we have seen the most waste:
Latency budget by stage. Instrument every stage of your pipeline separately: query embedding, vector search, reranking, LLM generation. Use LangSmith or Langfuse (both have solid tracing out of the box). In almost every pipeline we've audited, the reranker is the latency surprise β teams add Cohere Rerank because it improves precision and then discover it's adding 800msβ1.5s per query. You need to know this before you ship, not after. Cross-encoder rerankers at scale require either batching, async execution, or a fast bi-encoder alternative.
Prompt caching. If you are using Claude and have a long system prompt or a large static context block, you are almost certainly leaving money on the table. Anthropic's prompt caching caches the KV state of your prompt prefix between requests. For a customer support RAG with a 2,000-token system prompt and knowledge base summary, we measured a 76% reduction in input token cost after enabling caching. The implementation is minimal β you add a cache_control parameter to the relevant content block. If you're running high-traffic RAG on Claude and not using prompt caching, fix that today.
Observability from day one. Every query should emit a trace with: query text, retrieved chunks with scores, reranker scores if applicable, LLM latency, token counts, and the final answer. This is not optional instrumentation you add after something breaks β it is the data that makes debugging possible. Without it, when a user reports a wrong answer, you have no way to know whether the retrieval failed, the reranker failed, or the LLM failed. You're guessing. With a full trace, you know in 30 seconds.
Cost modeling before you scale. Before you expand a RAG system from 100 to 10,000 users, model the cost. Count your tokens: average query length, average context window per request, average output length. Multiply by your LLM pricing, add vector search costs, add embedding costs for new documents. The number should not surprise you at scale. If it does, you need smarter caching, smaller context windows, or a cheaper model for the cases that don't require frontier capability.
Further reading
- RAG: A Technical Guide β Tensoria's deep-dive on how RAG works, chunking, vector stores, and RAG vs. fine-tuning.
- Agentic RAG β How retrieval becomes dynamic when you hand the retrieval tool to an agent. Covers planning, multi-step retrieval, and when it's worth the complexity.
- Multi-agent orchestration compared β LangGraph vs CrewAI vs AutoGen vs custom. Useful when failure mode #3 (multi-hop) pushes you toward agentic patterns.
- RAG systems β Tensoria's end-to-end service for deploying production RAG, including eval infrastructure and observability.
- LLM integration β When the failure isn't RAG-specific but in the broader LLM pipeline (cost, latency, structured outputs).
- RAGAS documentation β The evaluation framework referenced throughout this article. Covers faithfulness, answer relevance, and context precision metrics.
- Anthropic prompt caching docs β Implementation details for the caching feature described in failure mode #5.
Talk to an engineer
Staring at one of these failure modes? We audit and fix RAG systems in 2β4 weeks.
The real reason most RAG systems fail
It is not the algorithm. It is not the embedding model, the chunk size, or the choice of vector store. The real reason most production RAG systems underperform is the absence of evaluation rigor and the habit of ignoring production realities until they become user-facing incidents.
The teams who ship reliable RAG are not the ones who spent the most time on retrieval architecture. They are the ones who defined what "working" means before they wrote code, built eval infrastructure as a first-class engineering deliverable, and instrumented for observability from the first deployment. Everything else β multi-hop retrieval, parent-document indexing, prompt caching β is important but secondary. Get the foundations right and those improvements are straightforward. Skip the foundations and you are iterating on an architecture you can't measure.
If your team is staring at one of these failure modes, book a call β we run structured AI audits and fix production RAG issues in 2β4 weeks. We have done this enough times to know exactly where to look. See our RAG systems service for what the engagement looks like in practice.