Design Pattern Agentique Tool Use – Utilisation d’outils

Le pattern Tool Use (ou Function Calling) permet au LLM d’interagir avec le monde extérieur en appelant des outils : APIs, bases de données, calculatrices, recherche web. Au lieu de deviner ou halluciner, l’agent obtient des données réelles et exécute des actions concrètes. Voir la table des matières complète

1. Le Concept en Une Phrase

🔧 L’essence : Le LLM ne fait pas tout seul — il délègue aux outils ce qu’ils font mieux : calculs précis, données temps réel, actions sur des systèmes externes.
[Requête utilisateur] ↓ ┌─────────────────┐ │ LLM │ │ « Ai-je besoin │ │ d’un outil ? » │ └────────┬────────┘ ↓ ┌──────┴──────┐ ↓ OUI ↓ NON ┌─────────┐ ┌─────────────┐ │ Appel │ │ Réponse │ │ Outil │ │ directe │ └────┬────┘ └─────────────┘ ↓ [Résultat outil] ↓ ┌─────────────────┐ │ LLM interprète │ │ et répond │ └─────────────────┘

🎯 Principe

Le LLM décide quand et quel outil appeler en analysant la requête, puis interprète le résultat pour formuler une réponse utile.

💡 Bénéfice

Élimine les hallucinations sur les données factuelles. Prix en temps réel, calculs exacts, recherches web actualisées, actions dans des systèmes tiers.

2. Quand Utiliser vs NE PAS Utiliser

✅ Cas d’Usage Idéaux

SituationOutils typiquesGain
Données temps réel (météo, bourse, stocks)API externesPrécision 100% vs hallucination
Calculs mathématiques ou financiersCalculatrice, formulesÉlimination des erreurs d’arrondi
Recherche d’information actualiséeRecherche web, RAGDonnées post-entraînement
Actions sur systèmes externesCRM, email, calendrierAutomatisation bout en bout
Requêtes base de donnéesSQL, Supabase, APIDonnées structurées fiables

❌ Quand NE PAS Utiliser

SituationPourquoi éviterAlternative
Questions de raisonnement purLatence inutile, pas de valeur ajoutéeRéponse directe du LLM
Outils non fiables ou lents (>5s)Timeout, UX dégradéeCache ou fallback statique
Données sensibles sans contrôle d’accèsRisque de fuite d’informationValidation préalable
Chaînage excessif (>5 outils séquentiels)Erreurs cumulées, latence x5Pattern Orchestrator
🧪 Test Simple : « Le LLM peut-il répondre correctement sans données externes ? » Si OUI → pas d’outil. Si NON (données temps réel, calcul précis, action externe) → Tool Use.

3. Trois Exemples Concrets

📦 Exemple 1 : Assistant E-commerce avec Gestion de Stocks

Contexte : Un chatbot qui répond aux questions clients sur la disponibilité et les prix des produits.

Types de requêtes :

  • « Est-ce que le iPhone 15 Pro est en stock ? »
  • « Quel est le prix actuel du MacBook Air M3 ? »
  • « Combien coûtera ma commande avec la livraison ? »
[Question client] ↓ ┌───────────────┐ │ LLM │ │ Détecte : │ │ stock/prix │ └───────┬───────┘ ↓ ┌──────┴──────┐ ↓ ↓ ┌────────┐ ┌────────────┐ │ API │ │ Calculateur│ │ Stock │ │ Prix │ └───┬────┘ └─────┬──────┘ └──────┬───────┘ ↓ [LLM formule réponse]

Gains mesurés :

  • Précision stock : 100% (vs 60% en devinant)
  • Latence moyenne : +150ms par appel outil
  • Taux de conversion : +23% (confiance client)

💬 Exemple 2 : Assistant RH avec Accès Calendrier

Contexte : Un agent qui aide les employés à gérer leurs congés et réunions.

Types de requêtes :

  • « Pose-moi un congé du 15 au 20 mars »
  • « Quand Marie est-elle disponible cette semaine ? »
  • « Combien de jours de congés me reste-t-il ? »
[Demande employé] ↓ ┌───────────────┐ │ LLM │ │ Intention : │ │ lecture/action│ └───────┬───────┘ ↓ ┌──────┴──────┐ ↓ ↓ ┌────────┐ ┌────────────┐ │ Lecture│ │ Création │ │ Calendar│ │ Événement │ └───┬────┘ └─────┬──────┘ └──────┬───────┘ ↓ [Confirmation LLM]

Gains mesurés :

  • Temps de traitement : 30s → 3s
  • Erreurs de saisie : -95% (validation automatique)
  • Satisfaction employé : +40 points NPS

🛡️ Exemple 3 : Agent de Veille Sécurité

Contexte : Un système qui surveille les vulnérabilités et alerte les équipes.

Types de requêtes :

  • « Y a-t-il des CVE critiques pour log4j cette semaine ? »
  • « Vérifie si notre version de OpenSSL est vulnérable »
  • « Envoie une alerte Slack si score CVSS > 9 »
[Requête sécurité] ↓ ┌───────────────┐ │ LLM │ │ Analyse : │ │ CVE, version │ └───────┬───────┘ ↓ ┌──────┼──────┐ ↓ ↓ ↓ ┌──────┐ ┌────┐ ┌─────┐ │ NVD │ │DEPS│ │Slack│ │ API │ │Check││Alert│ └──┬───┘ └──┬─┘ └──┬──┘ └────────┼──────┘ ↓ [Rapport LLM + Action]

Gains mesurés :

  • Temps de détection : 4h → 5min
  • Couverture CVE : 100% des critiques
  • Faux positifs : <5% (validation LLM)

4. Prompt Prêt à l’Emploi

💡 Prompt Prêt à l’Emploi : Agent avec Outils

Contexte :

Ce système complet configure un agent capable de décider quand appeler un outil, d’exécuter l’appel, puis d’interpréter le résultat pour répondre à l’utilisateur.

Étape 1 – Prompt Système (définition des outils) :
Tu es un assistant intelligent avec accès aux outils suivants :

**Outils disponibles :**
[LISTE_OUTILS]

**Format d'appel d'outil :**
Quand tu as besoin d'un outil, réponds UNIQUEMENT avec ce JSON :
{
  "tool_call": {
    "name": "nom_outil",
    "arguments": { "param1": "valeur1" }
  }
}

**Règles critiques :**
1. N'appelle un outil que si tu ne peux PAS répondre sans données externes
2. Un seul appel d'outil à la fois
3. Si aucun outil n'est nécessaire, réponds directement en texte
4. Après réception du résultat, formule une réponse claire pour l'utilisateur
Étape 2 – Exemple de définition d’outils :
// Variable [LISTE_OUTILS] - à personnaliser selon votre cas

1. **get_stock_price**
   - Description : Récupère le prix actuel d'une action
   - Paramètres : { "symbol": "string (ex: AAPL)" }
   - Retourne : { "price": number, "currency": "USD", "timestamp": "ISO8601" }

2. **search_database**
   - Description : Recherche dans la base de données produits
   - Paramètres : { "query": "string", "limit": "number (défaut: 5)" }
   - Retourne : { "results": [{ "id", "name", "price", "stock" }] }

3. **send_email**
   - Description : Envoie un email
   - Paramètres : { "to": "string", "subject": "string", "body": "string" }
   - Retourne : { "success": boolean, "message_id": "string" }

4. **calculate**
   - Description : Effectue un calcul mathématique précis
   - Paramètres : { "expression": "string (ex: 156.50 * 1.20)" }
   - Retourne : { "result": number }
Étape 3 – Orchestration (pseudo-code) :
async function agentLoop(userMessage, tools) {
  const messages = [{ role: "user", content: userMessage }];
  
  while (true) {
    // Appel LLM avec contexte complet
    const response = await callLLM(systemPrompt, messages);
    
    // Vérifie si le LLM demande un outil
    if (response.tool_call) {
      // Exécute l'outil
      const toolResult = await executeTools(response.tool_call);
      
      // Ajoute le résultat au contexte
      messages.push({
        role: "assistant",
        content: JSON.stringify(response.tool_call)
      });
      messages.push({
        role: "tool",
        content: JSON.stringify(toolResult)
      });
      
      // Continue la boucle pour que le LLM interprète
    } else {
      // Réponse finale - sortie de boucle
      return response.content;
    }
  }
}

// Exécution sécurisée des outils
async function executeTools(toolCall) {
  const { name, arguments: args } = toolCall;
  
  // Validation des paramètres
  if (!tools[name]) {
    return { error: `Outil inconnu: ${name}` };
  }
  
  try {
    const result = await tools[name].execute(args);
    return { success: true, data: result };
  } catch (error) {
    return { success: false, error: error.message };
  }
}
Étape 4 – Prompt d’interprétation du résultat :
**Résultat de l'outil [NOM_OUTIL] :**
[RESULTAT_OUTIL]

**Instructions :**
1. Analyse le résultat reçu
2. Si erreur : explique le problème et propose une alternative
3. Si succès : formule une réponse claire et utile pour l'utilisateur
4. N'invente JAMAIS de données - utilise uniquement le résultat fourni

**Réponds maintenant à l'utilisateur :**
Flux complet :
[Message utilisateur] ↓ ┌─────────────────┐ │ LLM + Système │ │ (liste outils) │ └────────┬────────┘ ↓ Outil nécessaire ? ↓ ↓ OUI NON ↓ ↓ ┌─────────┐ ┌──────────┐ │ JSON │ │ Réponse │ │tool_call│ │ directe │ └────┬────┘ └──────────┘ ↓ ┌─────────┐ │ Exécute │ │ outil │ └────┬────┘ ↓ [Résultat outil] ↓ ┌─────────────────┐ │ LLM interprète │ │ et répond │ └─────────────────┘ ↓ Autre outil ? ←──┐ ↓ NON │ [Réponse finale] │ ↓ OUI ─────────┘
Variables à personnaliser :
  • [LISTE_OUTILS] : Définitions complètes de vos outils (nom, description, paramètres, format retour)
  • [NOM_OUTIL] : Nom de l’outil appelé (injecté automatiquement)
  • [RESULTAT_OUTIL] : JSON retourné par l’outil (injecté automatiquement)
Résultat attendu :

L’agent répond avec des données réelles, issues des outils, sans hallucination. Latence = LLM + outil(s) appelé(s). En moyenne +200-500ms par appel d’outil.

5. Bonnes Pratiques & Anti-Patterns

✅ Bonnes Pratiques

🎯 Descriptions Précises

Chaque outil doit avoir une description claire de son usage, ses paramètres et son format de retour.

Permet au LLM de choisir le bon outil.

⏱️ Timeouts Systématiques

Timeout de 5s max par outil. Prévoir un message de fallback si l’outil ne répond pas.

Évite de bloquer l’utilisateur.

🔒 Validation des Paramètres

Toujours valider les paramètres AVANT d’exécuter l’outil. Le LLM peut générer des valeurs invalides.

Prévient les erreurs et injections.

📝 Journalisation Complète

Logger chaque appel d’outil : paramètres, résultat, latence. Essentiel pour le débogage.

Facilite le diagnostic des problèmes.

❌ Anti-Patterns à Éviter

Anti-PatternConséquenceSolution
Trop d’outils (>15)LLM confus, mauvais choix d’outilGrouper par catégorie, router d’abord
Descriptions vaguesAppels inappropriés ou manquésExemples concrets dans la description
Pas de gestion d’erreurAgent bloqué, hallucinationsToujours retourner un JSON, même en erreur
Chaînage aveugleBoucle infinie, coûts explosésLimite de 5 appels max par requête

6. Propriétés Essentielles

🎯 Idempotence

Les outils de lecture peuvent être rappelés sans effet de bord.

Permet les retry automatiques.

⚡ Latence Bornée

Timeout de 3-5s maximum par outil.

UX prévisible et réactive.

📋 Format Structuré

Entrées et sorties en JSON strict.

Parsing fiable, pas d’ambiguïté.

🔐 Contrôle d’Accès

Permissions par outil selon l’utilisateur.

Sécurité et conformité.

📊 Observabilité

Logs et métriques sur chaque appel.

Débogage et optimisation.

🔄 Graceful Degradation

Fallback si l’outil échoue.

Résilience du système.

7. Métriques de Succès

MétriqueCibleAlerte siSignification
Taux de succès outil>95%<90%Fiabilité des intégrations
Latence médiane outil<500ms>1sPerformance des APIs
Taux de sélection correcte>90%<80%Qualité des descriptions
Appels par requête1-2>4Efficacité de l’agent
Taux de fallback déclenché<5%>15%Stabilité des outils
Coût moyen par requêteBaseline+50%Maîtrise des coûts
⚠️ Alerte Critique : Si le taux de sélection correcte chute sous 80%, vos descriptions d’outils sont probablement trop vagues ou similaires. Ajoutez des exemples concrets dans chaque description.

8. Récapitulatif

📌 En 3 Points Clés :
  1. Délégation intelligente — Le LLM décide quand un outil est nécessaire et lequel utiliser
  2. Données réelles — Élimine les hallucinations sur les faits, prix, stocks, calculs
  3. Boucle complète — Appel → Résultat → Interprétation → Réponse utilisateur

✅ Quand Utiliser

  • Données temps réel requises
  • Calculs précis nécessaires
  • Actions sur systèmes externes
  • Informations post-entraînement

❌ Quand NE PAS Utiliser

  • Raisonnement pur sans données
  • Outils non fiables (>5s latence)
  • Chaînage >5 outils séquentiels
  • Données sensibles non sécurisées
⚠️ Erreur Fréquente : Définir trop d’outils similaires sans exemples distinctifs. Le LLM confond alors « search_products » et « get_product_details ». Solution : une description + 2 exemples d’usage par outil.

Publications similaires