MÓDULO 2 · PRIMEROS PASOS CON OPENAI · 30 MIN

Generación de texto y chatbots con GPT

30 min Básico OpenAI API (Python) GPT-4o GPT-3.5
La "memoria" en GPT no es mágica: es simplemente reenviar todo el historial de la conversación en cada nueva petición. El modelo no recuerda nada entre llamadas — sos vos quien le pasa el contexto cada vez.
El problema

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 solución: Chat Completions API

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:

  1. system: define la personalidad y reglas (ej. "Eres un experto en Python"). Se envía al principio.
  2. user: la entrada actual del humano.
  3. assistant: las respuestas previas del modelo (para darle contexto).
Cuándo aplicarlo
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 respuestaBuscás búsquedas semánticas (usá Embeddings)
Ejercicio práctico

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.

pythonimport os from dotenv import load_dotenv from openai import OpenAI load_dotenv() cliente = OpenAI() # Usa OPENAI_API_KEY del entorno
Paso 1 — Tu primera conversación (Hola Mundo)
python# Definimos el modelo y los mensajes modelo = "gpt-3.5-turbo" mensajes_basicos = [ {"role": "system", "content": "Eres un asistente sarcástico."}, {"role": "user", "content": "¿Cuál es el sentido de la vida?"} ] # Llamada a la API respuesta = cliente.chat.completions.create( model=modelo, messages=mensajes_basicos ) # Extraemos el contenido print(f"🤖 Respuesta: {respuesta.choices[0].message.content}")
Paso 2 — Controlando la creatividad (parámetros)

A veces querés datos exactos (temperature 0) y otras veces poesía creativa (temperature alta).

pythonprompt_poetico = [{"role": "user", "content": "Escribe un poema de 4 líneas sobre Python."}] # Temperatura 0 (determinista, lógico) resp_logica = cliente.chat.completions.create( model="gpt-3.5-turbo", messages=prompt_poetico, temperature=0 ) print("\n🧊 Temp 0:\n" + resp_logica.choices[0].message.content) # Temperatura 1.5 (muy creativo/caótico) resp_creativa = cliente.chat.completions.create( model="gpt-3.5-turbo", messages=prompt_poetico, temperature=1.5 ) print("\n🔥 Temp 1.5:\n" + resp_creativa.choices[0].message.content)

// Observá cómo la temperatura alta puede generar palabras inventadas o estructuras raras.

Paso 3 — Implementando memoria (clase ChatBot)

Vamos a crear un objeto que guarde el historial automáticamente:

pythonclass ChatBot: def __init__(self, modelo="gpt-4o-mini", sistema="Eres un asistente útil."): self.client = OpenAI() self.modelo = modelo self.historial = [{"role": "system", "content": sistema}] def charlar(self, mensaje_usuario): # 1. Añadir mensaje del usuario al historial self.historial.append({"role": "user", "content": mensaje_usuario}) # 2. Llamar a la API con TODO el historial respuesta = self.client.chat.completions.create( model=self.modelo, messages=self.historial, temperature=0.7 ) # 3. Obtener texto y añadirlo al historial (para que lo recuerde la próxima) texto_respuesta = respuesta.choices[0].message.content self.historial.append({"role": "assistant", "content": texto_respuesta}) return texto_respuesta # --- Probando la memoria --- bot = ChatBot(sistema="Eres un profesor de matemáticas.") print("\n--- Inicio del Chat ---") print("Usuario: ¿Cuánto es 2 + 2?") print("Bot:", bot.charlar("¿Cuánto es 2 + 2?")) print("\nUsuario: ¿Y si le sumas 5?") # Pregunta dependiente del contexto anterior print("Bot:", bot.charlar("¿Y si le sumas 5?")) # Verificamos qué hay en la memoria print("\n[Debug] Historial acumulado:") for msg in bot.historial: print(f" {msg['role'].upper()}: {msg['content']}")
Paso 4 — Validación

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.

output esperado (fragmento)Usuario: ¿Y si le sumas 5? Bot: Si a 4 le sumas 5, el resultado es 9.

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".

Troubleshooting rápido
Si ves esto...CausaSolución
RateLimitErrorExcediste tu cuota o velocidad de peticionesEsperá unos segundos o revisá tu saldo en OpenAI
context_length_exceededEl historial es demasiado largo para el modeloLos modelos tienen límite (ej. 16k tokens). Deberías borrar mensajes antiguos del historial en una app real.
Respuestas cortadasmax_tokens muy bajo, o finish_reason: lengthAumentá max_tokens o revisá si el prompt es muy largo
Puntos clave

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: