Gestión de historial de mensajes en LangGraph
Clase 5 de 26 • Curso para Crear Agentes de AI con LangGraph
Resumen
Un buen agente conversacional necesita memoria confiable. Aquí verás cómo LangGraph integra el historial en el estado, cómo usar los tipos de mensaje de LangChain y cómo evitar errores comunes en Python al concatenar listas. También conocerás el messages stage para agregar mensajes sin sobrescribir el historial y probarlo en la interfaz de debug.
¿Cómo estructurar el historial de mensajes en LangGraph?
Gestionar el contexto es clave para que la IA responda bien. LangChain ofrece una API de mensajes y LangGraph incorpora el historial como parte del estado compartido. Así, cada nodo conoce la conversación y responde según el rol del mensaje.
¿Qué tipos de mensajes existen y para qué sirven?
- AI message: respuesta de la IA. Importa el rol para que el language model entienda quién habla.
- Human message: mensaje de la persona usuaria.
- System message: instrucciones del system prompt para guiar el modelo.
- Tool message: intercambio con herramientas externas.
- Base message y any message: clases base/agnósticas para tipar listas de mensajes.
Ejemplo mínimo en Python:
# Importar clases de mensajes desde Landchain core (según el proyecto).
from landchain_core.messages import AIMessage, HumanMessage, SystemMessage # nombres referenciales
ai_msg = AIMessage(content="Hola, ¿en qué te ayudo?")
print(ai_msg.text) # Propiedad mencionada para extraer el texto.
human_msg = HumanMessage(content="Hola, soy Nicolás.")
¿Cómo imprimir y depurar el historial con prettyprint?
- Cada mensaje expone un formato legible con prettyprint.
- Útil para inspeccionar rápido el estado de la conversación.
history = [ai_msg, human_msg]
for msg in history:
msg.prettyprint() # Muestra rol y contenido de cada mensaje.
¿Cómo concatenar listas en Python sin errores?
- Usa el operador + entre listas. Siempre listas.
- Evita sumar un elemento suelto. Envuélvelo en una lista.
- Patrón correcto para agregar al historial: lista + [nuevo_mensaje].
history = [human_msg]
new_ai = AIMessage(content="Entendido.")
# Correcto: concatenas listas.
history = history + [new_ai]
# Incorrecto: no puedes sumar un solo objeto directamente.
# history = history + new_ai # Esto daría error.
¿Cómo gestionar el estado compartido con messages stage?
El messages stage de LangGraph estandariza la gestión del historial: concatena nuevos mensajes sin reemplazar la lista existente. Funciona como memoria compartida entre nodos, con un protocolo de agregado eficiente.
¿Cómo definir el estado con la key messages?
- El estado incluye la clave messages con una lista de mensajes.
- Puedes tiparlo con base message o any message, o usar directamente el messages stage para abstraer la lógica de agregado.
- Al retornar, solo envía lo nuevo a concatenar; el messages stage lo agrega al final.
# Importar *messages stage* (según tu estructura de proyecto).
# from langgraf.state import messages_stage # Referencial
from langchain_core.messages import AIMessage
def node_logic(state):
respuesta = AIMessage(content="Hello")
# Solo retorna lo nuevo; el *messages stage* concatena con el historial.
return {
"messages": [respuesta]
}
¿Cómo reaccionar a entradas y agregar respuestas de la IA?
- Lógica ejemplo: si no hay customer name, actualiza esa parte del estado. Si existe, agrega un AI message al historial.
- En la interfaz de debug puedes inyectar mensajes iniciales: human message, AI message, tool, function, chat, etc.
- El messages stage garantiza que siempre recibes un array, así puedes hacer
get("messages")
con confianza.
def simple_node(state):
customer = state.get("customer_name")
if not customer:
# Actualiza solo el nombre del cliente y no toca el historial.
return {"customer_name": "Nicolás Molina"}
# Si ya hay customer name, agrega una respuesta de la IA al historial.
return {
"messages": [AIMessage(content="Hola, ¿en qué más te ayudo?")]
}
- Prueba en debug: si envías un human message inicial (por ejemplo, "Hola, soy Nicolás"), verás que entra al estado y luego la IA concatena su respuesta sin borrar lo anterior.
¿Qué estrategias de contexto y tokens puedes aplicar?
Administrar el historial impacta costos y calidad. Puedes combinar técnicas según el caso.
- Usar un summary del historial con un large language model para comprimir y ahorrar tokens.
- Enviar todo el historial cuando necesites máximo contexto.
- Tomar el primer o el último mensaje si buscas señales específicas.
- Decidir por nodo o por agente qué porción del historial usar.
¿Te gustaría ver más patrones de estado o ejemplos de tool message integrados? Comparte tu caso y continuamos la conversación.