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 spoliehaľa 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í.
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 |
| Halucinace/konfabulácie |
Odpovede založené na reálnych dokumentoch |
70% 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:
- Presnosť faktov: 45% (vanilla LLM) → 92% (RAG)
- Náklady: $50,000 fine-tuning → $100/mesiac vector DB
- Čas na update: 2-3 mesiace retraining → instant
3. Technická architektúra RAG
| Komponent |
Funkcia |
Populárne riešenia |
| Document Store |
Uloženie originálnych dokumentov |
S3, MongoDB, PostgreSQL |
| Chunking Strategy |
Rozdelenie dokumentov na segmenty |
Fixed-size, Semantic, Sliding window |
| Embedding Model |
Konverzia textu na vektory |
OpenAI Ada, Cohere, Sentence-BERT |
| Vector Database |
Indexovanie a vyhľadávanie vektorov |
Pinecone, Weaviate, ChromaDB, Qdrant |
| Reranker |
Zoradenie výsledkov podľa relevancie |
Cohere Rerank, Cross-encoder |
| LLM |
Generovanie finálnej odpovede |
GPT-4, Claude, Llama |
- 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": 4000 # Max tokeny v prompte
}
4. Implementácia RAG systému
# Chunking stratégie
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
# Vytvorenie embeddingov
embedder = SentenceTransformer('all-MiniLM-L6-v2')
embeddings = embedder.encode(chunks)
# Uloženie do vector DB
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):
# Embed otázku
query_embedding = embedder.encode(question)
# Vyhľadaj relevantné chunky
results = collection.query(
query_embeddings=query_embedding,
n_results=5
)
# Vytvor prompt s kontextom
context = "\n".join(results['documents'])
prompt = f"Context: {context}\n\nQuestion: {question}\nAnswer:"
# Generuj odpoveď
response = llm.generate(prompt)
return response
5. Pokročilé RAG techniky
| Technika |
Popis |
Improvement |
| Hybrid Search |
Kombinácia semantic + keyword search |
+15% recall |
| Multi-hop RAG |
Iteratívne vyhľadávanie (question → docs → follow-up → more docs) |
+25% na komplexných otázkach |
| Self-RAG |
Model sám rozhoduje kedy potrebuje retrieval |
-30% zbytočných retrievals |
| CRAG (Corrective RAG) |
Automatická korekcia irelevantných výsledkov |
+20% precision |
| Graph RAG |
Použitie knowledge graphs namiesto flat documents |
+35% na relačných otázkach |
| Multimodal RAG |
Retrieval obrázkov, tabuliek, diagramov |
+40% na technických dokumentoch |
# Kombinácia BM25 (keyword) + semantic search
def hybrid_search(query, alpha=0.5):
keyword_results = bm25_search(query)
semantic_results = vector_search(query)
# Weighted combination
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. Optimalizácia výkonu
| Stratégia |
Vhodné pre |
Chunk size |
Pros |
Cons |
| Fixed-size |
Všeobecné texty |
500-1000 tokens |
Jednoduché, predvídateľné |
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 |
| Document-based |
Krátke dokumenty |
Celý dokument |
Plný kontext |
Neškáluje pre veľké docs |
- Embedding model selection:
| Model |
Provider |
Dimensions |
Speed |
Quality |
Cost |
| Ada-002 |
OpenAI |
1536 |
Fast |
Excellent |
$0.0001/1k tokens |
| all-MiniLM-L6 |
Open source |
384 |
Very fast |
Good |
Free |
| E5-large |
Microsoft |
1024 |
Medium |
Very good |
Free |
| Cohere-v3 |
Cohere |
1024 |
Fast |
Excellent |
$0.0002/1k tokens |
7. Monitoring a metriky
| Metrika |
Definícia |
Target |
Ako merať |
| Retrieval Precision |
% relevantných dokumentov |
>80% |
Human evaluation |
| Answer Accuracy |
Správnosť odpovede |
>90% |
Ground truth comparison |
| Latency |
Čas odpovede end-to-end |
<2s |
Performance monitoring |
| Context Utilization |
% použitého kontextu v odpovedi |
>60% |
Token analysis |
| Source Attribution |
% tvrdení s citáciou |
100% |
Automated checking |
# RAG debugging pipeline
def debug_rag(question):
print(f"Question: {question}")
# 1. Check retrieval
retrieved = retrieve(question)
print(f"Retrieved {len(retrieved)} chunks")
print(f"Relevance scores: {[r.score for r in retrieved]}")
# 2. Check context
context = build_context(retrieved)
print(f"Context length: {len(context)} tokens")
# 3. Check generation
response = generate(context, question)
print(f"Used {count_citations(response)} citations")
return response
8. Produkčné nasadenie
- Stack pre production RAG:
| Layer |
Component |
Options |
Considerations |
| Data Pipeline |
ETL/Ingestion |
Airflow, Dagster |
Schedule, monitoring |
| Vector DB |
Storage + Search |
Pinecone, Weaviate, Qdrant |
Scale, latency, cost |
| API Layer |
Serving |
FastAPI, Flask |
Rate limiting, auth |
| Caching |
Response cache |
Redis, Memcached |
TTL strategy |
| Monitoring |
Observability |
Datadog, Grafana |
Metrics, alerts |
| LLM Gateway |
Model management |
LiteLLM, Portkey |
Fallbacks, load balancing |
- Cost optimization:
- Semantic caching: Ukladaj podobné otázky (30-50% úspora)
- Incremental indexing: Indexuj len nové/zmenené dokumenty
- Compression: Kompresia embeddings (50% storage saving)
- Smart routing: Jednoduché otázky → menší model
9. Use cases a príklady
| Doména |
Aplikácia |
Výsledky |
| Customer Support |
Chatbot nad knowledge base |
-70% ticketov, 4.5/5 satisfaction |
| Legal |
Contract analysis, case law search |
10x rýchlejší research |
| Healthcare |
Medical literature QA |
95% accuracy na clinical queries |
| Education |
Personalized tutoring |
+30% learning outcomes |
| Enterprise |
Internal knowledge management |
2.5h/deň saved per employee |
| E-commerce |
Product recommendation + QA |
+25% conversion rate |
Zhrnutie
- RAG je najefektívnejší spôsob ako dať LLM prístup k aktuálnym a špecifickým informáciám bez nákladného pretrénovania
- 70% redukcia halucinácií a možnosť citovať zdroje robí z RAG go-to riešenie pre enterprise aplikácie
- Implementácia za $100-1000/mesiac je 50-100x lacnejšia ako fine-tuning či vlastný model
- Kľúč k úspechu: Kvalitné chunking, relevantný retrieval a dobrý reranking — nie veľkosť LLM