Contenido del curso

Memoria compartida entre nodos en LangGraph

Resumen

LangGraph organiza agentes de inteligencia artificial como un grafo donde cada nodo accede a una memoria compartida llamada estado. Si estás construyendo agentes que necesitan recordar información, ejecutar acciones y coordinarse entre sí, entender este flujo es tu primer paso.

¿Qué es un grafo en LangGraph y por qué importa?

LangGraph trabaja con una arquitectura de nodos conectados por edges. Tienes un nodo inicial (Start), uno o varios nodos intermedios y un nodo final (End). Cada nodo puede ser un Large Language Model, un retrieval que trae información extra (por ejemplo, de un PDF), una memoria o tools que dan manos al cerebro para ejecutar acciones [1:00].

Esta estructura te permite orquestar entradas y salidas que no necesariamente son chats. Pueden ser archivos, mensajes o cualquier otro input. La gracia es que todos los nodos comparten un mismo estado.

¿Qué es un nodo en LangGraph? Es una función de Python que recibe el estado compartido, ejecuta lógica y devuelve la parte del estado que quiere actualizar.

¿Cómo se define el estado compartido?

El estado en LangGraph se gestiona como un diccionario tipado de Python. Para tiparlo correctamente importas TypedDict desde typing y declaras las claves que vas a compartir entre nodos [4:30].

Un ejemplo concreto del flujo:

  • Defines una clase State con campos como customer_name: str y my_age: int.
  • Inicializas el estado vacío y accedes a sus valores con .get() para evitar errores.
  • Si intentas leer una clave inexistente sin .get(), Python lanza un error porque el diccionario está vacío.

Usar .get() con un valor por defecto es la práctica recomendada. Te da un fallback y evita que el programa se rompa cuando una variable aún no ha sido asignada.

¿Cómo creas y conectas nodos en LangGraph?

Un nodo se define como una función de Python que recibe el estado y devuelve un diccionario con los cambios. Aquí entra una buena práctica clave: devuelve solo lo que estás actualizando, no el estado completo [6:45].

Si tu estado tiene 10 o 20 variables y devuelves todo siempre, LangGraph intentará reconciliar cada campo con los demás nodos del grafo. Devolver únicamente el delta es más limpio y eficiente.

¿Cómo se ensambla el grafo?

Una vez tienes tus funciones, importas desde LangGraph tres piezas: StateGraph, START y END. El proceso es:

  1. Creas un builder con StateGraph(State) pasándole la definición del estado.
  2. Registras nodos con builder.add_node("node_one", node_one), donde la convención es usar el mismo nombre de la función.
  3. Conectas con add_edge(START, "node_one") y luego add_edge("node_one", END).
  4. Llamas a builder.compile() y obtienes tu agente listo.

¿Qué es un edge en LangGraph? Es la conexión entre dos nodos del grafo. Define el orden de ejecución: desde dónde sale el flujo y hacia dónde llega.

¿Cómo visualizar el grafo sin depender de PNG?

LangGraph ofrece varios formatos para dibujar el grafo. El más común es Mermaid PNG, pero el servicio puede fallar y bloquear tu flujo. Una alternativa rápida y confiable es el formato ASCII, que se renderiza directo en tu notebook [9:50].

Para usar ASCII necesitas instalar la dependencia grandalf como paquete de desarrollo. Una vez instalada, ejecutas la visualización ASCII y ves el grafo con su Start, su nodo intermedio y su End conectados por edges.

Esto te permite avanzar sin pelearte con visualizadores externos como LangGraph Studio, aunque ese también es una opción válida cuando quieres ver el grafo de forma más estética.

¿Cómo actualizar el estado con lógica condicional?

La función principal de un nodo es actualizar el estado. Puedes meter lógica condicional dentro de la función para decidir qué campo modificar según lo que ya exista en la memoria compartida.

En el ejemplo trabajado:

  • Si customer_name no existe, el nodo lo asigna a "John Doe".
  • Si customer_name ya tiene valor, el nodo actualiza my_age con un número.
  • Si ninguna condición aplica, devuelves un diccionario vacío {} y el estado no cambia.

Cuando ejecutas esto en LangGraph Studio, puedes pasar valores iniciales al estado desde la interfaz gráfica. Por ejemplo, defines customer_name = "Nicolás Molina" y el nodo entra por la rama que actualiza my_age.

¿Por qué devolver solo el campo actualizado y no todo el estado? Porque LangGraph reconcilia automáticamente los cambios con el resto del grafo. Devolver todo el estado obliga al sistema a procesar variables que no cambiaron y puede generar conflictos cuando varios nodos escriben en paralelo.

Reto: extiende tu estado

Ahora te toca a ti. Tu estado actual tiene dos variables: customer_name y my_age. Agrega una tercera, por ejemplo un array, e intenta hacer push de elementos desde node_one según alguna condición. Modifica el estado y observa cómo se refleja en el debugger.

¿Qué variable agregaste y cómo decidiste cuándo actualizarla? Cuéntame en los comentarios.