Le problème de la sélection d'outils
Un agent avec trop d'outils disponibles perd en précision : il choisit le mauvais outil ou hallucine des paramètres. La sélection d'outils est un art qui impacte directement la fiabilité de l'agent.
Principe : moins c'est plus
Les LLMs performent mieux avec 5-10 outils bien définis qu'avec 50 outils mal documentés. Au-delà de 15-20 outils, la qualité de sélection se dégrade significativement.
Bonnes pratiques de définition
Nommage clair et sans ambiguïté
# Mauvais
@tool
def get_data(query: str) -> str:
"""Récupère des données."""
# Bon
@tool
def search_product_catalog(product_name: str, category: str = None) -> str:
"""Recherche un produit par nom dans le catalogue.
Retourne le nom, prix et disponibilité.
Utiliser quand l'utilisateur demande des infos sur un produit spécifique."""Documentation exhaustive
Chaque outil doit préciser : - Ce qu'il fait exactement - Quand l'utiliser (et quand NE PAS l'utiliser) - Le format des paramètres attendus - Ce qu'il retourne
Sélection dynamique
Pattern : Tool Registry avec routing
class ToolRegistry:
def __init__(self):
self.tools: dict[str, BaseTool] = {}
self.categories: dict[str, list[str]] = {}
def get_tools_for_context(self, user_query: str, context: dict) -> list[BaseTool]:
"""Sélectionne les outils pertinents selon le contexte."""
category = self.classify_intent(user_query)
tool_names = self.categories.get(category, [])
return [self.tools[name] for name in tool_names]Pattern : Two-step tool selection
1. Premier appel LLM : "Quels outils sont pertinents pour cette requête ?" 2. Second appel LLM : Exécution avec uniquement les outils sélectionnés
selection_prompt = """Voici les outils disponibles : {all_tools}
Pour cette requête : {query}
Quels outils (max 5) sont pertinents ? Liste uniquement les noms."""Pattern : Outils composites
Regrouper les actions liées en un seul outil :
@tool
def manage_order(action: str, order_id: str, params: dict = None) -> str:
"""Gère une commande. Actions: 'status', 'cancel', 'modify', 'refund'.
- status: pas de params supplémentaires
- cancel: params={reason: str}
- modify: params={items: list}
- refund: params={amount: float, reason: str}"""Erreurs courantes
- Outils trop génériques ("search" sans préciser quoi)
- Outils avec des noms similaires qui confondent l'agent
- Pas de description de quand NE PAS utiliser l'outil
- Paramètres optionnels non documentés
- Retours non structurés (l'agent ne sait pas parser le résultat)