Phase 11 - Lesson 02
Few-Shot, Chain-of-Thought, Tree-of-Thought
This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.
Decirle a un modelo qué hacer es prompting. Mostrarle cómo pensar es ingeniería. La diferencia entre el 78% y el 91% de precisión en el mismo modelo, la misma tarea y los mismos datos no se debe a un modelo mejor. Se debe a una mejor estrategia de razonamiento.
Tipo: Build Idiomas: Python Prerrequisitos: Lección 11.01 (Ingeniería de Prompts) Tiempo: ~45 minutos
Objetivos de Aprendizaje
- Implementar few-shot prompting seleccionando y formateando demostraciones de ejemplos que maximicen la precisión de la tarea
- Aplicar el razonamiento de cadena de pensamiento (CoT) para mejorar la precisión en problemas de múltiples pasos, como problemas matemáticos de texto
- Construir un prompt de árbol de pensamiento (Tree-of-Thought) que explore múltiples caminos de razonamiento y seleccione el mejor
- Medir la mejora de precisión entre zero-shot vs few-shot vs CoT en un benchmark estándar
El Problema
Construyes una aplicación de tutoría de matemáticas. Tu prompt dice: "Resuelve este problema matemático". El GPT-5 lo hace bien el 94% de las veces en GSM8K, el benchmark estándar de matemáticas de primaria. Crees que ya alcanzaste el límite. No es así: la cadena de pensamiento (chain-of-thought) todavía añade de 3 a 4 puntos.
Agrega cinco palabras — "Pensemos paso a paso" — y la precisión sube al 91%. Agrega unos pocos ejemplos resueltos y llega al 95%. El mismo modelo. La misma temperatura. El mismo costo de API. La única diferencia es que le diste papel de borrador al modelo.
Esto no es un truco. Es cómo funciona el razonamiento. Los humanos no resuelven problemas de múltiples pasos en un solo salto mental. Los transformers tampoco. Cuando obligas a un modelo a generar tokens intermedios, esos tokens se convierten en parte del contexto para el siguiente token. Cada paso de razonamiento alimenta al siguiente. El modelo literalmente calcula su camino hacia la respuesta.
Pero "pensar paso a paso" es el comienzo, no el final. ¿Qué pasaría si seleccionaras cinco caminos de razonamiento y realizaras una votación por mayoría? ¿Qué pasaría si dejaras que el modelo explorara un árbol de posibilidades, evaluando y podando ramas? ¿Qué pasaría si intercalaras el razonamiento con el uso de herramientas? Estos no son casos hipotéticos. Son técnicas publicadas con mejoras medidas, y las construirás todas en esta lección.
El Concepto
Zero-Shot vs Few-Shot: Cuando los Ejemplos Superan a las Instrucciones
El prompt zero-shot le da al modelo una tarea y nada más. El prompt few-shot le da ejemplos primero.
Wei et al. (2022) midieron esto en 8 benchmarks. Para tareas simples como la clasificación de opiniones (sentiment classification), zero-shot y few-shot tuvieron un rendimiento con una diferencia del 2% entre si. Para tareas complejas como aritmética de varios pasos y razonamiento simbólico, few-shot mejoró la precisión en un 10-25%.
La intuición: los ejemplos son instrucciones comprimidas. En lugar de describir el formato de salida, lo muestras. En lugar de explicar el proceso de razonamiento, lo demuestras. El modelo coincide con los patrones de los ejemplos de manera más confiable que al interpretar instrucciones abstractas.
graph TD
subgraph Comparison["Zero-Shot vs Few-Shot"]
direction LR
Z["Zero-Shot\n'Clasifica esta reseña'\nEl modelo adivina el formato\n78% en GSM8K"]
F["Few-Shot\n'Aquí hay 3 ejemplos...\nAhora clasifica esta reseña'\nEl modelo coincide con el patrón\n85% en GSM8K"]
end
Z ~~~ F
style Z fill:#1a1a2e,stroke:#e94560,color:#fff
style F fill:#1a1a2e,stroke:#51cf66,color:#fff
Cuándo gana few-shot: tareas sensibles al formato, clasificación, extracción estructurada, jerga específica del dominio, cualquier tarea en la que el modelo necesite coincidir con un patrón específico.
Cuándo gana zero-shot: preguntas de hechos simples, tareas creativas donde los ejemplos limitan la creatividad, tareas en las que encontrar buenos ejemplos es más difícil que escribir buenas instrucciones.
Selección de Ejemplos: Los Similares Superan a los Aleatorios
No todos los ejemplos son iguales. Elegir ejemplos similares a la entrada de destino supera a la selección aleatoria por un 5-15% en tareas de clasificación (Liu et al., 2022). Tres principios:
- Similitud semántica: elije los ejemplos más cercanos a la entrada en el espacio de incrustación (embedding space)
- Diversidad de etiquetas: cubre todas las categorías de salida en tus ejemplos
- Coincidencia de dificultad: coincide con el nivel de complejidad del problema de destino
La cantidad óptima de ejemplos para la mayoría de las tareas es de 3 a 5. Por debajo de 3, el modelo no tiene suficiente señal para extraer el patrón. Por encima de 5, se llega a un rendimiento decreciente y se desperdician tokens de la ventana de contexto. Para clasificación con muchas etiquetas, usa un ejemplo por etiqueta.
Cadena de Pensamiento (Chain-of-Thought): Dando Papel de Borrador a los Modelos
El prompt de cadena de pensamiento (CoT) fue introducido por Wei et al. (2022) en Google Brain. La idea es simple: en lugar de pedirle al modelo solo la respuesta, pídele que muestre primero sus pasos de razonamiento.
graph LR
subgraph Standard["Prompting Estándar"]
Q1["P: Roger tiene 5 bolas.\nCompra 2 latas de 3.\n¿Cuántas bolas?"] --> A1["R: 11"]
end
subgraph CoT["Prompting de Cadena de Pensamento"]
Q2["P: Roger tiene 5 bolas.\nCompra 2 latas de 3.\n¿Cuántas bolas?"] --> R2["Roger comienza con 5.\n2 latas de 3 = 6.\n5 + 6 = 11."] --> A2["R: 11"]
end
style Q1 fill:#1a1a2e,stroke:#e94560,color:#fff
style A1 fill:#1a1a2e,stroke:#e94560,color:#fff
style Q2 fill:#1a1a2e,stroke:#51cf66,color:#fff
style R2 fill:#1a1a2e,stroke:#ffa500,color:#fff
style A2 fill:#1a1a2e,stroke:#51cf66,color:#fff
¿Por qué funciona esto mecánicamente? Cada token que genera un transformer se convierte en contexto para el siguiente token. Sin CoT, el modelo debe comprimir todo el razonamiento en el estado oculto de una sola pasada hacia adelante (forward pass). Con CoT, el modelo externaliza los cálculos intermedios en forma de tokens. Cada token de razonamiento extiende la profundidad de cálculo efectiva.
Benchmarks GSM8K (matemáticas de primaria, 8.5 mil problemas):
| Modelo | Zero-Shot | Zero-Shot CoT | Few-Shot CoT |
|---|---|---|---|
| GPT-4o | 78% | 91% | 95% |
| GPT-5 | 94% | 97% | 98% |
| o4-mini (razonamiento) | 97% | — | — |
| Claude Opus 4.7 | 93% | 97% | 98% |
| Gemini 3 Pro | 92% | 96% | 98% |
| Llama 4 70B | 80% | 89% | 94% |
| DeepSeek-V3.1 | 89% | 94% | 96% |
Nota sobre modelos de razonamiento. Los modelos como la serie-o de OpenAI (o3, o4-mini) y DeepSeek-R1 ejecutan internamente la cadena de pensamiento antes de emitir su respuesta. Agregar "Pensemos paso a paso" a un modelo de razonamiento es redundante y, a veces, contraproducente — ya lo han hecho.
Dos variantes de CoT:
Zero-shot CoT: agrega "Pensemos paso a paso" al prompt. No se necesitan ejemplos. Kojima et al. (2022) demostraron que esta simple frase mejora la precisión en tareas de aritmética, sentido común y razonamiento simbólico.
Few-shot CoT: proporciona ejemplos que incluyan pasos de razonamiento. Es más efectivo que zero-shot CoT porque el modelo ve el formato exacto de razonamiento que esperas.
Cuándo perjudica el CoT: recuperación de hechos simples ("¿Cuál es la capital de Francia?"), clasificación de un solo paso, tareas donde la velocidad importa más que la precisión. CoT añade una sobrecarga de razonamiento de 50 a 200 tokens por consulta. Para tareas de alto rendimiento (throughput) y baja complejidad, esto es un desperdicio de costo.
Autoconsistencia (Self-Consistency): Muestrear Varios, Votar una Vez
Wang et al. (2023) presentaron la autoconsistencia. La idea clave: una sola ruta de CoT puede contener errores de razonamiento. Pero si muestras N rutas de razonamiento independientes (usando temperature > 0) y realizas una votación por mayoría sobre la respuesta final, los errores se cancelan.
graph TD
P["Problema: 'Una tienda tiene 48 manzanas.\nVenden 1/3 el lunes\ny 1/4 del resto el martes.\n¿Cuántas quedan?'"]
P --> Path1["Camino 1: 48 - 16 = 32\n32 - 8 = 24\nRespuesta: 24"]
P --> Path2["Camino 2: 1/3 de 48 = 16\nRestante: 32\n1/4 de 32 = 8\n32 - 8 = 24\nRespuesta: 24"]
P --> Path3["Camino 3: 48/3 = 16 vendidas\n48 - 16 = 32\n32/4 = 8 vendidas\n32 - 8 = 24\nRespuesta: 24"]
P --> Path4["Camino 4: Vende 1/3: 48 - 12 = 36\nVende 1/4: 36 - 9 = 27\nRespuesta: 27"]
P --> Path5["Camino 5: Lunes: 48 * 2/3 = 32\nMartes: 32 * 3/4 = 24\nRespuesta: 24"]
Path1 --> V["Voto de la Mayoría\n24: 4 votos\n27: 1 voto\nFinal: 24"]
Path2 --> V
Path3 --> V
Path4 --> V
Path5 --> V
style P fill:#1a1a2e,stroke:#ffa500,color:#fff
style Path1 fill:#1a1a2e,stroke:#51cf66,color:#fff
style Path2 fill:#1a1a2e,stroke:#51cf66,color:#fff
style Path3 fill:#1a1a2e,stroke:#51cf66,color:#fff
style Path4 fill:#1a1a2e,stroke:#e94560,color:#fff
style Path5 fill:#1a1a2e,stroke:#51cf66,color:#fff
style V fill:#1a1a2e,stroke:#51cf66,color:#fff
La autoconsistencia mejoró la precisión de GSM8K del 56,5% (CoT único) al 74,4% con N=40 en los experimentos originales de PaLM 540B. En GPT-5, la mejora es pequeña (97% a 98%) porque la precisión base ya está saturada. La técnica brilla más en modelos con un 60-85% de precisión base de CoT, el punto óptimo donde los errores de una sola ruta son comunes pero no sistemáticos. Para modelos de razonamiento (serie-o, R1), la autoconsistencia está integrada en el muestreo interno.
La compensación: N muestras significa N veces el costo y la latência de la API. En la práctica, N=5 captura la mayor parte del beneficio. N=3 es el mínimo para una votación significativa. N > 10 tiene rendimientos decrecientes para la mayoría de las tareas.
Árbol de Pensamiento (Tree-of-Thought): Exploración por Ramificación
Yao et al. (2023) introdujeron Tree-of-Thought (ToT). Mientras que CoT sigue un único camino lineal de razonamiento, ToT explora múltiples ramas y evalúa cuáles son las más prometedoras antes de continuar.
graph TD
Root["Problema"] --> B1["Pensamento 1a"]
Root --> B2["Pensamento 1b"]
Root --> B3["Pensamento 1c"]
B1 --> E1["Evaluación: 0.8"]
B2 --> E2["Evaluación: 0.3"]
B3 --> E3["Evaluación: 0.9"]
E1 -->|Continuar| B1a["Pensamento 2a"]
E1 -->|Continuar| B1b["Pensamento 2b"]
E3 -->|Continuar| B3a["Pensamento 2a"]
E3 -->|Continuar| B3b["Pensamento 2b"]
E2 -->|Podar| X["X"]
B1a --> E4["Evaluación: 0.7"]
B3a --> E5["Evaluación: 0.95"]
E5 -->|Mejor camino| Final["Solución"]
style Root fill:#1a1a2e,stroke:#ffa500,color:#fff
style E2 fill:#1a1a2e,stroke:#e94560,color:#fff
style X fill:#1a1a2e,stroke:#e94560,color:#fff
style E5 fill:#1a1a2e,stroke:#51cf66,color:#fff
style Final fill:#1a1a2e,stroke:#51cf66,color:#fff
style B1 fill:#1a1a2e,stroke:#808080,color:#fff
style B2 fill:#1a1a2e,stroke:#808080,color:#fff
style B3 fill:#1a1a2e,stroke:#808080,color:#fff
style B1a fill:#1a1a2e,stroke:#808080,color:#fff
style B1b fill:#1a1a2e,stroke:#808080,color:#fff
style B3a fill:#1a1a2e,stroke:#808080,color:#fff
style B3b fill:#1a1a2e,stroke:#808080,color:#fff
style E1 fill:#1a1a2e,stroke:#808080,color:#fff
style E3 fill:#1a1a2e,stroke:#808080,color:#fff
style E4 fill:#1a1a2e,stroke:#808080,color:#fff
ToT tiene tres componentes:
- Generación de pensamientos: producir múltiples candidatos para los siguientes pasos
- Evaluación del estado: puntuar cada candidato (se puede usar el propio LLM como evaluador)
- Algoritmo de búsqueda: BFS (búsqueda en anchura) o DFS (búsqueda en profundidad) a través del árbol, podando las ramas de baja puntuación
En la tarea del Game of 24 (combinar 4 números usando aritmética para obtener 24), GPT-4 con prompting estándar resuelve el 7,3% de los problemas. Con CoT, el 4,0% (CoT en realidad perjudica aquí porque el espacio de búsqueda es amplio). Con ToT, el 74%.
ToT es costoso. Cada nodo en el árbol requiere una llamada de LLM. Un árbol con un factor de ramificación de 3 y una profundidad de 3 requiere hasta 39 llamadas de LLM. Úsalo solo para problemas donde el espacio de búsqueda es grande pero evaluable — planificación, resolución de acertijos, resolución creativa de problemas con restricciones.
ReAct: Pensar + Actuar
Yao et al. (2022) combinaron trazas de razonamiento con acciones. El modelo alterna entre pensar (generar razonamiento) y actuar (llamar a herramientas, buscar, computar).
graph LR
Q["Pregunta:\n¿Cuál es la\npoblación del\npaís donde\nse encuentra\nla Eiffel Tower?"]
T1["Pensamento: Necesito\nencontrar qué país\ntiene la Eiffel Tower"]
A1["Acción: buscar\n'ubicación de la Eiffel Tower'"]
O1["Observación:\nParís, Francia"]
T2["Pensamento: Agora preciso\nla población de Francia"]
A2["Acción: buscar\n'población de Francia 2024'"]
O2["Observación:\n68.4 millones"]
T3["Pensamento: Tengo\nla respuesta"]
F["Respuesta:\n68.4 millones"]
Q --> T1 --> A1 --> O1 --> T2 --> A2 --> O2 --> T3 --> F
style Q fill:#1a1a2e,stroke:#ffa500,color:#fff
style T1 fill:#1a1a2e,stroke:#51cf66,color:#fff
style A1 fill:#1a1a2e,stroke:#e94560,color:#fff
style O1 fill:#1a1a2e,stroke:#808080,color:#fff
style T2 fill:#1a1a2e,stroke:#51cf66,color:#fff
style A2 fill:#1a1a2e,stroke:#e94560,color:#fff
style O2 fill:#1a1a2e,stroke:#808080,color:#fff
style T3 fill:#1a1a2e,stroke:#51cf66,color:#fff
style F fill:#1a1a2e,stroke:#51cf66,color:#fff
ReAct supera a CoT puro en tareas intensivas en conocimiento porque puede fundamentar su razonamiento en datos reales. En HotpotQA (preguntas y respuestas de múltiples saltos), ReAct con GPT-4 logra un 35,1% de coincidencia exacta frente al 29,4% de CoT solo. El poder real es que los errores de razonamiento se corrigen mediante observaciones — el modelo puede actualizar su plan a mitad de la ejecución.
ReAct es la base de los agentes de IA modernos. Cada framework de agentes (LangChain, CrewAI, AutoGen) implementa alguna variante del ciclo Pensamiento-Acción-Observación (Thought-Action-Observation). Construirás agentes completos en la Fase 14. Esta lección cubre el patrón de prompting.
Prompting Estructurado: Etiquetas XML, Delimitadores, Encabezados
A medida que los prompts se vuelven complejos, la estructura evita que el modelo confunda las secciones. Tres enfoques:
Etiquetas XML (funciona mejor con Claude, sólido en todas partes):
<context>
You are reviewing a pull request.
The codebase uses TypeScript and React.
</context>
<task>
Review the following diff for bugs, security issues, and style violations.
</task>
<diff>
{diff_content}
</diff>
<output_format>
List each issue with: file, line, severity (critical/warning/info), description.
</output_format>
Encabezados Markdown (universal):
## Role
Senior security engineer at a fintech company.
## Task
Analyze this API endpoint for vulnerabilities.
## Input
{api_code}
## Rules
- Focus on OWASP Top 10
- Rate each finding: critical, high, medium, low
- Include remediation steps
Delimitadores (mínimo pero efectivo):
---INPUT---
{user_text}
---END INPUT---
---INSTRUCTIONS---
Summarize the above in 3 bullet points.
---END INSTRUCTIONS---
Encadenamiento de Prompts (Prompt Chaining): Descomposición Secuencial
Algunas tareas son demasiado complejas para un solo prompt. El encadenamiento de prompts las divide en pasos, donde la salida de un prompt se convierte en la entrada del siguiente.
graph LR
I["Entrada Bruta"] --> P1["Prompt 1:\nExtraer\nhechos clave"]
P1 --> O1["Hechos"]
O1 --> P2["Prompt 2:\nAnalizar\nhechos"]
P2 --> O2["Análisis"]
O2 --> P3["Prompt 3:\nGenerar\nrecomendación"]
P3 --> F["Salida Final"]
style I fill:#1a1a2e,stroke:#808080,color:#fff
style P1 fill:#1a1a2e,stroke:#e94560,color:#fff
style O1 fill:#1a1a2e,stroke:#ffa500,color:#fff
style P2 fill:#1a1a2e,stroke:#e94560,color:#fff
style O2 fill:#1a1a2e,stroke:#ffa500,color:#fff
style P3 fill:#1a1a2e,stroke:#e94560,color:#fff
style F fill:#1a1a2e,stroke:#51cf66,color:#fff
El encadenamiento supera al prompt único por tres razones:
- Cada paso es más sencillo: el modelo maneja una tarea enfocada en lugar de lidiar con todo a la vez
- Las saídas intermedias se pueden inspeccionar: puedes validar y corregir entre pasos
- Diferentes pasos pueden usar diferentes modelos: usa un modelo económico para la extracción y uno costoso para el razonamiento
Comparación de Rendimiento
| Técnica | Ideal Para | Precisión GSM8K (GPT-5) | Llamadas de API | Sobrecarga de Tokens | Complejidad |
|---|---|---|---|---|---|
| Zero-Shot | Tareas simples | 94% | 1 | Ninguna | Trivial |
| Few-Shot | Coincidencia de formato | 96% | 1 | 200-500 tokens | Baja |
| Zero-Shot CoT | Impulso rápido de razonamiento | 97% | 1 | 50-200 tokens | Trivial |
| Few-Shot CoT | Precisión máxima en llamada única | 98% | 1 | 300-600 tokens | Baja |
| Autoconsistencia (N=5) | Razonamiento de alto riesgo | 98.5% | 5 | Costo de tokens 5x | Media |
| Modelo de razonamiento (o4-mini) | Reemplazo directo de CoT | 97% | 1 | oculto (2-10x interno) | Trivial |
| Tree-of-Thought | Problemas de búsqueda/planificación | N/A (74% en Game of 24) | 10-40+ | Costo de tokens 10-40x | Alta |
| ReAct | Razonamiento fundamentado en conocimiento | N/A (35.1% en HotpotQA) | 3-10+ | Variable | Alta |
| Encadenamiento de Prompts | Tareas complejas de varios pasos | 96% (pipeline) | 2-5 | Costo de tokens 2-5x | Media |
La técnica correcta depende de tres factores: el requisito de precisión, el límite de latencia y la tolerancia al costo. Para la mayoría de los sistemas en producción, CoT de pocos ejemplos con un fallback de autoconsistencia de 3 muestras cubre el 90% de los casos de uso.
Implementación
Construiremos un resolvedor de problemas matemáticos que combina prompting de pocos ejemplos (few-shot prompting), razonamiento de cadena de pensamiento (chain-of-thought) y votación de autoconsistencia (self-consistency) en un único pipeline. Luego agregaremos tree-of-thought para problemas difíciles.
La implementación completa se encuentra en code/advanced_prompting.py. Aquí están los componentes clave.
Paso 1: Almacén de Ejemplos Few-Shot
El primer componente gestiona los ejemplos de pocos disparos (few-shot) y selecciona los más relevantes para un problema dado.
GSM8K_EXAMPLES = [
{
"question": "Janet's ducks lay 16 eggs per day. She eats three for breakfast every morning and bakes muffins for her friends every day with four. She sells every egg at the farmers' market for