Skip to main content

Appels de fonctions (Function Calling / Tool Calling)

POUR AGENT IAChatGPTClaude

Protocole technique et standard d'interaction entre les LLM et les logiciels externes. Au lieu de générer du texte libre, le modèle retourne un JSON valide contenant le nom de la fonction et des arguments typés selon un schéma JSON Schema, permettant au backend d'exécuter des actions déterministes sur des API réelles.

1. Aperçu du concept et problème systémique

Le modèle de langage est enfermé dans son propre contexte : il ignore l'heure exacte, ne peut pas débiter un compte ni vérifier l'état d'un conteneur Docker.

Sans mécanisme d'interaction avec le code, le chatbot ne pouvait que simuler des actions en renvoyant un texte vague : « J'ai vérifié votre solde, il y a 50 $ » (même si le solde était de 0 $).

Function Calling (appel de fonction ou Tool Calling) transforme le générateur de texte en orchestrateur de systèmes. Le modèle analyse le prompt, comprend qu'il lui manque des données et, au lieu de générer du texte, produit un JSON lisible par la machine :

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

Modèle mental : si le LLM est le cerveau, alors Function Calling représente les impulsions nerveuses qui envoient des commandes aux muscles (votre code et vos API) pour exécuter une action physique.

┌─────────────────────────────────────────────────────────────┐
│                 ARCHITECTURE DU FUNCTION CALLING            │
├─────────────────────────────────────────────────────────────┤
│ 1. REQUÊTE UTILISATEUR :                                    │
│    « Quel temps fait-il à Lviv ? »                          │
├─────────────────────────────────────────────────────────────┤
│                          │                                  │
│                          ▼ Requête vers le LLM (avec schéma)│
├─────────────────────────────────────────────────────────────┤
│ 2. RÉPONSE DU LLM (finish_reason: "tool_calls") :           │
│    { "name": "get_weather", "args": { "city": "Lviv" } }    │
├─────────────────────────────────────────────────────────────┤
│                          │                                  │
│                          ▼ Le backend effectue la vraie     │
│                            requête API                      │
├─────────────────────────────────────────────────────────────┤
│ 3. VOTRE SERVEUR ➔ OpenWeatherMap ➔ Récupère { temp: 18, rain: 0}│
├─────────────────────────────────────────────────────────────┤
│                          │                                  │
│                          ▼ Envoi du résultat au LLM         │
├─────────────────────────────────────────────────────────────┤
│ 4. RÉPONSE FINALE À L'HUMAIN :                              │
│    « Il fait actuellement +18°C à Lviv, sans précipitations,│
│      bonne journée ! »                                      │
└─────────────────────────────────────────────────────────────┘

2. Exemple pratique : description du schéma et appel via cURL

Voici à quoi ressemble l'enregistrement d'un outil selon le standard 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"
  }'

Ce que retourne le modèle :

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

3. Quatre règles de sécurité lors de l'utilisation de Function Calling

  1. Validation stricte des arguments (Pydantic / Zod) : Ne faites jamais aveuglément confiance aux arguments issus du JSON du modèle. Validez-les toujours via un schéma avant d'exécuter une requête SQL ou un débit bancaire.
  2. Passerelle de contrôle pour les actions destructrices (Human-in-the-Loop) : Si la fonction effectue une opération irréversible (delete_database, transfer_funds), le backend doit suspendre l'exécution et demander la confirmation d'un humain.
  3. Limitation du contexte des outils : Ne transmettez pas des centaines de fonctions simultanément au modèle. Cela dilue l'attention (Attention Saturation) et augmente le risque d'appels erronés. Utilisez un filtrage dynamique ou MCP.
  4. Protection contre les boucles infinies (Infinite Tool Loop) : Fixez toujours une limite rigide sur le nombre d'appels séquentiels de fonctions (par exemple, maximum 5 itérations par requête).

4. Conclusion synthétique

Function Calling est le pont qui relie le monde de la modélisation statistique du langage au monde déterministe de la programmation. C'est ce mécanisme qui constitue le cœur de tous les agents IA modernes, des serveurs MCP et des assistants autonomes de développement.

/ Questions fréquentesSchema.org FAQPage

FAQ: Appels de fonctions (Function Calling / Tool Calling)

Absolument pas ! Le modèle est un processeur textuel-mathématique isolé. Il n'a pas accès direct à votre base de données ni à votre réseau. Il se contente de générer des tokens au format JSON contenant une requête adressée à votre serveur : 'Exécute get_user_balance(user_id=42)'. Le code réel est toujours exécuté par votre backend hôte.
/ Liens internes
Tous les termes