Potřeboval jsem porovnat tři tarify domácího internetu, cenu, rychlost a výpovědní lhůtu. Napsal jsem AI, ať mi je stručně shrne. Dostal jsem tři pěkně napsané odstavce, v každém jiné pořadí informací, jeden začínal cenou, druhý rychlostí, třetí větou o „flexibilitě”. Abych je mohl srovnat vedle sebe, musel jsem si stejně vzít papír a přepsat si čísla ručně do řádků.

Zkusil jsem to znovu, tentokrát jsem řekl přesně, co chci: „Vytvoř tabulku se sloupci Tarif, Cena, Rychlost, Výpovědní lhůta.” Tabulka byla hotová za pár vteřin, čísla přesně pod sebou, srovnání na první pohled.

Model přitom stejná fakta znal už napoprvé. Jenom je napoprvé zabalil do formátu, který se na porovnávání nehodí.

Proč z modelu vždycky nejdřív vypadne souvislý text

Model se nerozhoduje mezi tabulkou, odrážkami a JSON podle toho, co by se vám nejlíp hodilo. Vybírá tvar odpovědi, který nejčastěji sedí k tomu, jak zní podobné otázky v datech, na kterých se učil, a to bývá plynulý odstavec, protože většina psaného textu na světě vypadá právě takhle. Ke tvaru jako tabulka nebo seznam se dostane, jen když mu dáte jasný signál, že přesně tenhle tvar chcete.

Rozdíl je stejný jako mezi otázkou „jak se ti líbil ten byt” a otázkou „napiš mi k bytu tři čísla: cenu, metry čtvereční a patro”. První otázka volá po vyprávění. Druhá po tabulce. Model odpoví na obě podle toho, jak jsou položené, ne podle toho, co byste si po pravdě přáli.

Tabulka, když chcete srovnávat

Tabulka se hodí vždycky, když existuje víc položek se stejnými vlastnostmi a chcete je vidět vedle sebe: tarify, produkty, kandidáti na pohovor, týdenní jídelníček. Nejspolehlivěji funguje, když rovnou pojmenujete sloupce, ne když necháte model, ať je vymyslí sám.

Porovnej tři tarify domácího internetu podle zadaných parametrů.
Vytvoř tabulku se sloupci: Tarif, Cena za měsíc, Rychlost, Výpovědní lhůta.

Tarif Basic: 399 Kč, 100 Mbit/s, výpověď 1 měsíc.
Tarif Standard: 549 Kč, 300 Mbit/s, výpověď 2 měsíce.
Tarif Family: 699 Kč, 500 Mbit/s, výpověď 3 měsíce.

V chatovacím okně na webu se taková tabulka rovnou hezky vykreslí. Jakmile ji ale zkopírujete do e-mailu nebo Wordu, formátování se často rozsype do podivných znaků s pruhy a svislítky, protože chat ji generuje v jazyce zvaném Markdown (jednoduché značky pro formátování textu), kterému mimo chat nebo tabulkový program nerozumí každá aplikace stejně. Pro vložení do Excelu funguje spolehlivěji přímo požádat: „výstup jako řádky oddělené tabulátorem, bez markdown syntaxe”, tabulkový procesor si to pak sám rozdělí do buněk.

Odrážky, když má být hlavní pořadí, ne souvislost

Odrážky pomůžou tam, kde je důležité pořadí kroků nebo výčet položek, ne to, jak spolu navzájem souvisí: nákupní seznam, kroky postupu, checklist před cestou. „Napiš seznam pěti věcí, co si sbalit na vícedenní turistiku, každou na samostatný řádek” dá čitelnější výsledek než stejná žádost bez zmínky formátu.

Tam, kde jde o argument nebo vysvětlení, kde jedna myšlenka vyplývá z druhé, odrážky spíš uškodí. Rozseknou souvislý argument na útržky a ztratí se slovo jako „protože” nebo „takže”, které dvě věty spojovalo. Zkuste si sami porovnat vysvětlení, proč zdražila hypotéka, napsané v odstavci, a to samé rozsekané do pěti odrážek. Odrážky vypadají přehledně, ale čtenáři zůstane jen seznam faktů bez toho, jak na sebe navazují.

K odrážkám má model sklon sahat i tam, kde o ně nikdo nežádal, hlavně u shrnutí a odpovědí na širší otázky. Pokud chcete souvislý text, řekněte to výslovně: „odpověz v souvislém odstavci, bez odrážek” bývá stejně účinné jako žádost o opak.

JSON, když výstup čte program, ne člověk

JSON, zkratka pro JavaScript Object Notation, v praxi jde jen o zápis dat pomocí složených závorek, dvojtečky a klíčů v uvozovkách, se hodí, jakmile výstup nemá číst člověk, ale program nebo tabulka, do které ho budete importovat. Typicky když chcete z nestrukturovaného textu, e-mailu, poznámky, vizitky, vytáhnout konkrétní údaje ve tvaru, který jde rovnou zpracovat dál.

Nejspolehlivější je do zadání napsat přesně, jaké klíče a jaký typ hodnoty u nich čekáte, ideálně i s ukázkou prázdné struktury:

Z následujícího textu vytáhni kontaktní údaje a vrať je jako JSON
s klíči: jmeno (text), telefon (text), email (text), firma (text nebo null,
pokud není uvedena). Odpověz pouze JSON objektem, žádný text okolo.

Text: Dobrý den, jsem Petra Nováková z firmy Grafton s.r.o., kdyby bylo
potřeba, ozvěte se na 604 123 456 nebo p.novakova@email.cz.

Model tu dostane přesný tvar, co má vzniknout, ne jen obecné „vytáhni kontakt”. Prázdná ukázka klíčů navíc funguje podobně jako přidělená role: zúží prostor, ve kterém si model může sám něco domýšlet.

Kombinace, která funguje nejlíp

Formát samotný odvede půl práce. Druhou půlku odvede role, protože řekne modelu, z jaké pozice a s jakou přesností má formát vyplnit. „Jsi datový analytik, který připravuje podklad pro import do systému, odpověz přesně podle zadané struktury” spojí obojí do jedné instrukce, a model se pak míň odchyluje od zadaného tvaru. O tom, jak přidělená role mění tón i obsah odpovědi, jsem psal v samostatném článku o přidělení role v promptu. Zvlášť fungují obě techniky dobře, dohromady ještě líp.

Kdy strukturu nechtít

Ne každý text má být tabulka nebo výčet. Průvodní e-mail, kondolence, popis produktu pro e-shop nebo cokoli, kde má text působit lidsky a plynule, strukturou spíš utrpí. Rozsekaný do odrážek nebo napěchovaný do tabulky zní obchodně a chladně tam, kde má znít vstřícně.

Podobně to platí u krátké odpovědi na jednoduchou otázku. Když se ptáte, kolik je sedm krát osm, tabulka se sloupcem „výsledek” je jen zbytečná okrasa kolem jednoho čísla.

JSON nemá smysl žádat, pokud výstup čtete jen vy sami na obrazovce. Je to formát pro stroj, člověku se čte hůř než obyčejná věta nebo přehledná tabulka.

Tahle technika se týká jen textových zadání. U generování obrázků slovo „formát” znamená něco úplně jiného, poměr stran nebo kompozici, ne odrážky nebo tabulku. Jak na to, píšu v článku Jak napsat prompt pro generování obrázku (s příklady).

Na co si dát pozor

Vygenerovaný JSON nemusí být na první pokus platný. Model do něj občas vloží vysvětlující větu před závorku nebo za ni, případně čárku navíc na konci posledního záznamu, což validní JSON nedovoluje. Než ho pustíte do dalšího programu, ověřte si ho, ať už v jednoduchém online validátoru, nebo tak, že si ho necháte načíst kódem, který na chybu sám upozorní.

U delších tabulek a seznamů model občas potichu vynechá pár řádků, hlavně když jich má vygenerovat desítky najednou. Počet položek na výstupu si spočítejte a porovnejte se vstupem. Nejde o schválnost, u dlouhých výčtů se prostě stává, že model pár záznamů cestou přeskočí.

Klíče v JSON a názvy sloupců v tabulce se mezi jednotlivými odpověďmi mohou nepatrně lišit, jednou „telefon”, podruhé „tel” nebo „phone”, pokud je pokaždé přesně nezadáte. Pro cokoli, co pak zpracováváte automaticky, se vyplatí psát přesný název klíče do zadání pokaždé stejně, ne spoléhat na to, že si ho model bude pamatovat z předchozí zprávy.

Kdo pracuje s AI přes vývojářské rozhraní, tedy přes takzvané API, má k dispozici ještě spolehlivější cestu, jak platný JSON vynutit. OpenAI od srpna 2024 nabízí ve svém API funkci Structured Outputs, která JSON podle předem daného schématu negeneruje jen na požádání, ale přímo to garantuje na úrovni technického nastavení modelu. V běžném chatovacím okně na webu tahle možnost není, tam zůstává jediným nástrojem přesně formulovaná věta v zadání.

Formát jako druhá polovina zadání

Obsah a formát jsou dvě oddělené věci, a model si obojí vybere sám, pokud mu do toho nemluvíte. Tabulka pro srovnání, odrážky pro postup, JSON pro data, souvislý text pro všechno ostatní. Příště, než pošlete zadání, si k otázce co chci vědět přidejte ještě jednu: jak přesně to chci mít napsané. Ta druhá věta bývá kratší než první, a přitom rozhodne, jestli výsledek použijete rovnou, nebo si ho ještě sami předěláte k obrazu svému.