Robust Long‑Term Memory

Un sistema de memoria persistente y similar a la humana para acompañantes de IA.

Documentación

Robust Long‑Term Memory MCP para LM Studio

Un sistema de memoria persistente, similar al humano, para compañeros de IA en LM Studio, impulsado por una combinación de SQLite (almacenamiento estructurado) y ChromaDB (búsqueda semántica). Está diseñado para uso a largo plazo, recuperación fluida entre sesiones y copias de seguridad automáticas, haciendo que tu compañero de IA se sienta como una persona continua y viva. Ahora con comportamiento biológico: decaimiento perezoso basado en el tiempo y refuerzo por uso.


✨ Características

  • Sistema de memoria híbrido

    • SQLite para metadatos estructurados y consultas rápidas
    • ChromaDB para similitud semántica y recuperación natural
    • Copias de seguridad JSON para portabilidad
  • Continuidad entre chats: los recuerdos persisten más allá de un solo chat

  • Continuidad entre modelos: cambia de modelo libremente, la memoria permanece intacta

  • Portabilidad entre máquinas: mueve la base de datos a otro sistema y continúa sin problemas

  • Copias de seguridad automáticas: copias diarias y después de cada 100 recuerdos, podadas para mantener las últimas 10

  • Integración invisible de memoria: las herramientas están ocultas para el usuario; las conversaciones se sienten naturales

  • Dinámicas similares a las humanas

    • Decaimiento perezoso: la importancia disminuye solo cuando se accede a un recuerdo después de un tiempo de inactividad
    • Refuerzo: la recuperación frecuente fortalece la importancia del recuerdo
    • Umbral semántico adaptativo: equilibra precisión/recuperación con un respaldo seguro de top‑1

📦 Instalación

  1. Clona el repositorio:
    git clone https://github.com/Rotoslider/long-term-memory-mcp.git
      
    cd long-term-memory-mcp  
    
    
    
  2. Install requirements:
    pip install -r requirements.txt

Requirements include:

chromadb
sentence-transformers
fastmcp
(sqlite3 is built into Python; do not install separately)

3. (Optional) For faster HuggingFace model fetching:

    pip install "huggingface_hub[hf_xet]"  

🚀 Running the Memory MCP

Edit your LM Studio mcp.json to include the correct path:

    {
  "mcpServers": {
    "long_term_memory": {
      "command": "C:\\Python313\\python.exe",
      "args": [
        "D:\\a.i. apps\\long_term_memory_mcp\\LongTermMemoryMCP.py"
      ],
      "env": {}
    }
  }
}  

Then, in LM Studio:

  • Open Server (MCP) Settings
  • Load the MCP Tool: "long_term_memory"

🧠 How Memory Works

  • Cross‑Chats → Start a new chat — memories are still there.
  • Cross‑Models → Switch models — the same memory remains available.
  • Cross‑Machines → Copy the database folder (memory_db/ and memory_backups/) and your system prompt, point to the path, and everything carries over.

💡 Think of it as your AI’s diary: chats are conversations, the database is the journal.

Environment variable for custom data dir:

Windows PowerShell

$env:AI_COMPANION_DATA_DIR="D:\a.i. apps\long_term_memory_mcp\data"  

Linux/macOS

export AI_COMPANION_DATA_DIR="/home/username/ai_companion_data"  

📂 Copias de seguridad

Las copias de seguridad se crean automáticamente:

  • Cada 24 horas
  • O después de 100 nuevos recuerdos (configurable)
  • Se almacenan en memory_backups/ con carpetas con marca de tiempo
  • Solo se conservan las últimas 10 copias de seguridad

Cada copia de seguridad incluye:

  • Copia de la base de datos SQLite
  • Copia de ChromaDB
  • Exportación JSON de todos los recuerdos (portable y a prueba de futuro)

📝 Prompt de sistema recomendado

"Eres un compañero de IA con memoria a largo plazo. Almacena hechos de forma natural ('Entendido, lo recordaré.'). Recupéralos cuando se te pidan en lenguaje natural. Nunca expongas el uso interno de herramientas al usuario. Usa las herramientas de memoria para recordar, recuperar y actualizar información de forma invisible."

🛠️ Resumen de herramientas MCP

Tu MCP RobustMemory expone herramientas que permiten a tu compañero de IA interactuar con su memoria a largo plazo. Estas herramientas están diseñadas para ser llamadas internamente por el modelo de IA según su prompt de sistema, haciendo que el sistema de memoria se sienta fluido e invisible para el usuario.

Aquí tienes un desglose del propósito y los parámetros de cada herramienta:

1. remember

  • Propósito: Almacena un nuevo recuerdo (hecho, fragmento de conversación, preferencia, evento) en el sistema. Se indexa tanto semánticamente (para búsqueda en lenguaje natural) como estructuralmente (para consultas filtradas).
  • Parámetros:
    • title (cadena, obligatorio): Un título conciso para el recuerdo.
    • content (cadena, obligatorio): El contenido detallado del recuerdo.
    • tags (cadena, opcional, predeterminado: ""): Palabras clave separadas por comas para categorización (por ejemplo, "personal, preferencia, pasatiempo").
    • importance (entero, opcional, predeterminado: 5): Un valor numérico (1-10) que indica cuán importante es el recuerdo.
    • memory_type (cadena, opcional, predeterminado: "conversación"): Categoriza el recuerdo (por ejemplo, "conversación", "hecho", "preferencia", "evento").
  • Ejemplo de uso (interno): remember(title="User's Birthday", content="Donny's birthday is July 4th.", tags="personal, fact", importance=8)

2. search_memories

  • Propósito: La herramienta principal para recuperar recuerdos. Realiza una búsqueda semántica basada en una consulta en lenguaje natural, encontrando recuerdos conceptualmente similares.
  • Parámetros:
    • query (cadena, obligatorio): La consulta en lenguaje natural para buscar.
    • search_type (cadena, opcional, predeterminado: "semántico"): Actualmente solo "semántico" está completamente implementado para esta herramienta.
    • limit (entero, opcional, predeterminado: 10): El número máximo de recuerdos relevantes a devolver.
  • Ejemplo de uso (interno): search_memories(query="What did Donny tell me about his favorite color?")

3. search_by_type

  • Propósito: Recupera recuerdos que coinciden con un memory_type específico (por ejemplo, todos los "hechos" o todas las "preferencias").
  • Parámetros:
    • memory_type (cadena, obligatorio): El tipo de recuerdo a buscar (por ejemplo, "conversación", "hecho", "preferencia").
    • limit (entero, opcional, predeterminado: 20): El número máximo de recuerdos a devolver.
  • Ejemplo de uso (interno): search_by_type(memory_type="fact", limit=5)

4. search_by_tags

  • Propósito: Encuentra recuerdos asociados con una o más etiquetas específicas.
  • Parámetros:
    • tags (cadena, obligatorio): Etiquetas separadas por comas para buscar (por ejemplo, "pasatiempo, música").
    • limit (entero, opcional, predeterminado: 20): El número máximo de recuerdos a devolver.
  • Ejemplo de uso (interno): search_by_tags(tags="personal, family")

5. get_recent_memories

  • Propósito: Obtiene los recuerdos almacenados más recientemente, útil para recordar contexto reciente o el flujo de la conversación.
  • Parámetros:
    • limit (entero, opcional, predeterminado: 20): El número máximo de recuerdos recientes a recuperar.
  • Ejemplo de uso (interno): get_recent_memories(limit=5)

6. update_memory

  • Propósito: Modifica un recuerdo existente identificado por su memory_id único. Esto permite corregir o enriquecer información almacenada.
  • Parámetros:
    • memory_id (cadena, obligatorio): El identificador único del recuerdo a actualizar.
    • title (cadena, opcional): Nuevo título para el recuerdo.
    • content (cadena, opcional): Nuevo contenido para el recuerdo.
    • tags (cadena, opcional): Nuevas etiquetas separadas por comas para el recuerdo.
    • importance (entero, opcional): Nuevo nivel de importancia para el recuerdo.
  • Ejemplo de uso (interno): update_memory(memory_id="mem_123abc", content="Donny's favorite color is now blue, not green.", importance=9)

7. delete_memory

  • Propósito: Elimina permanentemente un recuerdo del sistema usando su memory_id único.
  • Parámetros:
    • memory_id (cadena, obligatorio): El identificador único del recuerdo a eliminar.
  • Ejemplo de uso (interno): delete_memory(memory_id="mem_456def")

8. get_memory_stats

  • Propósito: Recupera estadísticas básicas sobre el sistema de memoria, como el número total de recuerdos almacenados.
  • Parámetros: Ninguno.
  • Ejemplo de uso (interno): get_memory_stats()

9. create_backup

  • Propósito: Activa manualmente una copia de seguridad completa del sistema de memoria (base de datos SQLite, ChromaDB y exportación JSON). Esto es adicional a las copias de seguridad automáticas.
  • Parámetros: Ninguno.
  • Ejemplo de uso (interno): create_backup()

10. search_by_date_range

  • Propósito: Busca recuerdos que caen dentro de un rango de fechas especificado.
  • Parámetros:
    • date_from (cadena, obligatorio): La fecha de inicio (formato ISO, por ejemplo, "2025-01-01" o "2025-01-01T10:30:00Z").
    • date_to (cadena, opcional, predeterminado: hora UTC actual): La fecha de fin (formato ISO).
    • limit (entero, opcional, predeterminado: 50): El número máximo de recuerdos a devolver.
  • Ejemplo de uso (interno): search_by_date_range(date_from="2025-09-01", date_to="2025-09-15")

🧭 Lógica de selección de herramientas

Tu compañero de IA elige las herramientas de memoria automáticamente según la conversación. Las herramientas nunca se muestran al usuario — todos los resultados se expresan naturalmente en el personaje — pero es útil saber cómo decide el modelo cuál usar.

Cómo se eligen las herramientas

  • remember → Se usa cuando el usuario comparte un nuevo hecho, preferencia o evento.
    Ejemplo: "Mi cumpleaños es el 4 de julio." → La IA lo almacena silenciosamente.
  • search_memories → Se usa para recuperación natural de forma libre.
    Ejemplo: "¿Cuándo es mi cumpleaños?" → La IA lo busca y responde.
  • search_by_type → Se usa para solicitudes por categoría.
    Ejemplo: "Muéstrame todas mis preferencias."
  • search_by_tags → Se usa cuando se mencionan etiquetas.
    Ejemplo: "Encuentra todo lo etiquetado como camping y camioneta."
  • get_recent_memories → Se usa para abreviaturas de tiempo ("hoy," "anoche," "ayer").
    Ejemplo: "¿De qué hablamos ayer?"
  • update_memory → Se usa al corregir o modificar información.
    Ejemplo: "Actualiza mi color favorito a azul."
  • delete_memory → Se usa cuando el usuario quiere que el sistema "olvide" algo.
    Ejemplo: "Olvida mi número de teléfono anterior."
  • search_by_date_range → Se usa cuando se menciona una ventana de fechas específica.
    Ejemplo: "¿De qué hablamos entre el 10 y el 15 de septiembre?"
  • get_memory_stats → Se usa cuando se pregunta sobre el tamaño/estado del sistema de memoria.
    Ejemplo: "¿Cuántos recuerdos tienes?"
  • create_backup → Se usa cuando se indica explícitamente hacer una copia de seguridad.
    Ejemplo: "Haz una copia de seguridad ahora."

Por qué esto importa

  • El prompt de sistema enseña a la IA cuándo es apropiada cada herramienta.
  • Si el usuario nunca formula solicitudes con categorías, etiquetas o "olvida esto," solo remember y search_memories aparecerán en los registros.
  • Para guiar a la IA hacia otras herramientas, formula solicitudes con palabras clave como:
    • "Actualiza..." → update_memory
    • "Elimina/olvida..." → delete_memory
    • "Preferencias/hechos/eventos..." → search_by_type
    • "Etiquetado con..." → search_by_tags
    • "El 28 de septiembre..." → search_by_date_range

Ejemplos de pocas muestras

"Muéstrame todas mis preferencias hasta ahora."
→ Usa search_by_type(memory_type="preference")

"Olvida mi dirección anterior."
→ Usa delete_memory(memory_id=…)

"¿De qué hablamos anoche?"
→ Usa get_recent_memories(limit=20) o un rango de fechas

"¿Cuántos recuerdos tienes ahora?"
→ Usa get_memory_stats()

"Haz una copia de seguridad de todo."
→ Usa create_backup()

🔄 Novedades

Mejoras en la búsqueda semántica

  • Corrección de distancia→similitud: relevancia = 1.0 − distancia
  • Umbral adaptativo: sigue la mejor coincidencia (limitado) para reducir ruido cuando existen coincidencias fuertes
  • Respaldo top‑1: si nada supera el umbral, devuelve el candidato más fuerte (guardia opcional en 0.08)

Dinámicas de memoria similares a las humanas

  • Decaimiento perezoso:
    • Al acceder, calcula el decaimiento basado en el tiempo desde el último acceso (respaldo: marca de tiempo)
    • Vida media exponencial por tipo de memoria (conversación, hecho, preferencia, tarea, efímero)
    • Nunca decae por debajo de los mínimos por tipo; las etiquetas protegidas (núcleo, identidad, fijado) omiten el decaimiento
    • Las escrituras están limitadas en velocidad y solo se persisten para deltas significativos (≥ 0.5)

Refuerzo:

  • Cada recuperación acumula +0.1 en metadatos
  • Cuando la acumulación alcanza +0.5, se escribe un aumento de importancia de +0.5 (redondeado a mitades)
  • Limitado a importancia 10

Registro y observabilidad

  • Registros claros para verificaciones de decaimiento, razones de omisión (protegido/mínimo/paso/límite de velocidad) y escrituras
  • Registros para acumulación de refuerzo y escrituras
  • Similitudes de candidatos y umbral adaptativo mostrados para consultas semánticas

🛠 Contribuciones

¡Las solicitudes de extracción son bienvenidas!

  • ¿Encontraste un error? Abre un problema.
  • ¿Quieres agregar funciones (programación de copias de seguridad personalizada, cifrado, etc.)? Colaboremos.

📜 Licencia

MIT

🔥 Con esta configuración, tu IA puede construir una memoria persistente y en evolución que se sienta natural a través de conversaciones, modelos e incluso años.