Técnicas de few-shot y chain-of-thought en producción

Lectura
25 min~5 min lectura

Concepto clave

Las técnicas de few-shot y chain-of-thought son dos herramientas fundamentales en prompt engineering para sistemas de producción. Few-shot prompting consiste en proporcionar al modelo algunos ejemplos de entrada-salida antes de la consulta real, como mostrarle a un nuevo empleado cómo completar un formulario con 2-3 ejemplos ya resueltos. Esto ayuda al modelo a entender el formato, el contexto y el tipo de respuesta esperada sin necesidad de reentrenamiento.

Chain-of-thought (CoT) es como pedirle a un experto que explique su razonamiento paso a paso antes de dar una respuesta final. En lugar de saltar directamente a la conclusión, el modelo desglosa el problema en pasos intermedios, lo que mejora significativamente la precisión en tareas complejas como cálculos matemáticos, análisis lógicos o toma de decisiones estructuradas. La combinación de ambas técnicas permite crear sistemas robustos que pueden manejar casos de uso reales con consistencia.

Cómo funciona en la práctica

Imagina que estás construyendo un sistema para clasificar tickets de soporte técnico. Sin técnicas avanzadas, el modelo podría confundir "mi computadora no enciende" con un problema de software. Con few-shot + CoT, primero proporcionas ejemplos:

Usuario: "La pantalla está en negro"
Razonamiento: El usuario menciona pantalla negra, no arranque del sistema. Esto sugiere problema de hardware o conexión de energía.
Categoría: Hardware

Luego, cuando llegue un ticket real como "no hay sonido en mis audífonos", el modelo seguirá el patrón: analizará los síntomas, considerará posibles causas (hardware vs software), y asignará la categoría correcta. En producción, esto se implementa estructurando el prompt con secciones claras: ejemplos de entrenamiento, instrucciones de razonamiento, y finalmente la consulta del usuario.

Codigo en accion

Veamos un ejemplo real para procesar pedidos de restaurante:

# ANTES: Prompt básico que da resultados inconsistentes
def procesar_pedido_basico(pedido_texto):
    prompt = f"Clasifica este pedido: {pedido_texto}"
    # Llamada a API...
    return respuesta

# Ejemplo problemático:
# Input: "Quiero una pizza y cancelar mi bebida"
# Output: "Modificación" (poco claro)
# DESPUES: Few-shot + Chain-of-thought para producción
import openai

def procesar_pedido_avanzado(pedido_texto):
    prompt = """
    Eres un sistema de procesamiento de pedidos. Sigue estos ejemplos:
    
    Ejemplo 1:
    Pedido: "Agregar extra queso a mi hamburguesa"
    Razonamiento: El cliente quiere agregar un ingrediente a un pedido existente. Esto es una modificación.
    Categoría: MODIFICACION
    
    Ejemplo 2:
    Pedido: "Necesito la factura para mi orden #456"
    Razonamiento: El cliente solicita documentación de una transacción completada. Esto es una consulta.
    Categoría: CONSULTA
    
    Ejemplo 3:
    Pedido: "La sopa llegó fría, quiero un reembolso"
    Razonamiento: El cliente reporta un problema con el producto recibido y solicita compensación. Esto es una queja.
    Categoría: QUEJA
    
    Ahora procesa este pedido paso a paso:
    Pedido: "{pedido_texto}"
    Razonamiento:"""
    
    # Primero obtenemos el razonamiento
    respuesta_razonamiento = openai.ChatCompletion.create(
        model="gpt-4",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.3
    )
    
    # Luego la categoría final
    prompt_final = prompt + respuesta_razonamiento + "\nCategoría:"
    respuesta_final = openai.ChatCompletion.create(
        model="gpt-4",
        messages=[{"role": "user", "content": prompt_final}],
        temperature=0.1
    )
    
    return {
        "razonamiento": respuesta_razonamiento,
        "categoria": respuesta_final
    }

# Ejemplo de uso:
resultado = procesar_pedido_avanzado(
    "Quiero una pizza y cancelar mi bebida"
)
# Output estructurado:
# {
#   "razonamiento": "El cliente hace dos acciones: ordenar pizza (nuevo pedido) y cancelar bebida (modificación). La acción principal es nueva orden.",
#   "categoria": "NUEVO_PEDIDO"
# }

Errores comunes

  • Ejemplos desbalanceados: Proporcionar solo ejemplos fáciles o de una categoría. Solución: Incluir casos límite y distribuir uniformemente las categorías.
  • Chain-of-thought demasiado largo: Hacer que el modelo "piense" en exceso, aumentando costos y latencia. Solución: Limitar los pasos de razonamiento a 3-5 pasos clave.
  • Falta de separación clara: Mezclar ejemplos con instrucciones. Solución: Usar delimitadores como --- o ### entre secciones.
  • Temperature incorrecta: Usar alta temperatura (ej: 0.8) en producción, lo que genera respuestas inconsistentes. Solución: Usar 0.1-0.3 para consistencia, reservando alta temperatura para brainstorming.
  • Ignorar el contexto de ventana: Los ejemplos ocupan tokens que podrían usarse para la consulta real. Solución: Priorizar ejemplos más relevantes y usar resúmenes cuando sea necesario.

Checklist de dominio

  1. ¿Tus ejemplos few-shot cubren casos límite y errores comunes?
  2. ¿El chain-of-thought sigue un patrón reproducible (ej: problema → análisis → conclusión)?
  3. ¿Has probado con al menos 50 consultas reales para validar consistencia?
  4. ¿El sistema maneja adecuadamente entradas fuera de distribución?
  5. ¿Has optimizado el número de ejemplos para balancear costo y rendimiento?
  6. ¿Los bloques de código incluyen manejo de errores y logging?
  7. ¿Puedes explicar por qué el modelo tomó cada decisión (auditabilidad)?

Implementa un clasificador de intenciones para chatbot de e-commerce

En este ejercicio, crearás un sistema de clasificación de intenciones usando few-shot + chain-of-thought para un chatbot de e-commerce.

  1. Configuración inicial: Crea un archivo Python con las importaciones necesarias (openai, json, logging). Configura tu API key de manera segura usando variables de entorno.
  2. Diseña los ejemplos few-shot: Define 4 ejemplos que cubran estas intenciones: CONSULTA_PRODUCTO, SEGUIMIENTO_PEDIDO, DEVOLUCION, RECLAMO. Cada ejemplo debe incluir: mensaje del usuario, razonamiento chain-of-thought (2-3 pasos), e intención final.
  3. Implementa la función principal: Crea una función clasificar_intencion(mensaje_usuario) que:
    • Construya el prompt con tus ejemplos few-shot
    • Use chain-of-thought en dos fases (razonamiento → clasificación)
    • Maneje errores de API con try-except
    • Registre cada clasificación en un log
  4. Prueba con casos reales: Ejecuta tu función con estos mensajes:
    • "¿Tienen este modelo en talla grande?"
    • "Mi paquete debería haber llegado ayer"
    • "Quiero cambiar la camisa por otra color"
    • "El producto llegó dañado y necesito ayuda"
  5. Optimiza: Analiza los tokens usados y ajusta los ejemplos para reducir costos manteniendo precisión.
Pistas
  • Usa el parámetro max_tokens para limitar la longitud de las respuestas y controlar costos.
  • Considera agregar un ejemplo de 'intención no reconocida' para manejar casos fuera de dominio.
  • Implementa un caché simple para mensajes idénticos y así reducir llamadas a la API.

Evalua tu comprension

Completa el quiz interactivo de arriba para ganar XP.