Tus agentes olvidan todo al cerrar la sesión. Esta guía te enseña a implementar un sistema de memoria persistente en 3 capas, sin frameworks ni bases de datos complejas.
"Un agente sin memoria es un empleado que empieza desde cero cada lunes."
Si alguna vez construiste un agente de IA que funciona perfecto en la primera sesión pero al día siguiente no recuerda nada de lo que le dijiste, esta guía es para ti.
Los LLMs son stateless por diseño: cada llamada a la API empieza desde cero. El modelo no recuerda quién eres, qué le dijiste ayer, ni qué tareas completó la semana pasada. Desde su perspectiva, cada conversación es la primera.
Esto crea dos problemas distintos que muchas personas confunden. El primero es el límite del contexto dentro de una sesión: cuando la conversación crece demasiado, el modelo empieza a perder información del principio. El segundo es la amnesia entre sesiones: al cerrar la ventana, todo desaparece.
La diferencia que hace la memoria es concreta: sin ella, cada lunes le explicas tu negocio al agente desde cero, vuelves a definir tus preferencias, vuelves a establecer el contexto. Con memoria, el agente abre un archivo y ya sabe todo lo relevante. Sabe tu nombre, tu empresa, tu industria, tus preferencias de formato, las decisiones que tomaste el mes pasado y los patrones que ha aprendido de trabajar contigo.
"Hola, soy asistente de IA. ¿En qué puedo ayudarte hoy?" — cada sesión igual, sin contexto previo, sin personalización.
"Hola María. La semana pasada terminamos el reporte de AgenciaX. Tienes 12 clientes activos. ¿Arrancamos el review del lunes?"
No toda la memoria funciona igual. Hay tres capas distintas con propósitos diferentes. Entenderlas bien es lo que diferencia un sistema de memoria rudimentario de uno que realmente escala.
Piénsalo como los círculos concéntricos de lo que el agente necesita saber: lo inmediato, lo de esta sesión, y lo permanente. Cada capa tiene una velocidad de acceso, un ciclo de vida y un formato distintos.
Memoria activa (Capa 1): Es lo que está en el contexto actual de la conversación. Es la más rápida en acceso, pero es limitada (el contexto del modelo tiene un límite de tokens) y completamente temporal. No necesitas hacer nada especial para gestionarla: simplemente es la lista de mensajes que pasas a la API.
Memoria de sesión (Capa 2): Son las decisiones tomadas, herramientas usadas y resultados obtenidos durante la ejecución actual del agente. Se guarda en un archivo JSON al inicio de la sesión y se actualiza con cada acción. Al terminar la sesión puedes archivarla o descartarla. Su valor: si algo falla a mitad de una tarea larga, puedes reanudar sin repetir pasos.
Memoria largo plazo (Capa 3): Son los hechos permanentes sobre el usuario y su negocio. Se carga al inicio de cada sesión e inyecta en el system prompt. Se actualiza cuando el agente aprende algo nuevo y permanente. Este es el archivo que convierte un agente genérico en un asistente que conoce tu negocio como si llevara años trabajando contigo.
💡 En Expertos AI Builder usamos esto para nuestro agente de onboarding de alumnos: en la primera sesión aprende el nivel, objetivos y disponibilidad del alumno. En las siguientes, siempre arranca exactamente desde donde lo dejaron, sin repetir preguntas.
No necesitas una base de datos. No necesitas un vector store. Para la mayoría de agentes personales o de equipos pequeños, dos archivos JSON son todo lo que necesitas. La estructura de carpetas es simple:
mi-agente/
├── agente.py ← el código del agente
├── memoria/
│ ├── largo_plazo.json ← hechos permanentes
│ └── sesion_actual.json ← log de sesión (se crea al iniciar)
El archivo de memoria largo plazo tiene esta estructura. Está organizado en tres secciones: lo que sabes sobre el usuario, lo que sabes sobre su negocio, y lo que has aprendido en sesiones anteriores:
{
"usuario": {
"nombre": "María",
"empresa": "AgenciaX",
"industria": "Marketing digital",
"preferencias": {
"idioma_codigo": "español",
"formato_reportes": "markdown",
"modelo_favorito": "claude-sonnet-4-6"
}
},
"negocio": {
"clientes_activos": 12,
"herramientas_usadas": ["Notion", "HubSpot", "Zapier"],
"objetivos_2026": "Escalar a 25 clientes sin contratar más staff"
},
"aprendido": [
"Prefiere reportes cortos, máximo 1 página",
"No usar jerga técnica en entregables para clientes",
"Los lunes hace review semanal"
]
}
Y aquí está el código Python para leer, escribir y gestionar las dos capas de memoria. Guarda este archivo como memory_utils.py en la carpeta del agente:
import json
import os
from datetime import datetime
import json
import os
from datetime import datetime
# Ruta base para todos los archivos de memoria
MEMORIA_DIR = "memoria"
def cargar_memoria(tipo: str) -> dict:
"""Carga un archivo de memoria por tipo: 'activa', 'sesion', 'largo_plazo'"""
ruta = os.path.join(MEMORIA_DIR, f"{tipo}.json")
# Si el archivo no existe, retornar estructura vacía
if not os.path.exists(ruta):
return {"hechos": [], "preferencias": {}, "ultima_actualizacion": None}
with open(ruta, "r", encoding="utf-8") as f:
return json.load(f) # Leer y parsear el JSON
def guardar_memoria(tipo: str, datos: dict) -> None:
"""Guarda el estado actual de la memoria en disco"""
os.makedirs(MEMORIA_DIR, exist_ok=True) # Crear carpeta si no existe
ruta = os.path.join(MEMORIA_DIR, f"{tipo}.json")
# Actualizar timestamp antes de guardar
datos["ultima_actualizacion"] = datetime.now().isoformat()
with open(ruta, "w", encoding="utf-8") as f:
json.dump(datos, f, ensure_ascii=False, indent=2) # Guardar con formato legible
def agregar_hecho(hecho: str, tipo: str = "largo_plazo") -> None:
"""Agrega un hecho nuevo a la memoria del tipo especificado"""
memoria = cargar_memoria(tipo)
# Evitar duplicados exactos
if hecho not in memoria["hechos"]:
memoria["hechos"].append(hecho)
guardar_memoria(tipo, memoria)
print(f"✓ Hecho guardado en memoria {tipo}: {hecho}")
def cargar_memoria_largo_plazo(ruta="memoria/largo_plazo.json"):
"""Carga la memoria permanente al inicio de cada sesión."""
if os.path.exists(ruta):
with open(ruta, "r", encoding="utf-8") as f:
return json.load(f) # Retornar el dict completo con usuario, negocio y aprendido
return {"usuario": {}, "negocio": {}, "aprendido": []} # Estructura vacía si no existe
def actualizar_memoria(memoria, nueva_info, ruta="memoria/largo_plazo.json"):
"""Guarda nueva información permanente aprendida durante la sesión."""
if "aprendido" not in memoria:
memoria["aprendido"] = [] # Inicializar lista si no existe
memoria["aprendido"].append({
"fecha": datetime.now().strftime("%Y-%m-%d"), # Fecha en formato ISO
"hecho": nueva_info
})
os.makedirs("memoria", exist_ok=True) # Crear carpeta si no existe
with open(ruta, "w", encoding="utf-8") as f:
json.dump(memoria, f, ensure_ascii=False, indent=2) # Guardar con indentación legible
def iniciar_sesion(objetivo):
"""Crea un log de sesión nuevo al arrancar el agente."""
sesion = {
"inicio": datetime.now().isoformat(), # Timestamp de inicio
"objetivo": objetivo,
"pasos": [] # Lista vacía que se irá llenando con cada acción
}
os.makedirs("memoria", exist_ok=True)
with open("memoria/sesion_actual.json", "w", encoding="utf-8") as f:
json.dump(sesion, f, ensure_ascii=False, indent=2)
return sesion
def registrar_paso(accion, resultado):
"""Registra cada paso del agente en el log de sesión para poder reanudar si falla."""
ruta = "memoria/sesion_actual.json"
if os.path.exists(ruta):
with open(ruta, "r", encoding="utf-8") as f:
sesion = json.load(f)
sesion["pasos"].append({
"timestamp": datetime.now().isoformat(),
"accion": accion,
"resultado": resultado[:200] # Solo primeros 200 chars para no inflar el archivo
})
with open(ruta, "w", encoding="utf-8") as f:
json.dump(sesion, f, ensure_ascii=False, indent=2)
La pieza clave es el system prompt. En lugar de un prompt genérico, construyes un system prompt dinámico que incluye todo lo que está en la memoria largo plazo. El modelo recibe ese contexto al inicio de cada sesión y actúa como si ya conociera a la persona.
Hay un truco adicional: puedes hacer que el propio modelo detecte cuándo aprende algo nuevo y permanente, y que lo señale explícitamente con un prefijo especial. Tu código detecta ese prefijo y guarda el hecho en la memoria automáticamente:
import anthropic
import json
import re
from memory_utils import cargar_memoria_largo_plazo, iniciar_sesion, registrar_paso, actualizar_memoria
def construir_system_prompt(memoria):
"""Construye el prompt de sistema con la memoria cargada."""
usuario = memoria.get("usuario", {})
negocio = memoria.get("negocio", {})
aprendido = memoria.get("aprendido", [])
hechos = "\n".join([f"- {h}" if isinstance(h, str) else f"- {h.get('hecho', h)}"
for h in aprendido[-10:]]) # últimos 10 hechos
return f"""Eres un asistente especializado para {usuario.get('nombre', 'el usuario')}.
CONTEXTO DEL NEGOCIO:
- Empresa: {negocio.get('empresa', 'no especificada')}
- Industria: {negocio.get('industria', 'no especificada')}
- Herramientas: {', '.join(negocio.get('herramientas_usadas', []))}
LO QUE YA SABES DE SESIONES ANTERIORES:
{hechos if hechos else 'Primera sesión — sin historial previo'}
PREFERENCIAS DEL USUARIO:
{json.dumps(usuario.get('preferencias', {}), ensure_ascii=False, indent=2)}
Si durante esta sesión aprendes algo nuevo y permanente sobre el usuario o su negocio,
indícalo con el prefijo: [MEMORIZAR: hecho_aprendido]
"""
def correr_agente_con_memoria(objetivo):
memoria = cargar_memoria_largo_plazo()
sesion = iniciar_sesion(objetivo)
system_prompt = construir_system_prompt(memoria)
client = anthropic.Anthropic()
mensajes = [{"role": "user", "content": objetivo}]
respuesta = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=4096,
system=system_prompt, # ← memoria inyectada aquí
tools=tools,
messages=mensajes
)
# Detectar nuevos hechos a memorizar
for bloque in respuesta.content:
if hasattr(bloque, 'text') and '[MEMORIZAR:' in bloque.text:
hechos = re.findall(r'\[MEMORIZAR: (.+?)\]', bloque.text)
for hecho in hechos:
actualizar_memoria(memoria, hecho)
print(f" 💾 Memorizado: {hecho}")
return respuesta
El patrón más poderoso es el onboarding en la primera sesión. En lugar de configurar la memoria manualmente, dejas que el agente extraiga y memorice la información por sí solo. Así funciona en la práctica:
El usuario describe su negocio completo. El agente extrae hechos clave, los señala con [MEMORIZAR: ...] y el código los guarda en largo_plazo.json. Al final de la sesión el archivo tiene 15-20 hechos estructurados.
El agente empieza ya sabiendo quién eres, qué haces, cuántos clientes tienes, qué herramientas usas y cuáles son tus preferencias. No necesitas repetir nada. El foco está en la tarea del día.
Usa este prompt copiable para tu primera sesión de onboarding. Cuanto más detallado seas, mejor trabajará el agente en todas las sesiones futuras:
Esta es nuestra primera sesión. Voy a darte información sobre mi negocio.
Quiero que la memorices toda usando el prefijo [MEMORIZAR: hecho].
Mi negocio: [DESCRIPCIÓN COMPLETA]
Mis clientes ideales: [DESCRIPCIÓN]
Mis herramientas habituales: [LISTA]
Mi forma de trabajar: [HORARIOS, PREFERENCIAS, RESTRICCIONES]
Cosas que NUNCA debes hacer: [LISTA]
Mi mayor objetivo este año: [OBJETIVO]
Confirma cada hecho que memorices.
Ejemplo de resultado
Entendido. He guardado tu perfil: eres consultor de marketing digital, trabajas principalmente con PyMEs de e-commerce, prefieres respuestas directas sin rodeos, y tu zona horaria es GMT-3. A partir de ahora recordaré este contexto en cada sesión.
🏢 Si tienes una agencia
Cada cliente tiene su propio archivo de memoria largo_plazo.json con su brief, tono, restricciones y historial de decisiones. El agente nunca olvida el contexto del cliente entre sesiones.
🛍️ Si vendes productos o servicios
La memoria de sesión guarda el carrito, las preferencias y las objeciones expresadas por cada usuario. El agente de ventas retoma la conversación exactamente donde la dejó, aunque sea días después.
🎬 Si eres creador de contenido
Guarda en memoria tu estilo, tus temas recurrentes y el rendimiento histórico de tu contenido. El agente aprende qué funciona para tu audiencia y mejora sus sugerencias con el tiempo.
En la comunidad Expertos AI Builder tienes el workshop completo en video, plantillas listas y soporte directo para implementarlo en tu negocio.
Ver la comunidad →Ya dominaste esto. El siguiente paso: