Generování textu 3/3


Ať vás článek inspiruje, více si povíme na školení!


V této kapitole si řekneme, jak postavit chatbota nad vlastními daty, tedy automat schopný vést plynulou konverzaci (chat). Chatbota budeme opět stavět přímo nad LLM, například v OpenAI Platformě anebo v Azure OpenAIStudio (Microsoft).

Fungování chatbota stojí na schopnosti modelu sáhnout do poskytnutých dokumentů a dat, která mu předám, přitom si je kvůli velikosti nemusí ukládat a jen pokud je-li dotázán, tak si v dokumentech dokáže příslušnou informaci dovyhledat. A přitom si nevymýšlet.

Jak model vypromptovat aby se držel tématu a odpovídal jen k věci, to jsme si řekli v kapitole Generování textu 2/3. V nějakém momentu se model dostane do situace, kdy nebude informaci vědět, ta bude obsažena v našich dokumentech, model proto spustí function calling a kódem si zavolá o vstupy, ty zpracuje a výsledek pošle uživateli na obrazovku. Ten správný moment, kdy si říct o vstupy, určím modelu dobře napsaným promptem (např „V okamžiku, kdy ses s uživatelem dohodnul, ze které kategorie produkt chce, nevymýšlej si podkategorie, ale použij strom kategorií z dokumentu.„). Je přitom důležité, aby volání mohl dělat jen můj kód v mém prostředí a všechna volání tak byla dobře zabezpečena (např proti tzv SQL injections).

Model si tedy řekne o informaci a tu začne hledat. Tradiční hledání přitom stavělo – zjednodušeně řečeno – na statistice, se kterou modely vyhledávaly výskyty stejných slov a posuzovaly relevantnost. Sémantické metody vyhledávání fungují jinak, na významové logice, tedy hledají texty, které si jsou významově podobné. K tomu účelu použijí techniku embeddingu (o embeddingu jsme si řekli víc v kapitole Generování textu 1/3), kdy vstupní dokumenty převedou do vektorů a poté stejným způsobem vektorizují uživatelský dotaz, aby výsledkem porovnaly jejich vzájemnost, blízkost. Tímto způsobem pochopí, že se ptáte například na zapomenuté heslo a najdou si správnou pasáž ve směrnici, kde se o zapomenutém heslu píše. Nejúčinnější vyhledávání však dnes není ani statistický, ani sémantický model, ale model hybridní, který kombinuje výhody obou technik. Použije tradiční, statistické vyhledávání pro pevné údaje (v uživatelském dotazu je uvedeno např konkrétní číslo SKU / katalogové ID / číslo objednávky) a ten propojí s výsledky embedding search. Výsledky obou hledání nakonec podle nějaké logiky re-rankují. Na samotné ukládání vektorů (embeddingů) a hledání podobností mezi nimi se používají specializované databáze (např Faiss).

Pojďme na konkrétní use case Chatbota jako prodejního asistenta. Nejdříve modelu systémovou zprávou dáme roli („Jsi asistent prodeje„) a informace o druhu zboží a zákaznících, kterým zboží prodává („Pro děti hračky a knížky, pro ženy sukně a kosmetiku,…„). Zároveň mu výslovně zakážeme nabízet jiný sortiment a technikou few-shot learning (kapitola Generování textu 2/3) dáme příklad, jak se zákazníkem mluvit („Pokud budeš dotazovaný na něco jiného, omluv se zdvořile, že to nevedeme. Například: „Omlouvám se, tento sortiment nevedeme, ale hodně zákazníkům vybírající dárek pro děti se líbí XY„“). Můžeme také model instruovat pro případ, že o zákazníkovi něco víme, například že u nás nenakupuje poprvé, popřípadě že volal na zákaznickou linku a podobně. Navedeme dále model na výstupy doporučení pro daného zákazníka (to je úloha pro samostatný ML model), popřípadě další relevantní informace (například že o něm víme, že má děti). Jde nám o to, aby se pro každého přihlášeného uživatele model choval personalizovaně. Do system message potom zadám „Přidám ti databázi z CRM a použij ji, pro co nejlepší doporučení“ a navíc uvedu styl pro ukázku „když budeš používat tyto informace, nepoužívej je autoritativně, ale namísto „Máte kluka“ se zeptej „Naše záznamy indikují, že máte kluka, je to tak?“ Tyto koučovací instrukce na styl by měl dodat marketér/obchoďák, nejde tedy o kompetence IT programátora/technika.

Možná už vnímáte, že prompt bude muset být opravdu chytře vymyšlený a na function calling se budou nabalovat další instrukce: založit objednávku, poslat zákazníka na eshop, kde už má už zboží v košíku atd.

V čem obecně nejsou modely příliš dobré je počítání, matematika. Za tímto účelem vyvinula společnost OpenAI code interpreter jako funkci, která dokáže napsat kód, jeho prostřednictvím vypočítá zadání někde v snadboxu a zpátky pošle hotový výsledek. Můžete proto v rámci promptu instruovat model, aby si v takové situaci odpověď nevymýšlel a přešel na code interpreter.

V průběhu komunikace si model historii chatu uchovává v paměti. Paměť je velmi důležité téma, protože kdyby historie chatu běžela v okně na straně uživatele, ne na straně serveru, bylo by to hodně komunikace mezi klientem a serverem. Navíc v případě výpadku spojení byste museli začínat se od začátku. Modely proto využívají conversation summarization memory: znamená to, že si nemusí držet celou historii chatu, která by to celé zpomalovala, ale udělají si namísto toho shrnutí určitého bloku konverzace a nad ním pokračuje v chatu dál…a to celé pak v průběhu natahující se konverzace opakují. Na konci konverzace celé shrnutí mohou uložit zákazníkovi do profilu a u dalšího kontaktu nebude model se zákazníkem začínat nanovo, ale na základě předchozích interakcí.


Chcete příležitosti AI pochopit lépe?