APIs de LLM para desarrolladores: primeros pasos
Tienes una gran idea para una función impulsada por IA, pero cuando empiezas a leer la documentación de la API, te topas con una pared de jerga: tokens, temperatura, streaming, prompts de sistema. Parece que necesitas un segundo título solo para enviar un mensaje. La buena noticia es que el concepto central es simple: envías una lista de mensajes y el modelo devuelve una respuesta. Todo lo demás es ajuste. Este artículo te guía por los pasos prácticos para integrar una API de chat completion de LLM en tu aplicación, con código que puedes adaptar hoy mismo.
¿Qué es una API de chat completion?
En esencia, una API de chat completion toma un historial de conversación como entrada y devuelve el siguiente mensaje de la conversación. El historial es un array de objetos de mensaje, cada uno con un role y un content. Los roles típicos son system, user y assistant. El mensaje de sistema establece el comportamiento del asistente, el mensaje de usuario es lo que escribió la persona, y el mensaje de asistente es lo que el modelo respondió anteriormente. Al enviar todo el historial, le das contexto al modelo para generar una respuesta coherente.
La mayoría de los proveedores (OpenAI, Anthropic, Google y alternativas de código abierto) siguen un patrón similar, aunque el endpoint y el payload exactos pueden variar. Una vez que entiendes uno, puedes adaptarte a los demás rápidamente.
Paso a paso: tu primera llamada a la API
Veamos un ejemplo mínimo usando Python y el SDK de OpenAI. Puedes instalarlo con pip install openai. Configura tu clave de API como variable de entorno para mantenerla fuera de tu código.
import os
from openai import OpenAI
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Explain what an API is in one sentence."}
]
)
print(response.choices[0].message.content)
Eso es todo. El objeto de respuesta contiene una lista de choices; normalmente tomas la primera. El contenido del mensaje es la respuesta del modelo. También puedes acceder a las estadísticas de uso para rastrear el consumo de tokens.
Parámetros clave que deberías ajustar
Además de los mensajes, unos pocos parámetros controlan la salida del modelo:
- model: Qué modelo usar. Los modelos más pequeños son más baratos y rápidos; los más grandes son más capaces.
- temperature: Controla la aleatoriedad. 0 es determinista, 1 es creativo. Para tareas fácticas, usa un valor bajo; para brainstorming, usa uno más alto.
- max_tokens: Limita la longitud de la respuesta. Configúralo para evitar respuestas inesperadamente largas (y costosas).
- top_p: Una alternativa a temperature para controlar la diversidad. Normalmente ajustas uno u otro, no ambos.
- stream: Cuando es true, la API envía respuestas parciales a medida que se generan, mejorando la latencia percibida.
Respuestas en streaming para una mejor UX
Esperar una respuesta completa puede sentirse lento, especialmente para respuestas largas. El streaming te permite mostrar el texto a medida que llega. Así se maneja un stream en Python:
stream = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Tell me a story."}],
stream=True
)
for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True)
Cada chunk contiene un delta con una parte de la respuesta. Acumulas estas partes para construir el mensaje completo. En una aplicación web, puedes reenviar estos chunks al navegador usando Server-Sent Events (SSE) o WebSockets.
Manejo de errores y límites de tasa
Las APIs fallan. Las redes tienen hipos. Los límites de tasa se activan. Tu integración debería manejarlos con elegancia. Los errores comunes incluyen:
- 401 Unauthorized: Clave de API inválida. Revisa tu variable de entorno.
- 429 Too Many Requests: Has alcanzado un límite de tasa. Implementa retroceso exponencial y reintenta.
- 500 Internal Server Error: Problema del lado del proveedor. Reintenta con un retraso.
Siempre envuelve las llamadas a la API en bloques try/except y registra los fallos. Para producción, considera usar una librería como tenacity para los reintentos.
Gestión de costos y tokens
Los tokens son la moneda de las APIs de LLM. Tanto los tokens de entrada como los de salida cuentan para tu factura. Para mantener los costos predecibles:
- Usa modelos más pequeños para tareas simples.
- Recorta el historial de conversación a los últimos mensajes cuando no se necesite el contexto completo.
- Configura
max_tokenspara limitar la longitud de salida. - Cachea respuestas frecuentes si tu caso de uso lo permite.
Monitorea el uso a través del panel del proveedor o registrando los conteos de tokens de cada respuesta.
Consideraciones de seguridad y privacidad
Cuando envías datos de usuario a una API de LLM, estás confiando esos datos a un tercero. Revisa las políticas de retención de datos del proveedor. Evita enviar información sensible como contraseñas o identificadores personales. Si es imprescindible, considera modelos autoalojados o proveedores con fuertes garantías de privacidad. Además, nunca expongas tu clave de API en código del lado del cliente; siempre enruta las solicitudes a través de tu backend.
Preguntas frecuentes
¿Cuál es la diferencia entre un chat completion y un completion normal?
Los chat completions están diseñados para interfaces conversacionales. Aceptan una lista de mensajes con roles, permitiendo al modelo mantener contexto. Los completions normales toman una sola cadena de prompt y son menos adecuados para diálogos de varios turnos.
¿Cómo elijo el modelo adecuado?
Empieza con un modelo más pequeño y económico para prototipar. Si necesitas mejor razonamiento o contexto más largo, pasa a un modelo más grande. Prueba ambos en tu tarea específica para encontrar el mejor equilibrio costo-rendimiento.
¿Puedo usar varios proveedores de LLM en una sola app?
Sí. Muchos desarrolladores abstraen las llamadas a la API detrás de una interfaz y cambian de proveedor según costo, latencia o características. Librerías como LiteLLM o LangChain pueden ayudar a unificar distintas APIs.
Próximos pasos
Ahora que puedes hacer una llamada básica, experimenta con prompts de sistema para dirigir el comportamiento del modelo. Prueba el streaming para mejorar la experiencia del usuario. Y siempre vigila el uso de tokens. A medida que construyes, puede que necesites formatear respuestas JSON del modelo para procesarlas más. Para eso, un formateador JSON puede ayudarte a validar e imprimir la salida de forma legible rápidamente.