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.

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.

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.

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:
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:
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_outputDu musst außerdem deine Haupt-Tool-Routing-Funktion aktualisieren, um Batch-Tool-Aufrufe zu verarbeiten:
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.