AgDex
🧠 Memory Guide April 2026 🔥 In Demand

AI Agent Memory Systems in 2026

Mem0 vs Zep vs Letta — plus DIY patterns. Everything you need to give your AI agent a persistent, intelligent memory.

📅 April 26, 2026 ⏱ 12 min read 🖊 AgDex Editorial

1. Why Agent Memory is the Missing Layer

Every LLM has a context window. Once a conversation ends, the memory is gone. For one-off queries that's fine — for agents that work with users over days, weeks, or months, it's a dealbreaker.

Consider these use cases that require persistent memory:

  • A coding assistant that remembers your project structure, preferred patterns, and past bugs
  • A customer support agent that knows a user's order history, past complaints, and preferences
  • A personal assistant that learns your habits, calendar patterns, and communication style
  • A research agent that accumulates findings across multiple sessions
⚠️ The naive approach fails fast: Stuffing all past messages into the context window runs out at ~32K–128K tokens, becomes expensive ($$$), and degrades retrieval quality due to the "lost in the middle" problem.

The solution: a dedicated memory layer that compresses, indexes, and retrieves the right context at the right time — independent of the context window.

2. Four Types of Agent Memory

TypeWhat It StoresAnalogyImplementation
In-context (buffer)Recent conversation turnsWorking memoryLast N messages in prompt
EpisodicPast events & interactionsDiaryVector DB + timestamp
SemanticFacts, preferences, knowledgePersonal encyclopediaKnowledge graph / vector DB
ProceduralSkills, workflows, instructionsMuscle memorySystem prompt + fine-tuning

Production agents need all four layers. Let's look at the best tools for each.

3. Mem0 — Drop-in Persistent Memory

⭐ Mem0 in One Sentence

An intelligent memory layer that automatically extracts, stores, and retrieves relevant memories from conversations — with a 3-line integration.

Mem0 (formerly mem0ai) is the most popular open-source memory solution for LLM agents in 2026. It uses an LLM to automatically identify what's worth remembering and stores facts as structured memories in a vector database.

Quick start

pip install mem0ai
from mem0 import Memory
from openai import OpenAI

# Initialize Mem0 (uses local vector store by default)
mem = Memory()

# Or with custom config (production)
config = {
    "llm": {
        "provider": "openai",
        "config": {
            "model": "deepseek-chat",
            "api_key": "your-key",
            "base_url": "https://api.deepseek.com"
        }
    },
    "vector_store": {
        "provider": "qdrant",
        "config": {"host": "localhost", "port": 6333}
    }
}
mem = Memory.from_config(config)

# Add memories from a conversation
messages = [
    {"role": "user", "content": "I prefer Python over JavaScript, and I'm building a RAG app"},
    {"role": "assistant", "content": "Got it! I'll use Python examples for your RAG app."}
]
mem.add(messages, user_id="user_123")
# Mem0 automatically extracts: "Prefers Python" + "Building a RAG app"

# Retrieve relevant memories
memories = mem.search("What language should I use?", user_id="user_123")
for m in memories:
    print(f"[{m['score']:.2f}] {m['memory']}")
# → [0.95] User prefers Python over JavaScript
# → [0.87] User is building a RAG application

Integrating Mem0 into an agent

from openai import OpenAI
from mem0 import Memory

client = OpenAI(api_key="your-key", base_url="https://api.deepseek.com")
mem = Memory()

def chat_with_memory(user_message: str, user_id: str) -> str:
    # 1. Retrieve relevant memories
    relevant = mem.search(user_message, user_id=user_id, limit=5)
    memory_context = "\n".join([f"- {m['memory']}" for m in relevant])

    # 2. Build prompt with memory context
    system = f"""You are a helpful personal assistant.

What you know about this user:
{memory_context if memory_context else 'Nothing yet.'}

Use this context to personalize your responses."""

    # 3. Get LLM response
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "system", "content": system},
            {"role": "user", "content": user_message}
        ]
    )
    answer = response.choices[0].message.content

    # 4. Store new memories from this exchange
    mem.add([
        {"role": "user", "content": user_message},
        {"role": "assistant", "content": answer}
    ], user_id=user_id)

    return answer

# Session 1
print(chat_with_memory("I'm allergic to peanuts", user_id="alice"))
# Session 2 (days later — memory persists)
print(chat_with_memory("Suggest a snack for me", user_id="alice"))
# → "Since you're allergic to peanuts, I'd suggest..."

4. Zep — Temporal Knowledge Graph

🔵 Zep in One Sentence

A knowledge graph-based memory that tracks entities, relationships, and how facts change over time — ideal for enterprise applications needing structured recall.

Zep goes beyond simple vector search. It builds a temporal knowledge graph of entities (people, products, organizations) and their relationships, automatically handling contradiction and fact updates ("User used to work at Google, now works at Anthropic").

Zep integration

pip install zep-python
from zep_python import ZepClient
from zep_python.memory import Memory, Message, Session

client = ZepClient(api_key="your-zep-key")  # or self-hosted

# Create a session
session_id = "user_alice_session_001"
client.memory.add_session(Session(session_id=session_id,
                                   metadata={"user_id": "alice"}))

# Add messages to memory
messages = [
    Message(role="human", content="I just got promoted to Senior Engineer at Stripe"),
    Message(role="ai", content="Congratulations on your promotion at Stripe!")
]
client.memory.add_memory(session_id, Memory(messages=messages))

# Search memory (semantic + temporal)
results = client.memory.search_memory(session_id, "What does Alice do for work?")
for r in results.results:
    print(f"[{r.dist:.2f}] {r.message.content}")

# Get entity facts (knowledge graph)
facts = client.memory.get_session_facts(session_id)
for fact in facts.facts:
    print(f"Fact: {fact.fact} | Valid: {fact.valid_at} → {fact.invalid_at or 'now'}")

Zep knowledge graph query

# Query entities across all sessions for a user
graph_results = client.graph.search(
    user_id="alice",
    query="job title and employer",
    scope="edges"  # relationships between entities
)
for edge in graph_results.edges:
    print(f"{edge.source_node_name} --[{edge.fact}]--> {edge.target_node_name}")

5. Letta (MemGPT) — Stateful Agents with OS-like Memory

🟢 Letta in One Sentence

An agent framework with an OS-inspired memory architecture — in-context working memory, archival storage, and memory tools that agents use autonomously.

Letta (previously MemGPT) treats memory like an operating system: the agent has a limited "RAM" (context window) and an unlimited "disk" (archival storage). The agent itself decides when to page memories in and out using built-in memory tools.

pip install letta-client
from letta_client import Letta

# Connect to Letta server (local or cloud)
client = Letta(token="your-token", base_url="https://app.letta.com")

# Create a stateful agent with memory
agent = client.agents.create(
    name="personal_assistant",
    memory_blocks=[
        {
            "label": "human",
            "value": "Name: Alice\nOccupation: Senior Engineer at Stripe",
            "limit": 2000
        },
        {
            "label": "persona",
            "value": "You are a helpful personal assistant who remembers everything about the user.",
            "limit": 1000
        }
    ],
    model="deepseek-chat",
    embedding="openai/text-embedding-3-small"
)

# Chat — Letta manages all memory automatically
response = client.agents.messages.create(
    agent_id=agent.id,
    messages=[{"role": "user", "content": "What do you know about me?"}]
)
for msg in response.messages:
    if msg.message_type == "assistant_message":
        print(msg.content)
# → "You're Alice, a Senior Engineer at Stripe..."

# The agent autonomously archives old memories and retrieves relevant ones
# It uses tools like: core_memory_append, archival_memory_insert, archival_memory_search

6. DIY Memory with Redis + pgvector

🟣 When to Go DIY

Full control over memory structure, storage, and retrieval. Best when you have specific compliance requirements or want to minimize dependencies.

import json, time
import psycopg2
import redis
from openai import OpenAI

client = OpenAI(api_key="your-key", base_url="https://api.deepseek.com")

# Redis for fast short-term memory (recent N turns)
r = redis.Redis(host="localhost", port=6379, decode_responses=True)

# pgvector for long-term semantic memory
conn = psycopg2.connect("postgresql://user:pass@localhost/agentdb")
cur = conn.cursor()

# Setup (run once)
cur.execute("""
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE IF NOT EXISTS agent_memories (
    id SERIAL PRIMARY KEY,
    user_id VARCHAR(255),
    content TEXT,
    embedding vector(1536),
    created_at TIMESTAMP DEFAULT NOW(),
    memory_type VARCHAR(50)  -- 'fact' | 'episode' | 'preference'
);
CREATE INDEX ON agent_memories USING ivfflat (embedding vector_cosine_ops);
""")
conn.commit()

def embed(text: str) -> list[float]:
    resp = client.embeddings.create(input=text, model="text-embedding-3-small")
    return resp.data[0].embedding

def store_memory(user_id: str, content: str, memory_type: str = "episode"):
    emb = embed(content)
    cur.execute(
        "INSERT INTO agent_memories (user_id, content, embedding, memory_type) VALUES (%s, %s, %s, %s)",
        (user_id, content, emb, memory_type)
    )
    conn.commit()

def retrieve_memories(user_id: str, query: str, top_k: int = 5) -> list[str]:
    query_emb = embed(query)
    cur.execute("""
        SELECT content, 1 - (embedding <=> %s::vector) AS similarity
        FROM agent_memories
        WHERE user_id = %s
        ORDER BY embedding <=> %s::vector
        LIMIT %s
    """, (query_emb, user_id, query_emb, top_k))
    return [row[0] for row in cur.fetchall()]

def add_to_buffer(user_id: str, role: str, content: str, max_turns: int = 10):
    key = f"buffer:{user_id}"
    r.rpush(key, json.dumps({"role": role, "content": content, "ts": time.time()}))
    r.ltrim(key, -max_turns * 2, -1)  # keep last N turns

def get_buffer(user_id: str) -> list[dict]:
    key = f"buffer:{user_id}"
    return [json.loads(m) for m in r.lrange(key, 0, -1)]

# Full agent with layered memory
def agent_reply(user_id: str, user_message: str) -> str:
    # Layer 1: Recent buffer (short-term)
    buffer = get_buffer(user_id)
    buffer_text = "\n".join([f"{m['role']}: {m['content']}" for m in buffer[-6:]])

    # Layer 2: Relevant long-term memories (semantic)
    long_term = retrieve_memories(user_id, user_message)
    lt_text = "\n".join([f"- {m}" for m in long_term])

    system = f"""You are a helpful assistant with memory.

Recent conversation:
{buffer_text}

Long-term memories about this user:
{lt_text if lt_text else 'None yet.'}"""

    resp = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "system", "content": system},
            {"role": "user", "content": user_message}
        ]
    )
    answer = resp.choices[0].message.content

    # Store to both layers
    add_to_buffer(user_id, "user", user_message)
    add_to_buffer(user_id, "assistant", answer)
    store_memory(user_id, f"User said: {user_message}", "episode")

    return answer

7. Full Comparison: Mem0 vs Zep vs Letta vs DIY

DimensionMem0ZepLettaDIY
Setup complexity⭐ (3 lines)⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Memory typeFacts/SemanticKnowledge GraphOS-inspired layersCustom
Temporal trackingLimited✅ ExcellentLimitedCustom
Auto extraction✅ LLM-based✅ LLM-based✅ Agent-driven❌ Manual
Self-hosted
Multi-userCustom
LangChain integrationPartialCustom
Production readinessHighHighMediumDepends
Best forQuick start, chatbotsEnterprise, structured dataLong-running agentsCompliance/control
PricingOpen-source + CloudOpen-source + CloudOpen-source + CloudInfra cost only

8. Production Memory Architecture Pattern

Here's the memory stack we recommend for a production AI assistant in 2026:

┌────────────────────────────────────────────────────────┐
│                    USER MESSAGE                         │
└──────────────────────────┬─────────────────────────────┘
                           │
              ┌────────────▼────────────┐
              │   Layer 1: Buffer        │  ← Redis (last 10 turns, ~1ms)
              │   (Working Memory)       │
              └────────────┬────────────┘
                           │
              ┌────────────▼────────────┐
              │   Layer 2: Semantic      │  ← Mem0 / pgvector (top-5 facts, ~50ms)
              │   (Long-term Memory)     │
              └────────────┬────────────┘
                           │
              ┌────────────▼────────────┐
              │   Layer 3: Knowledge     │  ← Zep (entity relationships, ~100ms)
              │   (Structured Facts)     │    Only for enterprise use cases
              └────────────┬────────────┘
                           │
              ┌────────────▼────────────┐
              │   LLM (DeepSeek V4)      │  ← Assembled context → response
              └────────────┬────────────┘
                           │
              ┌────────────▼────────────┐
              │   Memory Update          │  ← Async background task
              │   (Extract + Store)      │    Don't block the response
              └─────────────────────────┘
💡 Implementation rules of thumb:
  1. Start with Mem0 — 3-line integration, works well for 90% of use cases
  2. Add Zep when you need entity tracking or fact contradiction handling
  3. Use Letta when your agent runs autonomously over days/weeks
  4. Always async memory writes — don't let storage latency affect response time
  5. Memory TTL — set expiry on episodic memories (1 year), keep semantic forever

Quick Decision: Which to Choose?

Use CaseRecommendation
Personal assistant / chatbotMem0 (managed cloud)
Enterprise CRM / supportZep + self-hosted
Long-running autonomous agentLetta
Compliance-heavy (GDPR/HIPAA)DIY + pgvector
Prototype / hackathonMem0 OSS, local Chroma
Multi-agent systemMem0 (shared memory layer)

Browse all memory tools, vector databases, and agent frameworks at AgDex.ai — 420+ AI agent tools organized by category.

Related
Héroe
🧠 Guía de memoria Abril 2026 🔥 Muy solicitado

Sistemas de memoria de agentes de IA en 2026

Mem0 vs Zep vs Letta — además de patrones DIY. Todo lo que necesitas para dotar a tu agente de IA de una memoria persistente e inteligente.

📅 26 de abril de 2026 ⏱ 12 min de lectura 🖊 Editorial de AgDex
Tabla de contenidos

1. Por qué la memoria de los agentes es la capa que falta

Cada LLM tiene una ventana de contexto. Una vez que termina una conversación, la memoria desaparece. Para consultas únicas eso está bien, pero para los agentes que trabajan con usuarios durante días, semanas o meses, es un obstáculo insalvable.

Considera estos casos de uso que requieren memoria persistente:

  • Un asistente de programación que recuerda la estructura de tu proyecto, los patrones preferidos y los errores del pasado
  • Un agente de atención al cliente que conoce el historial de pedidos de un usuario, sus quejas anteriores y sus preferencias
  • Un asistente personal que aprende tus hábitos, patrones de calendario y estilo de comunicación
  • Un agente de investigación que acumula hallazgos a lo largo de múltiples sesiones
⚠️ El enfoque ingenuo falla rápidamente: Meter todos los mensajes anteriores en la ventana de contexto se agota a los ~32K–128K tokens, se vuelve costoso ($$$) y degrada la calidad de recuperación debido al problema de "pérdida en el medio" (lost in the middle).

La solución: una capa de memoria dedicada que comprime, indexa y recupera el contexto adecuado en el momento oportuno, de forma independiente de la ventana de contexto.

2. Cuatro tipos de memoria de agentes

TipoQué almacenaAnalogíaImplementación
En contexto (búfer)Turnos de conversación recientesMemoria de trabajoÚltimos N mensajes en el prompt
EpisódicaEventos e interacciones pasadosDiarioBD vectorial + marca de tiempo
SemánticaHechos, preferencias, conocimientoEnciclopedia personalGráfico de conocimiento / BD vectorial
ProcedimentalHabilidades, flujos de trabajo, instruccionesMemoria muscularPrompt del sistema + ajuste fino

Los agentes en producción necesitan las cuatro capas. Veamos las mejores herramientas para cada una.

3. Mem0 — Memoria persistente lista para usar

⭐ Mem0 en una frase

Una capa de memoria inteligente que extrae, almacena y recupera automáticamente recuerdos relevantes de las conversaciones, con una integración de tan solo 3 líneas.

Mem0 (anteriormente mem0ai) es la solución de memoria de código abierto más popular para agentes de LLM en 2026. Utiliza un LLM para identificar automáticamente qué vale la pena recordar y almacena los hechos como recuerdos estructurados en una base de datos vectorial.

Inicio rápido

pip install mem0ai
from mem0 import Memory
from openai import OpenAI

# Inicializa Mem0 (usa almacenamiento vectorial local por defecto)
mem = Memory()

# O con configuración personalizada (producción)
config = {
    "llm": {
        "provider": "openai",
        "config": {
            "model": "deepseek-chat",
            "api_key": "your-key",
            "base_url": "https://api.deepseek.com"
        }
    },
    "vector_store": {
        "provider": "qdrant",
        "config": {"host": "localhost", "port": 6333}
    }
}
mem = Memory.from_config(config)

# Añade recuerdos de una conversación
messages = [
    {"role": "user", "content": "Prefiero Python sobre JavaScript y estoy construyendo una aplicación RAG"},
    {"role": "assistant", "content": "¡Entendido! Usaré ejemplos de Python para tu aplicación RAG."}
]
mem.add(messages, user_id="usuario_123")
# Mem0 extrae automáticamente: "Prefiere Python" + "Construyendo una aplicación RAG"

# Recupera recuerdos relevantes
memories = mem.search("¿Qué lenguaje debería usar?", user_id="usuario_123")
for m in memories:
    print(f"[{m['score']:.2f}] {m['memory']}")
# → [0.95] El usuario prefiere Python sobre JavaScript
# → [0.87] El usuario está construyendo una aplicación RAG

Integración de Mem0 en un agente

from openai import OpenAI
from mem0 import Memory

client = OpenAI(api_key="your-key", base_url="https://api.deepseek.com")
mem = Memory()

def chat_with_memory(user_message: str, user_id: str) -> str:
    # 1. Recupera recuerdos relevantes
    relevant = mem.search(user_message, user_id=user_id, limit=5)
    memory_context = "
".join([f"- {m['memory']}" for m in relevant])

    # 2. Construye el prompt con el contexto de la memoria
    system = f"""Eres un asistente personal servicial.

Lo que sabes sobre este usuario:
{memory_context if memory_context else 'Nada por ahora.'}

Utiliza este contexto para personalizar tus respuestas."""

    # 3. Obtiene la respuesta del LLM
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "system", "content": system},
            {"role": "user", "content": user_message}
        ]
    )
    answer = response.choices[0].message.content

    # 4. Almacena nuevos recuerdos de este intercambio
    mem.add([
        {"role": "user", "content": user_message},
        {"role": "assistant", "content": answer}
    ], user_id=user_id)

    return answer

# Sesión 1
print(chat_with_memory("Soy alérgico al maní", user_id="alice"))
# Sesión 2 (días después — la memoria persiste)
print(chat_with_memory("Sugiéreme un bocadillo", user_id="alice"))
# → "Dado que eres alérgico al maní, te sugiero..."

4. Zep — Gráfico de conocimiento temporal

🔵 Zep en una frase

Una memoria basada en gráficos de conocimiento que rastrea entidades, relaciones y cómo cambian los hechos con el tiempo, ideal para aplicaciones empresariales que necesitan una recuperación estructurada.

Zep va más allá de la simple búsqueda vectorial. Construye un gráfico de conocimiento temporal de entidades (personas, productos, organizaciones) y sus relaciones, manejando automáticamente las contradicciones y actualizaciones de hechos ("El usuario solía trabajar en Google, ahora trabaja en Anthropic").

Integración de Zep

pip install zep-python
from zep_python import ZepClient
from zep_python.memory import Memory, Message, Session

client = ZepClient(api_key="your-zep-key")  # o autohospedado

# Crea una sesión
session_id = "user_alice_session_001"
client.memory.add_session(Session(session_id=session_id,
                                   metadata={"user_id": "alice"}))

# Añade mensajes a la memoria
messages = [
    Message(role="human", content="Me acaban de ascender a Ingeniero Principal en Stripe"),
    Message(role="ai", content="¡Felicitaciones por tu ascenso en Stripe!")
]
client.memory.add_memory(session_id, Memory(messages=messages))

# Busca en la memoria (semántica + temporal)
results = client.memory.search_memory(session_id, "¿A qué se dedica Alice?")
for r in results.results:
    print(f"[{r.dist:.2f}] {r.message.content}")

# Obtiene hechos de entidades (gráfico de conocimiento)
facts = client.memory.get_session_facts(session_id)
for fact in facts.facts:
    print(f"Hecho: {fact.fact} | Válido: {fact.valid_at} → {fact.invalid_at or 'ahora'}")

Consulta de gráfico de conocimiento de Zep

# Consulta entidades en todas las sesiones de un usuario
graph_results = client.graph.search(
    user_id="alice",
    query="cargo y empleador",
    scope="edges"  # relaciones entre entidades
)
for edge in graph_results.edges:
    print(f"{edge.source_node_name} --[{edge.fact}]--> {edge.target_node_name}")

5. Letta (MemGPT) — Agentes con estado con memoria tipo SO

🟢 Letta en una frase

Un marco de agentes con una arquitectura de memoria inspirada en los sistemas operativos: memoria de trabajo en contexto, almacenamiento de archivo y herramientas de memoria que los agentes utilizan de forma autónoma.

Letta (anteriormente MemGPT) trata la memoria como un sistema operativo: el agente tiene una "RAM" limitada (ventana de contexto) y un "disco" ilimitado (almacenamiento de archivo). El propio agente decide cuándo cargar y descargar recuerdos utilizando herramientas de memoria integradas.

pip install letta-client
from letta_client import Letta

# Se conecta al servidor de Letta (local o en la nube)
client = Letta(token="your-token", base_url="https://app.letta.com")

# Crea un agente con estado y memoria
agent = client.agents.create(
    name="personal_assistant",
    memory_blocks=[
        {
            "label": "human",
            "value": "Nombre: Alice
Ocupación: Ingeniera Principal en Stripe",
            "limit": 2000
        },
        {
            "label": "persona",
            "value": "Eres un asistente personal servicial que recuerda todo sobre el usuario.",
            "limit": 1000
        }
    ],
    model="deepseek-chat",
    embedding="openai/text-embedding-3-small"
)

# Chat: Letta gestiona toda la memoria automáticamente
response = client.agents.messages.create(
    agent_id=agent.id,
    messages=[{"role": "user", "content": "¿Qué sabes sobre mí?"}]
)
for msg in response.messages:
    if msg.message_type == "assistant_message":
        print(msg.content)
# → "Eres Alice, una Ingeniera Principal en Stripe..."

# El agente archiva de forma autónoma recuerdos antiguos y recupera los relevantes
# Utiliza herramientas como: core_memory_append, archival_memory_insert, archival_memory_search

6. DIY Memoria con Redis + pgvector

🟣 Cuándo optar por DIY

Control total sobre la estructura, el almacenamiento y la recuperación de la memoria. Es la mejor opción cuando tienes requisitos de cumplimiento específicos o deseas minimizar las dependencias.

import json, time
import psycopg2
import redis
from openai import OpenAI

client = OpenAI(api_key="your-key", base_url="https://api.deepseek.com")

# Redis para memoria rápida a corto plazo (últimos N turnos)
r = redis.Redis(host="localhost", port=6379, decode_responses=True)

# pgvector para memoria semántica a largo plazo
conn = psycopg2.connect("postgresql://user:pass@localhost/agentdb")
cur = conn.cursor()

# Configuración (ejecutar una vez)
cur.execute("""
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE IF NOT EXISTS agent_memories (
    id SERIAL PRIMARY KEY,
    user_id VARCHAR(255),
    content TEXT,
    embedding vector(1536),
    created_at TIMESTAMP DEFAULT NOW(),
    memory_type VARCHAR(50)  -- 'fact' | 'episode' | 'preference'
);
CREATE INDEX ON agent_memories USING ivfflat (embedding vector_cosine_ops);
""")
conn.commit()

def embed(text: str) -> list[float]:
    resp = client.embeddings.create(input=text, model="text-embedding-3-small")
    return resp.data[0].embedding

def store_memory(user_id: str, content: str, memory_type: str = "episode"):
    emb = embed(content)
    cur.execute(
        "INSERT INTO agent_memories (user_id, content, embedding, memory_type) VALUES (%s, %s, %s, %s)",
        (user_id, content, emb, memory_type)
    )
    conn.commit()

def retrieve_memories(user_id: str, query: str, top_k: int = 5) -> list[str]:
    query_emb = embed(query)
    cur.execute("""
        SELECT content, 1 - (embedding <=> %s::vector) AS similarity
        FROM agent_memories
        WHERE user_id = %s
        ORDER BY embedding <=> %s::vector
        LIMIT %s
    """, (query_emb, user_id, query_emb, top_k))
    return [row[0] for row in cur.fetchall()]

def add_to_buffer(user_id: str, role: str, content: str, max_turns: int = 10):
    key = f"buffer:{user_id}"
    r.rpush(key, json.dumps({"role": role, "content": content, "ts": time.time()}))
    r.ltrim(key, -max_turns * 2, -1)  # mantiene los últimos N turnos

def get_buffer(user_id: str) -> list[dict]:
    key = f"buffer:{user_id}"
    return [json.loads(m) for m in r.lrange(key, 0, -1)]

# Agente completo con memoria en capas
def agent_reply(user_id: str, user_message: str) -> str:
    # Capa 1: Búfer reciente (a corto plazo)
    buffer = get_buffer(user_id)
    buffer_text = "
".join([f"{m['role']}: {m['content']}" for m in buffer[-6:]])

    # Capa 2: Recuerdos relevantes a largo plazo (semántica)
    long_term = retrieve_memories(user_id, user_message)
    lt_text = "
".join([f"- {m}" for m in long_term])

    system = f"""Eres un asistente servicial con memoria.

Conversación reciente:
{buffer_text}

Recuerdos a largo plazo sobre este usuario:
{lt_text if lt_text else 'Ninguno por ahora.'}"""

    resp = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "system", "content": system},
            {"role": "user", "content": user_message}
        ]
    )
    answer = resp.choices[0].message.content

    # Almacena en ambas capas
    add_to_buffer(user_id, "user", user_message)
    add_to_buffer(user_id, "assistant", answer)
    store_memory(user_id, f"El usuario dijo: {user_message}", "episode")

    return answer

7. Comparación completa: Mem0 vs Zep vs Letta vs DIY

DimensiónMem0ZepLettaDIY
Complejidad de configuración⭐ (3 líneas)⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Tipo de memoriaHechos/SemánticaGráfico de conocimientoCapas inspiradas en SOPersonalizada
Rastreo temporalLimitado✅ ExcelenteLimitadoPersonalizada
Extracción automática✅ Basada en LLM✅ Basada en LLM✅ Dirigida por agente❌ Manual
Autohospedado
MultiusuarioPersonalizada
Integración con LangChainParcialPersonalizada
Preparación para producciónAltaAltaMediaDepende
Ideal paraInicio rápido, chatbotsEmpresas, datos estructuradosAgentes de larga duraciónCumplimiento/control
PreciosCódigo abierto + NubeCódigo abierto + NubeCódigo abierto + NubeSolo costo de infraestructura

8. Patrón de arquitectura de memoria en producción

Este es el conjunto de memoria que recomendamos para un asistente de IA en producción en 2026:

┌────────────────────────────────────────────────────────┐
│                 MENSAJE DEL USUARIO                    │
└──────────────────────────┬─────────────────────────────┘
                           │
              ┌────────────▼────────────┐
              │   Capa 1: Búfer         │  ← Redis (últimos 10 turnos, ~1ms)
              │   (Memoria de trabajo)   │
              └────────────┬────────────┘
                           │
              ┌────────────▼────────────┐
              │   Capa 2: Semántica     │  ← Mem0 / pgvector (top-5 hechos, ~50ms)
              │   (Memoria a largo plazo)│
              └────────────┬────────────┘
                           │
              ┌────────────▼────────────┐
              │   Capa 3: Conocimiento  │  ← Zep (relaciones de entidades, ~100ms)
              │   (Hechos estructurados)│    Solo para casos de uso empresarial
              └────────────┬────────────┘
                           │
              ┌────────────▼────────────┐
              │   LLM (DeepSeek V4)      │  ← Contexto ensamblado → respuesta
              └────────────┬────────────┘
                           │
              ┌────────────▼────────────┐
              │Actualización de memoria │  ← Tarea asíncrona en segundo plano
              │   (Extraer + Almacenar) │    No bloquees la respuesta
              └─────────────────────────┘
💡 Reglas prácticas de implementación:
  1. Comienza con Mem0 — integración de 3 líneas, funciona bien para el 90% de los casos de uso
  2. Añade Zep cuando necesites seguimiento de entidades o manejo de contradicciones de hechos
  3. Usa Letta cuando tu agente se ejecute de forma autónoma durante días o semanas
  4. Siempre escritura asíncrona de memoria — no permitas que la latencia de almacenamiento afecte al tiempo de respuesta
  5. TTL de memoria — establece la expiración en recuerdos episódicos (1 año), mantén los semánticos para siempre

Decisión rápida: ¿Cuál elegir?

Caso de usoRecomendación
Asistente personal / chatbotMem0 (nube gestionada)
CRM empresarial / soporteZep + autohospedado
Agente autónomo de larga duraciónLetta
Altas exigencias de cumplimiento (GDPR/HIPAA)DIY + pgvector
Prototipo / hackathonMem0 código abierto, Chroma local
Sistema multiagenteMem0 (capa de memoria compartida)

Explora todas las herramientas de memoria, bases de datos vectoriales y marcos de agentes en AgDex.ai: más de 420 herramientas de agentes de IA organizadas por categoría.

Relacionados
🧠 Memory-Leitfaden April 2026 🔥 Sehr gefragt

KI-Agent-Memory-Systeme im Jahr 2026

Mem0 vs. Zep vs. Letta — plus Do-it-Yourself-Muster. Alles, was Sie brauchen, um Ihrem KI-Agenten ein persistentes, intelligentes Gedächtnis zu geben.

📅 26. April 2026 ⏱ 12 Min. Lesezeit 🖊 AgDex Redaktion
Inhaltsverzeichnis

1. Warum das Agenten-Gedächtnis die fehlende Ebene ist

Jedes LLM hat ein Kontextfenster. Sobald ein Gespräch endet, ist das Gedächtnis gelöscht. Für einmalige Abfragen ist das in Ordnung — für Agenten, die über Tage, Wochen oder Monate hinweg mit Benutzern arbeiten, ist es jedoch ein K.o.-Kriterium.

Betrachten Sie diese Anwendungsfälle, die ein persistentes Gedächtnis erfordern:

  • Ein Programmierassistent, der sich an Ihre Projektstruktur, bevorzugte Muster und vergangene Fehler erinnert
  • Ein Kundensupport-Agent, der die Bestellhistorie, frühere Beschwerden und Präferenzen eines Benutzers kennt
  • Ein persönlicher Assistent, der Ihre Gewohnheiten, Kalendermuster und Ihren Kommunikationsstil lernt
  • Ein Forschungsagent, der Erkenntnisse über mehrere Sitzungen hinweg sammelt
⚠️ Der naive Ansatz scheitert schnell: Das vollstopfen des Kontextfensters mit allen vergangenen Nachrichten stößt bei ca. 32K–128K Token an seine Grenzen, wird teuer ($$$) und verschlechtert die Abrufqualität aufgrund des "Lost-in-the-Middle"-Problems.

Die Lösung: eine spezielle Speicher-Ebene, die den richtigen Kontext zur richtigen Zeit komprimiert, indiziert und abruft — unabhängig vom Kontextfenster.

2. Vier Arten von Agenten-Gedächtnis

TypWas er speichertAnalogieImplementierung
In-context (Puffer)Kürzliche GesprächsrundenArbeitsgedächtnisLetzte N Nachrichten im Prompt
EpisodischVergangene Ereignisse & InteraktionenTagebuchVektor-DB + Zeitstempel
SemantischFakten, Präferenzen, WissenPersönliche EnzyklopädieWissensgraph / Vektor-DB
ProzeduralFähigkeiten, Workflows, AnweisungenMuskelgedächtnisSystem-Prompt + Fine-Tuning

Produktions-Agenten benötigen alle vier Ebenen. Sehen wir uns die besten Tools für jede an.

3. Mem0 — Unkomplizierter persistenter Speicher

⭐ Mem0 in einem Satz

Eine intelligente Speicherebene, die automatisch relevante Erinnerungen aus Gesprächen extrahiert, speichert und abruft — mit einer 3-zeiligen Integration.

Mem0 (ehemals mem0ai) ist die beliebteste Open-Source-Speicherlösung für LLM-Agenten im Jahr 2026. Es verwendet ein LLM, um automatisch zu identifizieren, was erinnerungswürdig ist, und speichert Fakten als strukturierte Erinnerungen in einer Vektor-Datenbank.

Schnellstart

pip install mem0ai
from mem0 import Memory
from openai import OpenAI

# Initialisiere Mem0 (verwendet standardmäßig lokalen Vektorspeicher)
mem = Memory()

# Oder mit benutzerdefinierter Konfiguration (Produktion)
config = {
    "llm": {
        "provider": "openai",
        "config": {
            "model": "deepseek-chat",
            "api_key": "your-key",
            "base_url": "https://api.deepseek.com"
        }
    },
    "vector_store": {
        "provider": "qdrant",
        "config": {"host": "localhost", "port": 6333}
    }
}
mem = Memory.from_config(config)

# Erinnerungen aus einem Gespräch hinzufügen
messages = [
    {"role": "user", "content": "Ich bevorzuge Python gegenüber JavaScript und baue eine RAG-App"},
    {"role": "assistant", "content": "Verstanden! Ich werde Python-Beispiele für Ihre RAG-App verwenden."}
]
mem.add(messages, user_id="user_123")
# Mem0 extrahiert automatisch: "Bevorzugt Python" + "Baut eine RAG-App"

# Relevante Erinnerungen abrufen
memories = mem.search("Welche Sprache sollte ich verwenden?", user_id="user_123")
for m in memories:
    print(f"[{m['score']:.2f}] {m['memory']}")
# → [0.95] Benutzer bevorzugt Python gegenüber JavaScript
# → [0.87] Benutzer baut eine RAG-Anwendung

Mem0 in einen Agenten integrieren

from openai import OpenAI
from mem0 import Memory

client = OpenAI(api_key="your-key", base_url="https://api.deepseek.com")
mem = Memory()

def chat_with_memory(user_message: str, user_id: str) -> str:
    # 1. Relevante Erinnerungen abrufen
    relevant = mem.search(user_message, user_id=user_id, limit=5)
    memory_context = "
".join([f"- {m['memory']}" for m in relevant])

    # 2. Prompt mit Speicherkontext erstellen
    system = f"""Sie sind ein hilfreicher persönlicher Assistent.

Was Sie über diesen Benutzer wissen:
{memory_context if memory_context else 'Noch nichts.'}

Verwenden Sie diesen Kontext, um Ihre Antworten zu personalisieren."""

    # 3. LLM-Antwort abrufen
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "system", "content": system},
            {"role": "user", "content": user_message}
        ]
    )
    answer = response.choices[0].message.content

    # 4. Neue Erinnerungen aus diesem Austausch speichern
    mem.add([
        {"role": "user", "content": user_message},
        {"role": "assistant", "content": answer}
    ], user_id=user_id)

    return answer

# Sitzung 1
print(chat_with_memory("Ich bin allergisch gegen Erdnüsse", user_id="alice"))
# Sitzung 2 (Tage später — Gedächtnis bleibt bestehen)
print(chat_with_memory("Schlage mir einen Snack vor", user_id="alice"))
# → "Da Sie allergisch gegen Erdnüsse sind, würde ich empfehlen..."

4. Zep — Temporaler Wissensgraph

🔵 Zep in einem Satz

Ein auf Wissensgraphen basierender Speicher, der Entitäten, Beziehungen und die Veränderung von Fakten im Laufe der Zeit verfolgt — ideal für Unternehmensanwendungen, die einen strukturierten Abruf benötigen.

Zep geht über die einfache Vektorsuche hinaus. Es erstellt einen temporalen Wissensgraphen von Entitäten (Personen, Produkte, Organisationen) und deren Beziehungen und verarbeitet automatisch Widersprüche und Fakten-Aktualisierungen („Benutzer hat früher bei Google gearbeitet, arbeitet jetzt bei Anthropic“).

Zep-Integration

pip install zep-python
from zep_python import ZepClient
from zep_python.memory import Memory, Message, Session

client = ZepClient(api_key="your-zep-key")  # oder self-hosted

# Eine Sitzung erstellen
session_id = "user_alice_session_001"
client.memory.add_session(Session(session_id=session_id,
                                   metadata={"user_id": "alice"}))

# Nachrichten zum Speicher hinzufügen
messages = [
    Message(role="human", content="Ich wurde gerade zum Senior Engineer bei Stripe befördert"),
    Message(role="ai", content="Herzlichen Glückwunsch zu Ihrer Beförderung bei Stripe!")
]
client.memory.add_memory(session_id, Memory(messages=messages))

# Speicher durchsuchen (semantisch + temporal)
results = client.memory.search_memory(session_id, "Was macht Alice beruflich?")
for r in results.results:
    print(f"[{r.dist:.2f}] {r.message.content}")

# Entitätsfakten abrufen (Wissensgraph)
facts = client.memory.get_session_facts(session_id)
for fact in facts.facts:
    print(f"Fakt: {fact.fact} | Gültig: {fact.valid_at} → {fact.invalid_at or 'jetzt'}")

Zep-Wissensgraph-Abfrage

# Entitäten über alle Sitzungen für einen Benutzer abfragen
graph_results = client.graph.search(
    user_id="alice",
    query="Berufsbezeichnung und Arbeitgeber",
    scope="edges"  # Beziehungen zwischen Entitäten
)
for edge in graph_results.edges:
    print(f"{edge.source_node_name} --[{edge.fact}]--> {edge.target_node_name}")

5. Letta (MemGPT) — Stateful Agents mit OS-ähnlichem Speicher

🟢 Letta in einem Satz

Ein Agenten-Framework mit einer vom Betriebssystem inspirierten Speicherarchitektur — In-Context-Arbeitsgedächtnis, Archivspeicher und Speicherwerkzeuge, die Agenten autonom nutzen.

Letta (ehemals MemGPT) behandelt Speicher wie ein Betriebssystem: Der Agent verfügt über ein begrenztes „RAM“ (Kontextfenster) und eine unbegrenzte „Festplatte“ (Archivspeicher). Der Agent selbst entscheidet mithilfe integrierter Speicher-Tools, wann Erinnerungen ein- und ausgelagert werden.

pip install letta-client
from letta_client import Letta

# Mit Letta-Server verbinden (lokal oder Cloud)
client = Letta(token="your-token", base_url="https://app.letta.com")

# Stateful Agent mit Speicher erstellen
agent = client.agents.create(
    name="personal_assistant",
    memory_blocks=[
        {
            "label": "human",
            "value": "Name: Alice
Beruf: Senior Engineer bei Stripe",
            "limit": 2000
        },
        {
            "label": "persona",
            "value": "Sie sind ein hilfreicher persönlicher Assistent, der sich an alles über den Benutzer erinnert.",
            "limit": 1000
        }
    ],
    model="deepseek-chat",
    embedding="openai/text-embedding-3-small"
)

# Chat — Letta verwaltet den gesamten Speicher automatisch
response = client.agents.messages.create(
    agent_id=agent.id,
    messages=[{"role": "user", "content": "Was weißt du über mich?"}]
)
for msg in response.messages:
    if msg.message_type == "assistant_message":
        print(msg.content)
# → "Du bist Alice, eine Senior Engineer bei Stripe..."

# Der Agent archiviert autonom alte Erinnerungen und ruft relevante ab
# Es verwendet Tools wie: core_memory_append, archival_memory_insert, archival_memory_search

6. DIY Memory with Redis + pgvector

🟣 Wann man sich für DIY entscheidet

Volle Kontrolle über Speicherstruktur, Speicherung und Abruf. Am besten, wenn Sie spezifische Compliance-Anforderungen haben oder Abhängigkeiten minimieren möchten.

import json, time
import psycopg2
import redis
from openai import OpenAI

client = OpenAI(api_key="your-key", base_url="https://api.deepseek.com")

# Redis für schnellen Kurzzeitspeicher (letzte N Runden)
r = redis.Redis(host="localhost", port=6379, decode_responses=True)

# pgvector für langfristigen semantischen Speicher
conn = psycopg2.connect("postgresql://user:pass@localhost/agentdb")
cur = conn.cursor()

# Setup (einmalig ausführen)
cur.execute("""
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE IF NOT EXISTS agent_memories (
    id SERIAL PRIMARY KEY,
    user_id VARCHAR(255),
    content TEXT,
    embedding vector(1536),
    created_at TIMESTAMP DEFAULT NOW(),
    memory_type VARCHAR(50)  -- 'fact' | 'episode' | 'preference'
);
CREATE INDEX ON agent_memories USING ivfflat (embedding vector_cosine_ops);
""")
conn.commit()

def embed(text: str) -> list[float]:
    resp = client.embeddings.create(input=text, model="text-embedding-3-small")
    return resp.data[0].embedding

def store_memory(user_id: str, content: str, memory_type: str = "episode"):
    emb = embed(content)
    cur.execute(
        "INSERT INTO agent_memories (user_id, content, embedding, memory_type) VALUES (%s, %s, %s, %s)",
        (user_id, content, emb, memory_type)
    )
    conn.commit()

def retrieve_memories(user_id: str, query: str, top_k: int = 5) -> list[str]:
    query_emb = embed(query)
    cur.execute("""
        SELECT content, 1 - (embedding <=> %s::vector) AS similarity
        FROM agent_memories
        WHERE user_id = %s
        ORDER BY embedding <=> %s::vector
        LIMIT %s
    """, (query_emb, user_id, query_emb, top_k))
    return [row[0] for row in cur.fetchall()]

def add_to_buffer(user_id: str, role: str, content: str, max_turns: int = 10):
    key = f"buffer:{user_id}"
    r.rpush(key, json.dumps({"role": role, "content": content, "ts": time.time()}))
    r.ltrim(key, -max_turns * 2, -1)  # die letzten N Runden behalten

def get_buffer(user_id: str) -> list[dict]:
    key = f"buffer:{user_id}"
    return [json.loads(m) for m in r.lrange(key, 0, -1)]

# Vollständiger Agent mit geschichtetem Speicher
def agent_reply(user_id: str, user_message: str) -> str:
    # Ebene 1: Kürzlicher Puffer (Kurzzeit)
    buffer = get_buffer(user_id)
    buffer_text = "
".join([f"{m['role']}: {m['content']}" for m in buffer[-6:]])

    # Ebene 2: Relevante Langzeiterinnerungen (semantisch)
    long_term = retrieve_memories(user_id, user_message)
    lt_text = "
".join([f"- {m}" for m in long_term])

    system = f"""Sie sind ein hilfreicher Assistent mit Gedächtnis.

Kürzliches Gespräch:
{buffer_text}

Langzeiterinnerungen über diesen Benutzer:
{lt_text if lt_text else 'Noch keine.'}"""

    resp = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "system", "content": system},
            {"role": "user", "content": user_message}
        ]
    )
    answer = resp.choices[0].message.content

    # In beiden Ebenen speichern
    add_to_buffer(user_id, "user", user_message)
    add_to_buffer(user_id, "assistant", answer)
    store_memory(user_id, f"Benutzer sagte: {user_message}", "episode")

    return answer

7. Vollständiger Vergleich: Mem0 vs. Zep vs. Letta vs. DIY

DimensionMem0ZepLettaDIY
Komplexität der Einrichtung⭐ (3 Zeilen)⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
SpeichertypFakten/SemantischWissensgraphVom Betriebssystem inspirierte EbenenBenutzerdefiniert
Temporale VerfolgungEingeschränkt✅ ExzellentEingeschränktBenutzerdefiniert
Automatische Extraktion✅ LLM-basiert✅ LLM-basiert✅ Agenten-gesteuert❌ Manuell
Self-hosted
MehrbenutzerfähigBenutzerdefiniert
LangChain-IntegrationTeilweiseBenutzerdefiniert
ProduktionsreifeHochHochMittelAbhängig
Bestens geeignet fürSchnellstart, ChatbotsUnternehmen, strukturierte DatenLanglebige AgentenCompliance/Kontrolle
PreiseOpen Source + CloudOpen Source + CloudOpen Source + CloudNur Infrastrukturkosten

8. Architekturmuster für Produktionsspeicher

Hier ist der Speicher-Stack, den wir für einen Produktions-KI-Assistenten im Jahr 2026 empfehlen:

┌────────────────────────────────────────────────────────┐
│                   BENUTZERNACHRICHT                    │
└──────────────────────────┬─────────────────────────────┘
                           │
              ┌────────────▼────────────┐
              │   Ebene 1: Puffer        │  ← Redis (letzte 10 Runden, ~1ms)
              │   (Arbeitsgedächtnis)    │
              └────────────┬────────────┘
                           │
              ┌────────────▼────────────┐
              │   Ebene 2: Semantisch    │  ← Mem0 / pgvector (Top-5 Fakten, ~50ms)
              │   (Langzeitgedächtnis)   │
              └────────────┬────────────┘
                           │
              ┌────────────▼────────────┐
              │   Ebene 3: Wissen        │  ← Zep (Entitätsbeziehungen, ~100ms)
              │   (Strukturierte Fakten) │    Nur für Unternehmensanwendungsfälle
              └────────────┬────────────┘
                           │
              ┌────────────▼────────────┐
              │   LLM (DeepSeek V4)      │  ← Zusammengefügter Kontext → Antwort
              └────────────┬────────────┘
                           │
              ┌────────────▼────────────┐
              │  Speicheraktualisierung  │  ← Asynchroner Hintergrundtask
              │ (Extrahieren + Speichern)│    Antwort nicht blockieren
              └─────────────────────────┘
💡 Praxisregeln für die Implementierung:
  1. Beginnen Sie mit Mem0 — 3-zeilige Integration, funktioniert gut für 90 % der Anwendungsfälle
  2. Fügen Sie Zep hinzu, wenn Sie Entitätenverfolgung oder die Behandlung von Faktenwidersprüchen benötigen
  3. Verwenden Sie Letta, wenn Ihr Agent über Tage/Wochen hinweg autonom läuft
  4. Speicherschreibvorgänge immer asynchron ausführen — lassen Sie nicht zu, dass die Speicherlatenz die Antwortzeit beeinträchtigt
  5. Speicher-TTL — setzen Sie ein Ablaufdatum für episodische Erinnerungen (1 Jahr), behalten Sie semantische für immer

Schnelle Entscheidung: Was soll man wählen?

AnwendungsfallEmpfehlung
Persönlicher Assistent / ChatbotMem0 (Managed Cloud)
Unternehmen-CRM / SupportZep + self-hosted
Langlaufender autonomer AgentLetta
Compliance-intensiv (DSGVO/HIPAA)DIY + pgvector
Prototyp / HackathonMem0 OSS, lokales Chroma
Multi-Agenten-SystemMem0 (gemeinsame Speicherebene)

Durchsuchen Sie alle Speicher-Tools, Vektor-Datenbanken und Agenten-Frameworks auf AgDex.ai — über 420 KI-Agenten-Tools, organisiert nach Kategorien.

Ähnliche
ヒーロー
🧠 メモリガイド 2026年4月 🔥 人気急上昇

2026年におけるAIエージェントメモリシステム

Mem0 vs Zep vs Letta — さらにDIYパターンも紹介。AIエージェントに永続的かつインテリジェントなメモリを提供するために必要なすべてを解説します。

📅 2026年4月26日 ⏱ 読了時間 12 分 🖊 AgDex 編集部
目次

1. エージェントメモリが欠けているレイヤーである理由

すべてのLLMにはコンテキストウィンドウがあります。会話が終了すると、メモリは失われます。単発の問い合わせであれば問題ありませんが、数日、数週間、あるいは数ヶ月にわたってユーザーと対話するエージェントにとっては、致命的な問題となります。

永続メモリを必要とする以下のユースケースを考えてみましょう。

  • プロジェクトの構造、好みのパターン、および過去のバグを記憶しているコーディングアシスタント
  • ユーザーの注文履歴、過去の苦情、および好みを把握しているカスタマーサポートエージェント
  • ユーザーの習慣、カレンダーのパターン、およびコミュニケーションスタイルを学習するパーソナルアシスタント
  • 複数のセッションにわたって調査結果を蓄積するリサーチエージェント
⚠️ 単純なアプローチはすぐに破綻します: 過去のすべてのメッセージをコンテキストウィンドウに詰め込むと、約32K〜128Kトークンで限界に達し、コストが高くなり($$$)、さらに「中央での情報の埋没(lost in the middle)」問題によって検索品質が低下します。

解決策:コンテキストウィンドウとは独立して、適切なタイミングで適切なコンテキストを圧縮、インデックス化、および検索する専用のメモリレイヤーです。

2. AIエージェントメモリの4つのタイプ

タイプ保存するもの比喩実装方法
インコンテキスト(バッファ)最近の会話のやり取り作業メモリプロンプト内の最後のN個のメッセージ
エピソードメモリ過去の出来事と相互作用日記ベクトルDB + タイムスタンプ
意味メモリ事実、好み、知識個人用の百科事典ナレッジグラフ / ベクトルDB
手続き型メモリスキル、ワークフロー、指示筋肉記憶システムプロンプト + ファインチューニング

プロダクション環境のエージェントには、これら4つのレイヤーすべてが必要です。それぞれのレイヤーに最適なツールを見ていきましょう。

3. Mem0 — 簡単に導入できる永続メモリ

⭐ Mem0の1行紹介

会話から関連する記憶を自動的に抽出、保存、および検索するインテリジェントなメモリレイヤー。わずか3行のコードで統合できます。

Mem0(旧mem0ai)は、2026年時点でLLMエージェント向けに最も広く利用されているオープンソースのメモリソリューションです。LLMを使用して記憶すべき価値のある情報を自動的に特定し、ベクトルデータベースに構造化された記憶として事実を保存します。

クイックスタート

pip install mem0ai
from mem0 import Memory
from openai import OpenAI

# Mem0の初期化(デフォルトでローカルのベクトルストアを使用)
mem = Memory()

# またはカスタム構成を使用(本番環境用)
config = {
    "llm": {
        "provider": "openai",
        "config": {
            "model": "deepseek-chat",
            "api_key": "your-key",
            "base_url": "https://api.deepseek.com"
        }
    },
    "vector_store": {
        "provider": "qdrant",
        "config": {"host": "localhost", "port": 6333}
    }
}
mem = Memory.from_config(config)

# 会話から記憶を追加する
messages = [
    {"role": "user", "content": "JavaScriptよりもPythonの方が好きで、RAGアプリを作っています"},
    {"role": "assistant", "content": "了解しました!RAGアプリにはPythonのコード例を使用します。"}
]
mem.add(messages, user_id="user_123")
# Mem0が自動的に抽出:「Pythonを好む」+「RAGアプリを構築中」

# 関連する記憶の検索
memories = mem.search("何語を使うべきですか?", user_id="user_123")
for m in memories:
    print(f"[{m['score']:.2f}] {m['memory']}")
# → [0.95] ユーザーはJavaScriptよりPythonを好む
# → [0.87] ユーザーはRAGアプリケーションを構築している

エージェントへのMem0の統合

from openai import OpenAI
from mem0 import Memory

client = OpenAI(api_key="your-key", base_url="https://api.deepseek.com")
mem = Memory()

def chat_with_memory(user_message: str, user_id: str) -> str:
    # 1. 関連する記憶を検索
    relevant = mem.search(user_message, user_id=user_id, limit=5)
    memory_context = "
".join([f"- {m['memory']}" for m in relevant])

    # 2. メモリコンテキストを使用してプロンプトを構築
    system = f"""あなたは親切なパーソナルアシスタントです。

このユーザーについて知っていること:
{memory_context if memory_context else 'まだ何もありません。'}

このコンテキストを使用して、回答をパーソナライズしてください。"""

    # 3. LLMの応答を取得
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "system", "content": system},
            {"role": "user", "content": user_message}
        ]
    )
    answer = response.choices[0].message.content

    # 4. このやり取りから新しい記憶を保存
    mem.add([
        {"role": "user", "content": user_message},
        {"role": "assistant", "content": answer}
    ], user_id=user_id)

    return answer

# セッション1
print(chat_with_memory("私はピーナッツアレルギーです", user_id="alice"))
# セッション2(数日後 — メモリは保持される)
print(chat_with_memory("スナックを提案して", user_id="alice"))
# → "ピーナッツアレルギーとのことですので、お勧めは..."

4. Zep — 時系列ナレッジグラフ

🔵 Zepの1行紹介

エンティティ、関係、および事実の経時変化を追跡するナレッジグラフベースのメモリ。構造化された情報の呼び出しを必要とするエンタープライズアプリケーションに最適です。

Zepは単なるベクトル検索にとどまりません。エンティティ(人、製品、組織)とその関係の時系列ナレッジグラフを構築し、矛盾や事実の更新を自動的に処理します(例:「ユーザーは以前Googleで働いていたが、現在はAnthropicで働いている」)。

Zepの統合

pip install zep-python
from zep_python import ZepClient
from zep_python.memory import Memory, Message, Session

client = ZepClient(api_key="your-zep-key")  # またはセルフホスト

# セッションの作成
session_id = "user_alice_session_001"
client.memory.add_session(Session(session_id=session_id,
                                   metadata={"user_id": "alice"}))

# メモリにメッセージを追加
messages = [
    Message(role="human", content="Stripeでシニアエンジニアに昇進しました"),
    Message(role="ai", content="Stripeでのご昇進おめでとうございます!")
]
client.memory.add_memory(session_id, Memory(messages=messages))

# メモリの検索(意味的+時系列)
results = client.memory.search_memory(session_id, "アリスの仕事は何ですか?")
for r in results.results:
    print(f"[{r.dist:.2f}] {r.message.content}")

# エンティティに関する事実を取得(ナレッジグラフ)
facts = client.memory.get_session_facts(session_id)
for fact in facts.facts:
    print(f"事実: {fact.fact} | 有効: {fact.valid_at} → {fact.invalid_at or '現在'}")

Zepナレッジグラフのクエリ

# ユーザーのすべてのセッションにわたってエンティティを照会する
graph_results = client.graph.search(
    user_id="alice",
    query="職位と雇用主",
    scope="edges"  # エンティティ間の関係
)
for edge in graph_results.edges:
    print(f"{edge.source_node_name} --[{edge.fact}]--> {edge.target_node_name}")

5. Letta (MemGPT) — OSライクなメモリを備えたステートフルエージェント

🟢 Lettaの1行紹介

OSにインスパイアされたメモリ設計(インコンテキスト作業メモリ、アーカイブストレージ、およびエージェントが自律的に使用するメモリツール)を備えたエージェントフレームワーク。

Letta(旧MemGPT)はメモリをオペレーティングシステムのように扱います。エージェントは、制限された「RAM」(コンテキストウィンドウ)と無限の「ディスク」(アーカイブストレージ)を持ちます。エージェント自身が、組み込みのメモリツールを使用してメモリをいつ出し入れ(ページング)するかを決定します。

pip install letta-client
from letta_client import Letta

# Lettaサーバーに接続(ローカルまたはクラウド)
client = Letta(token="your-token", base_url="https://app.letta.com")

# メモリを備えたステートフルエージェントを作成
agent = client.agents.create(
    name="personal_assistant",
    memory_blocks=[
        {
            "label": "human",
            "value": "名前: アリス
職業: Stripeのシニアエンジニア",
            "limit": 2000
        },
        {
            "label": "persona",
            "value": "あなたはユーザーに関するすべてを記憶している、親切なパーソナルアシスタントです。",
            "limit": 1000
        }
    ],
    model="deepseek-chat",
    embedding="openai/text-embedding-3-small"
)

# チャット — Lettaがすべてのメモリを自動的に管理します
response = client.agents.messages.create(
    agent_id=agent.id,
    messages=[{"role": "user", "content": "私について何を知っていますか?"}]
)
for msg in response.messages:
    if msg.message_type == "assistant_message":
        print(msg.content)
# → "あなたはStripeのシニアエンジニアであるアリスです..."

# エージェントは古い記憶を自律的にアーカイブし、関連する記憶を検索します
# core_memory_append、archival_memory_insert、archival_memory_search などのツールを使用します

6. DIY Memory with Redis + pgvector

🟣 DIYを選択すべきケース

メモリの構造、保存、および検索を完全に制御できます。特定のコンプライアンス要件がある場合や、依存関係を最小限に抑えたい場合に最適です。

import json, time
import psycopg2
import redis
from openai import OpenAI

client = OpenAI(api_key="your-key", base_url="https://api.deepseek.com")

# 高速な短期メモリ用のRedis(直近N回のやり取り)
r = redis.Redis(host="localhost", port=6379, decode_responses=True)

# 長期的な意味メモリ用のpgvector
conn = psycopg2.connect("postgresql://user:pass@localhost/agentdb")
cur = conn.cursor()

# セットアップ(1回のみ実行)
cur.execute("""
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE IF NOT EXISTS agent_memories (
    id SERIAL PRIMARY KEY,
    user_id VARCHAR(255),
    content TEXT,
    embedding vector(1536),
    created_at TIMESTAMP DEFAULT NOW(),
    memory_type VARCHAR(50)  -- 'fact' | 'episode' | 'preference'
);
CREATE INDEX ON agent_memories USING ivfflat (embedding vector_cosine_ops);
""")
conn.commit()

def embed(text: str) -> list[float]:
    resp = client.embeddings.create(input=text, model="text-embedding-3-small")
    return resp.data[0].embedding

def store_memory(user_id: str, content: str, memory_type: str = "episode"):
    emb = embed(content)
    cur.execute(
        "INSERT INTO agent_memories (user_id, content, embedding, memory_type) VALUES (%s, %s, %s, %s)",
        (user_id, content, emb, memory_type)
    )
    conn.commit()

def retrieve_memories(user_id: str, query: str, top_k: int = 5) -> list[str]:
    query_emb = embed(query)
    cur.execute("""
        SELECT content, 1 - (embedding <=> %s::vector) AS similarity
        FROM agent_memories
        WHERE user_id = %s
        ORDER BY embedding <=> %s::vector
        LIMIT %s
    """, (query_emb, user_id, query_emb, top_k))
    return [row[0] for row in cur.fetchall()]

def add_to_buffer(user_id: str, role: str, content: str, max_turns: int = 10):
    key = f"buffer:{user_id}"
    r.rpush(key, json.dumps({"role": role, "content": content, "ts": time.time()}))
    r.ltrim(key, -max_turns * 2, -1)  # 直近のNターンを保持

def get_buffer(user_id: str) -> list[dict]:
    key = f"buffer:{user_id}"
    return [json.loads(m) for m in r.lrange(key, 0, -1)]

# レイヤー化されたメモリを備えた完全なエージェント
def agent_reply(user_id: str, user_message: str) -> str:
    # レイヤー1:直近のバッファ(短期)
    buffer = get_buffer(user_id)
    buffer_text = "
".join([f"{m['role']}: {m['content']}" for m in buffer[-6:]])

    # レイヤー2:関連する長期記憶(意味的)
    long_term = retrieve_memories(user_id, user_message)
    lt_text = "
".join([f"- {m}" for m in long_term])

    system = f"""あなたはメモリを備えた親切なアシスタントです。

最近の会話:
{buffer_text}

このユーザーに関する長期記憶:
{lt_text if lt_text else 'まだありません。'}"""

    resp = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "system", "content": system},
            {"role": "user", "content": user_message}
        ]
    )
    answer = resp.choices[0].message.content

    # 両方のレイヤーに保存
    add_to_buffer(user_id, "user", user_message)
    add_to_buffer(user_id, "assistant", answer)
    store_memory(user_id, f"ユーザーの発言: {user_message}", "episode")

    return answer

7. 完全比較:Mem0 vs Zep vs Letta vs DIY

評価項目Mem0ZepLettaDIY
セットアップの複雑さ⭐(3行)⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
メモリタイプ事実/意味メモリナレッジグラフOSにインスパイアされたレイヤーカスタム
時系列追跡制限あり✅ 非常に優秀制限ありカスタム
自動抽出✅ LLMベース✅ LLMベース✅ エージェント主導❌ 手動
セルフホスト
マルチユーザー対応カスタム
LangChain連携一部対応カスタム
本番環境での利用性状況による
最適なユースケースクイックスタート、チャットボットエンタープライズ、構造化データ長期実行エージェントコンプライアンス/制御重視
料金体系オープンソース + クラウドオープンソース + クラウドオープンソース + クラウドインフラコストのみ

8. 本番環境のメモリ設計パターン

2026年における本番環境のAIアシスタントに推奨されるメモリスタックは以下の通りです:

┌────────────────────────────────────────────────────────┐
│                    ユーザーメッセージ                  │
└──────────────────────────┬─────────────────────────────┘
                           │
              ┌────────────▼────────────┐
              │   レイヤー1:バッファ   │  ← Redis(直近10ターン、〜1ms)
              │   (作業メモリ)        │
              └────────────┬────────────┘
                           │
              ┌────────────▼────────────┐
              │   レイヤー2:意味メモリ │  ← Mem0 / pgvector(上位5つの事実、〜50ms)
              │   (長期メモリ)        │
              └────────────┬────────────┘
                           │
              ┌────────────▼────────────┐
              │   レイヤー3:ナレッジ   │  ← Zep(エンティティ関係、〜100ms)
              │   (構造化された事実)  │    エンタープライズユースケースのみ
              └────────────┬────────────┘
                           │
              ┌────────────▼────────────┐
              │   LLM (DeepSeek V4)     │  ← 構築されたコンテキスト → 応答
              └────────────┬────────────┘
                           │
              ┌────────────▼────────────┐
              │      メモリの更新       │  ← 非同期バックグラウンド処理
              │    (抽出 + 保存)     │    応答をブロックしない
              └─────────────────────────┘
💡 実装の鉄則:
  1. まずはMem0から開始する — 3行で統合でき、90%のユースケースで十分に機能します
  2. エンティティの追跡や事実の矛盾処理が必要な場合はZepを追加する
  3. エージェントが数日または数週間にわたって自律的に実行される場合はLettaを使用する
  4. メモリへの書き込みは常に非同期で行う — ストレージの遅延が応答時間に影響しないようにします
  5. メモリのTTL(生存期間) — エピソードメモリには有効期限(1年など)を設定し、意味メモリは永続的に保持します

クイック判断:どれを選ぶべきか?

ユースケース推奨される選択肢
パーソナルアシスタント / チャットボットMem0(マネージドクラウド)
エンタープライズCRM / サポートZep + セルフホスト
長期実行する自律型エージェントLetta
コンプライアンス重視(GDPR/HIPAAなど)DIY + pgvector
プロトタイプ / ハッカソンMem0 OSS、ローカルのChroma
マルチエージェントシステムMem0(共有メモリレイヤー)

AgDex.ai で、すべてのメモリツール、ベクトルデータベース、およびエージェントフレームワークをご覧ください。カテゴリ別に整理された420以上のAIエージェントツールを掲載しています。

関連記事