Wird geladen

Multi-Turn-Konversationen mit Tools

Lektion 2710 Min.

Beim Erstellen von Anwendungen mit mehreren Tools musst du Szenarien handhaben, in denen Claude möglicherweise mehrere Tools in Folge aufrufen muss, um eine einzelne Benutzerfrage zu beantworten. Wenn ein Benutzer beispielsweise fragt „Welcher Tag ist 103 Tage von heute an?", muss Claude zunächst das aktuelle Datum abrufen und dann 103 Tage dazu addieren.

Dies erzeugt ein Multi-Turn-Tool-Muster, bei dem Claude mehrere Tool-Anfragen stellt, bevor es eine endgültige Antwort liefert. Deine Anwendung muss dies automatisch handhaben.

Das Multi-Turn-Tool-Muster

Hier ist, was hinter den Kulissen passiert, wenn Claude mehrere Tools benötigt:

  1. Der Benutzer fragt: „Welcher Tag ist 103 Tage von heute an?"
  2. Claude antwortet mit einem Tool-Use-Block, der get_current_datetime anfordert
  3. Dein Server ruft die Funktion auf und gibt das Ergebnis zurück
  4. Claude erkennt, dass es weitere Informationen benötigt, und fordert add_duration_to_datetime an
  5. Dein Server ruft diese Funktion auf und gibt das Ergebnis zurück
  6. Claude hat nun genug Informationen, um die endgültige Antwort zu liefern

Eine Konversationsschleife erstellen

Um dieses Muster zu handhaben, benötigst du eine Konversationsschleife, die fortgesetzt wird, bis Claude keine Tools mehr anfordert:

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

        add_assistant_message(messages, response)

        # Pseudocode
        if response isn't asking for a tool:
            break

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

Hilfsfunktionen refaktorieren

Bevor du die Konversationsschleife implementierst, musst du deine Hilfsfunktionen aktualisieren, um mehrere Nachrichtenblöcke ordnungsgemäß zu handhaben.

Nachrichten-Handler aktualisieren

Deine Funktionen add_user_message und add_assistant_message gehen derzeit davon aus, dass sie immer mit reinem Text arbeiten. Aktualisiere sie, um vollständige Nachrichtenobjekte zu handhaben:

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)

Dies ermöglicht es dir, entweder einen String, eine Liste von Blöcken oder ein vollständiges Nachrichtenobjekt zu übergeben.

Die Chat-Funktion aktualisieren

Modifiziere deine Chat-Funktion, um eine Liste von Tools zu akzeptieren und die vollständige Nachricht anstatt nur Text zurückzugeben:

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

Text aus Nachrichten extrahieren

Da die Chat-Funktion nun vollständige Nachrichten anstatt nur Text zurückgibt, füge eine Hilfsfunktion hinzu, um Text bei Bedarf zu extrahieren:

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

Diese Funktion findet alle Textblöcke in einer Nachricht und fügt sie zusammen, was nützlich ist, wenn du die endgültige Antwort den Benutzern anzeigen musst.

Warum diese Änderungen wichtig sind

Diese Refaktorierungsschritte bereiten deinen Code auf die Realität von Tool-fähigen Konversationen vor:

  • Mehrere Blöcke pro Nachricht - Claudes Antworten können sowohl Text- als auch Tool-Use-Blöcke enthalten
  • Flexible Nachrichtenverarbeitung - Deine Funktionen können jetzt mit verschiedenen Nachrichtenformaten arbeiten
  • Vollständige Nachrichtenerhaltung - Du behältst alle Informationen, die Claude bereitstellt, nicht nur die Textteile
  • Unterstützung für Tool-Listen - Deine Chat-Funktion kann jetzt mehrere Tools empfangen und verwenden

Mit diesen Grundlagen bist du bereit, die vollständige Konversationsschleife zu implementieren, die mehrere Tool-Aufrufe automatisch handhabt und so eine nahtlose Erfahrung schafft, bei der Claude alle benötigten Tools verwenden kann, um Benutzerfragen vollständig zu beantworten.