[ Inżynieria ]TechnicalPoziom: Projektowanie

Function calling — jak model AI wywołuje Twój kod

Mechanizm, na którym stoi każdy agent i każda poważna integracja AI: model nie wykonuje kodu — prosi o wywołanie funkcji, a Twój system decyduje i odpowiada. Z przykładem krok po kroku.

Krzysztof Leszczyński3 min czytania

Mała matowa skrzynka na ciemnym biurku laboratoryjnym z mleczną szklaną kartą wsuniętą w szczelinę i jedną limonkową diodą przy slocie.

[ W skrócie ]

  • Function calling to protokół: model dostaje opisy funkcji, a gdy chce z której skorzystać, zwraca ustrukturyzowane żądanie — wykonanie należy do Ciebie.
  • Model NIGDY nie wykonuje kodu sam — to Twój system waliduje argumenty, wywołuje funkcję i odsyła wynik.
  • Jakość opisów funkcji i ich parametrów wprost decyduje o trafności wywołań — to dokumentacja pisana dla modelu.
  • Pętla wywołań (model prosi, system odpowiada, model kontynuuje) to fundament agentów.

Co to właściwie jest?

Function calling (u części dostawców: tool calling) to umowa między Twoim kodem a modelem:

  1. Ty deklarujesz funkcje — nazwa, opis, schemat parametrów.
  2. Model, gdy uzna, że funkcja pomoże w zadaniu, zwraca żądanie wywołania z konkretnymi argumentami.
  3. Twój system funkcję wykonuje (albo nie!) i odsyła wynik.
  4. Model kontynuuje z nową wiedzą.

Najważniejsze zdanie tego artykułu: model nie wykonuje niczego — on tylko prosi. Cała władza (i cała odpowiedzialność) zostaje w Twoim kodzie.

Krok po kroku na przykładzie

Deklaracja narzędzia (tu: składnia Anthropic, u innych dostawców niemal identyczna):

json
{
  "name": "sprawdz_stan_magazynu",
  "description": "Zwraca dostepna ilosc produktu w magazynie po SKU",
  "input_schema": {
    "type": "object",
    "properties": {
      "sku": { "type": "string", "description": "kod produktu, np. BUT-42-CZ" }
    },
    "required": ["sku"]
  }
}

Użytkownik pyta: „czy macie jeszcze czarne czterdziestkidwójki?”. Model odpowiada żądaniem:

json
{
  "type": "tool_use",
  "name": "sprawdz_stan_magazynu",
  "input": { "sku": "BUT-42-CZ" }
}

Twój kod wywołuje magazyn i odsyła wynik:

json
{
  "type": "tool_result",
  "content": "{ \"sku\": \"BUT-42-CZ\", \"dostepne\": 7 }"
}

Model kończy: „Tak, mamy 7 par na stanie”. Pętla może mieć wiele rund — i dokładnie ta pętla, obudowana limitami i uprawnieniami, robi z modelu agenta.

Zasady, które oszczędzają problemów

  • Waliduj argumenty przed wykonaniem. Schemat to deklaracja intencji, nie gwarancja — SKU sprawdź regexem, zakresy dat logiką.
  • Opisy pisz jak dokumentację. Model wybiera funkcję po opisie; „zwraca stan po SKU” działa, „handler magazynu” — nie. Dobre opisy plus przykłady w opisie parametrów potrafią podnieść trafność wywołań bardziej niż zmiana modelu na droższy.
  • Funkcje odczytu i zapisu rozdzielaj. Odczyty mogą być swobodne; zapisy chcesz móc wyłączyć jedną flagą albo obłożyć potwierdzeniem.
  • Loguj każdą rundę. Żądanie, argumenty, wynik — bez tego nie zdiagnozujesz, czemu model „dziwnie się zachował” w czwartek o 16:40.

Co zrobić, gdy model wywołuje źle

Trzy typowe awarie i ich przyczyny — w kolejności częstości, nie dramatyzmu.

Wywołuje niewłaściwą funkcję. Prawie zawsze wina opisu, nie modelu. Dwie funkcje o podobnych opisach („pobierz dane klienta” i „pobierz historię klienta”) będą mylone. Lekarstwo: opisy, które mówią, kiedy użyć, a nie tylko co robi — „użyj, gdy potrzebujesz danych kontaktowych; do historii zamówień użyj X”.

Halucynuje argumenty. Model wypełnia wymagane pole zmyśloną wartością, bo schemat mówi „required”. Lekarstwo dwustopniowe: pola, których nie da się wywnioskować, oznaczaj jako opcjonalne, a w opisie napisz wprost „jeśli użytkownik nie podał numeru, zapytaj zamiast zgadywać”.

Wpada w pętlę. Wywołuje to samo w kółko, bo wynik go nie zadowala. Lekarstwo jest po Waszej stronie i musi być twarde: limit rund i limit wywołań na sprawę, po przekroczeniu — przekazanie człowiekowi. Bez tego pierwszy nietypowy przypadek wygeneruje rachunek, który zapamiętacie.

Wspólny mianownik całej trójki: żadnej z tych awarii nie naprawia zmiana modelu na mocniejszy. Wszystkie trzy mają źródło w tym, co sami podaliśmy modelowi — w opisach, schematach i braku limitów. To dobra wiadomość, bo są to rzeczy w pełni pod kontrolą zespołu.

Koszt, o którym się zapomina

Każda runda to pełny kontekst wysłany od nowa: instrukcja systemowa, definicje wszystkich narzędzi, cała dotychczasowa rozmowa i wyniki funkcji. Sprawa rozwiązana w pięciu rundach nie kosztuje pięciu wywołań — kosztuje znacznie więcej, bo kontekst rośnie z każdą rundą.

Dwa wnioski praktyczne: nie podawaj modelowi wszystkich narzędzi naraz (zestaw dobrany do etapu sprawy jest tańszy i trafniejszy) oraz skracaj wyniki funkcji — zwracanie całego rekordu z bazy, gdy potrzebne są trzy pola, płacisz w każdej kolejnej rundzie.

Zobacz projekt: Automatic AI — ta strona

Udostępnij

InżynieriaTechnical4 min czytania

MCP — co to jest i dlaczego warto je znać?

Model Context Protocol to otwarty standard łączenia modeli AI z narzędziami i danymi firmy. Zamiast pisać osobną integrację dla każdej pary „model + system”, piszesz jeden serwer MCP.

Krzysztof Leszczyński

InżynieriaTechnical3 min czytania

RAG — czym jest i kiedy ma sens?

Model językowy nie zna Twoich dokumentów. RAG to sposób, żeby odpowiadał na ich podstawie — bez trenowania własnego modelu. Wyjaśniamy, jak działa i kiedy się opłaca.

Krzysztof Leszczyński

InżynieriaTechnical3 min czytania

Embeddings — po co są i jak działają w praktyce?

Embeddingi zamieniają tekst na liczby, które niosą znaczenie. To one sprawiają, że wyszukiwanie znajduje „urlop” po zapytaniu o „wolne”. Wyjaśniamy bez matematyki — i z jednym wzorem, który warto znać.

Krzysztof Leszczyński

Automatic AI

hello@automaticai.pl · automaticai.pl