Model umí text. Neumí se podívat do tvé databáze, spočítat úrok ani poslat e-mail. Tool use (nebo function calling) je mechanismus, kterým mu dáš seznam funkcí, a on si sám řekne, kterou zavolat a s jakými parametry. Tvůj kód ji provede a výsledek mu vrátí. Tímhle se z chytrého textového stroje stává něco, co reálně něco dělá.
Jak to celé běží
1. ty → modelu: "Kolik stojí objednávka 4821?" + seznam nástrojů
2. model → tobě: zavolej najdi_objednavku(id=4821) ← nevolá ji sám!
3. ty → provedeš funkci ve svém kódu → {"cena": 1290, "stav": "odeslána"}
4. ty → modelu: výsledek nástroje
5. model → tobě: "Objednávka 4821 stojí 1 290 Kč a je odeslaná."
Zásadní detail: model nic nespouští. Jen řekne, co by chtěl zavolat. Vykonání je vždy na tvém kódu, a to je tvoje pojistka i tvoje zodpovědnost.
Jak se nástroj popisuje
Nástroj = jméno, popis a schéma parametrů. Popis je pro model jediné vodítko, kdy ho použít:
{
"name": "najdi_objednavku",
"description": "Vrátí stav, cenu a datum objednávky podle jejího čísla. Použij vždy, když se uživatel ptá na konkrétní objednávku.",
"parameters": {
"type": "object",
"properties": {
"id": { "type": "integer", "description": "Číslo objednávky, např. 4821" }
},
"required": ["id"]
}
}
💡 Kvalita popisů rozhoduje o tom, jestli to bude fungovat. Napiš do nich i kdy nástroj nepoužít („na obecné dotazy o dopravě ho nevolej“), ušetří ti to spoustu zbytečných volání.
Co dělat nástrojem místo promptu
Cokoli, kde model selhává nebo kde potřebuješ jistotu:
- výpočty: kalkulačka, měnové kurzy, daně
- aktuální a firemní data: databáze, API, ceník, skladovost
- čas: model netuší, kolik je hodin, dokud mu to neřekneš
- akce: založ tiket, pošli e-mail, zarezervuj termín
- vyhledávání: fulltext i vektorové
Bezpečnost: tady se to láme
Model může být oklamán vstupem (viz prompt injection). Když má k dispozici nástroj, který maže data nebo posílá peníze, je z toho průšvih.
Pravidla, která se vyplatí dodržet:
- Nástroj dělá jen to, co má.
smaz_uzivatele(id)s libovolným ID je zbraň. Omez ho na data, ke kterým má přihlášený uživatel právo, autorizaci řeš ve svém kódu, ne v promptu. - Odděl čtení od zápisu. Čtecí nástroje pusť volně, zapisovací (platba, mazání, odeslání) nech potvrdit člověkem nebo omez limity.
- Validuj parametry. Model může poslat nesmysl nebo hodnotu mimo rozsah. Chovej se k nim jako ke vstupu z internetu, protože to jím fakticky je.
- Loguj každé volání. Bez záznamu, co model zavolal a s čím, nevyšetříš žádný incident.
- Omez počet kroků. Model se umí zacyklit (volá dokola totéž). Nastav strop na počet volání v jedné odpovědi.
Časté problémy
| Problém | Co s tím |
|---|---|
| Model nástroj nepoužije, i když má | Zlepši popis, přidej příklad, zmiň nástroj v systémovém promptu |
| Volá ho pořád, i zbytečně | Do popisu napiš, kdy ho nepoužívat |
| Vymyslí si parametr | Validuj a vrať mu chybu, umí se opravit |
| Zacyklí se | Strop na počet kroků + jasná podmínka ukončení |
| Nástrojů je moc | Nad ~10 se model ztrácí; seskup je nebo vybírej podle kontextu |
Cvičení
- Dáváš modelu nástroj
smaz_uzivatele(id). Vyjmenuj tři věci, které musí být v kódu, ne v popisu nástroje. - Model zavolá nástroj s argumentem, který neprojde validací. Co mu vrátíš?
Náčrt řešení: rozbal, až si cvičení zkusíš sám
- Autorizace, rozsah dat a potvrzení. Za prvé kontrola, jestli přihlášený uživatel vůbec smí mazat, protože model o právech nic neví. Za druhé omezení na data, ke kterým má daný uživatel přístup, aby nešlo smazat cizí záznam podstrčeným ID. Za třetí potvrzení u nevratné akce. Popis nástroje je nápověda pro model, ne bezpečnostní hranice, a útočník ji ovlivní obsahem, který ti pošle. Viz prompt injection.
- Srozumitelnou chybovou zprávu jako normální výsledek nástroje, ne výjimku. Například „datum musí být ve formátu RRRR-MM-DD, dostal jsem 3. května“. Model podle toho volání opraví a pokračuje. Když místo toho vyhodíš výjimku a běh spadne, přijdeš o kontext a uživatel o odpověď. Viz agenti.
Shrnutí
- Model nástroj nespouští, jen navrhne volání, provedení je na tvém kódu.
- Popis nástroje je instrukce pro model; napiš do něj i kdy ho nepoužít.
- Nástroje řeší přesně to, v čem je model slabý: počty, aktuální data, čas, akce.
- Autorizaci, validaci parametrů a limity musíš mít ve svém kódu, ne v promptu.
Model vrátí požadavek na zavolání funkce `smaz_objednavku(id=999)`. Co se má stát?
Tvůj kód ověří, že přihlášený uživatel má na tuhle objednávku právo, zvaliduje parametr a teprve pak (u destruktivní akce ideálně po potvrzení člověkem) funkci provede. Model volání jen navrhuje, autorizace nikdy nesmí být na něm.
Proč dávat modelu kalkulačku jako nástroj, když „umí počítat“?
Protože nepočítá, hádá nejpravděpodobnější pokračování textu a u delších čísel se plete (souvisí to i s tokenizací). Nástroj dá přesný výsledek a model ho jen zasadí do odpovědi.
Agent volá pořád dokola stejný nástroj a nikam se nedostane. Jak to ošetřit?
Nastavit strop na počet kroků a jasnou ukončovací podmínku, vracet modelu smysluplné chybové hlášky a mít fallback (předání člověku). Bez limitu je zacyklení otázkou času a stojí peníze.
