Los modelos de lenguaje (LLMs) como GPT son "stateless" (sin estado). Esto significa que cada vez que les enviás una pregunta, no recuerdan nada de lo que preguntaste hace 10 segundos.
Situación típica: estás creando un chatbot de soporte. El usuario dice "Hola, mi impresora no funciona" y el bot responde con pasos. Luego el usuario pregunta "¿Y si eso falla?" y el bot responde "¿Y qué falla?" — porque olvidó que hablaban de una impresora.
Por qué es importante: para construir aplicaciones conversacionales reales (chatbots, tutores, asistentes), debés gestionar vos mismo el historial de la charla y enviárselo al modelo en cada interacción. Si no lo hacés, la experiencia de usuario es frustrante e incoherente.
La API de OpenAI no recibe solo una frase, recibe una lista de mensajes. Esta lista representa toda la conversación hasta el momento. Cada mensaje tiene un role y un content:
| Usá Chat Completions cuando... | NO lo uses cuando... |
|---|---|
| Necesitás interacción conversacional (multi-turno) | Solo necesitás completar una frase simple (el endpoint legacy completions ya no se recomienda) |
| Querés instruir al modelo con una "personalidad" específica (system prompt) | Querés generar imágenes (usá DALL-E) o audio (usá TTS) |
| Necesitás controlar la aleatoriedad de la respuesta | Buscás búsquedas semánticas (usá Embeddings) |
Objetivo: pasar de una llamada básica a construir una clase ChatBot que recuerde lo que hablamos, probando modelos como GPT-4o y GPT-3.5 Turbo.
Contexto inicial: asegurate de tener tu .env configurado con tu API Key (lección anterior) y las librerías instaladas.
A veces querés datos exactos (temperature 0) y otras veces poesía creativa (temperature alta).
// Observá cómo la temperatura alta puede generar palabras inventadas o estructuras raras.
Vamos a crear un objeto que guarde el historial automáticamente:
Al ejecutar el paso 3, el bot debe responder correctamente a "¿Y si le sumas 5?" diciendo "9" (o similar), demostrando que recordó que el número anterior era 4.
temperature=0 se suele llamar "determinista", pero en la práctica la API no garantiza el mismo output byte a byte en cada llamada, incluso con temperature=0 — hay variabilidad de bajo nivel en cómo se sirven los modelos (batching, hardware) que ocasionalmente puede cambiar un token. Para reproducibilidad más estricta existe el parámetro seed, pero tampoco es una garantía absoluta. "Determinista" acá significa "mucho más consistente", no "idéntico siempre".
| Si ves esto... | Causa | Solución |
|---|---|---|
RateLimitError | Excediste tu cuota o velocidad de peticiones | Esperá unos segundos o revisá tu saldo en OpenAI |
context_length_exceeded | El historial es demasiado largo para el modelo | Los modelos tienen límite (ej. 16k tokens). Deberías borrar mensajes antiguos del historial en una app real. |
| Respuestas cortadas | max_tokens muy bajo, o finish_reason: length | Aumentá max_tokens o revisá si el prompt es muy largo |
Concepto central: la "memoria" en GPT no es mágica; es simplemente reenviar todo el historial de chat en cada nueva petición.
Para recordar:
role: system para definir el comportamiento inicialtemperature baja (0-0.3) para tareas lógicas/matemáticas y alta (0.7-1.0) para escritura creativa