Un agente sin memoria repite las mismas preguntas y pierde contexto entre sesiones. LangGraph resuelve esto con dos mecanismos distintos: checkpointers para memoria de corto plazo y stores para memoria de largo plazo.
Es un error común tratar "memoria" como un concepto único. LangGraph distingue explícitamente entre memoria de corto plazo —el historial de la conversación actual, ligado a un `thread_id`— y memoria de largo plazo —hechos o preferencias del usuario que deben persistir entre conversaciones distintas, incluso después de que el `thread_id` cambie. La primera se resuelve con checkpointers; la segunda con el `Store` de LangGraph.
Para desarrollo y pruebas, `MemorySaver` guarda el estado en memoria del proceso. Para producción, se necesita persistencia real:
Con `PostgresSaver`, si el proceso se reinicia o el usuario cierra y reabre la conversación con el mismo `thread_id`, el grafo recupera el estado exacto donde quedó, incluyendo el historial completo de mensajes y cualquier otra clave del estado definido.
Cuando se necesita recordar información del usuario más allá de una sola conversación —su nombre, preferencias, historial de compras resumido— se usa un `Store`, indexado no por `thread_id` sino por un espacio de nombres (`namespace`) propio del usuario:
Al compilar el grafo con `builder.compile(checkpointer=checkpointer, store=store)`, cualquier nodo puede declarar el parámetro `store` en su firma y LangGraph lo inyecta automáticamente en tiempo de ejecución.
Una conversación de cientos de mensajes eventualmente excede la ventana de contexto o dispara costos innecesarios. El patrón estándar es un nodo que, cuando el historial supera un umbral, lo resume y reemplaza los mensajes antiguos por el resumen:
`RemoveMessage` es un tipo especial que, combinado con el reductor de mensajes de LangGraph, elimina mensajes específicos del estado por id, permitiendo podar el historial sin perder los últimos turnos, que suelen ser los más relevantes para la respuesta inmediata.
En despliegues reales usamos `PostgresSaver` para el estado transaccional de la conversación activa (con un TTL razonable, ya que no todo hilo necesita vivir para siempre) y un `Store` separado —a veces respaldado por la misma base de datos, a veces por un vector store cuando la memoria de largo plazo necesita búsqueda semántica sobre preferencias acumuladas— para lo que debe sobrevivir entre sesiones. Mezclar ambos conceptos en una sola tabla ad-hoc es la causa más común de bugs de "memoria fantasma" que hemos visto en auditorías: información de una conversación filtrándose a otra por reutilizar el mismo `thread_id` para usuarios distintos.
Carlos Montiel es arquitecto de soluciones IA empresarial. Implementa LLMs, Agentes, RAG y orquestadores en empresas de Guatemala y Latinoamérica. Contáctalo para una consultoría.
Contactar a Carlos Montiel