Skip to main content

Wywoływanie funkcji (Function Calling / Tool Calling)

DLA AGENTÓW AIChatGPTClaude

Protokół techniczny i standard interakcji LLM z zewnętrznym oprogramowaniem. Zamiast swobodnego tekstu model zwraca poprawny JSON zawierający nazwę funkcji oraz argumenty typowane zgodnie ze schemą JSON Schema, co umożliwia backendowi deterministyczne wykonywanie operacji w rzeczywistych API.

1. Przegląd koncepcji i problem systemowy

Model językowy jest zamknięty we własnym kontekście: nie zna aktualnego, dokładnego czasu, nie może obciążyć konta ani sprawdzić stanu kontenera w Dockerze.

Bez mechanizmu interakcji z kodem chatbot mógł jedynie imitować działania, zwracając mglisty tekst: „Sprawdziłem Twoje saldo, wynosi $50” (nawet jeśli realne saldo to $0).

Function Calling (Wywołanie funkcji lub Tool Calling) przekształca generator tekstu w orkiestratora systemów. Model analizuje prompt, rozumie brakujące dane i zamiast generować tekst, tworzy maszynowo czytelny JSON:

{
  "name": "fetch_user_balance",
  "arguments": "{\"account_id\": \"ACC-9481\"}"
}

Mentalna model: jeśli LLM to mózg, to Function Calling to impulsy nerwowe wysyłające komendy do mięśni (Twojego kodu i API) w celu wykonania fizycznej akcji.

┌─────────────────────────────────────────────────────────────┐
│                 ARCHITEKTURA FUNCTION CALLING               │
├─────────────────────────────────────────────────────────────┤
│ 1. ZAPYT UŻYTKOWNIKA:                                       │
│    „Jaka jest pogoda we Lwowie?”                            │
├─────────────────────────────────────────────────────────────┤
│                          │                                  │
│                          ▼ Zapytanie do LLM (ze schematem)   │
├─────────────────────────────────────────────────────────────┤
│ 2. ODPOWIEDŹ LLM (finish_reason: "tool_calls"):             │
│    { "name": "get_weather", "args": { "city": "Lviv" } }    │
├─────────────────────────────────────────────────────────────┤
│                          │                                  │
│                          ▼ Backend wykonuje rzeczywiste     │
│                            zapytanie API                    │
├─────────────────────────────────────────────────────────────┤
│ 3. TWÓJ SERWER ➔ OpenWeatherMap ➔ Otrzymuje { temp: 18, rain: 0}│
├─────────────────────────────────────────────────────────────┤
│                          │                                  │
│                          ▼ Przesłanie wyniku z powrotem do LLM│
├─────────────────────────────────────────────────────────────┤
│ 4. FINALNA ODPOWIEDŹ DLA CZŁOWIEKA:                         │
│    „We Lwowie jest teraz +18°C, bez opadów, miłego dnia!”   │
└─────────────────────────────────────────────────────────────┘

2. Praktyczny przykład: opis schematu i wywołanie przez cURL

Oto jak wygląda rejestracja narzędzia w standardzie OpenAI / Anthropic Tool Calling:

curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4o",
    "messages": [
      {"role": "user", "content": "Заблокуй картку користувача 5501"}
    ],
    "tools": [
      {
        "type": "function",
        "function": {
          "name": "block_payment_card",
          "description": "Безпечне блокування банківської картки користувача у разі втрати",
          "parameters": {
            "type": "object",
            "properties": {
              "card_id": {
                "type": "integer",
                "description": "Унікальний ідентифікатор картки в системі"
              },
              "reason": {
                "type": "string",
                "enum": ["lost", "stolen", "fraud"],
                "description": "Причина блокування"
              }
            },
            "required": ["card_id", "reason"]
          }
        }
      }
    ],
    "tool_choice": "auto"
  }'

Co zwraca model:

{
  "role": "assistant",
  "content": null,
  "tool_calls": [
    {
      "id": "call_abc123",
      "type": "function",
      "function": {
        "name": "block_payment_card",
        "arguments": "{\"card_id\": 5501, \"reason\": \"lost\"}"
      }
    }
  ]
}

3. Cztery zasady bezpieczeństwa przy pracy z Function Calling

  1. Ścisła walidacja argumentów (Pydantic / Zod): Nigdy nie ufaj ślepo argumentom pochodzącym z JSON-a modelu. Zawsze parsuj je przez schemat walidacji przed wykonaniem zapytania SQL lub obciążeniem konta.
  2. Bramka kontrolna dla destrukcyjnych działań (Human-in-the-Loop): Jeśli funkcja wykonuje operację nieodwracalną (delete_database, transfer_funds), backend musi zatrzymać wykonanie i poprosić o potwierdzenie żywego człowieka.
  3. Ograniczenie kontekstu narzędzi: Nie przekazuj modelowi setek funkcji jednocześnie. Rozmywa to uwagę (Attention Saturation) i zwiększa prawdopodobieństwo błędnego wywołania. Stosuj dynamiczną filtrację lub MCP.
  4. Ochrona przed nieskończoną pętlą (Infinite Tool Loop): Zawsze ustawiaj sztywny limit liczby sekwencyjnych wywołań funkcji (np. maksymalnie 5 iteracji na jedno zapytanie).

4. Podsumowanie

Function Calling to most łączący świat statystycznego modelowania języka z deterministycznym światem programowania. To właśnie ten mechanizm stanowi rdzeń wszystkich współczesnych agentów AI, serwerów MCP oraz autonomicznych asystentów deweloperskich.

/ Najczęściej zadawane pytaniaSchema.org FAQPage

FAQ: Wywoływanie funkcji (Function Calling / Tool Calling)

Zdecydowanie nie! Model to izolowany procesor tekstowo-matematyczny. Nie ma bezpośredniego dostępu do Twojej bazy danych ani sieci. Generuje jedynie tokeny w formacie JSON z żądaniem skierowanym do Twojego serwera: 'Wykonaj get_user_balance(user_id=42)'. Rzeczywisty kod zawsze wykonuje Twój hostowy backend.
/ Linki wewnętrzne
Wszystkie hasła