Cargando

Uso de herramientas en lote

Lección 299 min

Claude puede ejecutar de forma nativa múltiples herramientas al mismo tiempo, pero algunas versiones no aprovechan esto tanto como podrías desear. Puedes aumentar considerablemente las probabilidades de que Claude realice múltiples llamadas a herramientas en un solo mensaje implementando una herramienta de lote (batch tool).

Cuando Claude devuelve partes de uso de herramientas en un mensaje, puede haber más de una solicitud de herramienta en una sola respuesta. Por ejemplo, si preguntas "¿Cuál es el 12 de marzo de 2025 + 50 días? Además, ¿cuál es el 12 de marzo de 2025 + 100 días?", Claude podría, en teoría, devolver dos partes de uso de herramientas separadas, una para cada cálculo. Estas operaciones son completamente paralelizables ya que no dependen entre sí.

Sin embargo, Claude no siempre intenta paralelizar las llamadas a herramientas tanto como cabría esperar. En lugar de realizar ambas llamadas simultáneamente, a menudo las realiza de forma secuencial, lo cual es menos eficiente.

Cómo funciona la herramienta de lote

La herramienta de lote se implementa igual que cualquier otra herramienta: necesitas una especificación de herramienta y una función para manejar su invocación. La idea clave es crear una herramienta que pueda invocar simultáneamente otras múltiples herramientas.

Aquí está la estructura básica de la especificación de la herramienta de lote:

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"]
  }
}

La herramienta toma una lista de invocaciones, donde cada invocación contiene el nombre de una herramienta a llamar y sus argumentos (codificados como una cadena JSON).

Implementación

La implementación de la herramienta de lote involucra dos funciones principales:

La función 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

Esta función recorre cada invocación, extrae el nombre de la herramienta y los argumentos, llama a la herramienta correspondiente usando la función run_tool existente, y recopila todos los resultados.

Agregar a run_tool

También necesitas agregar un caso a tu función principal run_tool:

python
elif tool_name == "batch_tool":
    return run_batch(tool_input)

Ten en cuenta que, a diferencia de otras herramientas, pasas tool_input directamente sin usar el operador splat (**), ya que la herramienta de lote necesita manejar la estructura de entrada sin procesar.

Resultados

Cuando implementas la herramienta de lote y ejecutas la misma consulta de cálculo de fechas, en lugar de ver dos llamadas a herramientas separadas en el registro de mensajes, verás una única llamada a la herramienta de lote. Esta única llamada contiene ambos cálculos de fechas como subinvocaciones, paralelizando efectivamente las operaciones.

La herramienta de lote es particularmente útil cuando tienes múltiples operaciones independientes que pueden ejecutarse simultáneamente. Al "engañar" a Claude para que use este patrón, puedes mejorar significativamente la eficiencia de tus flujos de trabajo de llamadas a herramientas.