TechLead
Lección 13 de 18
5 min de lectura
LangChain

Llamadas a Herramientas y Funciones

Dale a los LLMs la capacidad de llamar funciones, acceder a APIs e interactuar con sistemas externos usando llamadas a herramientas

¿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. 1. Definir herramientas — Describe funciones con nombres, descripciones y esquemas de parámetros
  2. 2. Vincular al modelo — Adjunta herramientas al LLM para que sepa qué está disponible
  3. 3. El LLM decide — Basado en el mensaje del usuario, el modelo decide si llamar una herramienta
  4. 4. Ejecutar — Tu código ejecuta la función y devuelve el resultado al LLM
  5. 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, o AgentExecutor para 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

Continuar aprendiendo