Retrieval-Augmented Generation (RAG) je technika, ktorá kombinuje LLM s vyhľadávaním v externých dokumentoch. Výsledok: AI, ktorá pozná vaše dáta.
Problém s LLM
LLM majú obmedzenia:
- Cutoff date - nepoznajú aktuálne informácie
- Halucinácie - vymýšľajú si fakty
- Žiadne firemné dáta - nepoznajú váš kontext
Ako RAG funguje
1. Používateľ položí otázku
2. Systém vyhľadá relevantné dokumenty
3. Dokumenty sa pridajú do kontextu LLM
4. LLM odpovie na základe dát
┌─────────┐ ┌─────────────┐ ┌─────────┐
│ Query │────►│ Retrieval │────►│ LLM │
└─────────┘ └─────────────┘ └─────────┘
│ │
┌─────┴─────┐ ┌─────┴─────┐
│ Vector │ │ Answer │
│ DB │ └───────────┘
└───────────┘
Implementácia s LangChain
1. Načítanie dokumentov
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# Načítanie PDF
loader = PyPDFLoader("company_docs.pdf")
documents = loader.load()
# Rozdelenie na chunky
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
chunks = splitter.split_documents(documents)
2. Vytvorenie embeddings
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
3. Retrieval + Generation
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
qa_chain = RetrievalQA.from_chain_type(
llm=OpenAI(),
chain_type="stuff",
retriever=vectorstore.as_retriever(
search_kwargs={"k": 5}
)
)
answer = qa_chain.run("Aké sú podmienky vrátenia tovaru?")
Pokročilé techniky
Hybrid Search
Kombinácia keyword a semantic search:
from langchain.retrievers import BM25Retriever, EnsembleRetriever
bm25 = BM25Retriever.from_documents(documents)
semantic = vectorstore.as_retriever()
hybrid = EnsembleRetriever(
retrievers=[bm25, semantic],
weights=[0.4, 0.6]
)
Re-ranking
Preusporiadanie výsledkov podľa relevancie:
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CohereRerank
reranker = CohereRerank()
compression_retriever = ContextualCompressionRetriever(
base_compressor=reranker,
base_retriever=retriever
)
Best Practices
- Chunk size - experimentujte (500-1500 tokenov)
- Overlap - 10-20% pre kontext
- Metadata - pridajte zdroj, dátum, kategóriu
- Evaluation - merajte kvalitu odpovedí
Use Cases
- Customer support - FAQ, dokumentácia
- Legal - analýza zmlúv
- HR - interné politiky
- Sales - produktové informácie
Záver
RAG je najrýchlejší spôsob, ako dať AI prístup k vašim dátam. Bez fine-tuningu, bez trénovania - len indexovanie a retrieval.