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.
01 —
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.
Auditoría
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.
02 —
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
03 —
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:
- La tarea es inequívoca (traducción literal, formateo simple)
- El LLM ya conoce el dominio (tecnologías estándar, conceptos comunes)
- No necesitás formato específico más allá de JSON/markdown genérico
Cuándo falla:
- Ambigüedad en categorías ("Technical" vs "Billing" puede solaparse)
- Formato específico de tu empresa/industria
- Tareas nuevas o poco representadas en el entrenamiento
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:
- Input → Output explícito: mostrá entrada y salida claramente separadas
- Diversidad: cubrí casos en el borde entre categorías
- Consistencia: mismo formato en todos los ejemplos
- Explicación opcional: añadí "Razón:" para aclarar el criterio
Número óptimo de ejemplos:
- 2-3 ejemplos: para tareas de clasificación simple o formateo
- 3-5 ejemplos: para tareas con múltiples clases o formato complejo
- 5+ ejemplos: raramente necesario; más allá de 5, considerá fine-tuning
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]
04 —
Cuándo aplicarlo
| Técnica | Usá cuando... | NO uses cuando... |
| Zero-shot | La tarea es inequívoca · El dominio es estándar (web dev, data science) · Solo necesitás formato genérico (JSON, markdown) · Prototipado rápido | Necesitá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-shot | Clasificació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 consistencia | La 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-thought | Razonamiento matemático/lógico · Análisis de seguridad/vulnerabilidades · Debugging (identificar causa raíz) · Decisiones multi-criterio · Necesitás auditar el razonamiento | La 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:
- Few-shot + Chain-of-thought: para tareas complejas específicas del dominio (ej: análisis de contratos legales)
- Zero-shot + CoT: cuando no tenés ejemplos pero la tarea requiere razonamiento
- Few-shot sin CoT: para clasificación simple donde el patrón es claro
05 —
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écnica | Consistencia (3 ejecuciones) | Razonamiento visible | Tiempo de respuesta |
| Zero-shot | __/3 iguales | No | ~2 seg |
| Few-shot | __/3 iguales | No | ~3 seg |
| Few-shot + CoT | N/A (1 ejecución) | Sí | ~5 seg |
Preguntas de reflexión:
- ¿En qué técnica confiarías para automatizar clasificación de 1000 commits?
- ¿Cuál usarías si necesitás auditar las decisiones del LLM?
- ¿Cuál es suficiente si solo clasificás 10 commits manualmente?
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).
06 —
Troubleshooting rápido
| Si ves esto... | Causa | Solución |
| Few-shot produce resultados peores que zero-shot | Ejemplos contradictorios o mal formateados | Verificá que todos los ejemplos usan el mismo formato (Input → Output). Eliminá ejemplos ambiguos. |
| Chain-of-thought da razonamiento genérico sin sustancia | El prompt no especifica QUÉ analizar | Definí pasos explícitos: "1. ¿Es X? 2. ¿Es Y? 3. Conclusión". Usá numeración. |
| Few-shot solo repite los ejemplos sin generalizar | Ejemplos demasiado similares entre sí | Añadí diversidad: incluí casos en el borde, ejemplos negativos, variaciones de formato. |
| CoT es demasiado verboso y lento | Usás CoT para tareas simples | Reservá CoT para tareas que realmente requieren razonamiento. Usá few-shot para clasificación. |
| El LLM ignora los ejemplos few-shot | Delimitadores poco claros | Usá formato consistente: "Ejemplo 1:\nInput: X\nOutput: Y\n\n" con doble salto de línea entre ejemplos. |
07 —
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:
- ✓ Zero-shot primero: siempre empezá con lo simple. Solo añadí complejidad si los resultados son insuficientes
- ✓ Few-shot para consistencia: si necesitás >90% de precisión en clasificación o formato específico, usá 3-5 ejemplos
- ✓ CoT para razonamiento: si necesitás entender el "por qué" o auditar la lógica, forzá pasos explícitos
- ✓ Medí la diferencia: ejecutá las 3 técnicas sobre el mismo problema y comparás antes de decidir
- ✓ Combiná cuando sea necesario: few-shot + CoT para tareas complejas específicas del dominio
- ✗ No uses few-shot con ejemplos malos: 3 ejemplos de alta calidad > 10 ejemplos mediocres
- ✗ No uses CoT para todo: el razonamiento explícito es lento y verboso. Usalo solo cuando aporta valor.
- ✗ No asumas que más ejemplos = mejor: más allá de 5, el beneficio marginal es mínimo. Considerá fine-tuning.