Módulo 4: Chain-of-Thought y Razonamiento
1. Introducción: Por Qué los LLMs Necesitan Pensar Paso a Paso
Descripción
Chain-of-Thought (CoT) es una técnica que mejora dramáticamente el razonamiento de los LLMs al pedirles que expliquen su proceso paso a paso. En esta cápsula entenderás el paper original (Wei et al., 2022), la paradoja de modelos con 100B+ parámetros que fallan en aritmética simple sin CoT, y cómo CoT desbloquea capacidades latentes que el modelo ya tiene pero no expresa.
Por qué importa: Sin CoT, un modelo puede dar la respuesta incorrecta a un problema de lógica o matemáticas sin que sepas por qué. Con CoT, el razonamiento es visible, verificable y corrige muchos errores al obligar al modelo a generar tokens intermedios que actúan como "espacio de trabajo mental".
Tiempo estimado: 45-60 minutos
La Paradoja del Modelo Gigante que Falla en Aritmética
Imagina esto: GPT-4, un modelo entrenado en billones de tokens de texto humano, capaz de escribir código, explicar física cuántica y debatir filosofía... falla en calcular 17 × 23.
¿Cómo es posible?
Modelos como GPT-4 pueden fallar en:
15 + 27 = ?(a veces responden 42, a veces 43)- "Si A implica B, y B es falso, ¿qué pasa con A?"
- Problemas de múltiples pasos encadenados
- Problemas de edades, velocidades, porcentajes
Pero cuando se les pide "Piensa paso a paso", la accuracy mejora 15-30% en tareas de razonamiento.
Esta es la paradoja: el modelo sabe cómo resolver el problema, pero el formato de predicción token-a-token hace que "tome atajos". CoT obliga al modelo a mostrar el trabajo, como un estudiante que no puede simplemente escribir la respuesta final en un examen.
¿Por Qué Ocurre Esto? El Mecanismo Subyacente
Los LLMs generan tokens uno por uno, y cada token depende de los anteriores. Cuando respondes directamente:
Pregunta: ¿Cuánto es 17 × 23?
Respuesta: [token para número] → 391
El modelo intenta "adivinar" el número correcto basándose en patrones estadísticos de su entrenamiento.
Pero con CoT:
Pregunta: ¿Cuánto es 17 × 23? Piensa paso a paso.
Respuesta:
- Descompongo: 17 × 23 = 17 × 20 + 17 × 3
- 17 × 20 = 340
- 17 × 3 = 51
- 340 + 51 = 391
- Por lo tanto: 391
Aquí, cada paso genera tokens que sirven como contexto enriquecido para los tokens siguientes. Los tokens intermedios ("340", "51") ya están en el contexto cuando el modelo calcula la suma final, reduciendo errores.
Analogía humana: Es como la diferencia entre hacer matemáticas mentalmente vs. escribirlas en papel. El papel (los tokens intermedios) actúa como memoria externa.
Paper Original: Chain-of-Thought Prompting (2022)
Referencia: Wei, J., Wang, X., Schuurmans, D., Bosma, M., Ichter, B., Xia, F., ... & Zhou, D. (2022). Chain-of-Thought Prompting Elicits Reasoning in Large Language Models. NeurIPS 2022.
Wei et al. demostraron en este paper fundacional que añadir ejemplos con razonamiento explícito mejora significativamente las capacidades de los modelos en:
- Aritmética: GSM8K, MATH benchmark
- Razonamiento lógico: SVAMP, MultiArith
- Sentido común: CommonsenseQA, StrategyQA
- Symbolic reasoning: Coin flip, last letter concatenation
Hallazgos Clave del Paper
| Hallazgo | Descripción |
|---|---|
| Emergencia con escala | CoT solo funciona bien con modelos ≥100B parámetros |
| Few-shot requerido | El paper original usaba ejemplos con razonamiento |
| Mejora consistente | +15-30% en math, +5-15% en logic |
| Generalización | Funciona sin cambiar los pesos del modelo |
Ejemplo del Paper
El paper mostraba ejemplos como este:
Q: Roger has 5 tennis balls. He buys 2 more cans of tennis balls.
Each can has 3 tennis balls. How many tennis balls does he have now?
A: Roger started with 5 balls. 2 cans of 3 tennis balls each is 6 tennis balls.
5 + 6 = 11. The answer is 11.
Comparado con el enfoque estándar que solo diría "11", este formato obliga al modelo a mostrar cada paso.
Zero-Shot CoT: El Descubrimiento de Kojima (2022)
Un año después, Kojima et al. (2022) hicieron un descubrimiento sorprendente: no necesitas ejemplos. Simplemente añadir la frase mágica es suficiente:
"Let's think step by step."
Esto se llama Zero-Shot CoT y funciona porque:
- El modelo ha visto miles de textos donde el razonamiento explícito precede a respuestas correctas
- La frase activa ese patrón de generación
- No requiere diseñar ejemplos específicos por dominio
Mejoras reportadas (Zero-Shot CoT vs. Zero-Shot estándar):
- MultiArith: 17.7% → 78.7%
- GSM8K: 10.4% → 40.7%
- SVAMP: 67.7% → 74.2%
CoT vs. Prompting Estándar: Comparativa
| Aspecto | Sin CoT | Con CoT |
|---|---|---|
| Accuracy en math | ~20-40% | ~50-80% |
| Accuracy en logic | ~55% | ~70-85% |
| Tokens consumidos | Pocos | 3-5x más |
| Costo API | Bajo | Moderado-alto |
| Verificabilidad | Ninguna | Alta |
| Detección de errores | Imposible | Posible |
| Mejor para | Tareas simples | Razonamiento complejo |
Los 4 Tipos de CoT
En este módulo exploraremos cuatro variantes principales:
1. Zero-Shot CoT
La más simple. Solo añades "Let's think step by step" o "Piensa paso a paso".
prompt = f"{pregunta}\n\nPiensa paso a paso."
2. Manual CoT (Few-Shot CoT)
Proporcionas ejemplos con razonamiento explícito formato Input → Reasoning → Answer.
prompt = f"""
Ejemplo:
Input: {ejemplo_1}
Reasoning: {razonamiento_1}
Answer: {respuesta_1}
Input: {nueva_pregunta}
Reasoning:
"""
3. Self-Consistency CoT
Generas múltiples cadenas de razonamiento y eliges la respuesta más común (mayoría de votos).
4. Automatic CoT
El modelo genera automáticamente los ejemplos de razonamiento usando clustering.
¿Cuándo Usar CoT?
✅ Usar CoT cuando:
- El problema requiere múltiples pasos (aritmética, álgebra, geometría)
- Hay razonamiento lógico (implicaciones, deducciones)
- Necesitas verificar el proceso, no solo la respuesta
- El problema es ambiguo y quieres ver cómo el modelo lo interpreta
- Analizas código o debugging
❌ NO usar CoT cuando:
- La tarea es creativa (poesía, brainstorming, metáforas)
- Es clasificación simple con criterios claros
- La respuesta es factual directa ("¿Capital de España?")
- El costo importa y la tarea es sencilla
- La latencia es crítica y hay miles de llamadas
Implementación Mínima con OpenAI
Aquí tienes el código más básico para experimentar con CoT:
from openai import OpenAI
client = OpenAI() # Asegúrate de tener OPENAI_API_KEY en el entorno
def comparar_con_sin_cot(pregunta: str) -> dict:
"""
Compara la respuesta de un modelo con y sin CoT.
Args:
pregunta: El problema a resolver
Returns:
dict con respuestas 'sin_cot' y 'con_cot'
"""
# Sin CoT
respuesta_directa = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": pregunta}],
temperature=0,
max_tokens=100
)
# Con CoT
respuesta_cot = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": f"{pregunta}\n\nPiensa paso a paso."}],
temperature=0,
max_tokens=500
)
return {
"sin_cot": respuesta_directa.choices[0].message.content,
"con_cot": respuesta_cot.choices[0].message.content
}
# Ejemplo de uso
if __name__ == "__main__":
problemas = [
"Si tengo 17 manzanas y doy el 30% a María, ¿cuántas me quedan?",
"Un tren sale de A a 60 km/h. Otro sale de B (300 km) a 90 km/h en dirección contraria. ¿Cuándo se encuentran?",
"Si todos los gatos son mamíferos, y algunos mamíferos vuelan, ¿pueden volar algunos gatos?"
]
for problema in problemas:
print(f"\nProblema: {problema}")
resultado = comparar_con_sin_cot(problema)
print(f"\nSin CoT:\n{resultado['sin_cot']}")
print(f"\nCon CoT:\n{resultado['con_cot']}")
print("-" * 60)
La Emergencia con Escala: Un Fenómeno Importante
Wei et al. descubrieron algo fascinante: CoT solo emerge como útil en modelos grandes.
En modelos pequeños (< 8B parámetros), añadir CoT a veces empeora los resultados, porque el modelo no tiene capacidad de generar razonamientos coherentes.
| Tamaño del modelo | Efecto de CoT |
|---|---|
| < 1B parámetros | Neutral o negativo |
| 1B - 8B | Ligero positivo en tareas simples |
| 8B - 70B | Positivo consistente |
| > 70B | Grandes mejoras (+20-40%) |
Implicación práctica: Si usas GPT-4o-mini, CoT funciona bien. Si usas modelos más pequeños locales, verifica que el modelo sea suficientemente capaz antes de depender de CoT.
Roadmap del Módulo 4
Este módulo te llevará de lo básico a lo avanzado en CoT prompting:
| # | Cápsula | Qué verás | Dificultad |
|---|---|---|---|
| 01 | Introducción (esta) | CoT, paradoja, paper fundacional | Básico |
| 02 | Zero-Shot CoT | "Let's think step by step", variantes, benchmarks | Básico |
| 03 | Manual CoT | Diseñar cadenas de razonamiento con ejemplos | Intermedio |
| 04 | CoT para tareas específicas | Math, logic, code, verification | Intermedio |
| 05 | Verification patterns | Self-check, backward verification, confidence | Avanzado |
| 06 | Multi-step reasoning pipelines | Etapas explícitas, orquestación | Avanzado |
| 07 | Limitaciones y anti-patterns | Cuándo CoT no ayuda, razonamiento fabricado | Intermedio |
| 08 | Proyecto: Reasoning Engine | CoT verificable con confidence y comparativa | Avanzado |
Al final del módulo sabrás:
- Cuándo y cómo aplicar CoT
- Diseñar prompts con razonamiento explícito por dominio
- Verificar y validar el razonamiento del modelo
- Construir pipelines multi-etapa robustos
- Detectar y evitar anti-patterns comunes
Ejercicios de esta Cápsula
Ejercicio 1: Tu primer experimento CoT
Elige 3 problemas de aritmética de distinta dificultad. Ejecuta cada uno con y sin "Piensa paso a paso". Registra si CoT mejora o no el resultado.
Ver solución
from openai import OpenAI
client = OpenAI()
problemas_con_respuesta = [
("¿Cuánto es 15 + 27?", "42"),
("¿Cuánto es 17 × 23?", "391"),
("Si tengo $150 y gasto el 40%, ¿cuánto me queda?", "90"),
]
def resolver(pregunta: str, cot: bool) -> str:
contenido = pregunta
if cot:
contenido += "\n\nPiensa paso a paso."
respuesta = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": contenido}],
temperature=0,
max_tokens=300
)
return respuesta.choices[0].message.content
aciertos_sin_cot = 0
aciertos_con_cot = 0
for pregunta, correcta in problemas_con_respuesta:
r_sin = resolver(pregunta, cot=False)
r_con = resolver(pregunta, cot=True)
if correcta in r_sin:
aciertos_sin_cot += 1
if correcta in r_con:
aciertos_con_cot += 1
print(f"\n=== {pregunta} ===")
print(f"Sin CoT: {r_sin[:80]}...")
print(f"Con CoT: {r_con[:80]}...")
print(f"\nAccuracy sin CoT: {aciertos_sin_cot}/{len(problemas_con_respuesta)}")
print(f"Accuracy con CoT: {aciertos_con_cot}/{len(problemas_con_respuesta)}")
Ejercicio 2: Identificar el mecanismo
Dado este output de CoT, identifica los "tokens intermedios" que actúan como memoria de trabajo y explica cómo cada uno ayuda al siguiente paso.
Problema: Si hay 5 equipos en un torneo y cada equipo juega contra todos los demás una vez, ¿cuántos partidos hay en total?
Respuesta con CoT:
- Equipo 1 juega contra 4 equipos: 4 partidos
- Equipo 2 juega contra 3 restantes (ya jugó contra equipo 1): 3 partidos
- Equipo 3 juega contra 2 restantes: 2 partidos
- Equipo 4 juega contra 1 restante: 1 partido
- Total: 4 + 3 + 2 + 1 = 10 partidos
Ver solución
Los tokens intermedios que actúan como memoria de trabajo son:
- "4 partidos" → El modelo "recuerda" este número al calcular el siguiente
- "3 restantes" → La palabra "restantes" reduce el espacio de búsqueda para el modelo
- "2 restantes", "1 restante" → Patrón que el modelo sigue consistentemente
- "4 + 3 + 2 + 1" → Ya no tiene que recordar los sumandos originales, están en contexto
Sin CoT, el modelo intentaría calcular C(5,2) = 10 directamente, lo cual requiere conocer la fórmula combinatoria. Con CoT, usa razonamiento inductivo más intuitivo.
Ejercicio 3: Diseña un caso de uso de CoT en tu dominio
Piensa en un problema de tu trabajo o área de interés donde CoT podría ayudar. Describe:
- El tipo de problema
- Por qué requiere múltiples pasos
- Qué esperas ganar con CoT
Ver solución (ejemplo)
Dominio: E-commerce / Análisis de pricing
Problema: "¿Debo bajar el precio de un producto si la competencia lo bajó?"
Por qué requiere múltiples pasos:
- Analizar margen actual
- Estimar elasticidad de precio en ese segmento
- Considerar costos fijos/variables
- Evaluar posicionamiento de marca
- Proyectar volumen con/sin bajada de precio
- Calcular revenue esperado en cada escenario
Beneficio de CoT: El modelo no puede saltarse pasos. El razonamiento es auditable por el equipo de negocio. Si el modelo hace una suposición incorrecta (ej: "elasticidad alta"), se puede detectar y corregir.
Ejercicio 4: Límites de CoT
Prueba CoT en estas 3 tareas y observa qué pasa. ¿Cuáles mejoran? ¿Cuáles no?
- "Escribe un haiku sobre el otoño"
- "¿Es válido el argumento: Todos los perros son animales. Rex es un animal. Por lo tanto Rex es un perro?"
- "¿Cuál es la capital de Japón?"
Ver solución
-
Haiku: CoT no ayuda (puede empeorar). La tarea es creativa y el razonamiento paso a paso puede generar un haiku mecánico y sin gracia. Ejemplo negativo: "Paso 1: Contar sílabas. Paso 2: Elegir tema otoñal..." → Resultado rígido.
-
Argumento lógico: CoT ayuda. La respuesta directa a veces da "Válido" incorrectamente. Con CoT: "Premisa: ∀x: perro(x)→animal(x). Rex es animal. Para concluir perro(Rex) necesito ∀x: animal(x)→perro(x), que es falsa. Falacias de afirmación del consecuente. INVÁLIDO." ✓
-
Pregunta factual: CoT es neutral o negativo. La respuesta directa es "Tokio". Con CoT, el modelo puede añadir información redundante: "Japón es un país en Asia. Su gobierno tiene sede en... Por lo tanto Tokio." Mismo resultado, más tokens y costo.
Conceptos Clave de esta Cápsula
| Término | Definición |
|---|---|
| Chain-of-Thought (CoT) | Técnica de prompting que pide razonamiento explícito paso a paso |
| Zero-Shot CoT | CoT sin ejemplos, solo con instrucción "piensa paso a paso" |
| Few-Shot CoT | CoT con ejemplos de razonamiento (Manual CoT) |
| Tokens intermedios | Los pasos del razonamiento que actúan como memoria de trabajo |
| Emergencia | Fenómeno por el que CoT solo funciona bien en modelos grandes |
| Fabricated reasoning | Razonamiento que suena lógico pero es incorrecto |
Resumen
- CoT obliga al modelo a generar tokens intermedios que actúan como espacio de trabajo mental
- La paradoja existe porque los modelos toman atajos sin CoT, aunque tengan el conocimiento
- El mecanismo es simple: más contexto relevante en el input del siguiente token = mejor predicción
- Mejora típica: +15-30% en math/logic con CoT
- Límites: Solo funciona en modelos suficientemente grandes; no aplica en tareas creativas o simples