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
🎯 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
| Situation | Outils typiques | Gain |
|---|---|---|
| Données temps réel (météo, bourse, stocks) | API externes | Précision 100% vs hallucination |
| Calculs mathématiques ou financiers | Calculatrice, formules | Élimination des erreurs d’arrondi |
| Recherche d’information actualisée | Recherche web, RAG | Données post-entraînement |
| Actions sur systèmes externes | CRM, email, calendrier | Automatisation bout en bout |
| Requêtes base de données | SQL, Supabase, API | Données structurées fiables |
❌ Quand NE PAS Utiliser
| Situation | Pourquoi éviter | Alternative |
|---|---|---|
| Questions de raisonnement pur | Latence inutile, pas de valeur ajoutée | Réponse directe du LLM |
| Outils non fiables ou lents (>5s) | Timeout, UX dégradée | Cache ou fallback statique |
| Données sensibles sans contrôle d’accès | Risque de fuite d’information | Validation préalable |
| Chaînage excessif (>5 outils séquentiels) | Erreurs cumulées, latence x5 | Pattern Orchestrator |
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 ? »
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 ? »
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 »
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 :
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-Pattern | Conséquence | Solution |
|---|---|---|
| Trop d’outils (>15) | LLM confus, mauvais choix d’outil | Grouper par catégorie, router d’abord |
| Descriptions vagues | Appels inappropriés ou manqués | Exemples concrets dans la description |
| Pas de gestion d’erreur | Agent bloqué, hallucinations | Toujours retourner un JSON, même en erreur |
| Chaînage aveugle | Boucle infinie, coûts explosés | Limite 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étrique | Cible | Alerte si | Signification |
|---|---|---|---|
| Taux de succès outil | >95% | <90% | Fiabilité des intégrations |
| Latence médiane outil | <500ms | >1s | Performance des APIs |
| Taux de sélection correcte | >90% | <80% | Qualité des descriptions |
| Appels par requête | 1-2 | >4 | Efficacité de l’agent |
| Taux de fallback déclenché | <5% | >15% | Stabilité des outils |
| Coût moyen par requête | Baseline | +50% | Maîtrise des coûts |
8. Récapitulatif
- Délégation intelligente — Le LLM décide quand un outil est nécessaire et lequel utiliser
- Données réelles — Élimine les hallucinations sur les faits, prix, stocks, calculs
- 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





