_CORE

Každý tým dokáže za odpoledne sestavit RAG prototyp, který na demo působí přesvědčivě. Ale mezi „funguje v Jupyteru" a „běží v produkci 24/7 na reálných datech" leží propast, kterou většina projektů nikdy nepřekročí. Tenhle článek je o tom, jak ji překročit — bez iluzí a bez marketingových zkratek.

Co je RAG a proč nestačí základní implementace

Retrieval-Augmented Generation (RAG) je architektonický pattern, kde jazykový model negeneruje odpovědi čistě z parametrické paměti, ale nejdřív si vyhledá relevantní kontext z externích zdrojů — dokumentů, databází, API — a teprve pak formuluje odpověď. Principiálně jednoduchý koncept: embed dotaz, najdi podobné dokumenty, vlož je do promptu, generuj odpověď.

Problém je, že tato jednoduchá verze funguje jen na jednoduchá data. Jakmile máte tisíce dokumentů různých formátů, data, která se mění denně, uživatele, kteří kladou neočekávané otázky, a business požadavek na nulovou toleranci halucinací — naivní RAG se rozpadne. Ne na úrovni modelu, ale na úrovni celého systému.

5 nejčastějších chyb v produkčním RAG

Za poslední dva roky jsme viděli desítky RAG implementací — vlastních i klientských. Tyhle chyby se opakují s překvapivou pravidelností.

1 Chunking bez strategie

Většina prototypů rozdělí dokumenty na fixní kusy po 512 tokenech a jde dál. V produkci je to katastrofa. Fixní chunking ignoruje strukturu dokumentu — rozsekne tabulku napůl, oddělí nadpis od obsahu, smíchá dva nesouvisející paragrafy do jednoho chunku. Výsledek: retriever vrací kontextově nesmyslné fragmenty a model z nich generuje nesmyslné odpovědi.

Řešení: Hierarchický chunking respektující strukturu dokumentu. Chunky na úrovni sekcí, paragrafů a vět s překryvem. Metadata o hierarchii (ke kterému dokumentu, kapitole a sekci chunk patří) jsou součástí indexu. Pro tabulky a strukturovaná data — separátní pipeline, ne text chunking.

2 Jeden embedding model na všechno

Obecné embedding modely (ada-002, nomic-embed) fungují rozumně na běžný text. Ale pokud vaše knowledge base obsahuje právní smlouvy, technickou dokumentaci a zákaznické emaily, jeden model na to nestačí. Sémantická vzdálenost mezi dotazem „jaká je výpovědní lhůta" a relevantním paragrafem smlouvy může být pro obecný embedding model příliš velká.

Řešení: Fine-tuned embedding modely na doménových datech. Nebo alespoň hybridní retrieval — kombinace vektorového vyhledávání s keyword-based BM25, kde sémantický model zachytí kontext a BM25 zachytí přesné termíny.

3 Žádný reranking

Vektorové vyhledávání vrátí top-k výsledků seřazených podle cosine similarity. Problém: cosine similarity na embedding vektorech je přibližný signál, ne přesný relevance score. Dva dokumenty se similarity 0.82 a 0.80 mohou být zásadně odlišné v kvalitě odpovědi na konkrétní dotaz. Bez rerankingu model dostane nesprávně seřazený kontext, což přímo ovlivňuje kvalitu odpovědi.

Řešení: Cross-encoder reranker (Cohere Rerank, bge-reranker, ColBERT) jako druhý stupeň. Retriever vrátí top-50 kandidátů, reranker je přeseřadí na základě skutečné relevance k dotazu, a model dostane top-5 skutečně nejrelevantnějších chunků.

4 Ignorování freshness a verzování dat

RAG prototyp naplníte jednou a demonstraci uděláte nad statickými daty. V produkci se dokumenty mění denně. Zákaznická dokumentace se aktualizuje, smlouvy se obnovují, produktové specifikace se verzují. Pokud váš index neodráží aktuální stav dat, model odpovídá na základě zastaralých informací — a to je horší než žádná odpověď.

Řešení: Inkrementální indexovací pipeline s change detection. Content hashing pro detekci změn, timestampy pro freshness scoring, verzování embeddings. A hlavně: jasná strategie, kdy se reindexuje a jak se řeší konflikt mezi starými a novými verzemi dokumentu.

5 Žádné evaluace a metriky

„Zeptali jsme se 10 otázek a odpovědi vypadaly OK" není evaluace. V produkci potřebujete systematické měření kvality retrieval i generace. Bez metrik nevíte, jestli změna v chunking strategii zlepšila nebo zhoršila kvalitu odpovědí. Nevíte, na jakých typech dotazů systém selhává. A nevíte, kdy kvalita klesla pod akceptovatelnou úroveň.

Řešení: Evaluační pipeline od prvního dne. Retrieval metriky (recall@k, MRR, nDCG), generační metriky (faithfulness, answer relevancy, hallucination rate), a golden test set s ručně ověřenými páry otázka–odpověď. Automatizované, běží po každé změně.

Ověřené architektonické patterny

Po desítkách nasazení se nám vykrystalizovala architektura, která funguje konzistentně napříč doménami. Tři klíčové vrstvy: indexovací pipeline, retrieval strategie a reranking.

Produkční RAG architektura
Datové zdroje
PDF / DOCX
Databáze
API / Web
Confluence
Ingestion pipeline
Parsing & OCR
Hierarchický chunking
Embedding
Metadata enrichment
Úložiště
Vector DB (pgvector / Qdrant)
Full-text index (BM25)
Metadata store
Retrieval & Reranking
Query rewriting
Hybrid search
Cross-encoder reranker
Context assembly
Generace & Validace
LLM generace
Hallucination check
Citation extraction
Odpověď + zdroje

Indexovací pipeline

Indexovací pipeline je základ, na kterém stojí všechno ostatní. Vstupem jsou surové dokumenty v různých formátech, výstupem je strukturovaný, prohledávatelný index. Klíčové komponenty:

  • Document parsing: Unstructured.io nebo vlastní parsery pro PDF, DOCX, HTML. OCR pro skenované dokumenty. Extrakce tabulek a obrázků jako separátní entity.
  • Hierarchický chunking: Sekce → paragrafy → věty. Každý chunk nese metadata o svém místě v hierarchii. Parent-child vztahy umožňují při retrieval vrátit širší kontext.
  • Metadata enrichment: Automatická klasifikace typu dokumentu, extrakce entit (jména, data, částky), přiřazení tagů. Metadata se indexují samostatně a slouží pro filtrování při retrieval.
  • Change detection: Content hashing (SHA-256) pro detekci změn. Reindexuje se jen to, co se skutečně změnilo. Staré verze se archivují, ne mažou.

Retrieval strategie

Naivní „embed query → cosine search → top-k" má v produkci dvě zásadní slabiny: jednokrokový retrieval nezvládá složité dotazy a čistě vektorové vyhledávání ztrácí přesné termíny. Proto používáme multi-stage retrieval:

  • Query rewriting: LLM přeformuluje uživatelský dotaz do 2–3 variant optimalizovaných pro retrieval. „Jak funguje reklamace?" → „proces vyřízení reklamace", „reklamační řád podmínky", „lhůta pro podání reklamace".
  • Hybrid search: Paralelní vektorové + BM25 full-text vyhledávání. Výsledky se spojí přes reciprocal rank fusion (RRF). Vektorový search zachytí sémantiku, BM25 zachytí přesné termíny a zkratky.
  • Metadata filtering: Před vyhledáváním se aplikují filtry — typ dokumentu, datum platnosti, oprávnění uživatele. Neprohledáváme celý index, ale relevantní podmnožinu.
  • Parent document retrieval: Pokud chunk skóruje vysoce, ale je příliš krátký na plný kontext, systém automaticky načte parent chunk (celou sekci), aby model měl dostatečný kontext.

Reranking jako game changer

Reranking je nejlevnější způsob, jak výrazně zlepšit kvalitu RAG systému. Bi-encoder (embedding model) je rychlý, ale nepřesný — porovnává query a dokument nezávisle. Cross-encoder je pomalý, ale přesný — zpracovává query a dokument společně a generuje skutečný relevance score.

V praxi to vypadá tak, že bi-encoder vrátí top-50 kandidátů za ~20ms, cross-encoder je přeseřadí za ~100ms, a model dostane top-5 skutečně nejrelevantnějších chunků. Latence se zvýší minimálně, kvalita odpovědí výrazně — typicky vidíme 15–25% nárůst v answer accuracy jen přidáním rerankeru.

Produkční retrieval pipeline v kódu

Následující ukázka ukazuje skeleton production-ready retrieval pipeline s hybridním vyhledáváním, rerankingem a structured output:

# production_retrieval.py — RAG retrieval pipeline
from dataclasses import dataclass
from typing import list
import hashlib, logging

logger = logging.getLogger(__name__)

@dataclass
class RetrievedChunk:
    content: str
    source: str
    score: float
    metadata: dict

class ProductionRetriever:
    """Hybrid retriever s reranking a freshness scoring."""

    def __init__(self, vector_store, bm25_index, reranker, llm):
        self.vector_store = vector_store
        self.bm25 = bm25_index
        self.reranker = reranker
        self.llm = llm

    def retrieve(self, query: str, top_k: int = 5) -> list:
        # 1. Query rewriting — LLM generuje varianty
        queries = self._rewrite_query(query)
        logger.info(f"Rewritten into {len(queries)} variants")

        # 2. Hybrid search — vector + BM25
        candidates = {}
        for q in queries:
            vec_results = self.vector_store.search(q, k=30)
            bm25_results = self.bm25.search(q, k=30)
            merged = self._rrf_merge(vec_results, bm25_results)
            for chunk_id, score in merged.items():
                candidates[chunk_id] = max(
                    candidates.get(chunk_id, 0), score
                )

        # 3. Reranking — cross-encoder přeřadí top-50
        top_candidates = sorted(
            candidates.items(), key=lambda x: x[1], reverse=True
        )[:50]
        chunks = [self._load_chunk(cid) for cid, _ in top_candidates]
        reranked = self.reranker.rerank(query, chunks)

        # 4. Freshness penalty — starší dokumenty skórují méně
        for chunk in reranked:
            chunk.score *= self._freshness_weight(chunk.metadata)

        result = sorted(reranked, key=lambda c: c.score, reverse=True)[:top_k]
        logger.info(f"Retrieved {len(result)} chunks, top score: {result[0].score:.3f}")
        return result

    def _rrf_merge(self, vec_results, bm25_results, k=60):
        """Reciprocal Rank Fusion — spojí dva ranked listy."""
        scores = {}
        for rank, (doc_id, _) in enumerate(vec_results):
            scores[doc_id] = scores.get(doc_id, 0) + 1 / (k + rank + 1)
        for rank, (doc_id, _) in enumerate(bm25_results):
            scores[doc_id] = scores.get(doc_id, 0) + 1 / (k + rank + 1)
        return scores

    def _rewrite_query(self, query: str) -> list:
        prompt = f"Přeformuluj dotaz do 3 variant pro vyhledávání:\n{query}"
        variants = self.llm.generate(prompt).split("\n")
        return [query] + [v.strip() for v in variants if v.strip()]

Klíčové aspekty této implementace: query rewriting generuje varianty dotazu pro lepší pokrytí, hybrid search kombinuje sémantické i keyword vyhledávání, RRF merge spojuje výsledky bez nutnosti normalizovat skóre z různých systémů, a freshness penalty penalizuje zastaralé dokumenty. V reálném nasazení přidáváme ještě metadata filtering, caching a circuit breaker pro případ výpadku vector store.

Monitoring a evaluace v produkci

RAG systém bez monitoringu je černá skříňka. Nevíte, jestli funguje, dokud si někdo nestěžuje. A stěžovat si začne pozdě — po desítkách špatných odpovědí, které podkopaly důvěru uživatelů. Proto monitoring stavíme od prvního dne.

Co měřit

  • Retrieval quality: Recall@k, MRR (Mean Reciprocal Rank), nDCG. Měří, jestli retriever vrací správné dokumenty. Vyžaduje golden test set s ručně anotovanými páry query–relevantní dokumenty.
  • Generation quality: Faithfulness (odpověď je podložená retrievnutým kontextem), answer relevancy (odpověď skutečně odpovídá na otázku), hallucination rate (model tvrdí něco, co není v kontextu).
  • Latence: P50, P95, P99 pro celý pipeline i jednotlivé fáze (retrieval, reranking, generace). Uživatel nečeká víc než 3 sekundy — pokud pipeline trvá déle, máte problém.
  • Usage patterns: Jaké typy dotazů uživatelé kladou, kde systém říká „nevím", kde se uživatelé ptají znovu (signál nespokojenosti).
  • Cost per query: Embedding calls, LLM tokens, reranker calls. V produkci s tisíci dotazy denně se náklady rychle sčítají.

Evaluační pipeline

Automatizované evaluace běží po každé změně — jiný chunking, nový embedding model, úprava promptu. Bez toho střílíte naslepo. Používáme kombinaci:

  • Offline eval: Golden test set (100–500 ručně ověřených párů), automatické metriky přes RAGAS framework, regression testy při každém deployi.
  • Online eval: LLM-as-judge na vzorku produkčních dotazů (5–10%), user feedback (thumbs up/down), eskalace na člověka při nízké confidence.
  • Drift detection: Sledování distribuce embedding vektorů a retrieval skóre v čase. Pokud se distribuce změní, pravděpodobně se změnila data nebo chování uživatelů.

Jak RAG stavíme v CORE SYSTEMS

V CORE SYSTEMS přistupujeme k RAG jako k datovému inženýrskému problému, ne jako k AI experimentu. Model je jen jedna komponenta — a obvykle ne ta nejsložitější. Největší práce je v datovém pipeline, kvalitě indexu a provozní spolehlivosti.

Každý projekt začíná data audit workshopem: zmapujeme datové zdroje, zhodnotíme kvalitu a strukturu dokumentů, identifikujeme edge cases (skenované PDF, tabulky v Excelu, vícejazyčný obsah). Teprve pak navrhujeme architekturu — protože chunking strategie pro právní smlouvy je zásadně odlišná od strategie pro produktovou dokumentaci.

Dodáváme end-to-end: indexovací pipeline, retrieval engine, generační vrstvu, evaluační framework a monitoring dashboard. Vše běží na klientské infrastruktuře — podporujeme Azure, AWS i on-premise, protože v regulovaných odvětvích data nesmí opustit perimetr. Provozujeme to, co stavíme — to nás nutí stavět věci, které v produkci skutečně fungují.

Používáme open-source stack (LlamaIndex, pgvector/Qdrant, RAGAS) doplněný o vlastní komponenty pro governance, security a enterprise integrace. Nejsme locked na jednoho LLM providera — podporujeme OpenAI, Anthropic, Azure OpenAI i lokální modely přes vLLM/Ollama, protože volba modelu je business rozhodnutí, ne technické omezení.

Závěr: RAG v produkci je datový inženýring

Největší ponaučení z desítek RAG nasazení? Kvalita RAG systému je z 80 % určena kvalitou dat a retrievalu, ne kvalitou modelu. Lepší chunking, lepší embeddingy, reranking a čisté datové pipeline vám přinesou víc než upgrade z GPT-4o na jakýkoliv novější model.

Firmy, které k RAG přistoupí jako k datovému inženýrskému problému — s robustním pipeline, systematickým měřením a provozní disciplínou — budou mít systém, který funguje 24/7. Ostatní budou pořád předvádět demo v Jupyteru a divit se, proč to v produkci nefunguje.

CORE SYSTEMS — Data & AI tým

Navrhujeme a provozujeme produkční RAG systémy a datové platformy pro enterprise klienty. Od data auditu přes architekturu až po 24/7 provoz.

Další články
Další krok

Chcete RAG, který funguje v produkci?

Začněme data audit workshopem. Zmapujeme vaše datové zdroje, zhodnotíme kvalitu dokumentů a navrhneme RAG architekturu, která přežije kontakt s reálnými uživateli.

Domluvme si workshop