?
SkillintermédiaireVérifié le 2025-05

Tool selection : choisir les bons outils pour l'agent

Patterns pour définir, documenter et sélectionner dynamiquement les outils d'un agent.

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)

Sources

agentstoolssélection