Uso de Herramientas y Llamada a Funciones
El uso de herramientas permite a los LLM solicitar la ejecución de funciones en lugar de adivinar respuestas. Define herramientas con esquemas, valida argumentos, ejecuta de forma segura y devuelve los resultados al modelo.
Receta
tools = [{"type": "function", "function": {
"name": "get_order",
"parameters": {"type": "object", "properties": {"order_id": {"type": "string"}}, "required": ["order_id"]},
}}]
response = client.chat.completions.create(model="gpt-4o-mini", messages=messages, tools=tools)Ejemplo Funcional
"""tool_use.py - bucle seguro de ejecución de herramientas."""
from __future__ import annotations
import json
from pydantic import BaseModel, ValidationError
from openai import OpenAI
client = OpenAI()
class GetOrderArgs(BaseModel):
order_id: str
def get_order(order_id: str) -> dict:
orders = {"ORD-123": {"status": "shipped", "total": 49.99}}
return orders.get(order_id, {"error": "not found"})
TOOL_REGISTRY = {"get_order": (GetOrderArgs, get_order)}
tools = [{"type": "function", "function": {
"name": "get_order",
"description": "Busca un pedido por ID",
"parameters": GetOrderArgs.model_json_schema(),
}}]
messages = [{"role": "user", "content": "¿Cuál es el estado del pedido ORD-123?"}]
for _ in range(5):
resp = client.chat.completions.create(model="gpt-4o-mini", messages=messages, tools=tools)
msg = resp.choices[0].message
if not msg.tool_calls:
print(msg.content)
break
messages.append(msg)
for call in msg.tool_calls:
name = call.function.name
schema_cls, fn = TOOL_REGISTRY[name]
try:
args = schema_cls.model_validate_json(call.function.arguments)
result = fn(**args.model_dump())
except ValidationError as e:
result = {"error": str(e)}
messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps(result)})Errores Comunes
- Ejecución de argumentos no validados - Inyección SQL a través de parámetros de herramientas. Solución: Validación con Pydantic; consultas parametrizadas.
- Herramientas con permisos excesivos - el modelo puede eliminar datos. Solución: Herramientas de solo lectura; aprobación humana para escrituras.
- Sin límite de iteraciones - bucle infinito de herramientas. Solución: Máximo 5-10 iteraciones.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Llamada a herramientas de OpenAI | Modelos GPT | Claude (usar formato de herramientas de Anthropic) |
| LangChain @tool | Agentes de LangGraph | Preferencia por SDKs directos |
| MCP | Servidores de herramientas estandarizados | Herramientas simples de una sola aplicación |
Preguntas Frecuentes
¿Herramientas de OpenAI vs Anthropic?
OpenAI: herramientas en chat.completions. Anthropic: parámetro tools con bloques tool_result.¿Cuántas herramientas?
5-10 herramientas enfocadas superan a 50 vagas.¿Las descripciones de las herramientas importan?
Sí - descripciones claras mejoran la precisión de la selección.¿Llamadas paralelas a herramientas?
Ejecuta todas las tool_calls en una respuesta; devuelve todos los resultados.¿Cómo pruebo las herramientas?
Prueba unitaria de cada función de herramienta; prueba de integración del bucle con LLM simulado.¿Herramientas peligrosas?
Sandbox para la ejecución de código; requiere aprobación humana para escrituras.¿Herramienta no llamada?
Mejora la descripción; añade ejemplos en el prompt del sistema.¿Herramienta incorrecta seleccionada?
Acota las descripciones de las herramientas; reduce el número de herramientas.¿Argumentos de herramientas estructurados?
Modelo Pydantic como esquema JSON para validación.¿Cómo registro las llamadas a herramientas?
Registra el nombre de la herramienta, argumentos, resultado y latencia para observabilidad.¿Límites de tasa para las API de herramientas?
Semáforo en las llamadas a API externas que hacen las herramientas.¿MCP vs herramientas en línea?
MCP para herramientas compartidas entre aplicaciones; en línea para específicas de la aplicación.Relacionado
- LangGraph y Bucles de Agentes
- SDK de Anthropic Claude
- Salida Estructurada
- Protocolo de Contexto de Modelo (MCP)
- Evaluación y Barreras de Protección
Versiones de Stack: Esta página se escribió para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.