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

OpenAI Prompt Engineering Avanzado

30 min Intermedio OpenAI API GPT-4 GPT-3.5
La calidad de la salida es directamente proporcional a la calidad de la entrada. Tratá el prompt como código: debe ser claro, modular y testeable — no es magia, es una forma estructurada de comunicación.
El problema

Escribir un prompt es fácil ("Escribe un email"), pero obtener una respuesta de calidad empresarial de forma consistente es difícil. Los modelos a menudo alucinan, ignoran instrucciones sutiles o responden con formatos que rompen tu aplicación.

Situación típica: le pedís al modelo "Extrae los nombres de los clientes de este texto". A veces devuelve una lista con viñetas, otras veces una frase narrativa, y otras veces incluye nombres de empresas que no son clientes. Tu código de parsing falla el 50% de las veces.

Por qué es importante: en un entorno B2B, la fiabilidad es más importante que la creatividad. Un buen prompt engineering transforma un modelo "impredecible" en una herramienta de software robusta.

La solución: estrategias de prompt engineering

Existen patrones probados para guiar al modelo:

  1. Instrucciones claras: no dejes nada a la interpretación. Definí el "quién" (persona), "qué" (tarea) y "cómo" (formato).
  2. Few-shot prompting: dale ejemplos de entrada → salida deseada.
  3. Chain-of-thought: pedile que "piense paso a paso" antes de responder.
  4. Delimitadores: usá """, --- o tags XML para separar instrucciones de datos.
Cuándo aplicarlo
Usá esto cuando...NO lo uses cuando...
Necesitás un formato de salida estricto (JSON, CSV)La tarea es extremadamente creativa y abierta (ej. lluvia de ideas)
La tarea requiere razonamiento lógico o matemáticoSolo necesitás una respuesta simple de sí/no sin contexto
El modelo comete errores frecuentes en casos de borde
Ejercicio práctico

Objetivo: mejorar iterativamente un prompt para clasificar correos de soporte técnico, pasando de una tasa de error alta a una respuesta estructurada y fiable.

Contexto inicial: tenés un correo de un cliente enfadado y querés extraer Categoría, Sentimiento y Urgencia.

pythonfrom openai import OpenAI from dotenv import load_dotenv load_dotenv() cliente = OpenAI() email_cliente = """ Hola, estoy harto de vuestro servicio. La impresora modelo X-2000 que compré la semana pasada no funciona. He intentado reiniciar 5 veces y nada. Exijo una devolución o que me mandéis un técnico ¡YA! """
Paso 1 — Prompt básico (zero-shot) — el "mal" ejemplo
pythondef pedir_gpt(prompt): resp = cliente.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": prompt}] ) return resp.choices[0].message.content prompt_v1 = f""" Clasifica este email: {email_cliente} """ print("--- V1: Básico ---") print(pedir_gpt(prompt_v1))

// Resultado probable: un párrafo de texto libre difícil de procesar por código.

Paso 2 — Prompt mejorado (instrucciones + formato)
pythonprompt_v2 = f""" Actúa como un sistema de CRM automático. Analiza el siguiente email de cliente delimitado por triples comillas. Extrae la siguiente información: - Categoría (Soporte Técnico, Facturación, Ventas) - Sentimiento (Positivo, Neutral, Negativo) - Urgencia (Alta, Media, Baja) Responde SOLO en formato JSON. Email: \"\"\"{email_cliente}\"\"\" """ print("\n--- V2: Estructurado ---") print(pedir_gpt(prompt_v2))

// Resultado: un JSON válido, pero quizás la lógica de urgencia no es la que queremos.

Paso 3 — Few-shot prompting + chain-of-thought (avanzado)

Le damos ejemplos para guiar su lógica y le pedimos que razone antes de clasificar.

pythonprompt_v3 = f""" Actúa como un agente de soporte senior. Tu tarea es clasificar tickets. Sigue estos pasos: 1. Analiza el tono del usuario. 2. Identifica si menciona productos específicos. 3. Determina la urgencia basándote en palabras clave como "ya", "ahora", "urgente". 4. Genera el JSON final. Ejemplos: Email: "Quería saber el precio del modelo Y." Salida: {{"categoria": "Ventas", "sentimiento": "Neutral", "urgencia": "Baja"}} Email: "¡Mi servidor se ha caído y estamos perdiendo dinero!" Salida: {{"categoria": "Soporte Técnico", "sentimiento": "Negativo", "urgencia": "Alta"}} Email: \"\"\"{email_cliente}\"\"\" Salida: """ print("\n--- V3: Few-Shot + Pasos ---") print(pedir_gpt(prompt_v3))
Validación

Comparando las salidas: V1 — texto libre desordenado. V2 — JSON limpio. V3 — JSON limpio y con una clasificación de urgencia mucho más precisa gracias a los ejemplos.

El troubleshooting de esta lección sugiere response_format={"type": "json_object"} para forzar JSON válido. Es real, pero solo garantiza JSON sintácticamente válido — no que respete tu schema exacto (nombres de campos, tipos, valores permitidos). Los modelos más recientes de OpenAI soportan además "structured outputs" con un json_schema explícito, que sí fuerza el schema a nivel de API en lugar de confiar en que el modelo lo siga por instrucción. Esta capacidad evoluciona rápido — vale la pena revisar la documentación vigente de OpenAI para el modelo que estés usando antes de asumir cuál es la opción recomendada hoy.

Troubleshooting rápido
Si ves esto...CausaSolución
El modelo sigue "hablando" antes del JSONLos modelos de chat tienden a ser conversacionalesUsá response_format={"type": "json_object"} o añadí "No incluyas explicaciones previas" en el prompt
Clasifica mal casos ambiguosFalta de contextoAñadí más ejemplos (few-shot) cubriendo esos casos borde específicos
El modelo ignora los delimitadoresEl prompt es confusoAsegurate de que los delimitadores envuelven claramente la entrada del usuario y son referenciados en las instrucciones
Puntos clave

Concepto central: la calidad de la salida es directamente proporcional a la calidad de la entrada. Tratá el prompt como código: debe ser claro, modular y testeable.

Para recordar: