
Memoria de IA agéntica con decaimiento de la curva de olvido de Ebbinghaus. +16 pp mejor recuperación que Mem0 en LoCoMo.

Memoria persistente y auto-mejorable para agentes de IA, construida sobre la ciencia de cómo recuerdan los humanos.
▶ Prueba la demo interactiva en vivo · Sitio web · Evaluaciones comparativas
Cada mañana tu agente de IA te trata como a un extraño. El mismo contexto reexplicado. Las mismas preferencias olvidadas. Cada sesión empieza desde cero.
La mayoría de las herramientas de "memoria" pegan una base de datos vectorial a un agente y lo llaman listo — pero eso es solo almacenamiento. Acapara cada casi-duplicado hasta que la recuperación se ahoga en ruido. Un pez dorado con una pecera más grande.
YourMemory es diferente: memoria que funciona como un cerebro, no como una base de datos.
flowchart LR
A["🧠 Le dices algo<br/>a tu IA"] --> B["Extraer hechos<br/>duraderos"]
B --> C["Dedup + incrustar<br/>+ enlazar grafo"]
C --> D[("Almacén de<br/>memoria")]
D -->|"los hechos relacionados se acumulan"| E["✨ Consolidar<br/>N → 1 resumen"]
D -->|"obsoleto + no usado"| F["📉 Decaimiento<br/>+ poda"]
D -->|"nueva sesión"| G["♻️ Recuperación<br/>híbrida + grafo"]
E --> D
G --> H["🤖 Tu agente<br/>retoma donde<br/>lo dejó"]
style D fill:#0a2540,stroke:#19cdff,color:#fff
style E fill:#0c2b3a,stroke:#5eead4,color:#fff
style H fill:#0c2b3a,stroke:#19cdff,color:#fffUn comando para instalar. DuckDB por defecto (cero configuración), Postgres + pgvector para equipos.
Tres conjuntos de datos externos. Cada número reproducible de forma independiente — el código de evaluación vive en el repositorio. Metodología completa en BENCHMARKS.md.
xychart-beta
title "Recall@5 · LoCoMo-10 (mayor es mejor)"
x-axis ["Mem0", "Zep Cloud", "Supermemory", "YourMemory"]
y-axis "Recall@5 percent" 0 --> 70
bar [18, 28, 31, 59]2× mejor recall que Zep Cloud en las 10 muestras. *Supermemory y Mem0 agotaron las cuotas del nivel gratuito a mitad de la evaluación; puntuaciones calculadas sobre los 1.534 pares completos.
El benchmark estándar más difícil para memoria a largo plazo. Cada pregunta está enterrada en ~53 sesiones.
| Métrica | Puntuación |
|---|---|
| Recall@5 (cualquier sesión correcta en top-5) | 89.4% |
| Recall-all@5 (todas las sesiones correctas en top-5) | 84.8% |
| nDCG@5 (calidad de ranking) | 87.4% |
| Sistema | BOTH_FOUND@5 |
|---|---|
| YourMemory (vector + BM25 + grafo de entidades) | 71.5% |
| YourMemory (sin aristas de entidad) | 59.5% |
Las aristas del grafo de entidades añaden +12 pp — se desplazan del Hecho 1 al Hecho 2 incluso cuando el Hecho 2 tiene baja similitud de incrustación con la consulta.
Artículo: Construí decaimiento de memoria para agentes de IA usando la curva de olvido de Ebbinghaus
Python 3.11–3.14. Sin Docker, sin configuración de base de datos. Toda la memoria almacenada localmente en ~/.yourmemory/.
pip install yourmemory
yourmemory-register <tu-token>
yourmemory-setup
Obtén tu token: visita yourmemoryai.xyz → ingresa tu correo → verifica con un código de 6 dígitos → copia tu token.
yourmemory-setup detecta y configura automáticamente Claude Code, Claude Desktop, Cursor, Windsurf y Cline, luego pregunta qué backend usar:
DATABASE_URL (necesita la extensión pgvector)Opcional — extracción local más inteligente: YourMemory funciona de inmediato con heurísticas integradas. Para una extracción de hechos de mayor calidad y completamente local, instala Ollama y
yourmemory-setupdescarga el modelo (qwen2.5:7b, ~4.7 GB) automáticamente. ¿Prefieres la nube? ConfiguraYOURMEMORY_EXTRACT_BACKEND=anthropic.
¿Prefieres no tocar pip? Obtén el binario independiente para tu plataforma desde la última versión:
| Plataforma | Archivo |
|---|---|
| macOS (Apple Silicon) | yourmemory-macos-arm64.tar.gz |
| macOS (Intel) | yourmemory-macos-x86_64.tar.gz |
# macOS / Linux — descarga, extrae, ejecuta
tar -xzf yourmemory-macos-arm64.tar.gz
./yourmemory-macos-arm64 register <tu-token>
./yourmemory-macos-arm64 setup
./yourmemory-macos-arm64 # inicia el servidor
Un solo ejecutable maneja cada comando: register, setup, ask "<pregunta>", path, y (sin argumentos) inicia el servidor.
Completamente autónomo y sin conexión — el binario incluye Python, cada dependencia y ambos modelos de ML (el modelo de incrustación + spaCy). No se descarga nada en la primera ejecución. La contrapartida es el tamaño (~2 GB). Construye el tuyo propio con un solo comando — ./build-binary.sh — y los binarios de lanzamiento multi-plataforma se producen automáticamente por el flujo de trabajo de compilación.
YourMemory trata la memoria como un sistema vivo — crece, se consolida, olvida y conecta, como lo hace un cerebro.
La mayoría de las herramientas de memoria solo siguen creciendo. YourMemory observa grupos de hechos relacionados y, una vez que se acumulan suficientes, los comprime en un solo resumen limpio — archivando los originales (nunca los elimina, así que nada se pierde).
flowchart LR
subgraph before [Los hechos relacionados se acumulan]
A1["Railway usa Nixpacks"]
A2["Railway en plan Pro"]
A3["Las variables de entorno de Railway<br/>contienen la URL de Postgres"]
A4["Despliega en Railway<br/>con Postgres"]
end
before --> C{"agrupar +<br/>resumir con LLM"}
C --> S["✨ Resumen<br/>Despliega en Railway (Pro,<br/>Nixpacks) con Postgres<br/>mediante variables de entorno"]
C -.->|"archivado, recuperable"| ARC[("archivo")]
style S fill:#0a2540,stroke:#5eead4,color:#fff
style C fill:#0c2b3a,stroke:#19cdff,color:#fffEjemplo real de un almacén en producción: 444 recuerdos → 16 resúmenes — mismo conocimiento, una fracción del ruido. La consolidación es impulsada por eventos (se activa cuando los recuerdos relacionados se acumulan), no un trabajo nocturno ciego.
La fuerza de la memoria decae exponencialmente. La importancia y la frecuencia de recuerdo ralentizan ese decaimiento:
effective_λ = base_λ × (1 − importance × 0.8)
strength = clamp(importance × e^(−effective_λ × active_days) × (1 + recall_count × 0.2), 0, 1)
active_days solo cuenta los días en que estuviste activo — las vacaciones no causan pérdida de memoria. Las memorias por debajo de fuerza 0.05 se podan automáticamente. Cada categoría envejece a su propio ritmo:
Poda consciente del grafo: una memoria decaída se mantiene viva si algún vecino del grafo aún es fuerte — el contexto de soporte sobrevive incluso cuando se consulta raramente de forma directa.
La recuperación se realiza en dos rondas para que surja tanto lo que pediste como lo que olvidaste pedir:
flowchart LR
Q["consulta"] --> R1["Búsqueda híbrida<br/>Vector + BM25"]
R1 --> R2["Expansión de grafo<br/>(lo que olvidaste pedir)"]
R2 --> S["ordenar por<br/>similitud × fuerza"]
S --> OUT["🎯 Recuerdos ordenados"]
style OUT fill:#0a2540,stroke:#19cdff,color:#fffLa deduplicación consciente del sujeto se ejecuta antes de cada almacenamiento — incrusta el sujeto de cada oración para que "Sachit usa DuckDB" y "YourMemory usa DuckDB" permanezcan separados (diferentes entidades), mientras que "YourMemory usa DuckDB" y "YourMemory almacena datos en DuckDB" se fusionan (misma entidad). Sin listas de palabras fijas; se generaliza a cualquier idioma.
Las empresas no permitirán que una caja negra opaca almacene sus datos. Por eso cada operación — lectura, escritura, actualización, eliminación, consolidación — se añade a un registro de auditoría encadenado por hash y a prueba de manipulaciones.
flowchart LR
E0["GÉNESIS"] --> E1
subgraph E1 [Evento 1]
H1["row_hash =<br/>sha256(prev + data)"]
end
E1 --> E2
subgraph E2 [Evento 2]
H2["row_hash =<br/>sha256(#1.hash + data)"]
end
E2 --> E3
subgraph E3 [Evento 3]
H3["row_hash =<br/>sha256(#2.hash + data)"]
end
E3 --> V{"GET /audit/verify"}
V -->|cadena intacta| OK["✅ verificado"]
V -->|cualquier fila alterada| BAD["❌ la cadena se rompe<br/>en esa fila"]
style OK fill:#0a2540,stroke:#5eead4,color:#fff
style BAD fill:#3a0c14,stroke:#fb7185,color:#fffCada fila registra la marca de tiempo, el usuario + agente actor, la acción, la operación, la memoria objetivo, la fuente (http vs mcp) y el hash de la fila anterior. Cambia cualquier registro histórico y verify_chain() señala exactamente dónde se rompió la cadena.
GET /audit # navegar por el registro (filtrar por usuario / acción / operación)
GET /audit/verify # verificar criptográficamente que la cadena no ha sido manipulada
POST /audit/prune # limpieza basada en retención (mínimo 90 días, nunca menos)
El registro de auditoría es fail-open — nunca bloquea una operación de memoria — y los eventos de lectura/listado del bucle de renderizado del panel están excluidos, para que el registro contenga señal, no ruido.
Dale a los agentes de todo un equipo un cerebro compartido — sin filtrar el contexto privado de nadie. Los recuerdos son compartidos (visibles para el pool) o privados (visibles solo para su dueño).
flowchart TB
P(("🧠 Pool del Equipo<br/>memoria compartida"))
A["Agente de Alicia"] <-->|compartido| P
B["Agente de Bob"] <-->|compartido| P
C["Agente de Carol"] <-->|compartido| P
A -. privado .-> AP["🔒 Solo Alicia"]
B -. privado .-> BP["🔒 Solo Bob"]
style P fill:#0a2540,stroke:#19cdff,color:#fff
style AP fill:#0c1424,stroke:#5a6b80,color:#8294a8
style BP fill:#0c1424,stroke:#5a6b80,color:#8294a8El acceso basado en roles se aplica por agente — lo que aprende el agente de un ingeniero, todo el equipo se beneficia de inmediato; el contexto sensible permanece limitado a su dueño.
POST /pools # crear un pool
POST /pools/{id}/members # añadir un miembro (con rol)
POST /pools/{id}/memories # contribuir con una memoria compartida
POST /pools/{id}/retrieve # recuperar en todo el pool
Porque la memoria que almacena datos reales necesita los controles para ser confiable:
Combinado con la pista de auditoría encadenada por hash y el mínimo de 90 días de retención, esto se asigna directamente a los controles documentados en SECURITY.md (alineado con SOC 2).
Dos interfaces de usuario integradas en el navegador — sin configuración adicional, se inician automáticamente con el servidor.
http://localhost:3033/uiUna vista completa de lectura/escritura con pestañas Memorias · Auditoría · Pools: barra de estadísticas (Fuerte / Desvaneciéndose / Cerca de poda), pestañas por agente, tarjetas de memoria con barras de fuerza en vivo, filtros por categoría, el registro de auditoría y gestión de pools.
http://localhost:3033/graphUn mapa interactivo basado en fuerzas de cómo se conectan los recuerdos — memoria raíz como un nodo brillante, vecinos codificados por colores según la categoría, grosor de arista = fuerza de conexión. Arrastra, acerca y haz clic en cualquier nodo para ver el contenido completo.
http://localhost:3033/graph?memoryId=42&userId=alex&depth=2
Tres herramientas, llamadas por tu IA automáticamente.
# Almacenar con contexto espacial
store_memory(
"Alex prefiere tabs sobre espacios en Python",
importance=0.9, category="fact",
context_paths=["/projects/backend"],
)
# Próxima sesión — el refuerzo espacial se activa al trabajar en ese directorio
recall_memory("formato Python", current_path="/projects/backend")
# → {"content": "Alex prefiere tabs sobre espacios en Python", "strength": 0.87}
El único sistema de memoria que puede responder preguntas sin hacer ninguna llamada a la API de un LLM:
yourmemory ask "qué base de datos usa este proyecto"
# → YourMemory usa DuckDB localmente y Postgres en producción.
yourmemory ask "cómo arreglo un despliegue de kubernetes"
# → No hay suficiente contexto de memoria para responder sin un LLM.
Cuando la memoria es lo suficientemente fuerte, responde al instante — cero tokens, cero coste de nube, cero latencia. Cuando no lo es, declina limpiamente en lugar de alucinar. Tu consulta nunca sale de tu máquina.
Las herramientas MCP se llaman a discreción de la IA. El proxy de API elimina esa incertidumbre — intercepta cada llamada al LLM, inyecta recuerdos relevantes automáticamente y maneja store_memory / update_memory sin configuración de modelo.
Inicia el servidor (yourmemory), luego apunta tu cliente a localhost:3033:
from anthropic import Anthropic
client = Anthropic(
api_key="sk-ant-...",
base_url="http://localhost:3033/proxy/anthropic",
default_headers={"X-YourMemory-User": "alex"}, # memoria por usuario
)
# La memoria se inyecta automáticamente — no se necesitan otros cambios
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
messages=[{"role": "user", "content": "¿Qué base de datos uso?"}],
)
OpenAI funciona de manera idéntica mediante base_url="http://localhost:3033/proxy/openai".
flowchart LR
C["Tu cliente de IA<br/>Claude · Cursor · cualquier MCP"] <--> Y["🧠 YourMemory"]
Y --> M[("Almacén de<br/>memoria")]
Y --> A[("Libro contable<br/>de auditoría")]
style Y fill:#0a2540,stroke:#19cdff,color:#fff
style M fill:#0c1a2c,stroke:#5eead4,color:#fff
style A fill:#0c1a2c,stroke:#5eead4,color:#fffLas escrituras se cuelgan / agotan el tiempo de espera (bloqueo de escritor único de DuckDB). Si tanto el servidor MCP como el servidor HTTP se ejecutan a la vez, compiten por el bloqueo de escritura de DuckDB. Solución:
pkill -f yourmemory 2>/dev/null || true
rm -f ~/.yourmemory/memories.duckdb.wal ~/.yourmemory/memories.duckdb.lock 2>/dev/null || true
# reinicia tu cliente
¿Ejecutas Claude Desktop (MCP) y Claude Code (hooks) simultáneamente? Usa SQLite en su lugar — maneja lectores/escritores concurrentes limpiamente:
DATABASE_URL=sqlite:///~/.yourmemory/memories.db
Las PRs son bienvenidas — consulta CONTRIBUTORS.md.
Copyright 2026 Sachit Misra — Licenciado bajo CC-BY-NC-4.0.
Gratuito para uso personal, educativo, investigación académica y proyectos de código abierto. Uso comercial requiere un acuerdo por escrito separado → [email protected]
pip install yourmemory| Característica | Qué hace |
|---|
| 🧠 | Consolidación | Cuando se acumulan suficientes hechos relacionados, se comprimen en un resumen limpio y los originales se archivan. La memoria se vuelve más nítida con el tiempo, no más hinchada. |
| 📉 | Decaimiento biológico | Cada memoria envejece según una curva de olvido de Ebbinghaus. Los hechos obsoletos y no usados se desvanecen; los importantes y recordados con frecuencia persisten. |
| 🔗 | Grafo de entidades | Los recuerdos se enlazan por personas, lugares y conceptos compartidos — así la recuperación saca a la luz lo que olvidaste pedir. |
| ♻️ | Sobrevive a reinicios de contexto | Cuando la ventana de contexto se compacta, YourMemory devuelve el contexto de trabajo — sin necesidad de releer archivos para saber dónde estabas. |
| 🔒 | Pista de auditoría a prueba de manipulaciones | Cada lectura/escritura/eliminación se registra en un libro contable encadenado por hash. Altera un registro y la cadena se rompe. |
| 👥 | Pools de memoria de equipo | Memoria compartida basada en roles, para que los agentes de todo un equipo se basen en el mismo conocimiento institucional — con recuerdos privados mantenidos en privado. |
| 🛡️ | Derechos de datos integrados | Exportación con un solo comando (derecho de acceso) y derecho al olvido (purga), además de controles alineados con SOC 2. |
| 🔌 | Nativo MCP y local-first | Funciona con Claude, Cursor, Cline, Windsurf o cualquier cliente MCP. Se ejecuta completamente en tu máquina — sin clave API, nada sale de tu sistema. |
| Linux (x86-64) | yourmemory-linux-x86_64.tar.gz |
| Windows (x86-64) | yourmemory-windows-x86_64.exe.zip |
| Categoría | Vida media | Mejor para |
|---|
estrategia | ~38 días | Patrones que funcionaron, decisiones arquitectónicas |
hecho | ~24 días | Preferencias, identidad, conocimiento estable |
suposición | ~19 días | Contexto inferido, creencias inciertas |
fallo | ~11 días | Errores, enfoques incorrectos, problemas específicos del entorno |
| Derecho | Endpoint | Qué hace |
|---|
| Acceso (exportación DSAR) | GET /users/{id}/export | Exportación completa de todo lo almacenado para un usuario |
| Supresión (derecho al olvido) | DELETE /users/{id}/memories | Purga con un solo comando de los recuerdos de un usuario |
| Portabilidad | POST /users/{id}/import | Reimportar una exportación anterior |
| Recuperabilidad | GET /users/{id}/archive | Recuperar originales consolidados |
| Herramienta | Cuando tu IA la llama | Qué hace |
|---|
recall_memory(query, current_path?) | Al inicio de cada tarea | Recupera recuerdos ordenados por similitud × fuerza de decaimiento; refuerzo espacial para recuerdos que coinciden con la ruta |
store_memory(content, importance, category?, context_paths?) | Después de aprender algo nuevo | Incrusta, deduplica, almacena con decaimiento; etiqueta rutas de archivo/directorio opcionales |
update_memory(id, new_content, importance) | Cuando un hecho almacenado está desactualizado | Reincrusta y reemplaza; registra el cambio en la pista de auditoría |
| Componente | Rol |
|---|
| DuckDB | Almacén vectorial por defecto — cero configuración, similitud coseno nativa |
| PostgreSQL + pgvector | Opcional — para equipos o grandes conjuntos de datos |
| NetworkX | Backend de grafo por defecto (~/.yourmemory/graph.pkl) |
| Neo4j | Backend de grafo opcional |
| sentence-transformers | Incrustaciones locales (multi-qa-mpnet-base-dot-v1, 768 dims) |
| spaCy | PLN local para deduplicación y extracción de entidades |
| APScheduler | Decaimiento + poda automáticos |