Nasadili jste AI do e-shopu a model začal doporučovat produkty, které neexistují? Generuje odkazy do prázdna? Vymýšlí si specifikace? Tenhle článek vychází z reálného projektu, kde Google Gemini doporučoval příslušenství k produktům — a halucinoval. Ukážeme si architekturu, která halucinace eliminovala, a dalších 7 technik, jak LLM modely udržet při realitě.
Halucinace je situace, kdy jazykový model (LLM) vygeneruje odpověď, která vypadá přesvědčivě, ale je fakticky nesprávná. Model si „vymyslí" data, odkazy, čísla nebo produkty, které neexistují. Nejedná se o záměrnou lež — model nemá koncept pravdy. Predikuje statisticky nejpravděpodobnější sekvenci tokenů na základě trénovacích dat.
V kontextu e-commerce je to obzvlášť nebezpečné. Představte si, že zákazníkovi doporučíte příslušenství s odkazem na produkt, který ve vašem katalogu neexistuje. Nebo model tvrdí, že objektiv X je kompatibilní s fotoaparátem Y, přestože mají jiný bajonet. Výsledek? Ztráta důvěry, zbytečné reklamace a poškozená reputace e-shopu.
15–20 %
odpovědí LLM modelů obsahuje faktické nepřesnosti při dotazech na specifická data bez kontextu
V jednom z našich e-shopových projektů jsme nasadili Google Gemini pro dvě úlohy: doporučování kompatibilního příslušenství (např. baterie, objektivy, paměťové karty k fotoaparátům) a vyhledávání podobných produktů (alternativy ve stejné kategorii). Naivní přístup — zeptat se Gemini „Jaké příslušenství se hodí k Sony Alpha A7V?" — selhal okamžitě.
Model generoval produktové názvy a URL, které vypadaly věrohodně, ale neodpovídaly žádnému reálnému produktu v katalogu. Vymýšlel katalogová čísla, odkazoval na neexistující stránky a kombinoval reálné značky s fiktivními modely. Klasická halucinace — statisticky pravděpodobný, ale fakticky nesmyslný výstup.
Klíčové poznání: LLM model nemá přístup k vaší databázi. Nemůže vědět, které produkty skutečně prodáváte, jaké mají URL, skladové zásoby nebo ceny. Pokud ho necháte odpovídat bez kontextu, bude hádat — a hádat sebevědomě.
Problém jsme vyřešili architekturou RAG (Retrieval-Augmented Generation) — vzorem, kdy model nedostává otevřený dotaz, ale pracuje výhradně s daty, která mu předložíme. Klíčový princip: model nevyhledává — model vybírá.
Celý systém má tři vrstvy:
Architektura
Než se vůbec obrátíme na LLM, Elasticsearch najde 30–50 reálných produktů, které by mohly být relevantní. Používáme tři vyhledávací strategie a výsledky kombinujeme:
Hledáme produkty, které v popisu, parametrech nebo názvu zmiňují zdrojový produkt. Například pokud hledáme příslušenství k „Sony Alpha A7V", najdeme baterie, které mají v popisu „kompatibilní se Sony Alpha A7V".
Elasticsearch query
Pole body (popis produktu) má nejvyšší váhu (^5), protože výrobci příslušenství většinou uvádí kompatibilitu právě v popisu. Parametry (params) mají váhu ^3, název a nefiltrovaný text nižší.
Ze zdrojového produktu extrahujeme klíčové technické parametry — typ baterie, bajonet objektivu, formát paměťové karty, rozměry filtrů — a hledáme produkty, které tyto hodnoty obsahují.
Příklad
Pokud první dvě strategie nenajdou dostatek kandidátů, hledáme obecné příslušenství od stejné značky v jiné kategorii. Výsledky řadíme podle „karmy" produktu — interní metriky kvality a obliby.
Tip
Všechny strategie filtrují pouze aktivní, viditelné a skladem dostupné produkty. To eliminuje další zdroj potenciálních problémů — doporučení produktů, které si zákazník nemůže koupit.
Kandidáty z Elasticsearch předáme Gemini jako strukturovaný seznam s ID. To je klíčový rozdíl oproti naivnímu přístupu — model nedostává otevřenou otázku, ale konkrétní „menu", ze kterého může vybírat.
Formát kandidátů předaných modelu
Každý kandidát obsahuje: ID z databáze, název, katalogové číslo, značku, kategorii, klíčové parametry a případně cenu a skladovou dostupnost. Model dostane systémovou instrukci, která ho striktně omezuje:
System prompt
Klíčová slova v promptu: „POUZE", „z předloženého seznamu", „validním JSON". Model nemá prostor pro kreativitu — může pouze vybírat ID z předloženého seznamu a zdůvodnit výběr.
I s perfektním promptem může model občas vrátit neočekávaný výstup. Proto je třetí vrstva — serverová validace — nezbytná. Každé ID z Gemini odpovědi ověřujeme proti původnímu seznamu kandidátů:
PHP — validační logika
Všimněte si dvou klíčových principů:
Tato architektura dělá halucinace strukturálně nemožnými. Model nemůže vygenerovat odkaz na neexistující produkt, protože odkazy generuje server z databáze. Model pouze rozhoduje „ano/ne" pro reálné produkty.
RAG (Retrieval-Augmented Generation) není jen buzzword — je to fundamentální změna v tom, co od modelu požadujeme. Porovnejme dva přístupy:
Naivní přístup (halucinace garantovány)
RAG přístup (halucinace eliminovány)
Rozdíl je v tom, že RAG přesouvá úlohu modelu z generování faktů na reasoning nad fakty. Model nemusí „vědět" — musí pouze „rozhodnout". A rozhodování nad strukturovanými daty je přesně to, v čem LLM modely excelují.
0
halucinovaných odkazů po nasazení RAG architektury — model fyzicky nemůže odkázat na neexistující produkt
RAG s Elasticsearch je základ, ale existuje celá řada dalších technik, které můžete kombinovat. Projdeme si sedm nejúčinnějších.
Místo volného textu vyžadujte od modelu striktně definovaný formát odpovědi. Moderní LLM API (Gemini, Claude, GPT-4o) podporují JSON mode nebo response schemas, které model nutí odpovídat v přesně definované struktuře.
Gemini API — response schema
Když model musí vrátit JSON s předdefinovanou strukturou, nemůže „odbočit" do volného textu a vymýšlet narativní odpovědi. Pole id s typem integer ho nutí vrátit číslo, ne vymyšlený URL.
Gemini API nabízí vestavěnou funkci Google Search grounding — model si může ověřit fakta proti živým výsledkům z Google vyhledávání. Aktivujete ji jedním parametrem:
Gemini API — search grounding
V našem projektu jsme tuto metodu použili jako alternativní přístup — Gemini generoval doporučení a současně si ověřoval existenci produktů přes Google. Ale i s touto funkcí jsme museli přidat post-processingovou vrstvu, která ověřovala vygenerované URL proti skutečné databázi a odstraňovala neexistující odkazy pomocí DOM manipulace.
Search grounding je užitečný jako doplňková vrstva, ale sám o sobě nestačí. Model může najít reálnou URL z Google, která ale neodpovídá vašemu katalogu — třeba produkt, který jste přestali prodávat nebo který je u konkurence.
Tip
Search grounding zvyšuje latenci odpovědi o 1–3 sekundy (model musí počkat na výsledky z Google). Pro real-time doporučení v e-shopu je RAG s Elasticsearch rychlejší a spolehlivější.
Technika, kdy model sám sebe kontroluje ve vícekrokovém procesu:
Příklad CoVe promptu
CoVe neeliminuje halucinace úplně, ale výrazně je redukuje — model si často sám odhalí slabá místa. Hodí se zejména pro úlohy, kde nemáte strukturovaná zdrojová data pro plnohodnotný RAG.
Parametr temperature ovlivňuje „kreativitu" modelu. Pro faktické úlohy, kde nechcete žádnou kreativitu, nastavte temperature na minimum:
Gemini API — nízká temperature
Pro naši úlohu doporučování příslušenství používáme temperature: 0.1 — model by měl vybírat kompatibilní produkty konzistentně, ne „kreativně". Kombinace s topP a topK dále zužuje distribuci pravděpodobností a eliminuje dlouhý ocas nepravděpodobných tokenů.
Způsob, jakým formulujete prompt, má obrovský vliv na míru halucinací. Několik osvědčených technik:
Modely mají tendenci vždy odpovědět — i když odpověď neznají. Explicitně jim dejte svolení říct „nevím":
Prompt
Když model musí ke každému výběru uvést důvod, kvalita výrazně stoupá — model si „uvědomí" slabá místa ve svém reasoning:
Prompt
Explicitně zakázat nežádoucí chování:
Prompt
I se všemi výše uvedenými technikami je serverová validace nutná. Nikdy nespoléhejte na to, že model vrátí 100% korektní výstup. Implementujte tyto kontroly:
PHP — extrakce JSON z odpovědi
Dvě doplňkové strategie, které v praxi významně pomohou:
Výsledky LLM doporučení ukládáme do cache (databáze) s TTL několik dní. Výhody:
Pro kritické případy přidejte možnost lidské kontroly:
Shrňme si všechny techniky a jejich účinnost:
| Technika | Účinnost | Kdy použít |
|---|---|---|
| RAG (Elasticsearch + LLM) | ★★★★★ | Vždy, když máte data |
| Constrained output (JSON) | ★★★★☆ | Strukturované úlohy |
| Validace výstupu (ID check) | ★★★★★ | Vždy — poslední síť |
| Nízká temperature | ★★★☆☆ | Faktické úlohy |
| Prompt engineering | ★★★☆☆ | Vždy — základní hygiena |
| Chain-of-Verification | ★★★★☆ | Bez strukturovaných dat |
| Google Search grounding | ★★★☆☆ | Ověření faktů z webu |
| Cachování + HITL | ★★★★☆ | Produkční systémy |
Žádná technika sama o sobě nestačí. V produkčním systému je ideální kombinovat minimálně 3–4 z nich. V našem e-shopovém projektu používáme všech sedm vrstev současně.
Pokud implementujete LLM do systému, kde záleží na faktické správnosti, projděte tento checklist:
responseMimeType: application/json a response schema, pokud to API podporuje.Zlaté pravidlo: LLM model používejte pro reasoning, ne pro retrieval. Nechte ho rozhodovat nad daty, která mu poskytnete — ale nikdy ho nenechte data vymýšlet. To je úloha pro databázi, ne pro jazykový model.
3+1
vrstvy obrany — RAG retrieval, constrained output, serverová validace + cachování jako bonus