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

  1. Chunk size - experimentujte (500-1500 tokenov)
  2. Overlap - 10-20% pre kontext
  3. Metadata - pridajte zdroj, dátum, kategóriu
  4. 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.