RAG vs Fine-Tuning: Debug the Failure Before Changing the Model
When an LLM application produces bad answers, the first instinct is often to change the model.
Try a larger model. Add more examples to the prompt. Fine-tune it on domain-specific data. Maybe introduce a vector database.
But these interventions solve different problems. Applying the wrong one can increase cost and complexity without improving the result.
Consider two failure cases:
An enterprise assistant gives an outdated answer because the latest policy never reached the model.
A classification system has all the information it needs but repeatedly produces inconsistent output formats.
The first is a knowledge-access problem. The second is a behavior problem.
RAG changes what information the model can access at inference time. Fine-tuning changes the behavior learned by the model.
At SotaTek, we approach this decision as an engineering problem: identify the failing layer, measure it, and introduce the smallest change that addresses the actual failure.
Let's break down how to do that.
- Understand What Each Technique Actually Changes
Retrieval-Augmented Generation (RAG)
RAG retrieves external information at runtime and provides it as context to the LLM.
User Query
|
v
Query Processing
|
v
Search / Retrieval
|
v
Reranking and Context Selection
|
v
LLM + Retrieved Evidence
|
v
Answer + Source References
The model's weights remain unchanged. The application changes the information available to the model for a particular request.
This is useful when answers depend on private, changing, or traceable information, such as internal policies, product catalogs, technical documentation, or customer records.
When a policy changes, the knowledge source can be updated and re-indexed without retraining the model.
Fine-Tuning
Fine-tuning adjusts a pretrained model using additional training examples to reinforce desired behavior.
Suppose a model must transform incident reports into a fixed internal classification schema.
{
"input": "Surface blistering detected near connector.",
"output": {
"category": "MATERIAL_DELAMINATION",
"severity": "S2",
"inspection_route": "MICROSCOPY"
}
}
A fine-tuning dataset can contain many representative input-output examples that demonstrate the required behavior.
The objective is not primarily to teach the model which incident happened yesterday. It is to make the model more consistent at performing a particular task.
This can be useful for specialized classification, structured extraction, domain-specific transformations, and high-volume tasks where prompt overhead or inference efficiency matters.
- Diagnose the Failure Before Choosing a Solution
A useful starting point is to separate the problem into three layers.
Layer
Diagnostic question
Potential intervention
Retrieval
Did the system find the correct evidence?
Improve search, metadata, chunking, or reranking
Context
Did the relevant evidence reach the model?
Improve context selection and prompt construction
Generation
Did the model use the evidence correctly?
Improve prompting, validation, or evaluate fine-tuning
This distinction prevents a common mistake: trying to fix a retrieval failure by changing the model.
Imagine an enterprise assistant that must answer questions about internal security policies.
The correct policy exists in the knowledge base, but retrieval consistently ranks it outside the top five results.
A larger LLM may generate a more convincing response, but it cannot reliably use evidence that never reaches its context window.
The right intervention is probably in the retrieval pipeline, not model training.
- Evaluate the Baseline Before Changing Anything
Before introducing RAG or fine-tuning, establish a baseline using representative test cases.
For an enterprise assistant, you might track:
Metric
Baseline
Answer accuracy
71%
Groundedness
68%
Format compliance
91%
Retrieval Recall@5
62%
These figures are illustrative, not benchmark results.
Even this small dataset suggests a direction: retrieval recall is relatively weak, while format compliance is already stronger.
Fine-tuning should not be the first intervention without further evidence. The system may be failing because it cannot retrieve the information required to answer correctly.
For a RAG application, evaluate retrieval and generation separately.
def evaluate_rag(query, expected_doc_ids, retriever, generator):
retrieved = retriever.search(
query=query,
top_k=5,
)
retrieved_ids = {
document.id for document in retrieved
}
relevant_ids = set(expected_doc_ids)
recall_at_5 = (
len(retrieved_ids & relevant_ids)
/ len(relevant_ids)
if relevant_ids else 0.0
)
answer = generator.generate(
query=query,
context=retrieved,
)
return {
"recall_at_5": recall_at_5,
"answer": answer,
"retrieved_count": len(retrieved),
}
This is a simplified evaluation example. A production implementation also needs to handle multiple relevant documents, retrieval ranking, empty results, access permissions, and answer-quality grading.
The important principle is to measure the retrieval layer independently from the generation layer.
Otherwise, a single answer-quality score tells you that something failed without telling you where to investigate.
- A Production RAG Pipeline Is More Than a Vector Database
A basic RAG implementation often looks like this:
Documents -> Embeddings -> Vector DB -> LLM
That can demonstrate the concept, but production retrieval typically requires additional components:
Document parsing and structure extraction
Chunking and metadata enrichment
Vector, lexical, or hybrid search
Query rewriting
Permission-aware filtering
Reranking
Context selection
Citation mapping
Retrieval and groundedness evaluation
Consider a multi-tenant enterprise application.
Retrieval must enforce the user's permissions before documents are passed into the model. Filtering the final answer afterward is not a substitute for preventing unauthorized context from entering the generation pipeline.
A simplified retrieval flow might look like this:
def answer_question(query, user):
candidates = search(
query=query,
workspace_id=user.workspace_id,
permissions=user.permissions,
top_k=30,
)
ranked = rerank(
query=query,
documents=candidates,
)
context = select_context(
documents=ranked,
max_documents=5,
)
return llm.generate(
question=query,
context=context,
instructions=(
"Answer using the provided evidence. "
"Cite sources for factual claims. "
"If evidence is insufficient, say so."
),
)
The functions are illustrative rather than tied to a specific framework. Authorization must also be enforced by a trusted application layer, not delegated to the model or a prompt instruction.
If the correct information is already available but retrieval is poor, improve the retrieval system before assuming that the model needs fine-tuning.
- When Fine-Tuning Becomes Worth Evaluating
Fine-tuning is more relevant when the model receives adequate information but repeatedly fails to perform the task in the required way.
Typical signals include:
Output schemas are inconsistent despite clear instructions.
The same specialized classification task produces unstable results.
Domain terminology is repeatedly misunderstood.
Few-shot examples make the prompt excessively large.
A smaller model needs to reproduce behavior previously achieved with a larger one.
However, fine-tuning is not automatically the next step.
Before training, check whether the failure can be solved with clearer instructions, structured output constraints, better examples, or simpler application logic.
If fine-tuning is justified, keep training, validation, and final evaluation data separate.
from sklearn.model_selection import train_test_split
train_data, holdout_data = train_test_split(
examples,
test_size=0.20,
random_state=42,
)
train_data, validation_data = train_test_split(
train_data,
test_size=0.125,
random_state=42,
)
print("Training:", len(train_data))
print("Validation:", len(validation_data))
print("Holdout:", len(holdout_data))
This produces an approximate 70/10/20 split.
For production datasets, split by the appropriate unit, such as customer, document, time period, or source record, when random splitting could leak near-duplicate examples across datasets.
After training, evaluate both the target behavior and potential regressions on previously supported tasks.
A model that improves formatting but loses general capability may not be a worthwhile trade-off.
- Compare Total System Cost, Not Just Model Cost
RAG and fine-tuning move engineering and operating costs to different places.
Factor
RAG
Fine-tuning
Initial engineering
Data ingestion and retrieval
Dataset preparation and training
Knowledge updates
Synchronize or re-index sources
May require another tuning cycle
Inference latency
Retrieval and reranking add steps
May use a simpler inference path
Prompt size
Retrieved context can be large
Learned behavior may reduce prompt examples
Main evaluation focus
Retrieval and groundedness
Task behavior and regression
Maintenance
Data freshness and retrieval quality
Training data and model versions
Source traceability
Supported through retrieved metadata
Not inherently provided by model weights
Neither approach is universally cheaper or faster.
RAG adds retrieval infrastructure and runtime work. Fine-tuning adds training, validation, artifact management, and model-version maintenance.
The right comparison is the total cost per successful business task, including retries, human review, infrastructure, and operational maintenance.
A lower inference cost per request does not necessarily translate into a lower cost per successful outcome.
- When Both Techniques Make Sense
Some applications genuinely have both problems.
Consider an enterprise compliance assistant that must:
Retrieve the latest regulations and internal policies.
Compare relevant clauses.
Apply an organization-specific classification scheme.
Produce a structured review.
Cite supporting evidence.
RAG provides the current, traceable knowledge. Fine-tuning may help with the specialized output behavior if evaluation shows that prompting alone is insufficient.
The architecture could look like this:
User Request
|
v
Permission-Aware Retrieval
|
v
Current Evidence + Source Metadata
|
v
Fine-Tuned Model
|
v
Structured Output
|
v
Validation + Citation Checks
|
v
Human Review, If Required
The two techniques operate at different layers.
But combining them should be an evidence-based decision. Irrelevant retrieved context can introduce noise, even when the model has been fine-tuned successfully.
Test the baseline, RAG-only, fine-tuning-only where appropriate, and hybrid configuration against the same held-out evaluation set.
Keep the hybrid architecture only if the improvement justifies its additional complexity.
- A Practical Decision Framework
Use this sequence when deciding what to build:
Start with the base model
|
v
Can prompting and output constraints
meet the evaluation target?
|
Yes | No
| |
v v
Ship Diagnose the failure
|
+------+------+
| |
v v
Missing or Inconsistent
stale knowledge behavior
| |
v v
RAG Evaluate fine-tuning
| |
+------+------+
|
v
Do both problems remain?
|
Yes | No
| |
v v
Evaluate Keep the simplest
hybrid working approach
A few practical rules follow:
If the model needs current, private, or source-backed information, start by evaluating RAG.
If the information is already available but the model consistently performs the task incorrectly, investigate behavior and prompting before considering fine-tuning.
If both knowledge access and specialized behavior are failing, evaluate the two interventions independently before combining them.
If the base model already meets the acceptance criteria, avoid adding infrastructure without a measurable reason.
Final Thoughts
RAG and fine-tuning are not competing ways to make an LLM smarter. They address different failure modes.
RAG changes the evidence available to the model. Fine-tuning changes the behavior learned by the model.
The engineering challenge is to identify which layer is failing and prove that the proposed intervention improves the result.
That requires more than selecting a model or a vector database. It requires representative evaluation data, clear metrics, reliable retrieval, controlled access, regression testing, and production monitoring.
At SotaTek, we treat these choices as part of a broader AI engineering process: start with the use case, establish a baseline, validate the architecture, and introduce model customization only when the evidence supports it.
For a broader view of how these decisions fit into enterprise AI delivery, see our AI Development Process guide.
Top comments (1)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.