Ce format d’utilisation d’outil est obsolète

Nous vous recommandons vivement de passer dès que possible à notre structure d’utilisation d’outils améliorée, qui est plus fiable et permet des performances de meilleure qualité, en particulier pour les tâches d’utilisation d’outils plus complexes.

Ce format d’utilisation d’outil n’est pas optimisé pour Claude 3 et peut entraîner des performances inférieures à notre format d’utilisation d’outils mis à jour.


Comment fonctionne l’utilisation d’outils hérités

Avec l’utilisation d’outils hérités, les fonctions sont définies dans l’invite elle-même. Lorsque vous fournissez à Claude des descriptions d’outils et de fonctions qu’il peut utiliser, Claude est capable de décider intelligemment quand et comment utiliser ces outils pour aider à répondre aux questions et à accomplir des tâches.

Par exemple, disons que vous fournissez à Claude (dans l’invite) une fonction appelée get_weather(location) qui récupère la météo actuelle pour un lieu donné. Si un utilisateur demande ensuite “Quel temps fait-il à Londres en ce moment ?”, Claude reconnaîtra qu’il peut utiliser la fonction get_weather que vous avez fournie pour trouver la réponse.

En coulisses, il s’agit d’un processus en plusieurs étapes :

  1. Les définitions de fonctions et la question de l’utilisateur sont toutes deux transmises à Claude dans une seule invite
    • Claude a non seulement besoin des outils et de leurs descriptions pour décider avec succès s’il doit utiliser les outils, mais probablement aussi d’exemples d’accompagnement de situations dans lesquelles ces outils devraient être utilisés, en fonction de la complexité du cas d’utilisation et des outils.
  2. Claude évalue la question de l’utilisateur et décide quelle(s) fonction(s) appeler et avec quels arguments
  3. Claude construit un appel de fonction correctement formaté
  4. L’appel de fonction est intercepté via le code client avec une stop_sequence claire, et la fonction réelle est exécutée côté client
  5. Le résultat de la fonction est renvoyé à Claude
  6. Claude utilise le résultat de la fonction pour formuler sa réponse finale à l’utilisateur

Cette technique permet à Claude de tirer parti de connaissances et de capacités externes tout en maintenant une interface conversationnelle.


Définition des fonctions

Les fonctions sont définies en fournissant à Claude une description de la fonction entourée de balises XML. La description doit inclure :

  • Le nom de la fonction
  • Une explication en texte brut de ce que fait la fonction
  • Les paramètres attendus, leurs types et leurs descriptions
  • Les valeurs de retour et les types
  • Toutes les exceptions qui peuvent être levées

Voici un exemple de définition de fonction :

XML
<tool_description>
<tool_name>get_weather</tool_name>
<description>
Récupère la météo actuelle pour un lieu spécifié.
Renvoie un dictionnaire avec deux champs :
- temperature : float, la température actuelle en Fahrenheit
- conditions : string, une brève description des conditions météorologiques actuelles
Lève ValueError si le lieu fourni ne peut pas être trouvé.
</description>
<parameters>
<parameter>
<name>location</name>
<type>string</type>
<description>La ville et l'état, par exemple San Francisco, CA</description>
</parameter>
</parameters>
</tool_description>

Quelques conseils pour écrire de bonnes descriptions de fonctions :

  • Soyez clair et concis, mais fournissez suffisamment de détails pour que Claude comprenne quand la fonction doit être utilisée
  • Spécifiez les types des paramètres et des valeurs de retour
  • Mentionnez toutes les exceptions pertinentes qui peuvent être levées
  • Utilisez des descriptions en texte brut, pas de syntaxe de code

Format d’utilisation d’outils hérités

Pour que Claude puisse appeler une fonction, il doit générer un bloc XML très spécifiquement formaté. Le format ressemble à ceci :

XML
<function_calls>
<invoke>
<tool_name>function_name</tool_name>
<parameters>
<param1>value1</param1>
<param2>value2</param2>
</parameters>
</invoke>
</function_calls>

Le bloc <function_calls> peut contenir plusieurs blocs <invoke> si Claude appelle plusieurs fonctions en même temps. Chaque <invoke> contient le nom de la fonction appelée et les paramètres transmis.

Vous devez passer </function_calls> dans votre appel API en tant que stop_sequence pour vous assurer que Claude arrête de générer du texte une fois qu’il a appelé une fonction.

Après un bloc <function_calls>, et en supposant que vous ayez la bonne séquence d’arrêt en place, Claude arrêtera de générer et attendra que le résultat de la fonction soit renvoyé dans un bloc <function_results> qui ressemble à ceci :

XML
<function_results>
<result>
<tool_name>function_name</tool_name>
<stdout>
le résultat de la fonction va ici
</stdout>
</result>
</function_results>

Le résultat de la fonction doit être placé à l’intérieur des balises <stdout>. Si la fonction a levé une exception, cela doit être renvoyé comme ceci :

XML
<function_results>
<error>
le message d'erreur va ici
</error>
</function_results>

Le résultat complet de la fonction doit être renvoyé à Claude sous forme de message qui poursuit la conversation d’avant. Après avoir reçu les résultats de la fonction, Claude continuera à générer pour incorporer les résultats dans sa réponse.


Exemple d’invite d’utilisation d’outils hérités

Voici un exemple complet d’invite qui fournit à Claude deux fonctions et une question qui nécessite de les utiliser :

Contenu
SystèmeDans cet environnement, vous avez accès à un ensemble d’outils que vous pouvez utiliser pour répondre à la question de l’utilisateur.

Vous pouvez les appeler comme ceci :
<function_calls>
<invoke>
<tool_name>$TOOL_NAME</tool_name>
<parameters>
<$PARAMETER_NAME>$PARAMETER_VALUE</$PARAMETER_NAME>

</parameters>
</invoke>
</function_calls>

Voici les outils disponibles :
<tools>
<tool_description>
<tool_name>get_current_stock_price
</tool_name><description>Obtient le cours actuel de l’action d’une entreprise. Renvoie float : Le cours actuel de l’action.
Lève ValueError : si le symbole d’entrée est invalide/inconnu.</description>
<parameters>
<parameter>
<name>symbol</name>
<type>string</type>
<description>Le symbole boursier de l’entreprise pour laquelle obtenir le prix.</description>
</parameter>
</parameters>
</tool_description>

<tool_description>
<tool_name>get_ticker_symbol</tool_name>
<description>Obtient le symbole boursier d’une entreprise recherchée par nom. Renvoie str : Le symbole boursier de l’action de l’entreprise. Lève TickerNotFound : si aucun symbole boursier correspondant n’est trouvé.
</description>
<parameters>
<parameter>
<name>company_name</name>
<type>string</type>
<description>Le nom de l’entreprise.</description>
</parameter>
</parameters>
</tool_description></tools>
UtilisateurQuel est le cours actuel de l’action de General Motors ?

Voici comment Claude répondrait :

Contenu
Assistant<scratchpad>
Pour répondre à cette question, je vais devoir :

1. Obtenir le symbole boursier de General Motors en utilisant la fonction get_ticker_symbol().
2. Utiliser le symbole boursier renvoyé pour obtenir le cours actuel de l’action en utilisant la fonction get_current_stock_price().</scratchpad>

<function_calls>
<invoke>
<tool_name>get_ticker_symbol</tool_name>
<parameters>
<company_name>General Motors</company_name>
</parameters>
</invoke>
</function_calls>

Claude appelle d’abord get_ticker_symbol pour récupérer le symbole boursier de General Motors. Nous pouvons reconnaître que Claude veut appeler une fonction via la séquence d’arrêt </function calls>. Nous extrayons les données pertinentes entre les balises XML appropriées et exécutons la fonction au nom de Claude. Ensuite, nous renvoyons les résultats à Claude dans des balises <function_results>.

Contenu
Utilisateur<function_results>
<result>
<tool_name>get_ticker_symbol</tool_name>
<stdout>
GM
</stdout>
</result>
</function_results>

Maintenant qu’il connaît le symbole boursier, Claude décidera par la suite qu’il doit appeler get_current_stock_price et obtenir le prix actuel.

Contenu
Assistant<function_calls>
<invoke>
<tool_name>get_current_stock_price</tool_name>
<parameters>
<symbol>GM</symbol>
</parameters>
</invoke>
</function_calls>

Nous renvoyons également ces résultats.

Contenu
Utilisateur<function_results>
<result>
<tool_name>get_current_stock_price</tool_name>
<stdout>
38.50
</stdout>
</result>
</function_results>

Avec toute cette chaîne de conversation fournissant à Claude tous les détails dont il a besoin, Claude sera en mesure de fournir une réponse à l’utilisateur comme sortie finale.

Contenu
<answer>
Le cours actuel de l’action de General Motors est de 38,50 $.
</answer>

FAQ sur l’utilisation d’outils hérités

Combien d’outils puis-je transmettre à Claude dans une interaction donnée ?

Vous pouvez définir n’importe quel nombre d’outils et de fonctions que Claude peut utiliser, bien que nous recommandions actuellement de ne pas dépasser 3 à 5 pour cette structure d’utilisation d’outils héritée, en fonction de la complexité de votre cas d’utilisation et des fonctions en question.

Claude a-t-il des outils intégrés qu’il connaît ?

Non. Tous les outils que vous voulez que Claude utilise, vous devrez les définir vous-même dans une invite d’utilisation d’outils. Claude n’a pas de liste prédéterminée de fonctions et de définitions qui fonctionnent le mieux.

Quand le nouveau format d’utilisation d’outils arrivera-t-il sur Vertex AI ou Amazon Bedrock ?

Dans un avenir proche !