How to build a RAG system that actually answers from your data
Retrieval-augmented generation grounds an AI's answers in your own documents. Here's how the pieces fit, and where teams go wrong.
- 01RAG retrieves relevant chunks of your data and feeds them to the model so answers are grounded, not guessed.
- 02Retrieval quality — chunking, embeddings and search — matters more than the model choice.
- 03Most RAG failures are retrieval failures: if the right context isn't fetched, no model can save you.

What RAG solves
A general AI model knows a lot about the world but nothing about your world — your policies, your products, your internal docs. Retrieval-augmented generation (RAG) bridges that gap. Instead of relying on what the model memorised in training, RAG fetches relevant passages from your own data at question time and hands them to the model as context, so the answer is grounded in your material rather than guessed from general knowledge.
Done well, this gives you answers that cite your actual documents and stay current as those documents change — without retraining anything. Done badly, it gives you confident answers built on the wrong passages. The difference is almost entirely in the retrieval, which is where this guide spends most of its time.
The pipeline, end to end
A RAG system has two phases.
Indexing (done ahead of time):
- Collect your source documents.
- Split them into chunks of manageable size.
- Embed each chunk — convert it into a numerical vector that captures its meaning.
- Store those vectors in a vector database.
Answering (done per question):
- Embed the question the same way.
- Search the vector store for the chunks most similar to the question.
- Assemble the top chunks into a prompt alongside the question.
- Generate an answer with the model, instructed to use the provided context.
That's the whole architecture. The art is in each step.
Step 1: Chunk thoughtfully
Chunking is the most underrated decision. Too large, and each chunk contains lots of irrelevant text that dilutes retrieval and wastes context. Too small, and you lose the surrounding meaning a passage needs to make sense.
Practical guidance:
- Aim for chunks that capture a coherent idea — often a few hundred words, but tune to your content.
- Overlap chunks slightly so a thought split across a boundary isn't lost.
- Respect natural structure — split on sections, paragraphs or headings rather than blindly every N characters.
- Keep useful metadata with each chunk (source document, section, date) so you can cite and filter.
Step 2: Embeddings and the vector store
An embedding model turns text into a vector such that similar meanings sit close together in vector space. Pick a reputable embedding model and, crucially, use the same one for both your documents and your queries — mixing them breaks the geometry.
The vector store holds these vectors and does fast similarity search. For small projects this can be a lightweight library; at scale it's a dedicated vector database. Either way the job is the same: given a query vector, return the nearest chunks.
Step 3: Retrieve well
This is where most RAG systems live or die. A few techniques that consistently help:
- Hybrid search — combine semantic (vector) search with old-fashioned keyword search. Semantic search understands meaning; keyword search nails exact terms, names and codes that embeddings sometimes blur. Together they beat either alone.
- Re-ranking — fetch a generous set of candidates, then use a more precise model to re-order them and keep the best few. Cheap retrieval for recall, careful re-ranking for precision.
- Filtering with metadata — narrow by date, document type or department before semantic search when you can.
Step 4: Prompt the model to stay grounded
With good chunks in hand, instruct the model clearly: answer using only the provided context, cite which passage each claim comes from, and say plainly when the context doesn't contain the answer. That last instruction is what prevents the system from quietly falling back to invented general knowledge. An honest "the documents don't cover this" is a feature, not a failure.
Where teams go wrong
Almost every disappointing RAG system fails for the same reason: the right context never gets retrieved. Before blaming the model, check the retrieval. A simple diagnostic: take a question that got a bad answer, look at the chunks that were actually fetched, and ask whether a human handed only those chunks could have answered correctly. If not, the problem is upstream — your chunking, embeddings or search — and no fancier model will fix it.
Other common traps: chunks too big or too small; query and document embeddings from different models; no keyword fallback for exact terms; and no evaluation set, so you're tuning blind.
Start small, measure, then scale
Build the simplest version first — basic chunking, a small vector store, a clear grounding prompt — and assemble a handful of real questions with known good answers as an evaluation set. Measure retrieval before you measure generation. Once retrieval is reliably surfacing the right passages, the rest of the system tends to fall into place.
Ask Relay — he reads every question himself and replies personally by email.
