Wird geladen

Wenn du mit den Tool-Calling-Fähigkeiten von Claude arbeitest, wirst du vielleicht bemerken, dass Claude mehrere Tool-Use-Blöcke in einer einzigen Assistant-Nachricht einbinden kann. Dies ermöglicht es Claude, mehrere Tools parallel auszuführen, anstatt für jedes einzelne eine separate Anfrage zu stellen. In der Praxis kann es jedoch schwierig sein, Claude dazu zu bringen, dies konsequent zu tun.

Das Problem mit mehreren Tool-Aufrufen

Angenommen, du bittest Claude, zwei Erinnerungen für dasselbe Datum zu setzen. Theoretisch sollte Claude in der Lage sein, eine einzige Antwort mit zwei Tool-Use-Blöcken zurückzusenden - einen für jede Erinnerung. In der Realität sendet Claude jedoch oft stattdessen separate Antworten.

Der ideale Austausch: eine Assistant-Nachricht mit zwei set_reminder-Tool-Uses für den 1. Januar, "Steuern fällig" und "Arzttermin".

Was typischerweise passiert, ist, dass Claude den ersten Tool-Aufruf tätigt, auf das Ergebnis wartet und dann den zweiten Tool-Aufruf in einer Folgenachricht tätigt. Dies erzeugt unnötige Hin-und-her-Kommunikation, obwohl die Operationen gleichzeitig hätten durchgeführt werden können.

Claude beantwortet die Zwei-Erinnerungen-Anfrage von unserem Server mit einem batch_tool-Aufruf: set_reminder für "Arzttermin" und "Steuern fällig".

Die Batch-Tool-Lösung

Die Lösung besteht darin, ein "Batch-Tool" zu implementieren - ein spezielles Tool, das eine Liste anderer Tool-Aufrufe entgegennimmt, um sie gleichzeitig auszuführen. Dies ist im Wesentlichen ein Workaround, der Claude dazu bringt, mehrere Tool-Aufrufe auf einmal zu tätigen.

Claude beantwortet die Zwei-Erinnerungen-Anfrage von unserem Server mit einem batch_tool-Aufruf: set_reminder für "Arzttermin" und "Steuern fällig".

So funktioniert es:

  • Du definierst ein Batch-Tool-Schema, das Claude mitteilt, dass es mehrere andere Tools parallel ausführen kann
  • Anstatt Tools direkt aufzurufen, ruft Claude das Batch-Tool mit einer Liste von Tool-Aufrufen auf
  • Dein Code verarbeitet diese Liste und führt jeden Tool-Aufruf aus
  • Du gibst die kombinierten Ergebnisse an Claude zurück

Implementierung des Batch-Tool-Schemas

Das Batch-Tool-Schema definiert, wie Claude seine Anfragen strukturieren soll, wenn es mehrere Tools ausführen möchte:

python
batch_tool_schema = {
    "name": "batch_tool",
    "description": "Invoke multiple other tool calls simultaneously",
    "input_schema": {
        "type": "object",
        "properties": {
            "invocations": {
                "type": "array",
                "description": "The tool calls to invoke",
                "items": {
                    "type": "object",
                    "properties": {
                        "name": {
                            "type": "string",
                            "description": "The name of the tool to invoke"
                        },
                        "arguments": {
                            "type": "object",
                            "description": "The arguments to pass to the tool"
                        }
                    }
                }
            }
        }
    }
}

Verarbeitung von Batch-Tool-Aufrufen

Wenn Claude das Batch-Tool verwendet, musst du die Liste der Aufrufe verarbeiten und jeden einzelnen ausführen. Hier ist die Implementierung:

python
def run_batch(invocations=[]):
    batch_output = []
    
    for invocation in invocations:
        name = invocation["name"]
        args = invocation["arguments"]
        
        tool_output = run_tool(name, args)
        
        batch_output.append({
            "tool_name": name,
            "output": tool_output
        })
    
    return batch_output

Du musst außerdem deine Haupt-Tool-Routing-Funktion aktualisieren, um Batch-Tool-Aufrufe zu verarbeiten:

python
def run_tool(tool_name, tool_input):
    if tool_name == "get_current_datetime":
        return get_current_datetime(**tool_input)
    elif tool_name == "add_duration_to_datetime":
        return add_duration_to_datetime(**tool_input)
    elif tool_name == "set_reminder":
        return set_reminder(**tool_input)
    elif tool_name == "batch_tool":
        return run_batch(**tool_input)

Ergebnisse

Mit dem implementierten Batch-Tool ist es viel wahrscheinlicher, dass Claude zusammengehörige Operationen gruppiert. Anstatt separate Anfragen für jede Erinnerung zu stellen, verwendet Claude das Batch-Tool, um beide Erinnerungen gleichzeitig zu setzen.

Der Gesprächsablauf wird dadurch viel sauberer - eine Anfrage vom Nutzer, eine Antwort von Claude mit dem Batch-Tool-Aufruf und eine Folgenachricht mit allen Ergebnissen. Dies reduziert die Latenz und macht deine Anwendung effizienter.

Auch wenn es wie ein Workaround erscheinen mag (und das ist es auch), ist das Batch-Tool-Muster eine effektive Möglichkeit, Claude dazu zu bringen, über Operationen nachzudenken, die parallelisiert werden können, und diese effizienter auszuführen.