Skip to main content

Llamada a Funciones (Function Calling / Tool Calling)

Protocolo técnico y estándar de interacción entre LLM y software externo. En lugar de texto libre, el modelo devuelve un JSON válido con el nombre de la función y argumentos tipados según el esquema JSON Schema, permitiendo al backend ejecutar acciones de manera determinista en APIs reales.

1. Visión general del concepto y problema sistémico

El modelo de lenguaje está encerrado en su propio contexto: no conoce la hora exacta actual, no puede retirar fondos de una cuenta o verificar el estado de un contenedor en Docker.

Sin un mecanismo de interacción con el código, el chatbot solo podría simular acciones, devolviendo texto vago: “He revisado su saldo, hay $50” (incluso si el saldo es $0).

Function Calling (Llamada a funciones o Tool Calling) transforma al generador de texto en un orquestador de sistemas. El modelo analiza el prompt, entiende que le faltan datos y en lugar de texto genera un JSON legible por máquina:

{
  "name": "fetch_user_balance",
  "arguments": "{\"account_id\": \"ACC-9481\"}"
}

Modelo mental: si LLM es el cerebro, Function Calling son los impulsos nerviosos que envían comandos a los músculos (su código y API) para ejecutar una acción física.

┌─────────────────────────────────────────────────────────────┐
│                 ARQUITECTURA FUNCTION CALLING               │
├─────────────────────────────────────────────────────────────┤
│ 1. SOLICITUD DEL USUARIO:                                   │
│    «¿Cuál es el clima en Lviv?»                             │
├─────────────────────────────────────────────────────────────┤
│                          │                                  │
│                          ▼ Solicitud a LLM (junto con el esquema) │
├─────────────────────────────────────────────────────────────┤
│ 2. RESPUESTA DE LLM (finish_reason: "tool_calls"):         │
│    { "name": "get_weather", "args": { "city": "Lviv" } }  │
├─────────────────────────────────────────────────────────────┤
│                          │                                  │
│                          ▼ Backend ejecuta la solicitud API real │
├─────────────────────────────────────────────────────────────┤
│ 3. SU SERVIDOR ➔ OpenWeatherMap ➔ Recibe { temp: 18, rain: 0}│
├─────────────────────────────────────────────────────────────┤
│                          │                                  │
│                          ▼ Envío del resultado de vuelta a LLM │
├─────────────────────────────────────────────────────────────┤
│ 4. RESPUESTA FINAL AL HUMANO:                               │
│    «En Lviv ahora hay +18°C, sin precipitaciones, ¡que tenga un buen día!» │
└─────────────────────────────────────────────────────────────┘

2. Taxonomía arquitectónica y modelo mental

Así es como se registra una herramienta en el estándar OpenAI / Anthropic Tool Calling:

curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4o",
    "messages": [
      {"role": "user", "content": "Bloquea la tarjeta del usuario 5501"}
    ],
    "tools": [
      {
        "type": "function",
        "function": {
          "name": "block_payment_card",
          "description": "Bloqueo seguro de la tarjeta bancaria del usuario en caso de pérdida",
          "parameters": {
            "type": "object",
            "properties": {
              "card_id": {
                "type": "integer",
                "description": "Identificador único de la tarjeta en el sistema"
              },
              "reason": {
                "type": "string",
                "enum": ["lost", "stolen", "fraud"],
                "description": "Razón del bloqueo"
              }
            },
            "required": ["card_id", "reason"]
          }
        }
      }
    ],
    "tool_choice": "auto"
  }'

Lo que devuelve el modelo:

{
  "role": "assistant",
  "content": null,
  "tool_calls": [
    {
      "id": "call_abc123",
      "type": "function",
      "function": {
        "name": "block_payment_card",
        "arguments": "{\"card_id\": 5501, \"reason\": \"lost\"}"
      }
    }
  ]
}

3. Cuatro reglas de seguridad al trabajar con Function Calling

  1. Validación estricta de argumentos (Pydantic / Zod): Nunca confíe ciegamente en los argumentos del modelo JSON. Siempre analícelos a través de un esquema de validación antes de ejecutar una consulta SQL o retirar fondos.
  2. Puerta de control para acciones destructivas (Human-in-the-Loop): Si la función ejecuta una operación irreversible (delete_database, transfer_funds), el backend debe detener la ejecución y solicitar la confirmación de una persona real.
  3. Limitación del contexto de herramientas: No pase cientos de funciones al modelo al mismo tiempo. Esto diluye la atención (Attention Saturation) y aumenta la probabilidad de una llamada errónea. Utilice filtrado dinámico o MCP.
  4. Protección contra bucles infinitos (Infinite Tool Loop): Siempre establezca un límite estricto en la cantidad de llamadas a funciones consecutivas (por ejemplo, no más de 5 iteraciones por solicitud).

4. Escenarios prácticos de ingeniería en producción

Function Calling es el puente que conecta el mundo del modelado estadístico del lenguaje con el mundo determinista de la programación. Este mecanismo es el núcleo de todos los modernos AI-agents, servidores MCP y asistentes autónomos para desarrolladores.

/ Preguntas frecuentesSchema.org FAQPage

FAQ: Llamada a Funciones (Function Calling / Tool Calling)

¡Categoricamente no! El modelo es un procesador textual y matemático aislado. No tiene acceso directo a su base de datos o red. Solo genera tokens en formato JSON con una solicitud a su servidor: 'Ejecuta get_user_balance(user_id=42)'. El código real siempre se ejecuta en su backend alojado.
/ Enlaces internos
Todos los términos