flowchart TD
A[Usuario formula tarea] --> B[Modelo]
B --> C{¿Necesita una tool?}
C -- No --> H[Genera respuesta]
C -- Sí --> D[Selecciona tool y argumentos]
D --> E[Aplicación valida y ejecuta]
E --> F[Resultado / observación]
F --> B
Tool calling
Ya tenemos herramientas.
Supongamos que la aplicación dispone de estas capacidades:
buscar_documentos
obtener_documento
calcular_exposicion
crear_borrador_revision
enviar_alerta
Y recibe una instrucción sencilla:
“Comprueba cuál es el anexo de seguridad vigente del proveedor ACME.”
Todavía falta explicar el mecanismo central.
¿Cómo pasa el sistema desde lenguaje natural a una operación concreta?
¿Cómo sabe qué herramienta utilizar?
¿Quién completa sus parámetros?
¿Quién ejecuta realmente la función?
¿Y cómo vuelve el resultado al modelo?
Ese ciclo se denomina habitualmente tool calling o, en muchas implementaciones, function calling.
En términos simplificados, tool calling es el proceso mediante el cual el modelo puede proponer una llamada estructurada a una herramienta y la aplicación puede ejecutarla, devolver el resultado y continuar la interacción.
El ciclo básico es:
detectar necesidad → elegir herramienta → preparar argumentos → ejecutar → recibir resultado → continuar.
Antes de llamar una tool, la aplicación debe describirla
El modelo no puede seleccionar adecuadamente una capacidad que no conoce.
Por eso una aplicación suele proporcionar una descripción de las herramientas disponibles.
Por ejemplo:
Nombre:
buscar_documentos
Descripción:
Busca contratos y anexos asociados a un proveedor dentro de repositorios autorizados.
Parámetros:
- proveedor: texto
- tipo_documento: texto
Salida:
Lista de documentos encontrados.
Esta descripción funciona como un pequeño contrato operacional.
Huyen señala que las herramientas suelen declararse mediante un nombre, parámetros y documentación sobre qué hace la función y qué necesita. Google subraya además que los schemas de entrada y salida ayudan tanto a describir la capacidad como a validar la llamada durante la ejecución.
Describir finalidad, no sólo implementación
Comparemos dos descripciones.
Mala descripción
Llama GET /v3/contracts con payload JSON.
Mejor descripción
Busca contratos y anexos asociados al proveedor dentro de los repositorios autorizados.
La primera puede ser correcta desde el punto de vista técnico, pero explica poco sobre cuándo utilizar la herramienta.
La segunda comunica finalidad.
Para un modelo que debe seleccionar entre varias capacidades, esa diferencia importa.
1. Detectar la necesidad
La primera etapa consiste en reconocer que la tarea no puede completarse únicamente con el contexto disponible.
El sistema recibe:
“Comprueba cuál es el anexo de seguridad vigente.”
Pero sólo tiene el contrato principal.
Una respuesta posible sería:
No dispongo del anexo.
Si la aplicación tiene tools, puede ocurrir algo más.
El modelo puede generar una salida equivalente a:
Necesito buscar documentos asociados al proveedor.
Esta etapa es importante porque un error puede ocurrir incluso antes de seleccionar una tool.
El modelo podría no detectar que falta información y simplemente inferir una respuesta.
2. Elegir la herramienta
Supongamos que el inventario disponible es:
buscar_documentos
calcular_exposicion
crear_borrador_revision
enviar_alerta
Para resolver la necesidad actual, la opción razonable es:
buscar_documentos
A esta colección de capacidades disponibles Huyen la denomina tool inventory.
Cuantas más herramientas ofrecemos, más capacidades tiene el sistema.
Pero también puede aumentar la dificultad de seleccionar correctamente.
Esto conduce a un principio de diseño útil:
más tools no significa automáticamente mejor sistema.
Una herramienta redundante, ambigua o excesivamente parecida a otra puede aumentar errores de selección.
3. Preparar argumentos
Elegir la función correcta no basta.
También debemos completarla.
La tool espera:
buscar_documentos(proveedor, tipo_documento)
El sistema puede generar:
buscar_documentos(
proveedor = "ACME",
tipo_documento = "anexo_seguridad"
)
Los valores concretos se denominan argumentos.
Aquí aparece otro punto de fallo.
La tool puede existir.
El nombre puede ser correcto.
El formato puede ser válido.
Y aun así el argumento puede ser incorrecto.
Por ejemplo:
proveedor = "ACNE"
La estructura no detecta necesariamente que se trata del proveedor equivocado.
Forma válida no equivale a contenido correcto
Esta diferencia conecta directamente con lo aprendido en salidas estructuradas.
Una llamada como:
{
"name": "buscar_documentos",
"arguments": {
"proveedor": "ACNE",
"tipo_documento": "anexo_seguridad"
}
}puede cumplir perfectamente el schema.
Eso sólo demuestra que:
el nombre existe
+
los campos requeridos están presentes
+
los tipos son válidos
No demuestra:
que el proveedor sea correcto
que la operación sea necesaria
que el usuario tenga permiso
que el resultado vaya a ser interpretado bien
La validación estructural puede comprobar la forma de la llamada.
La corrección de la tarea exige además evaluar la semántica, el contexto y la autorización.
4. Ejecutar
Este paso es arquitectónicamente decisivo.
El modelo puede producir una estructura que indica:
usa buscar_documentos con estos argumentos
Pero eso no significa que el modelo haya entrado por sí mismo al DMS.
En una implementación típica, otra parte de la aplicación recibe la solicitud.
Puede entonces:
1. comprobar que la tool está habilitada
2. validar argumentos
3. comprobar autenticación
4. comprobar autorización
5. ejecutar la función real
6. manejar errores
7. registrar la operación
Berryman y Ziegler muestran este patrón de manera explícita: la aplicación envía al modelo las definiciones de tools, recibe una posible tool call, localiza la función correspondiente, ejecuta sus argumentos y añade la respuesta de la función de vuelta a la conversación.
La frase precisa es entonces:
el modelo genera una solicitud de tool calling; la aplicación controla la ejecución.
La aplicación puede rechazar la llamada
Esto es muy importante.
La existencia de una tool call no obliga al sistema a ejecutarla.
Supongamos:
eliminar_documento(id = "DOC-021")
La aplicación puede responder:
OPERACIÓN NO AUTORIZADA
O puede solicitar confirmación humana.
Esta separación entre propuesta y ejecución crea un punto de control.
5. Recibir el resultado
Supongamos que la búsqueda se ejecuta correctamente.
La función devuelve:
DOC-011 | Anexo_Seguridad_ACME_2024.pdf | reemplazado
DOC-019 | Anexo_Seguridad_ACME_2026_draft.pdf | borrador
DOC-021 | Anexo_Seguridad_ACME_2026.pdf | firmado
Ese resultado vuelve a la aplicación.
Después puede incorporarse al contexto del modelo.
En arquitecturas de agentes suele utilizarse la palabra observación para referirse a información obtenida después de ejecutar una acción.
No necesitamos adoptar obligatoriamente esa terminología aquí.
La idea importante es:
la salida de la tool se convierte en una nueva entrada para la siguiente etapa.
6. Continuar el trabajo
El resultado anterior no resuelve todavía toda la tarea.
Ahora el sistema sabe que existe un documento firmado:
DOC-021
Puede necesitar recuperarlo.
Entonces genera otra llamada:
obtener_documento(id = "DOC-021")
La aplicación vuelve a ejecutar.
El contenido regresa.
El modelo puede finalmente comparar el anexo con el contrato principal.
Tool calling puede, por tanto, formar un ciclo.
Un ciclo no es todavía un agente
Esta frontera merece cuidado.
Un sistema puede ejecutar una tool call y volver al modelo sin que debamos llamarlo agente en el sentido pedagógico de este curso.
Por ejemplo:
siempre que el usuario pregunte por un documento
→ ejecutar buscador
→ devolver resultado
La ruta puede estar predeterminada.
O el usuario puede presionar un botón que dispare la tool.
Más adelante estudiaremos agentes como sistemas capaces de seleccionar dinámicamente próximos pasos dentro de ciertos límites.
Por ahora:
TOOL CALLING
≠
AUTONOMÍA
Errores en cada etapa
Una de las ventajas de descomponer el ciclo es que podemos reconocer fallos diferentes.
Error de necesidad
El sistema no detecta que falta el anexo.
Error de selección
Utiliza buscar_correos en vez de buscar_documentos.
Error de argumentos
Busca ACNE en vez de ACME.
Error de ejecución
El DMS no responde.
Error de interpretación
La tool devuelve tres archivos y el sistema elige el borrador.
Error de autorización
La llamada técnicamente válida intenta acceder a un matter no autorizado.
Cada fallo necesita un tratamiento diferente.
Los errores también pueden ser información
Google destaca un punto interesante: los mensajes de error pueden diseñarse para ayudar al sistema a corregir el siguiente paso.
Comparemos:
ERROR 404
con:
No se encontró un documento con ese ID.
Comprueba si utilizaste el identificador correcto o busca el documento por proveedor y tipo.
El segundo mensaje no sólo informa que algo falló.
También proporciona contexto útil para continuar.
Esto convierte el manejo de errores en parte del diseño de la herramienta.
Tool calling y schemas
Las definiciones de tools suelen utilizar schemas estructurados para describir entradas.
Por ejemplo:
{
"name": "buscar_documentos",
"parameters": {
"type": "object",
"properties": {
"proveedor": {"type": "string"},
"tipo_documento": {"type": "string"}
},
"required": ["proveedor", "tipo_documento"]
}
}No necesitamos aprender a programar este objeto.
Sólo debemos reconocer qué expresa:
la función se llama buscar_documentos
espera dos campos
ambos deben ser texto
ambos son obligatorios
Eso permite al sistema validar parte de la llamada.
Tool calling y APIs
Todavía queda una pregunta.
La aplicación sabe que debe ejecutar:
buscar_documentos(...)
Pero ¿cómo se comunica esa tool con el DMS?
Una forma muy habitual es mediante una API.
La tool puede envolver una operación técnica de otro sistema y presentar al modelo una interfaz más pequeña y comprensible.
Por eso el siguiente paso natural no es estudiar más sobre selección de herramientas, sino comprender cómo se comunican sistemas de software.
Un caso completo
Encargo:
“Verifica si el contrato ACME tiene un anexo de seguridad vigente y dime si está firmado.”
1. Detectar necesidad
El modelo observa que el anexo no está en contexto.
2. Seleccionar tool
buscar_documentos
3. Preparar argumentos
proveedor = ACME
tipo_documento = anexo_seguridad
4. Ejecutar
La aplicación valida la solicitud y ejecuta la función.
5. Resultado
DOC-021 | firmado
6. Continuar
El modelo responde:
Existe un anexo de seguridad identificado como DOC-021 y el sistema documental lo registra como firmado.
Observe la diferencia entre esta frase y:
El contrato tiene un anexo de seguridad firmado.
La primera hace visible la procedencia del dato.
Eso puede ser valioso en trabajo profesional.
¿Quién decide si la tool es opcional u obligatoria?
Las implementaciones de function calling suelen permitir distintas políticas de uso.
Huyen resume tres patrones frecuentes:
NONE
no utilizar tools
REQUIRED
debe utilizar al menos una
AUTO
el modelo puede decidir si necesita una
La nomenclatura concreta depende del proveedor, pero la distinción conceptual es útil.
El sistema puede controlar cuánto espacio de decisión entrega al modelo.
Por ejemplo, si una tarea siempre debe verificar el estado del proveedor en una base oficial, la arquitectura puede exigir esa consulta en vez de dejarla como opción.
Si la consulta sólo es necesaria en algunos casos, puede permitirse selección contextual.
Y si una tarea debe ejecutarse sin acceso externo, las tools pueden deshabilitarse.
Esto muestra nuevamente que tool calling no equivale a autonomía plena. La aplicación puede definir un marco muy estrecho dentro del cual ocurre la selección.
Tool calling puede detenerse antes de ejecutar
También podemos insertar una etapa de confirmación.
El modelo produce:
Tool propuesta:
enviar_correo
Destinatario:
proveedor@acme.example
Asunto:
Desviaciones contractuales
La aplicación puede mostrar:
[Autorizar] [Cancelar]
Sólo después de la confirmación ejecuta la función.
La arquitectura separa entonces:
SELECCIÓN
el modelo propone
AUTORIZACIÓN
la persona confirma
EJECUCIÓN
el software actúa
No necesitamos desarrollar todavía toda la política de permisos. La enseñanza aquí es que la tool call puede ser un objeto revisable antes de convertirse en acción.
Resultado de tool y texto del modelo son canales diferentes
Otra distinción útil es separar:
TOOL OUTPUT
dato devuelto por la operación
MODEL OUTPUT
interpretación o respuesta generada
Supongamos que la tool devuelve:
status = signed
y el modelo afirma:
El anexo está plenamente vigente y no requiere revisión.
La segunda frase contiene una inferencia que no estaba necesariamente en el resultado de la tool.
Para trabajos verificables conviene conservar la procedencia:
Dato obtenido:
status = signed
Interpretación:
el documento aparece registrado como firmado
Evaluación:
su vigencia jurídica requiere revisar fecha, partes y posibles sustituciones
Esto evita que una respuesta generada transforme silenciosamente una observación limitada en una conclusión más amplia.
Qué debes recordar
Tool calling no es magia ni acceso directo del modelo al mundo.
Es un ciclo compuesto por etapas:
DETECTAR NECESIDAD
↓
ELEGIR TOOL
↓
PREPARAR ARGUMENTOS
↓
VALIDAR Y EJECUTAR
↓
RECIBIR RESULTADO
↓
CONTINUAR
Cada etapa puede fallar.
Y la aplicación puede introducir controles entre la solicitud y la ejecución.
El problema que todavía queda abierto
Ya sabemos cómo una aplicación puede pasar desde una necesidad expresada en lenguaje a una operación estructurada.
Pero la tool todavía necesita comunicarse con otros sistemas.
¿Cómo pide información a un DMS?
¿Cómo envía datos a un calendario?
¿Cómo consulta un CRM?
Para responder necesitamos una abstracción más antigua que los LLM y mucho más general que la IA: la API.