Chargement

Conversations multi-tours avec des outils

Leçon 2610 min

Lors de la création d'applications avec plusieurs outils, vous devez gérer des scénarios où Claude peut avoir besoin d'appeler plusieurs outils en séquence pour répondre à une seule question de l'utilisateur. Par exemple, si un utilisateur demande « Quel jour sera-t-il dans 103 jours à partir d'aujourd'hui ? », Claude doit d'abord obtenir la date actuelle, puis y ajouter 103 jours.

Cela crée un modèle de conversation multi-tours où Claude effectue plusieurs demandes d'outils avant de fournir une réponse finale. Votre application doit gérer cela automatiquement.

Le modèle d'outils multi-tours

Voici ce qui se passe en arrière-plan lorsque Claude a besoin de plusieurs outils :

  1. L'utilisateur demande : « Quel jour sera-t-il dans 103 jours à partir d'aujourd'hui ? »
  2. Claude répond avec un bloc d'utilisation d'outils demandant get_current_datetime
  3. Votre serveur appelle la fonction et renvoie le résultat
  4. Claude se rend compte qu'il a besoin de plus d'informations et demande add_duration_to_datetime
  5. Votre serveur appelle cette fonction et renvoie le résultat
  6. Claude dispose maintenant de suffisamment d'informations pour fournir la réponse finale

Construction d'une boucle de conversation

Pour gérer ce modèle, vous avez besoin d'une boucle de conversation qui continue jusqu'à ce que Claude arrête de demander des outils :

python
def run_conversation(messages):
    while True:
        response = chat(messages)

        add_assistant_message(messages, response)

        # Pseudo-code
        if response isn't asking for a tool:
            break

        tool_result_blocks = run_tools(response)
        add_user_message(messages, tool_result_blocks)
        
    return messages

Refactorisation des fonctions d'assistance

Avant d'implémenter la boucle de conversation, vous devez mettre à jour vos fonctions d'assistance pour gérer correctement plusieurs blocs de messages.

Mise à jour des gestionnaires de messages

Vos fonctions add_user_message et add_assistant_message supposent actuellement que vous travaillez toujours avec du texte brut. Mettez-les à jour pour gérer des objets de message complets :

python
from anthropic.types import Message

def add_user_message(messages, message):
    user_message = {
        "role": "user",
        "content": message.content if isinstance(message, Message) else message
    }
    messages.append(user_message)

Cela vous permet de passer soit une chaîne de caractères, soit une liste de blocs, soit un objet de message complet.

Mise à jour de la fonction de chat

Modifiez votre fonction de chat pour accepter une liste d'outils et renvoyer le message complet au lieu de simplement le texte :

python
def chat(messages, system=None, temperature=1.0, stop_sequences=[], tools=None):
    params = {
        "model": model,
        "max_tokens": 1000,
        "messages": messages,
        "temperature": temperature,
        "stop_sequences": stop_sequences,
    }
    
    if tools:
        params["tools"] = tools
        
    if system:
        params["system"] = system
        
    message = client.messages.create(**params)
    return message

Extraction du texte des messages

Puisque vous renvoyez maintenant des objets de message complets, créez une fonction d'assistance pour extraire le texte lorsque nécessaire :

python
def text_from_message(message):
    return "\n".join(
        [block.text for block in message.content if block.type == "text"]
    )

Cette fonction trouve tous les blocs de texte dans un message et les assemble, ce qui est utile lorsque vous devez afficher la réponse finale aux utilisateurs.

Améliorations clés

Ces étapes de refactorisation préparent votre code pour une gestion robuste des outils :

  • Gestion flexible des messages - Vos fonctions d'assistance peuvent désormais fonctionner avec différents formats de messages
  • Support des outils dans le chat - La fonction de chat peut recevoir et transmettre des schémas d'outils
  • Retours de messages complets - Vous obtenez des objets de message complets au lieu de simplement du texte, préservant tous les blocs
  • Utilitaire d'extraction de texte - Moyen simple d'obtenir du texte lisible à partir de messages complexes

Avec ces fondations en place, vous êtes prêt à implémenter la boucle de conversation qui gère automatiquement plusieurs appels d'outils, créant une expérience fluide où Claude peut utiliser autant d'outils que nécessaire pour répondre aux questions des utilisateurs.