Claude可以原生地同时运行多个工具,但某些版本并没有像您期望的那样充分利用这一点。通过实现一个批量工具,您可以大大提高Claude在单条消息中进行多次工具调用的可能性。

当Claude在消息中发回工具使用部分时,单个响应中可能包含多个工具请求。例如,如果您问"2025年3月12日加50天是多少?另外,2025年3月12日加100天是多少?",Claude理论上可以发回两个独立的工具使用部分——每个计算对应一个。由于这些操作互不依赖,因此完全可以并行化。
然而,Claude并不总是像您期望的那样尝试并行化工具调用。它往往不是同时进行两次调用,而是按顺序进行,这样效率较低。
批量工具的工作原理
批量工具的实现方式与其他任何工具相同——您需要一个工具规范和一个函数来处理它被调用时的逻辑。其核心思想是创建一个可以同时调用多个其他工具的工具。
以下是批量工具规范的基本结构:
json
{
"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": "string",
"description": "The arguments to the tool, encoded as a JSON string"
}
},
"required": ["name", "arguments"]
}
}
},
"required": ["invocations"]
}
}该工具接受一个调用列表,其中每个调用包含要调用的工具名称及其参数(以JSON字符串编码)。
实现
批量工具的实现涉及两个主要函数:
run_batch 函数
python
def run_batch(tool_input):
batch_output = []
for invocation in tool_input["invocations"]:
tool_name = invocation["name"]
args = json.loads(invocation["arguments"])
tool_output = run_tool(tool_name, args)
batch_output.append({"tool_name": tool_name, "output": tool_output})
return batch_output该函数遍历每个调用,提取工具名称和参数,使用现有的run_tool函数调用相应的工具,并收集所有结果。
添加到 run_tool
您还需要在主run_tool函数中添加一个分支:
python
elif tool_name == "batch_tool":
return run_batch(tool_input)请注意,与其他工具不同,您需要直接传递tool_input,而不使用展开运算符(**),因为批量工具需要处理原始输入结构。
结果
当您实现批量工具并运行相同的日期计算查询时,您将在消息日志中看到对批量工具的单次调用,而不是两个独立的工具调用。这一次调用将两个日期计算作为子调用包含在内,从而有效地实现了操作的并行化。
当您有多个可以同时执行的独立操作时,批量工具特别有用。通过"诱导"Claude使用这种模式,您可以显著提高工具调用工作流程的效率。