MemGPT / Letta - Mémoire d’agent style système d’exploitation
MemGPT est la technique — et Letta le framework qui en est sorti — pour donner aux agents LLM une gestion de la mémoire style système d’exploitation. L’idée centrale : traiter la fenêtre de contexte comme de la RAM (rapide mais petite) et ajouter du « disque » sous la forme de mémoire archivistique interrogeable. L’agent lui-même décide, via des appels d’outils, ce qui rester dans le contexte principal et ce qui paginer vers le stockage, lui permettant de maintenir une mémoire à long terme cohérente bien au-delà de la limite de contexte brute. (Le projet est maintenant développé comme Letta.)
Installation
| Méthode | Commande |
|---|
| pip | pip install letta |
| Exécuter le serveur | letta server |
| Docker | docker run -p 8283:8283 letta/letta:latest |
| ADE (interface Web) | connecter l’environnement de développement d’agent au serveur |
| Vérifier | letta version |
Architecture de la mémoire
| Tier | Analogie | Contenu |
|---|
| Main context (core memory) | RAM | Persona + faits clés toujours dans l’invite |
| Recall memory | Fichiers récents | Historique de conversation, interrogeable |
| Archival memory | Disque | Faits arbitraires à long terme, interrogeables |
| L’agent | Le système d’exploitation | Décide ce paginer entrée/sortie via des outils |
Mémoire centrale (toujours en contexte)
| Block | Objectif |
|---|
persona | Qui est l’agent / comment il se comporte |
human | Ce qu’il sait sur l’utilisateur |
| Custom blocks | Faits spécifiques au domaine toujours présents |
L’agent modifie ces blocs avec des outils (core_memory_append, core_memory_replace) en apprenant.
Créer un agent
from letta_client import Letta
client = Letta(base_url="http://localhost:8283")
agent = client.agents.create(
name="assistant",
memory_blocks=[
{"label": "persona", "value": "Je suis un assistant concis et utile."},
{"label": "human", "value": "Le nom de l'utilisateur est Nick."},
],
model="openai/gpt-4o",
embedding="openai/text-embedding-3-small",
)
Messaging et outils de mémoire
response = client.agents.messages.create(
agent_id=agent.id,
messages=[{"role": "user", "content": "Souviens-toi que je préfère le mode sombre."}],
)
| Tool (agent-invoked) | Action |
|---|
core_memory_append | Ajouter à un bloc toujours-en-contexte |
core_memory_replace | Mettre à jour un bloc de mémoire centrale |
archival_memory_insert | Stocker un fait à l’archivistique (disque) |
archival_memory_search | Récupérer à partir de la mémoire archivistique |
conversation_search | Rechercher la mémoire de rappel |
Mémoire archivistique
| Commande | Description |
|---|
client.agents.passages.create(agent_id, text=...) | Insérer une mémoire archivistique |
client.agents.passages.list(agent_id) | Lister les passages stockés |
| Agent search | L’agent appelle automatiquement archival_memory_search quand pertinent |
Persistance et état
| Fonctionnalité | Remarque |
|---|
| Stateful agents | L’état de l’agent persiste sur le serveur entre les sessions |
| Storage | SQLite par défaut ; PostgreSQL pour la production |
| Export/import | Sérialiser les agents pour les déplacer entre les déploiements |
| Multi-agent | Exécuter et coordonner plusieurs agents stateful |
Workflows courants
# Un assistant long terme qui se souvient entre les sessions
# 1) créer une fois avec les blocs persona/human
# 2) chaque session, envoyer juste des messages — Letta gère la pagination de mémoire
client.agents.messages.create(agent_id=agent.id,
messages=[{"role": "user", "content": "Que te souviens-tu de moi ?"}])
# l'agent cherche le rappel/archivistique et répond avec un contexte persistant
MemGPT/Letta vs autre mémoire
| Aspect | Letta (MemGPT) | Mem0 | Zep |
|---|
| Modèle | Pagination style OS, gérée par agent | Multi-tier store | Graphe temporel |
| Statefulness | Agents côté serveur | Library | Service |
| Control | L’agent décide la pagination | L’app décide | Le service gère |
| Meilleur pour | Agents autonomes long terme | Personnalisation | Faits temporels |
Ressources