Saltar al contenido principal
Jordi Izquierdo Montalbán
Proyectos

Fundamentos y Ciclo ReAct (LangGraph Essentials)

Implementación del ciclo ReAct con StateGraph: bifurcación automática con tools_condition, enlace de herramientas con @tool, persistencia volátil con MemorySaver y subflujo asistido para clasificación y redacción estructurada.

Código privado: te lo enseño en una entrevista

LangGraph, Python, TypeScript, ReAct, MemorySaver, ToolNode, Pydantic

El problema

Un agente que usa herramientas externas (APIs, calculadoras, buscadores) acaba en código espagueti si lo implemento con bucles a mano. El modelo tiene que decidir solo cuándo seguir ejecutando funciones, cuándo parar y cómo pausar para pedir confirmación al usuario sin perder los datos de la sesión.

La solución

El bucle cerrado de razonamiento ReAct: StateGraph → modelo con bind_tools → bifurcación condicional tools_condition → ToolNode → MemorySaver y pausas con interrupt().

En los 5 laboratorios de LangGraph Essentials construí la base para enlazar modelos con herramientas reales dentro del ciclo de razonamiento ReAct:

  1. Construcción y compilación del grafo. Ensamblo el grafo con StateGraph y MessagesState, añado nodos (builder.add_node) y aristas estándar (START, END), y compilo el flujo.
  2. Ciclo ReAct y aristas condicionales:
    • Convierto funciones de Python en herramientas del modelo con el decorador @tool y llm.bind_tools([tool]).
    • tools_condition bifurca solo: el grafo mira si el LLM emitió tool_calls y manda el flujo al ToolNode correspondiente, o termina.
  3. Memoria de conversación (MemorySaver). Aísla cada conversación por thread_id, de modo que varios usuarios tienen contextos independientes en la misma aplicación. Esta memoria es volátil.
  4. Human-in-the-Loop nativo. Con interrupt() el agente se detiene antes de una acción irreversible y espera a que el usuario confirme o edite. Después se reanuda con Command(resume=...).
  5. Asistente de correo (EmailAgent). Combino salidas tipadas (with_structured_output) para el triaje semántico y para guiar la generación de respuestas.

Stack desglosado

  • Orquestación: LangGraph (StateGraph, ToolNode, tools_condition).
  • Memoria: MemorySaver y gestión de hilos por thread_id.
  • Estructuración: Pydantic y with_structured_output().
  • Lenguajes: Implementaciones equivalentes en Python y TypeScript / JavaScript.

Resultados y aprendizajes

Lo que funcionó fue la sencillez de tools_condition y ToolNode. Si las herramientas son nodos del grafo, añadir una capacidad nueva al agente es registrar una función de Python decorada.

Lo que aprendí: el ciclo ReAct es la pieza base de cualquier agente más avanzado. Entender bien los mensajes de herramientas y la bifurcación condicional es lo que evita los bucles infinitos.