MÓDULO 2 · PROMPT ENGINEERING · 40 MIN

ReAct prompting: razonamiento y acción para tareas multi-paso

40 min Intermedio-Avanzado Claude ChatGPT Gemini cualquier LLM
ReAct (Reasoning + Acting) convierte al LLM de un "oráculo que adivina" a un "agente que razona y actúa". El LLM alterna Thought (razona qué necesita) → Action (ejecuta una herramienta concreta) → Observation (recibe el resultado), repitiendo el ciclo hasta tener evidencia suficiente para responder.
El problema

Los LLMs fallan en tareas complejas cuando intentan dar una respuesta directa sin descomponer el problema.

Situación típica 1 — Respuesta incorrecta por falta de pasos: preguntás "¿Cuántos días pasaron entre el lanzamiento del iPhone original y el primer Android?" y recibís "Aproximadamente 18 meses" — vago, sin mostrar el cálculo, posiblemente incorrecto.

Situación típica 2 — Alucinación por falta de verificación: preguntás por el CEO actual de una empresa y su fecha de asunción, y el LLM responde con confianza usando datos desactualizados, porque no puede verificar información actual.

Situación típica 3 — Tarea multi-paso resuelta de forma incompleta: pedís "analiza si esta empresa es buena inversión: revisa sus finanzas, competencia y tendencias" y obtenés un análisis superficial que mezcla todo sin estructura, omite pasos, y no indica qué información usó para cada conclusión.

Por qué es importante: sin estructura de razonamiento + acción, el LLM "adivina" en lugar de razonar paso a paso, no podés verificar cómo llegó a una conclusión, se salta pasos críticos en tareas complejas, y no reconoce cuándo necesita información externa.

La solución: el patrón ReAct

ReAct es un patrón donde el LLM alterna entre:

THOUGHT (Pensamiento) → ¿Qué necesito hacer/saber ahora? ACTION (Acción) → Ejecuto una acción específica OBSERVATION (Observación) → ¿Qué resultado obtuve? ... (repetir hasta resolver) ANSWER (Respuesta) → Conclusión final basada en evidencia

Origen: el patrón viene del paper "ReAct: Synergizing Reasoning and Acting in Language Models" (Yao et al., 2022), donde demostró mejoras significativas en tareas de razonamiento y QA.

Cómo funciona
1. Thought — el LLM verbaliza su razonamiento antes de actuar

Incluye: ¿qué información necesito? ¿qué paso debo tomar ahora? ¿qué sé hasta ahora y qué me falta?

thoughtThought: Para responder cuántos días entre iPhone y Android, necesito saber las fechas exactas de lanzamiento de ambos. Primero buscaré la fecha del iPhone original.
2. Action — una acción concreta

El LLM especifica una acción concreta a ejecutar. Las acciones típicas son:

actionAction: Search[fecha lanzamiento iPhone original]
3. Observation — el resultado de la acción

En una conversación real, vos proporcionás este resultado. En sistemas automatizados, una herramienta lo proporciona.

observationObservation: El iPhone original fue lanzado el 29 de junio de 2007.
4. Ciclo iterativo

El proceso se repite hasta que el LLM tiene suficiente información para dar una respuesta fundamentada:

ciclo completoThought: Ahora tengo la fecha del iPhone. Necesito la fecha del primer Android. Action: Search[fecha lanzamiento primer teléfono Android] Observation: El HTC Dream (T-Mobile G1), primer teléfono Android, fue lanzado el 22 de octubre de 2008. Thought: Tengo ambas fechas. Ahora puedo calcular la diferencia. Action: Calculate[días entre 29 junio 2007 y 22 octubre 2008] Observation: 481 días Answer: Entre el lanzamiento del iPhone original (29 de junio de 2007) y el primer teléfono Android (22 de octubre de 2008) pasaron 481 días, aproximadamente 1 año y 4 meses.
Plantilla básica de prompt ReAct
markdownResuelve la siguiente tarea usando el formato Thought/Action/Observation. # HERRAMIENTAS DISPONIBLES Puedes usar estas acciones: - Search[consulta]: Busca información sobre un tema - Calculate[expresión]: Realiza un cálculo matemático - Compare[A, B]: Compara dos elementos - Verify[afirmación]: Verifica si una afirmación es correcta # FORMATO Sigue este formato estrictamente: Thought: [Tu razonamiento sobre qué hacer] Action: [Herramienta[parámetro]] Observation: [Resultado - ESPERA a que te lo proporcione] ... (repite Thought/Action/Observation hasta tener suficiente información) Answer: [Tu respuesta final basada en las observaciones] # REGLAS 1. Siempre empieza con un Thought 2. Cada Action debe ser UNA sola herramienta 3. ESPERA la Observation antes de continuar (no la inventes) 4. Solo da Answer cuando tengas suficiente información 5. Si una búsqueda no da resultado útil, reformula la consulta # TAREA [Tu pregunta o tarea aquí]
Herramientas virtuales comunes — según el tipo de tarea
Cuándo aplicarlo
Usá ReAct cuando...NO uses ReAct cuando...
La tarea requiere múltiples pasos de razonamientoLa tarea es directa y simple
Necesitás verificar información antes de responderYa tenés toda la información necesaria
El problema requiere cálculos intermediosEs una tarea creativa sin respuesta verificable
Querés auditar el razonamiento del LLMLa velocidad es más importante que la trazabilidad
La respuesta incorrecta tiene alto costoEs brainstorming o exploración libre
Hay múltiples fuentes de información a consultarSolo hay una fuente obvia
Ejercicio práctico

Objetivo: aplicar el patrón ReAct para resolver tareas multi-paso, actuando vos como el "proveedor de observaciones" en una conversación con el LLM.

Contexto inicial: usá Claude.ai, ChatGPT, o cualquier interfaz de LLM. Vos simulás las herramientas proporcionando las observaciones cuando el LLM solicite una acción.

Paso 1 — ReAct básico: cálculo con búsqueda

Copiá este prompt y envialo al LLM:

markdownResuelve la siguiente tarea usando el formato Thought/Action/Observation. # HERRAMIENTAS DISPONIBLES - Search[consulta]: Busca información (yo te daré el resultado) - Calculate[expresión]: Realiza un cálculo (yo te daré el resultado) # REGLAS - DETENTE después de cada Action y espera mi Observation - No inventes resultados de búsqueda # TAREA ¿Cuál es la diferencia de población entre la ciudad más poblada de España y la ciudad más poblada de Portugal? Da el resultado en millones con un decimal.

El LLM debería responder con un Thought y un Action: Search[ciudad más poblada de España], deteniéndose ahí. Le respondés vos con la Observation:

TÚ
observationObservation: Madrid es la ciudad más poblada de España con aproximadamente 3.3 millones de habitantes en la ciudad (6.7 millones en el área metropolitana).

El LLM continúa pidiendo la ciudad de Portugal; le respondés:

TÚ
observationObservation: Lisboa es la ciudad más poblada de Portugal con aproximadamente 545.000 habitantes en la ciudad (2.9 millones en el área metropolitana).

El LLM debería notar la inconsistencia de unidades (ciudad vs. área metropolitana) y elegir un criterio consistente antes de calcular — anotá si lo hace explícito en su Thought. Verificá al final: ¿esperó tus observaciones o inventó datos? ¿mostró su razonamiento en cada Thought? ¿la respuesta final cita las fuentes/datos usados?

Paso 2 — ReAct para fact-checking

Diseñá un verificador de hechos con herramientas Search[consulta], Verify[afirmación], Conclude[veredicto], que termine con Verdict: VERDADERO/FALSO/PARCIALMENTE VERDADERO + explicación. Probalo con esta afirmación compuesta, que mezcla datos verdaderos y falsos a propósito:

afirmación a verificar"Python fue creado en los años 80 por Guido van Rossum mientras trabajaba en Google, y su nombre viene de los Monty Python."

El LLM debería descomponerla en las 4 partes verificables (década, creador, empleador, origen del nombre) y pedir observaciones para cada una. Las reales son: Guido van Rossum sí es el creador; el desarrollo empezó en 1989 pero la primera versión (0.9.0) se publicó en 1991, en el CWI (Centrum Wiskunde & Informatica) de Países Bajos — no en Google; y el nombre sí viene del grupo de comedia Monty Python's Flying Circus. El resultado esperado es PARCIALMENTE VERDADERO, con el desglose punto por punto de qué era cierto y qué no.

Paso 3 — ReAct para análisis comparativo

Usá el patrón para una decisión técnica real: herramientas Research[tema], ListPros[opción], ListCons[opción], Score[opción, criterio] (puntúa 1-10), Decide[opciones]. Tarea: un equipo debe elegir entre PostgreSQL y MongoDB para una app de e-commerce, considerando escalabilidad, flexibilidad del schema, transacciones, y ecosistema/soporte. Cuando el LLM pida ListPros[PostgreSQL], podés responder con: transacciones ACID completas, SQL estándar, excelente para relaciones complejas, maduro y estable, extensiones potentes (PostGIS, full-text search). Seguí dando observaciones reales para cada pedido hasta que llegue a una Final Decision con Reasoning explícito.

Paso 4 — ReAct auto-contenido (sin herramientas externas)

Para tareas donde el LLM ya tiene el conocimiento necesario, puede generar sus propias observaciones por lógica pura — es el caso de un problema de deducción:

problema de lógicaTres amigos (Ana, Bruno, Carlos) tienen profesiones diferentes (médica, ingeniero, abogado) y viven en ciudades diferentes (Madrid, Barcelona, Valencia). Pistas: 1. Ana no vive en Madrid 2. El ingeniero vive en Barcelona 3. Bruno no es médico ni abogado 4. Carlos no vive en Valencia 5. La médica vive en Madrid ¿Quién es quién, qué profesión tiene, y dónde vive?

Acá el formato usa Action: [Analyze/Deduce/Check][parámetro] y el LLM mismo genera la Observation basándose en lógica, empezando por las pistas más restrictivas (Bruno no es médico ni abogado → es ingeniero → vive en Barcelona por la pista 2), y encadenando el resto hasta resolver el sistema completo.

Paso 5 — Diseñá tu propio prompt ReAct

Elegí uno de estos escenarios y armá el prompt completo:

Tu prompt debe incluir: lista de herramientas con descripción, formato Thought/Action/Observation, reglas claras (esperar observaciones, no inventar), y la tarea específica.

Troubleshooting rápido
Si ves esto...CausaSolución
El LLM inventa las observaciones en lugar de esperarNo enfatizaste que debe esperarAñadí: "DETENTE después de cada Action. NO generes Observation, espera mi respuesta."
Salta directamente a la respuesta sin razonarNo usó el formatoIncluí un ejemplo completo del ciclo T/A/O en el prompt
Actions demasiado vagas ("Search[info]")Herramientas no bien definidasDefiní parámetros esperados: "Search[consulta específica sobre X]"
Se pierde en loops infinitosNo definiste condición de paradaAñadí: "Máximo 5 ciclos. Si no tenés respuesta, indicá qué información falta."
Mezcla Thought y Action en una líneaFormato no lo suficientemente estrictoMostrá un ejemplo con saltos de línea claros entre cada componente
No cita las observaciones en la respuesta finalNo lo requeristeAñadí: "Tu Answer debe referenciar las Observations que usaste como evidencia"

El ciclo Thought/Action/Observation te da razonamiento visible, pero visible no es lo mismo que fiel. Un LLM puede generar un Thought que suena coherente sin que sea realmente lo que determinó la Action siguiente — es razonamiento post-hoc, no una traza interna verificada. ReAct es una herramienta de auditoría muy útil, pero no una garantía de que el modelo "pensó" exactamente lo que escribió. Cuando algo importa de verdad, seguí verificando las Observations contra fuentes reales, no solo contra la coherencia narrativa del Thought.

Puntos clave

Concepto central: ReAct convierte al LLM de un "oráculo que adivina" a un "agente que razona y actúa". Al forzar el ciclo Thought → Action → Observation, el LLM descompone problemas complejos, verifica información antes de usarla, y produce respuestas trazables y auditables.

Para recordar: