Aller au contenu principal

Le Processus en 5 Étapes

Un protocole clair entre vous et le modèle

Le function calling avec Mistral suit un processus en 5 étapes bien définies. Chaque étape a un responsable clair — soit vous (le développeur), soit le modèle, soit l’utilisateur. Comprendre ce flux est essentiel avant d’écrire la moindre ligne de code.

1

Définir les fonctions (Développeur)

Vous décrivez chaque fonction disponible avec un schéma JSON : nom, description, paramètres, types et champs requis. Le modèle ne voit que cette spécification, pas votre code.

2

Interroger le modèle (Utilisateur)

L'utilisateur pose sa question en langage naturel. Vous envoyez cette requête au modèle Mistral accompagnée de la liste des outils disponibles.

3

Générer les arguments (Modèle)

Le modèle analyse la requête, choisit la fonction appropriée et génère les arguments au format JSON. Il ne l'exécute pas — il vous dit simplement quoi appeler et avec quels paramètres.

4

Exécuter la fonction (Développeur)

Votre code extrait le nom de la fonction et les arguments de la réponse du modèle, exécute la fonction correspondante et récupère le résultat.

5

Générer la réponse finale (Modèle)

Vous renvoyez le résultat de la fonction au modèle. Il l'intègre dans le contexte de la conversation et formule une réponse naturelle pour l'utilisateur.

Le flux en détail

Voici comment ces 5 étapes se traduisent concrètement dans le code. Prenons l’exemple d’un utilisateur qui demande le statut d’un paiement.

Étape 1 : Vous définissez les outils

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_payment_status",
            "description": "Récupère le statut d'un paiement à partir de son identifiant de transaction",
            "parameters": {
                "type": "object",
                "properties": {
                    "transaction_id": {
                        "type": "string",
                        "description": "L'identifiant unique de la transaction (ex: T1001)"
                    }
                },
                "required": ["transaction_id"]
            }
        }
    }
]

Étape 2 : L’utilisateur pose sa question

messages = [
    {"role": "user", "content": "Quel est le statut du paiement T1001 ?"}
]

Étape 3 : Le modèle génère les arguments

from mistralai import Mistral

client = Mistral(api_key="votre-clé-api")
response = client.chat.complete(
    model="mistral-large-latest",
    messages=messages,
    tools=tools
)

# Le modèle retourne un tool_call :
# function.name = "get_payment_status"
# function.arguments = '{"transaction_id": "T1001"}'

Étape 4 : Vous exécutez la fonction

import json

tool_call = response.choices[0].message.tool_calls[0]
args = json.loads(tool_call.function.arguments)
result = get_payment_status(**args)
# → {"status": "payé", "date": "2026-03-15"}

Étape 5 : Le modèle formule la réponse

messages.append(response.choices[0].message)
messages.append({
    "role": "tool",
    "name": "get_payment_status",
    "content": json.dumps(result),
    "tool_call_id": tool_call.id
})

final = client.chat.complete(
    model="mistral-large-latest",
    messages=messages,
    tools=tools
)
print(final.choices[0].message.content)
# → "Le paiement T1001 a été effectué le 15 mars 2026."

Les patterns de flux

Selon la complexité de la requête, le flux peut prendre différentes formes :

  • Sans fonction : l’utilisateur pose une question générale, le modèle répond directement sans appeler de fonction
  • Appel simple : une seule fonction est appelée, un seul résultat est retourné
  • Appels séquentiels : le modèle appelle une première fonction, utilise le résultat pour en appeler une deuxième
  • Appels parallèles : le modèle demande l’exécution de plusieurs fonctions en même temps

Ces patterns seront détaillés dans les leçons suivantes.

Points clés à retenir

  • Le function calling suit un processus en 5 étapes avec des responsabilités claires
  • Le modèle ne peut jamais exécuter de fonction directement — il génère uniquement les arguments
  • Votre code est le gardien : c’est lui qui décide d’exécuter ou non la fonction
  • Le résultat de la fonction est renvoyé au modèle pour qu’il formule une réponse naturelle
  • Le flux peut être simple (un appel) ou complexe (séquentiel, parallèle)