RAG (Retrieval-Augmented Generation)
RAG je technika, ktorá kombinuje vyhľadávanie informácií z externých zdrojov s generovaním textu pomocou LLM. Namiesto spoliehania sa na „pamäť" modelu z tréningu RAG v reálnom čase vyhľadá relevantné dokumenty a použije ich ako kontext pre generovanie presnejších a aktuálnych odpovedí.
V roku 2026 je RAG de facto štandardnou architektúrou pre enterprise AI aplikácie — konkuruje mu hlavne nástup modelov s extrémne dlhým kontextom, no pre väčšinu produkčných scenárov zostáva rýchlejší, lacnejší a kontrolovateľnejší.
1. Ako RAG funguje
Základný workflow:
- Indexovanie: Dokumenty sa rozrežú na chunky a prevedú na vektorové embeddings
- Query processing: Používateľská otázka sa tiež prevedie na embedding
- Retrieval: Systém nájde top-K najpodobnejších chunkov
- Augmentation: Nájdené chunky sa pridajú do promptu ako kontext
- Generation: LLM vygeneruje odpoveď na základe kontextu
Jednoduchý príklad:
# Používateľ: "Aká je naša politika dovoleniek?"
# 1. Vyhľadanie relevantných dokumentov
relevant_docs = vector_db.search("politika dovoleniek", k=3)
# 2. Vytvorenie promptu s kontextom
prompt = f"""
Kontext: {relevant_docs}
Otázka: Aká je naša politika dovoleniek?
Odpoveď:"""
# 3. Generovanie odpovede
response = llm.generate(prompt)
2. Prečo je RAG dôležitý
| Problém klasických LLM |
Ako RAG pomáha |
Praktický dopad |
| Zastarané znalosti |
Real-time prístup k aktuálnym dátam |
Vždy aktuálne odpovede |
| Halucinácie/konfabulácie |
Odpovede zakotvené v reálnych dokumentoch |
Výrazne menej faktických chýb |
| Čierna skrinka |
Citácie zdrojov pre každé tvrdenie |
Overiteľnosť a dôveryhodnosť |
| Nemožnosť updatu |
Stačí aktualizovať dokumenty v DB |
Žiadne pretrénovanie |
| Domain expertise |
Špecializované znalosti z firemných dát |
Expertné odpovede bez fine-tuningu |
- Čísla z praxe (orientačné, závisí od use case):
- Presnosť faktov: ~50 % (vanilla LLM) → ~85–90 % (dobre naladený RAG)
- Náklady: $50 000 fine-tuning → $100–500/mesiac vector DB + inference
- Čas na update znalostnej bázy: dni/týždne retrainingu → minúty pri inkrementálnom indexovaní
3. Technická architektúra RAG
| Komponent |
Funkcia |
Populárne riešenia (2026) |
| Document Store |
Uloženie originálnych dokumentov |
S3, MongoDB, PostgreSQL |
| Chunking Strategy |
Rozdelenie dokumentov na segmenty |
Fixed-size, Semantic, Late chunking |
| Embedding Model |
Konverzia textu na vektory |
OpenAI text-embedding-3, Cohere embed-v4, GTE |
| Vector Database |
Indexovanie a vyhľadávanie vektorov |
Pinecone, Weaviate, Qdrant, pgvector |
| Reranker |
Zoradenie výsledkov podľa relevancie |
Cohere Rerank 3.5, ColBERT, Jina |
| LLM |
Generovanie finálnej odpovede |
GPT-4o, Claude Sonnet, Gemini Flash, Llama 3 |
- Parametre ovplyvňujúce výkon:
# Kľúčové konfiguračné parametre
config = {
"chunk_size": 512, # Veľkosť chunkov (tokeny)
"chunk_overlap": 128, # Prekryv medzi chunkmi
"embedding_dim": 1536, # Dimenzionalita vektorov
"top_k": 5, # Počet retrieved chunkov
"similarity_threshold": 0.7, # Minimálna podobnosť
"rerank_top_n": 3, # Finálny počet po rerankingu
"max_context_length": 8000 # Max tokeny v prompte
}
4. Implementácia RAG systému
def chunk_document(text, chunk_size=500, overlap=50):
chunks = []
for i in range(0, len(text), chunk_size - overlap):
chunk = text[i:i + chunk_size]
chunks.append({
"text": chunk,
"metadata": {"start": i, "end": i + chunk_size}
})
return chunks
- Krok 2: Embedding a indexovanie
from sentence_transformers import SentenceTransformer
import chromadb
embedder = SentenceTransformer('all-MiniLM-L6-v2')
embeddings = embedder.encode(chunks)
client = chromadb.Client()
collection = client.create_collection("knowledge_base")
collection.add(
embeddings=embeddings,
documents=chunks,
ids=[f"chunk_{i}" for i in range(len(chunks))]
)
- Krok 3: Query a generovanie
def answer_question(question):
query_embedding = embedder.encode(question)
results = collection.query(
query_embeddings=query_embedding,
n_results=5
)
context = "\n".join(results['documents'])
prompt = f"Context: {context}\n\nQuestion: {question}\nAnswer:"
response = llm.generate(prompt)
return response
- Frameworky pre rýchly štart: LlamaIndex a LangChain pokrývajú väčšinu RAG primitívov out-of-the-box — indexovanie, chunking, hybrid search, rerankery aj integrované memory. Pre produkciu s vyššou kontrolou sa oplatí postaviť pipeline na meru.
5. Pokročilé RAG techniky
| Technika |
Popis |
Zlepšenie |
| Hybrid Search |
Kombinácia semantic + keyword (BM25) search |
+10–20 % recall |
| Multi-hop RAG |
Iteratívne vyhľadávanie (otázka → docs → follow-up) |
+25 % na komplexných otázkach |
| Self-RAG |
Model sám rozhoduje, kedy potrebuje retrieval |
−30 % zbytočných retrievalov |
| CRAG (Corrective RAG) |
Automatická korekcia irelevantných výsledkov |
+20 % precision |
| Graph RAG |
Knowledge grafy namiesto flat dokumentov |
+35 % na relačných otázkach |
| Multimodal RAG |
Retrieval obrázkov, tabuliek, diagramov (ColPali) |
Pokrytie vizuálnych zdrojov |
| Contextual Retrieval |
Každý chunk dostane LLM-generovaný kontext pred indexovaním |
+49 % menej failed retrievals |
| RAG Fusion |
Viacero query variácií → reciprocal rank fusion |
+15 % na ambiguous queries |
- Contextual Retrieval (Anthropic, 2025): Pred indexovaním každý chunk obohatíme o kontext celého dokumentu pomocou LLM. Chunk „Tržby vzrástli o 15 %" sa zmení na „Čl. 3 výročnej správy Acme Corp 2024: Tržby vzrástli o 15 % medziročne." Retriever tak vie, čo chunk znamená, nielen čo obsahuje.
def add_context_to_chunk(document, chunk, llm):
prompt = f"""
<document>
{document}
</document>
<chunk>
{chunk}
</chunk>
Krátko opíš kontext tohto chunku v rámci celého dokumentu (1-2 vety):
"""
context = llm.generate(prompt)
return f"{context}\n\n{chunk}"
def hybrid_search(query, alpha=0.5):
keyword_results = bm25_search(query)
semantic_results = vector_search(query)
combined_scores = {}
for doc_id, score in keyword_results:
combined_scores[doc_id] = alpha * score
for doc_id, score in semantic_results:
combined_scores[doc_id] += (1 - alpha) * score
return sorted(combined_scores.items(), key=lambda x: x[1], reverse=True)
6. Agentic RAG
V roku 2025–2026 sa klasický RAG posunul k agentickému RAG — namiesto jedného statického retrieval kroku agent dynamicky rozhoduje o stratégii vyhľadávania.
| Klasický RAG |
Agentic RAG |
| Jeden retrieval krok |
Iteratívne, multi-step retrieval |
| Pevný počet chunkov |
Agent rozhoduje, koľko a čo hľadať |
| Pasívny — len odpovedá |
Aktívny — môže volať tools, API, DB |
| Deterministický pipeline |
Flexibilný reasoning loop |
- Príklad: ReAct loop pre RAG
# Agent uvažuje → koná → pozoruje → opakuje
def agentic_rag(question):
context = []
for step in range(max_steps):
# Thought: čo potrebujem zistiť?
thought = llm.think(question, context)
if thought.action == "search":
docs = vector_db.search(thought.query)
context.extend(docs)
elif thought.action == "answer":
return llm.generate_answer(question, context)
elif thought.action == "call_api":
data = external_api.get(thought.endpoint)
context.append(data)
- Kedy použiť: Multi-hop otázky, kde odpoveď vyžaduje kombinovanie informácií z viacerých zdrojov, alebo scenáre kde agent musí volať externé API (ceny, databázy, kalkulátory).
7. RAG vs. alternatívy
V roku 2026 má RAG troch hlavných konkurentov: fine-tuning, long-context modely a MCP.
| Prístup |
Kedy použiť |
Výhody |
Nevýhody |
| RAG |
Dynamické, aktualizovateľné znalosti |
Lacné, citácie, aktuálnosť |
Retrieval latency, chunking overhead |
| Fine-tuning |
Pevný štýl/formát, domain terminológia |
Rýchla inferencia, bez retrieval |
Drahé, znalosti zastarávajú |
| Long context |
Celý dokument naraz (< 1M tokenov) |
Jednoduché, bez indexovania |
Drahé na inference, "lost in the middle" |
| MCP / Tool use |
Štruktúrované dáta, live API |
Reálne dáta, akcie |
Vyžaduje integráciu, latency |
- Praktické pravidlo:
- Menej ako ~20 dokumentov → long context (hoď ich priamo do promptu)
- Viac ako 20, aktualizujú sa → RAG
- Chceš zmeniť správanie/štýl modelu → fine-tuning
- Potrebuješ live dáta (burza, ERP) → MCP / tool calling
8. Optimalizácia výkonu
| Stratégia |
Vhodné pre |
Chunk size |
Pros |
Cons |
| Fixed-size |
Všeobecné texty |
500–1000 tokenov |
Jednoduché |
Môže rozbiť kontext |
| Semantic |
Štruktúrované dokumenty |
Variable |
Zachováva význam |
Komplexnejšie |
| Sliding window |
Dlhé dokumenty |
500 + 100 overlap |
Lepší context coverage |
Viac chunkov |
| Late chunking |
Dlhé dokumenty s globálnym kontextom |
Variable |
Lepšie embeddings |
Vyžaduje dlhý encoder |
- Embedding model selection (2026):
| Model |
Provider |
Dimensions |
Quality |
Cost |
| text-embedding-3-large |
OpenAI |
3072 |
Výborná |
$0.00013/1k tokenov |
| embed-v4 |
Cohere |
1024 |
Výborná |
$0.0002/1k tokenov |
| all-MiniLM-L6 |
Open source |
384 |
Dobrá |
Zadarmo |
| GTE-large |
Alibaba/HF |
1024 |
Veľmi dobrá |
Zadarmo |
9. Monitoring a metriky
| Metrika |
Definícia |
Target |
Ako merať |
| Retrieval Precision |
% relevantných dokumentov medzi retrieved |
>80 % |
Human evaluation / LLM judge |
| Answer Faithfulness |
Odpoveď netvrdí nič navyše oproti kontextu |
>95 % |
RAGAS framework |
| Answer Relevance |
Odpoveď rieši pôvodnú otázku |
>90 % |
Ground truth comparison |
| Latency |
Čas odpovede end-to-end |
<2 s |
Performance monitoring |
| Context Recall |
% kľúčových faktov zachytených retrieval-om |
>70 % |
RAGAS |
def debug_rag(question):
print(f"Question: {question}")
retrieved = retrieve(question)
print(f"Retrieved {len(retrieved)} chunks")
print(f"Relevance scores: {[r.score for r in retrieved]}")
context = build_context(retrieved)
print(f"Context length: {len(context)} tokens")
response = generate(context, question)
print(f"Used {count_citations(response)} citations")
return response
10. Produkčné nasadenie
- Stack pre production RAG:
| Layer |
Component |
Options |
Considerations |
| Data Pipeline |
ETL/Ingestion |
Airflow, Dagster |
Scheduling, monitoring |
| Vector DB |
Storage + Search |
Pinecone, Qdrant, pgvector |
Scale, latency, cost |
| API Layer |
Serving |
FastAPI, LiteLLM |
Rate limiting, auth |
| Caching |
Semantic cache |
Redis + embedding similarity |
TTL stratégia |
| Monitoring |
Observability |
RAGAS, Langfuse, Datadog |
Metriky, alerty |
| LLM Gateway |
Model management |
LiteLLM, Portkey |
Fallbacks, load balancing |
- Cost optimization:
- Semantic caching: Ukladaj podobné otázky podľa embedding similarity (20–50 % úspora)
- Incremental indexing: Indexuj len nové/zmenené dokumenty
- Smart routing: Jednoduché otázky → lacnejší/menší model
- Embedding cache: Rovnaký text → rovnaký embedding, neembedduj dvakrát
11. Use cases a príklady
| Doména |
Aplikácia |
Výsledky |
| Customer Support |
Chatbot nad knowledge base |
−60–70 % ticketov, vyššia spokojnosť |
| Legal |
Analýza zmlúv, vyhľadávanie judikatúry |
5–10× rýchlejší research |
| Healthcare |
Medical literature QA |
Vysoká presnosť na klinické otázky |
| Education |
Personalizované doučovanie |
Merateľné zlepšenie výsledkov |
| Enterprise |
Interný knowledge management |
Hodiny ušetrené denne na tíme |
| E-commerce |
Product QA + odporúčania |
Vyšší konverzný pomer |
| Software Dev |
Codebase QA (napr. cez MCP) |
Rýchlejší onboarding, menej duplicít |
Zhrnutie
- RAG je v roku 2026 zlatý štandard pre enterprise AI aplikácie vyžadujúce aktuálne, verifikovateľné a doménovo špecifické odpovede
- Citácie zdrojov a nízka miera halucinácií robia z RAG riešenie vhodné tam, kde záleží na dôveryhodnosti — právnictvo, medicína, financie
- Implementácia za $100–500/mesiac je rádovo lacnejšia ako fine-tuning, pričom znalostná báza sa aktualizuje v reálnom čase
- V roku 2026 sa posúvame od statického RAG k agentickému — modely dynamicky rozhodujú, čo, kedy a koľkokrát vyhľadať
- Kľúč k úspechu: Kvalitné chunking a contextual retrieval, hybrid search, reranker — a meranie cez RAGAS ešte pred spustením do produkcie