Quand on parle d'« agent IA avec mémoire », beaucoup imaginent une seule base vectorielle et un retrieval magique. En pratique, cela ne suffit presque jamais.

Pour Volna, mon agent Telegram, la mémoire est structurée en plusieurs couches différentes. Parce que dans un dialogue réel, il faut résoudre trois problèmes à la fois : stocker des faits à long terme, garder le contexte récent à portée de main et ne pas surcharger le modèle avec des tokens inutiles.


La mémoire de Volna se compose schématiquement de 4 parties :

- Blocs permanents dans Letta. Ce sont deux blocs de base d'environ 3 000 caractères chacun.

Le premier est le portrait de l'utilisateur : qui il est, ce qu'il fait, ce qui est important pour lui, ses intérêts et contextes stables.

Le second est le profil de Volna elle-même : style de communication, règles de comportement, comment elle réagit aux corrections et ce qu'elle considère important dans le dialogue.

- Mémoire d'archive. C'est une couche pour les faits détaillés qu'il n'est pas nécessaire de garder en permanence dans le prompt, mais qu'il est important de pouvoir retrouver rapidement. La recherche est sémantique, avec un reclassement par fraîcheur pour éviter qu'un fait ancien mais similaire n'écrase un fait plus récent.

- Journal épisodique quotidien. Après chaque dialogue, le système extrait des faits courts et les écrit dans un fichier markdown. Y sont consignées les décisions, préférences, réactions explicites. Au démarrage d'une nouvelle session, seuls les 3 derniers jours sont renvoyés dans le contexte, et uniquement sous forme compressée.

- Graphe de relations dans Neo4j. Un réseau d'entités est construit séparément : personnes, projets, entreprises, thèmes, outils, événements. Si dans un message je mentionne quelque chose de familier, Volna essaie de remonter les entités et relations associées. En substance, c'est une couche non pas de « mémoire des faits », mais de « mémoire de la structure ».


L'idée clé est que ces couches ne sont pas mélangées de la même manière dans le modèle.

Lorsque la session est réinitialisée ou que le contexte est réduit, Volna reconstruit le tableau. En fonctionnement normal, elle ne traîne pas tout le dump mémoire, mais utilise un cache de base et le contexte dynamique du message.

C'est important à la fois pour la qualité et la rapidité. Si on donne toujours au modèle toute la mémoire en une fois, il commence à se noyer dans son propre passé. Si au contraire on ne garde qu'un seul résumé court, on perd la sensation de continuité de la conversation.


J'apprécie particulièrement la façon dont est organisée la mise à jour de la mémoire après la réponse. Elle se fait de manière asynchrone, en arrière-plan. C'est-à-dire que l'utilisateur a déjà reçu le message, tandis que le système effectue en parallèle plusieurs opérations :
- extraire les faits de l'échange,
- compléter le journal quotidien,
- envoyer le dialogue à Letta pour mettre à jour la mémoire à long terme,
- et mettre à jour le graphe d'entités.

De plus, il existe plusieurs limiteurs utiles. Par exemple, les échanges trop courts peuvent ne pas du tout être pris en compte dans l'extraction de faits. Et le nombre de faits dépend de la longueur du dialogue. C'est une chose simple, mais elle protège bien la mémoire des déchets.


Une autre couche importante est celle des instantanés de sessions. Lorsque la conversation se termine, le système enregistre un court instantané JSON : résumé, dernières répliques, nombre de tours, parfois des observations sur l'humeur ou le schéma comportemental. Lors de la réinitialisation suivante, cet instantané peut être renvoyé une fois dans le contexte pour donner l'impression que l'agent ne « s'est pas réveillé de zéro ».


Volna dispose également d'une couche de réflexion au-dessus de la mémoire.

Si la question est du type « comment l'attitude de Vlad envers le travail a-t-elle changé » ou « quelle est sa trajectoire en matière de santé », une simple recherche est trop faible : elle renvoie des morceaux, pas une compréhension.

Pour cela, il y a memory_reflect. Il commence par remonter un ensemble de souvenirs pertinents via une recherche sémantique, puis les transmet au modèle avec une tâche distincte : assembler un récit cohérent à partir d'enregistrements épars. En sortie, on obtient une courte interprétation de 2 à 5 paragraphes.


Et bien sûr, la mémoire doit être entretenue. Sinon, tout système de mémoire se transforme rapidement en un débarras numérique. D'où un processus de maintenance séparé.


Pour faire court, la mémoire de Volna n'est pas un seul prompt, ni une seule base, ni un seul retrieval. C'est un routage de différents types de mémoire avec des durées de vie, des coûts et des modes d'injection dans le contexte différents.


❗️❗️❗️❗️❗️❗️❗️❗️ / Non interdit en Fédération de Russie