volver al blog

Memoria en agentes: qué recuerda tu LLM y cómo

agentesllmmemoriaarquitectura

El contexto no es memoria

Hay una confusión que se repite en casi todos los proyectos de agentes que reviso: creer que un modelo con ventana de contexto de 200.000 tokens ya “recuerda”. No recuerda. Lo que hace es leer, otra vez, todo lo que le vuelves a pasar en cada llamada. Un LLM es, por defecto, una función pura: mismas entradas, misma salida. No hay estado entre invocaciones.

Esa distinción parece un tecnicismo, pero define la arquitectura entera. Si tratas el contexto como memoria, tu agente se convierte en un chat con amnesia caro: pagas por reenviar la conversación completa en cada turno y, cuando la conversación crece más que la ventana, empieza a olvidar lo del principio sin avisar. La memoria de verdad es otra cosa: decidir qué información sobrevive fuera del contexto y cómo vuelve a entrar cuando hace falta.

Los tres tipos que conviene separar

Cuando hablamos de “memoria” en un agente casi siempre mezclamos tres cosas distintas. Separarlas ayuda a decidir dónde vive cada una.

La memoria de trabajo es lo que cabe en la ventana de contexto ahora mismo: la instrucción de sistema, la tarea actual, los últimos turnos, el resultado de la herramienta que acabas de llamar. Es rápida y precisa, pero volátil y limitada. Todo lo que metes aquí compite por espacio y por atención del modelo.

La memoria a corto plazo es la sesión: el histórico de la conversación en curso. Suele empezar cabiendo en contexto y dejar de caber. Ahí entran las técnicas de resumen progresivo o de ventana deslizante.

La memoria a largo plazo es lo que persiste entre sesiones: preferencias del usuario, hechos aprendidos, decisiones pasadas. Esta vive fuera del modelo —en una base de datos, un almacén vectorial o un simple archivo— y se recupera bajo demanda. Es la que convierte un asistente genérico en uno que sabe quién eres.

Cómo se implementa la de largo plazo

El patrón habitual no tiene misterio: escribes hechos relevantes en un almacén, y antes de cada respuesta recuperas los que vienen a cuento y los inyectas en el contexto. Es RAG, pero aplicado al estado del propio agente en lugar de a una base documental.

# Memoria a largo plazo mínima: guardar hechos y recuperarlos
# por similitud semántica antes de responder.

class AgentMemory:
    def __init__(self, store, embed):
        self.store = store      # almacén vectorial (Qdrant, pgvector...)
        self.embed = embed      # función texto -> vector

    def remember(self, fact: str, user_id: str) -> None:
        # Guardamos el hecho con su embedding y metadatos mínimos.
        self.store.upsert(
            vector=self.embed(fact),
            payload={"text": fact, "user_id": user_id},
        )

    def recall(self, query: str, user_id: str, k: int = 5) -> list[str]:
        # Recuperamos solo los k hechos más relevantes de ESTE usuario.
        hits = self.store.search(
            vector=self.embed(query),
            filter={"user_id": user_id},
            limit=k,
        )
        return [h.payload["text"] for h in hits]


def build_context(memory, user_id, user_msg, history):
    # Los hechos recuperados entran como bloque aparte, no mezclados
    # con la conversación: así el modelo distingue "lo que sé de ti"
    # de "lo que me acabas de decir".
    facts = memory.recall(user_msg, user_id)
    facts_block = "\n".join(f"- {f}" for f in facts)
    return [
        {"role": "system", "content": f"Lo que sabes del usuario:\n{facts_block}"},
        *history[-6:],                       # ventana corta de la sesión
        {"role": "user", "content": user_msg},
    ]

Lo interesante no es el código, es lo que revela: la memoria a largo plazo es un problema de recuperación, no de almacenamiento. Guardar es trivial. El reto es traer justo lo pertinente, del usuario correcto, sin llenar el contexto de ruido.

Ventana larga o memoria externa

La tentación, con modelos que aceptan cientos de miles de tokens, es no montar nada: meterlo todo en contexto y olvidarse. A veces funciona. Pero conviene tener claro el intercambio.

CriterioSolo ventana de contextoMemoria externa
Persistencia entre sesionesNingunaTotal
Coste por turnoCrece con el históricoEstable
Precisión con mucho textoCae (“perdido en el medio”)Alta si recuperas bien
Complejidad de montajeMínimaMedia (almacén + recuperación)
Control sobre qué recuerdaEscasoExplícito

Para una tarea acotada de una sola sesión —resumir un documento, un flujo de soporte que empieza y acaba— la ventana basta y montar memoria externa es sobreingeniería. En cuanto necesitas continuidad entre sesiones, personalización o mantener coste acotado con conversaciones largas, la memoria externa deja de ser opcional.

El problema de verdad: qué olvidar

Casi todo el mundo se centra en cómo guardar. El trabajo real está en qué no guardar y qué descartar. Una memoria que lo retiene todo se degrada igual que un contexto saturado: acumula hechos contradictorios (“prefiere Python” / “ahora usa Go”), datos caducados y detalles irrelevantes que ensucian cada recuperación.

Tres decisiones que marcan la diferencia. Primero, extraer en vez de volcar: no guardes la conversación entera, guarda los hechos destilados (“el usuario despliega en AWS”, no los cuatro mensajes donde se dedujo). Segundo, resolver conflictos al escribir: si un hecho nuevo contradice a uno viejo, actualiza o marca el antiguo como obsoleto en lugar de tener ambos compitiendo. Tercero, caducar lo que envejece: una preferencia puntual de hace seis meses rara vez sigue siendo cierta; ponle fecha y deja que decaiga.

Es la misma disciplina que aplicamos a una base de datos: sin mantenimiento, cualquier almacén se pudre. La memoria de un agente no es una excepción.

Por dónde empezar

Si vas a añadir memoria a un agente, resiste el impulso de montar la infraestructura completa el primer día. Empieza por la pregunta honesta: ¿tu caso necesita continuidad entre sesiones? Si la respuesta es no, quédate con una ventana de contexto bien gestionada y un buen resumen de sesión; te ahorras un sistema entero.

Si la respuesta es sí, monta lo mínimo: un almacén con filtrado por usuario, extracción de hechos al cierre de cada sesión y recuperación de los cinco más relevantes por turno. Mide antes de crecer. La mayoría de los agentes no fallan por tener poca memoria, sino por recordar mal lo poco que guardan. Un agente que recuerda tres cosas ciertas de ti es más útil que uno que recuerda trescientas, la mitad falsas.