MÓDULO 2 · PROMPT ENGINEERING · 45 MIN

Zero-shot vs Few-shot vs Chain-of-thought: estrategias de prompting para tareas complejas

45 min Intermedio Claude ChatGPT GPT-4 cualquier LLM
Zero-shot es el default: instrucción directa, sin ejemplos. Few-shot enseña un formato o patrón mostrando 2-5 ejemplos. Chain-of-thought fuerza al LLM a razonar paso a paso antes de responder. Elegís según consistencia requerida y complejidad de la tarea — no según cuál suena más sofisticada.
El problema

Los prompts estructurados básicos (lección anterior) funcionan bien para tareas directas como "genera una función", "traducí este texto" o "formateá este JSON". Pero fallan en tres escenarios críticos.

Situación típica 1 — Clasificación ambigua: solicitás clasificar tickets de soporte en categorías (Billing, Technical, Feature Request). Un prompt básico produce resultados inconsistentes: el mismo ticket "no puedo acceder a mi cuenta" se clasifica como Technical en una ejecución y Billing en otra.

Situación típica 2 — Formato específico del dominio: necesitás generar código siguiendo los patrones exactos de tu empresa (estructura de clases, naming conventions, manejo de errores). El LLM produce código genérico que no respeta tus convenciones, obligándote a editar manualmente cada output.

Situación típica 3 — Razonamiento complejo: pedís analizar si un cambio de código introduce vulnerabilidades de seguridad. El LLM da respuestas superficiales ("parece seguro") sin explicar qué validó ni qué casos de borde consideró.

Por qué es importante: sin la técnica adecuada obtenés outputs inconsistentes que no podés automatizar, calidad baja en tareas específicas del dominio, y falta de trazabilidad en el razonamiento — no podés auditar por qué el modelo llegó a esa conclusión.

La guía original cita que "few-shot mejora precisión 20-40% en clasificación" y "chain-of-thought reduce errores lógicos 50%+ en matemáticas y razonamiento", sin fuente primaria. Tratá estos números como una intuición direccional (ambas técnicas ayudan, en general), no como una garantía para tu caso puntual. La única forma confiable de saber cuánto te ayuda cada técnica es medirla vos mismo con tu propio problema — que es exactamente lo que hace el ejercicio de esta lección.

La solución: tres técnicas para tres tipos de problema
ZERO-SHOT → Tarea clara, sin ejemplos necesarios FEW-SHOT → Tarea ambigua, necesita ver ejemplos CHAIN-OF-THOUGHT → Tarea compleja, necesita razonar paso a paso
Cómo funciona
1. Zero-shot — instrucción directa sin ejemplos

El LLM debe resolver la tarea basándose únicamente en su entrenamiento previo y tu instrucción. Es la técnica que usamos en la lección anterior.

markdownClasifica el siguiente ticket de soporte en una de estas categorías: Billing, Technical, Feature Request. Ticket: "No puedo acceder a mi cuenta"

Cuándo funciona:

Cuándo falla:

2. Few-shot — aprendizaje por ejemplos

Proporcionás 2-5 ejemplos del formato o comportamiento esperado. El LLM infiere el patrón y lo aplica al input nuevo.

markdownClasifica tickets de soporte según estos ejemplos: Ejemplo 1: Ticket: "Mi tarjeta fue cobrada dos veces" Categoría: Billing Razón: Problema con cobros/pagos Ejemplo 2: Ticket: "La app se cierra al abrir notificaciones" Categoría: Technical Razón: Error de funcionalidad Ejemplo 3: Ticket: "Sería genial tener modo oscuro" Categoría: Feature Request Razón: Solicitud de nueva característica Ahora clasifica este: Ticket: "No puedo acceder a mi cuenta"

Estructura de ejemplos efectivos:

Número óptimo de ejemplos:

3. Chain-of-thought — razonamiento explícito paso a paso

Forzás al LLM a "pensar en voz alta" antes de dar la respuesta final. Se activa con frases como:

markdownPiensa paso a paso: Razona tu respuesta: Antes de responder, analiza: Let's think step by step: // la frase mágica de los papers
markdownAnaliza si este cambio de código introduce vulnerabilidades de seguridad. Piensa paso a paso: 1. ¿Qué entradas de usuario acepta? 2. ¿Se validan/sanitizan esas entradas? 3. ¿Hay riesgo de inyección (SQL, XSS, Command)? 4. ¿Se expone información sensible? 5. Conclusión final: ¿Es seguro? Código: ```python def buscar_usuario(nombre): query = f"SELECT * FROM users WHERE name = '{nombre}'" return db.execute(query) ```

El LLM respondería algo como:

output1. Entradas de usuario: el parámetro 'nombre' viene directamente del usuario 2. Validación: NO hay sanitización del input 3. Riesgo de inyección: SÍ — SQL injection clara. Ejemplo: nombre = "' OR '1'='1" retornaría todos los usuarios 4. Información sensible: SÍ — expone toda la tabla de usuarios 5. Conclusión: NO ES SEGURO — vulnerable a SQL injection crítico Recomendación: usar prepared statements o ORM con parametrización

Chain-of-thought puede combinarse con few-shot:

markdownEjemplos de análisis de seguridad: Ejemplo 1: Código: [código seguro] Análisis paso a paso: 1. Entradas: parámetro 'email' 2. Validación: usa prepared statement 3. Riesgo: ninguno detectado Conclusión: SEGURO Ejemplo 2: Código: [código inseguro] Análisis paso a paso: 1. Entradas: parámetro 'id' 2. Validación: ninguna 3. Riesgo: SQL injection en línea 5 Conclusión: INSEGURO Ahora analiza este: [tu código]
Cuándo aplicarlo
TécnicaUsá cuando...NO uses cuando...
Zero-shotLa tarea es inequívoca · El dominio es estándar (web dev, data science) · Solo necesitás formato genérico (JSON, markdown) · Prototipado rápidoNecesitás consistencia alta (>95%) · El formato es específico de tu empresa · La tarea tiene ambigüedad (clasificación multi-clase) · El LLM no conoce el dominio (legal, médico, API interna)
Few-shotClasificación/categorización · Formato específico (tu plantilla de código) · Convenciones de tu empresa · Extracción de datos con estructura particular · Necesitás 90-98% de consistenciaLa tarea es obvia (traducción literal) · No tenés ejemplos representativos · Los ejemplos no caben en el contexto · Necesitás razonamiento complejo (usá CoT)
Chain-of-thoughtRazonamiento matemático/lógico · Análisis de seguridad/vulnerabilidades · Debugging (identificar causa raíz) · Decisiones multi-criterio · Necesitás auditar el razonamientoLa tarea es simple (formateo, traducción) · No necesitás explicación del proceso · Querés respuestas rápidas y concisas · El razonamiento es obvio

Combinaciones válidas:

Ejercicio práctico

Objetivo: implementar las 3 técnicas sobre el mismo problema (clasificación de commits Git) y medir diferencias en precisión y utilidad.

Contexto inicial: usá cualquier LLM (Claude, ChatGPT, GPT-4). Necesitás acceso a un repositorio Git o podés usar estos ejemplos de commits:

commitsCommit 1: "fix: corrected null pointer in user service" Commit 2: "feat: added dark mode toggle to settings" Commit 3: "docs: updated API authentication examples" Commit 4: "refactor: simplified payment processing logic" Commit 5: "chore: bumped dependency versions"

Categorías objetivo: fix, feat, docs, refactor, chore, test, style

Paso 1 — Baseline con zero-shot
markdownClasifica este commit Git en una de estas categorías: fix, feat, docs, refactor, chore, test, style. Retorna solo el nombre de la categoría. Commit: "updated authentication to use JWT tokens"

Ejecutá 3 veces el mismo prompt (refrescando la conversación entre ejecuciones) y anotá los resultados: Ejecución 1: ___ · Ejecución 2: ___ · Ejecución 3: ___

// Problema esperado: probablemente obtengas variaciones como feat, refactor, o chore dependiendo de cómo el LLM interprete "updated".

Paso 2 — Mejora con few-shot
markdownClasifica commits Git según estos ejemplos: Ejemplo 1: Commit "fix: corrected null pointer in user service" → Categoría: fix Ejemplo 2: Commit "feat: added dark mode toggle to settings" → Categoría: feat Ejemplo 3: Commit "docs: updated API authentication examples" → Categoría: docs Ejemplo 4: Commit "refactor: simplified payment processing logic" → Categoría: refactor Ahora clasifica este commit: Commit: "updated authentication to use JWT tokens" Retorna solo la categoría.

Ejecutá 3 veces y anotá: Ejecución 1: ___ · Ejecución 2: ___ · Ejecución 3: ___

// Resultado esperado: mayor consistencia. Probablemente refactor o feat de manera consistente, porque los ejemplos muestran el patrón.

Paso 3 — Máxima claridad con few-shot + chain-of-thought
markdownClasifica commits Git siguiendo este proceso: Ejemplo 1: Commit "fix: corrected null pointer in user service" Razonamiento: - ¿Añade funcionalidad nueva? No - ¿Corrige un bug? Sí → "null pointer" indica error - ¿Cambia documentación? No Categoría: fix Ejemplo 2: Commit "feat: added dark mode toggle to settings" Razonamiento: - ¿Añade funcionalidad nueva? Sí → "added" + "toggle" indica feature nueva - ¿Corrige un bug? No Categoría: feat Ejemplo 3: Commit "refactor: simplified payment processing logic" Razonamiento: - ¿Añade funcionalidad nueva? No - ¿Corrige un bug? No - ¿Cambia estructura sin alterar comportamiento? Sí → "simplified logic" Categoría: refactor Ahora clasifica este commit con el mismo razonamiento: Commit: "updated authentication to use JWT tokens" Piensa paso a paso y luego da la categoría final.

Ejecutá 1 vez (CoT es más determinístico) y anotá: Categoría: ___ · Razonamiento dado: ___

// Resultado esperado: respuesta con justificación explícita, probablemente refactor o feat con explicación de por qué descartó las otras categorías.

Paso 4 — Comparación y análisis

Completá esta tabla con tus resultados:

TécnicaConsistencia (3 ejecuciones)Razonamiento visibleTiempo de respuesta
Zero-shot__/3 igualesNo~2 seg
Few-shot__/3 igualesNo~3 seg
Few-shot + CoTN/A (1 ejecución)Sí~5 seg

Preguntas de reflexión:

Paso 5 — Validación con caso edge

Probá las 3 técnicas con este commit ambiguo:

commitCommit: "fixed typo in README and updated installation steps"

Este commit tiene dos acciones (fix typo = probablemente docs, updated steps = docs o feat).

Ejecutá cada técnica: Zero-shot clasifica como: ___ · Few-shot clasifica como: ___ · CoT explica: ___

// Resultado esperado: CoT debería identificar la ambigüedad y justificar la elección (probablemente docs porque ambas acciones están en documentación).

Troubleshooting rápido
Si ves esto...CausaSolución
Few-shot produce resultados peores que zero-shotEjemplos contradictorios o mal formateadosVerificá que todos los ejemplos usan el mismo formato (Input → Output). Eliminá ejemplos ambiguos.
Chain-of-thought da razonamiento genérico sin sustanciaEl prompt no especifica QUÉ analizarDefiní pasos explícitos: "1. ¿Es X? 2. ¿Es Y? 3. Conclusión". Usá numeración.
Few-shot solo repite los ejemplos sin generalizarEjemplos demasiado similares entre síAñadí diversidad: incluí casos en el borde, ejemplos negativos, variaciones de formato.
CoT es demasiado verboso y lentoUsás CoT para tareas simplesReservá CoT para tareas que realmente requieren razonamiento. Usá few-shot para clasificación.
El LLM ignora los ejemplos few-shotDelimitadores poco clarosUsá formato consistente: "Ejemplo 1:\nInput: X\nOutput: Y\n\n" con doble salto de línea entre ejemplos.
Puntos clave

Concepto central: zero-shot es el default, few-shot es para enseñar formato/patrón, chain-of-thought es para forzar razonamiento. Escogé según consistencia requerida y complejidad de la tarea, no según cuál suena más sofisticada.

Para recordar: