RAG (retrieval-augmented generation) stojí na třech krocích: převést dokumenty na číselné vektory, při dotazu najít nejpodobnější pasáže a vložit je do promptu jazykového modelu. Celý řetězec se dá provozovat na jednom počítači, aniž by jediný bajt textu odešel do cloudu – dokumenty zůstávají v lokální vektorové databázi a model odpovídá přes Ollamu nebo llama.cpp.
Od PDF k odpovědi v šesti krocích
- Extrakce textu. PyMuPDF (modul fitz), pdfplumber nebo Unstructured převedou PDF na prostý text. U naskenovaných dokumentů je nutné nasadit OCR, nejčastěji Tesseract.
- Chunkování. Text se dělí na bloky o 500–1000 tokenech s překryvem 10–20 %, aby se neztratila informace na hranici odstavců.
- Embedding. Každý blok převede embedding model na vektor o 384–1024 dimenzích.
- Uložení. Vektory a metadata (název souboru, číslo strany) se zapíší do vektorové databáze.
- Dotaz. Otázka se převede stejným modelem a databáze vrátí top-k nejbližších bloků (typicky 3–5) podle kosinové podobnosti.
- Generování. Vybrané bloky se vloží do promptu a lokální LLM podle nich sestaví odpověď. Systémový prompt se nastavuje tak, aby model citoval zdroj a při chybějící informaci to přiznal.
Embedding model rozhoduje o kvalitě vyhledávání
Pro anglické texty stačí all-MiniLM-L6-v2: 384 dimenzí, zhruba 80 MB, běží rychle i na CPU. Na češtinu je ale slabý, protože je trénovaný primárně na angličtině. Pro vícejazyčné dokumenty se používají modely jako intfloat/multilingual-e5-base (768 dimenzí), BAAI/bge-m3 (1024 dimenzí, kontext až 8192 tokenů) nebo mxbai-embed-large (1024 dimenzí). Přes Ollamu se stahují příkazem ollama pull nomic-embed-text (768 dimenzí) nebo mxbai-embed-large.
Důležité pravidlo: stejný model musí zpracovat jak indexované bloky, tak dotaz. Záměna modelů mezi fázemi rozbije podobnost vektorů a vyhledávání přestane fungovat.
Vektorová databáze pro jednoho uživatele
Pro tisíce až desetitisíce bloků není potřeba žádný server. ChromaDB se instaluje přes pip, běží v procesu a data ukládá do lokální složky. FAISS od Facebooku je jen knihovna s indexy v paměti nebo na disku. Qdrant přináší HTTP API a filtrování podle metadat, což se hodí, když chcete omezit hledání na jeden dokument. LanceDB kombinuje vektorové a sloupcové úložiště. Všechny čtyři varianty zvládnou provoz bez internetu.
Lokální jazykový model
Nejjednodušší cesta je Ollama: ollama pull llama3.1:8b, qwen2.5:7b nebo gemma2:9b. Alternativami jsou llama.cpp s ručním nastavením vrstev na GPU (-ngl) a LM Studio s grafickým rozhraním. Modely se stahují v kvantizaci Q4_K_M, která u 7–8miliardového modelu zabere kolem 4–5 GB disku a stejně tolik paměti.
Jaký hardware reálně stačí
Embeddingy zvládne i slušný CPU, protože model je malý a běží dávkově. Nároky určuje LLM:
- GPU s 8 GB VRAM – 7B model v Q4 se vejde, delší kontext (8k tokenů) může narazit; pomůže nižší kvantizace nebo přesun části vrstev na CPU.
- GPU s 12 GB VRAM (např. RTX 3060 12 GB) – komfortní běh 7–8B modelů v Q4 s delším kontextem.
- Apple Silicon s 16 GB unified memory – 7B model běží svižně, protože paměť je sdílená mezi CPU a GPU.
- Jen CPU a 16 GB RAM – funguje to, ale inference se pohybuje v řádu jednotek tokenů za sekundu; na občasné dotazy postačí, na plynulý chat ne.
Vektorová databáze při desítkách tisíc bloků zabere stovky megabajtů, takže pro ni platí stejné nároky jako pro běžnou aplikaci.
Hotové nástroje místo psaní kódu
Kdo nechce psát pipeline ručně, má tři rozumné volby. Open WebUI se připojí k Ollamě a umí nahrát dokumenty a dělat RAG přímo v rozhraní. AnythingLLM je desktopová aplikace s lokálním režimem a správou dokumentů. LlamaIndex a LangChain zůstávají volbou pro vlastní skripty v Pythonu, kde se hodí napojení na firemní systémy nebo vlastní chunkovací logika.
Kde to nejčastěji drhne
Kvalitu odpovědí určuje retrieval, ne model. Pokud chunk obsahuje dvě nesouvisející myšleni, embedding je rozostřený a dotaz ho nenajde. Podobně škodí chunk příliš velký – model sice dostane kontext, ale v promptu zabere místo a vytlačí ostatní bloky. U českých textů je nutné počítat s tím, že anglické embedding modely nerozliší pády a synonyma spolehlivě.
Druhý problém je halucinace: model bez výslovné instrukce si odpověď domyslí, i když v retrieved blocích není. Pomáhá systémový prompt typu „odpovídej pouze z dodaného kontextu, jinak napiš, že informace není k dispozici“ a vracení citací na konkrétní soubor a stranu.
Zálohu celého systému řeší prosté zkopírování složky s vektorovou databází a souborů modelů – žádná data nikam neodcházejí a obnovení na jiném stroji znamená přenést dvě složky.
Foto: Matheus Bertelli / Pexels