Nástroje (tool use)

Function calling: model volá tvůj kód.

Co se naučíš: Pochopíš function calling a hlavně to, že nástroj spouští tvůj kód, ne model.

6 min čtení + cvičeníNavazuje na:📋 Strukturovaný výstup

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:

  1. 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.
  2. Odděl čtení od zápisu. Čtecí nástroje pusť volně, zapisovací (platba, mazání, odeslání) nech potvrdit člověkem nebo omez limity.
  3. 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.
  4. Loguj každé volání. Bez záznamu, co model zavolal a s čím, nevyšetříš žádný incident.
  5. 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émCo 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 parametrValiduj a vrať mu chybu, umí se opravit
Zacyklí seStrop na počet kroků + jasná podmínka ukončení
Nástrojů je mocNad ~10 se model ztrácí; seskup je nebo vybírej podle kontextu

Cvičení

  1. 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.
  2. 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
  1. 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.
  2. 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.