¿Qué es Tool Calling?
Tool calling (también conocido como function calling) permite a los LLMs decidir cuándo llamar a funciones externas para recopilar información o tomar acciones. En lugar de alucinar respuestas, el modelo puede llamar a una API del clima, consultar una base de datos, hacer cálculos o interactuar con cualquier sistema que definas.
🛠️ Cómo Funciona
- 1. Definir herramientas — Describe funciones con nombres, descripciones y esquemas de parámetros
- 2. Vincular al modelo — Adjunta herramientas al LLM para que sepa qué está disponible
- 3. El LLM decide — Basado en el mensaje del usuario, el modelo decide si llamar una herramienta
- 4. Ejecutar — Tu código ejecuta la función y devuelve el resultado al LLM
- 5. Respuesta final — El LLM usa el resultado de la herramienta para generar la respuesta
Creando Herramientas
import { tool } from "@langchain/core/tools";
import { z } from "zod";
// Definir una herramienta del clima
const obtenerClima = tool(
async ({ ciudad }) => {
const datos: Record<string, string> = {
"madrid": "22°C, Soleado",
"londres": "14°C, Nublado",
"tokio": "27°C, Húmedo",
};
return datos[ciudad.toLowerCase()] || "Datos no disponibles";
},
{
name: "obtener_clima",
description: "Obtiene el clima actual de una ciudad",
schema: z.object({
ciudad: z.string().describe("Nombre de la ciudad"),
}),
}
);
// Definir una calculadora
const calculadora = tool(
async ({ expresion }) => {
try {
const resultado = Function(`"use strict"; return (${expresion})`)();
return String(resultado);
} catch {
return "Expresión inválida";
}
},
{
name: "calculadora",
description: "Evalúa una expresión matemática",
schema: z.object({
expresion: z.string().describe("La expresión matemática, ej: '2 + 2'"),
}),
}
);
Vinculando Herramientas al Modelo
import { ChatOpenAI } from "@langchain/openai";
const model = new ChatOpenAI({ modelName: "gpt-4" });
const modelConHerramientas = model.bindTools([obtenerClima, calculadora]);
const response = await modelConHerramientas.invoke(
"¿Cuál es el clima en Tokio y cuánto es 25 * 4?"
);
console.log(response.tool_calls);
// [
// { name: "obtener_clima", args: { ciudad: "Tokio" } },
// { name: "calculadora", args: { expresion: "25 * 4" } }
// ]
Ejecución Automática de Herramientas
import { createToolCallingAgent, AgentExecutor } from "langchain/agents";
import { ChatPromptTemplate } from "@langchain/core/prompts";
const tools = [obtenerClima, calculadora];
const prompt = ChatPromptTemplate.fromMessages([
["system", "Eres un asistente útil con acceso a herramientas."],
["human", "{input}"],
["placeholder", "{agent_scratchpad}"],
]);
const agent = createToolCallingAgent({
llm: new ChatOpenAI({ modelName: "gpt-4" }),
tools,
prompt,
});
const executor = new AgentExecutor({ agent, tools });
const result = await executor.invoke({
input: "¿Cuál es el clima en Madrid? Si la temperatura es 22°C, ¿cuánto es en Fahrenheit? Usa la fórmula (C * 9/5) + 32",
});
console.log(result.output);
// "El clima en Madrid es 22°C y Soleado.
// 22°C en Fahrenheit es 71.6°F."
💡 Puntos Clave
- • Tool calling permite a los LLMs interactuar con APIs externas, bases de datos y funciones
- • Define herramientas con nombre, descripción y esquema Zod para parámetros
- • Usa
bindTools()para adjuntar herramientas, oAgentExecutorpara ejecución automática - • El LLM decide cuándo y qué herramientas llamar según la entrada del usuario
- • Siempre valida y sanitiza las entradas de las herramientas