Memora : un système de mémoire extensible pour les tâches de longue durée
(github.com/microsoft)Vue d’ensemble
-
Objectif
- Un framework de mémoire qui aide les agents IA à extraire automatiquement les informations nécessaires depuis des conversations et des documents, puis à les stocker et les retrouver sur le long terme
-
Conception centrale
- Le
Memory value, c’est-à-dire le texte source complet, est conservé tel quel, tandis que la recherche utilise laPrimary abstractionet lesCue anchors
- Le
-
Principaux différenciateurs
- Une architecture qui vise à réduire la perte d’information et l’ambiguïté de recherche par rapport au RAG classique, qui embarque directement tout le texte source
-
Fonctionnalités principales
- Extraction automatique de mémoires, déduplication, fusion et mise à jour, recherche sémantique, recherche par mots-clés, recherche multi-étapes basée sur un LLM
-
Cas d’usage
- IA conversationnelle de longue durée, systèmes multi-agents, services personnalisés, gestion des connaissances à partir de documents
-
État actuel
- Projet open source en Python sous licence MIT, incluant des benchmarks et des fonctionnalités expérimentales, mais encore proche d’une phase de publication initiale
Introduction
Résoudre la complexité de la gestion de mémoire des agents
-
Dans le développement d’agents IA existants, les développeurs doivent gérer eux-mêmes les problèmes suivants
- Décider quelles informations stocker en mémoire
- Déterminer quand mettre à jour ou supprimer les informations stockées
- Retrouver les souvenirs pertinents pour une question utilisateur
- Gérer les souvenirs redondants ou contradictoires
-
Memora vise à gérer ce cycle de vie de la mémoire au sein du framework
-
Les développeurs peuvent se concentrer sur les fonctions métier de l’agent et la génération de réponses plutôt que sur la logique bas niveau de stockage et de recherche
Limites des architectures de mémoire existantes
-
Systèmes RAG classiques
- Découper les documents ou les conversations brutes en morceaux d’une taille donnée
- Embarquer chaque morceau et le stocker dans une base de données vectorielle
- Rechercher les morceaux sémantiquement proches de la question
-
Cette approche est simple à mettre en œuvre, mais peut entraîner les problèmes suivants
- Les contextes longs sont séparés en plusieurs morceaux
- Les informations formulées de manière similaire sont stockées en double
- Une simple similarité sémantique peut ne pas correspondre à l’intention réelle de la question
- Ne stocker que des résumés compressés peut entraîner une perte de détails
-
Les bases de connaissances de type graphe sont avantageuses pour représenter les relations, mais imposent de gérer en continu le schéma et la structure relationnelle
Développement
Séparer le texte source de la structure de recherche
- Chaque mémoire dans Memora se compose de trois éléments
Memory value
- L’ensemble des informations effectivement stockées
- Préserve le texte source et les détails sans les compresser
- N’est pas inclus directement dans l’index de recherche
- Sert à conserver le contexte d’origine sans perte d’information
Primary abstraction
- Résumé représentatif indiquant de quoi traite cette mémoire
- Généré une fois pour chaque mémoire
- Utilisé comme base pour la recherche, la mise à jour, la fusion et la déduplication
- Sert d’unité standard représentant l’identité de la mémoire
Cue anchors
- Plusieurs indices sémantiques permettant d’accéder à une même mémoire
- Construits en combinant personnes, objets, événements, attributs clés, etc.
- Plusieurs indices peuvent être reliés à un même souvenir
- Forment une structure plusieurs-à-plusieurs où plusieurs souvenirs peuvent partager le même indice
Indexation sélective des cibles de recherche
-
Memora n’indexe pas directement tous les textes sources
-
La recherche effective n’utilise que les informations suivantes
- Primary abstraction
- Cue anchors
-
Une fois la recherche terminée, le
Memory valued’origine associé est renvoyé -
Objectifs de cette structure
- Séparer la représentation de recherche des informations réellement stockées
- Maintenir un index de recherche concis
- Préserver les détails du texte source tels quels
- Réduire le bruit sémantique pouvant provenir de l’embedding du texte source
Une forme intermédiaire entre RAG et structure de graphe
-
Fournit des indices de recherche plus structurés que le RAG classique
-
Ne définit pas toutes les relations dans un schéma strict comme une base de données graphe
-
Ajoute une couche d’abstraction au-dessus des souvenirs pour obtenir à la fois flexibilité et structuration
-
Orientation clé
- Stocker le texte source sous une forme libre
- Utiliser des représentations structurées pour la recherche et les connexions
- Gérer indépendamment la structure de stockage et la structure de recherche
Flux de traitement, de la création de mémoire à la réponse
1. Collecte de mémoire
-
L’agent traite une conversation ou un document
-
Il extrait automatiquement les informations suivantes du contenu
- Informations factuelles
- Événements et expériences
- Procédures et méthodes de travail
-
Les longues conversations sont découpées en épisodes par sujet
-
Les informations clés sont converties en éléments de mémoire structurés
2. Stockage intelligent
-
Utilise par défaut la base de données vectorielle ChromaDB comme stockage
-
Stocke les mémoires à l’aide d’embeddings sémantiques
-
Lorsqu’une nouvelle information est saisie, elle est comparée aux mémoires existantes
-
Pour les informations similaires ou redondantes, les opérations suivantes sont effectuées
- Déduplication
- Fusion avec les souvenirs existants
- Mise à jour des informations obsolètes
-
Peut créer en option un Cue index pour prendre en charge une recherche structurée
3. Recherche adaptative
- Fournit plusieurs stratégies de recherche selon le type de question et la configuration
Recherche Semantic
- Calcule la similarité vectorielle entre la question et les représentations de mémoire
- Simple à implémenter et applicable aux questions générales
- Peut trouver des informations sémantiquement similaires même lorsque la formulation diffère
Recherche Prompted
- Un LLM exécute le processus de recherche étape par étape
- Ajuste de manière itérative les mots-clés et le périmètre de recherche à partir des premiers résultats
- Adaptée aux questions complexes ou nécessitant de combiner plusieurs souvenirs
- Peut augmenter les coûts et le temps de réponse en raison d’appels LLM supplémentaires
Recherche Hybrid
- Combine la recherche sémantique vectorielle et la recherche BM25/par mots-clés
- Exploite à la fois la similarité sémantique et les correspondances exactes de mots
- Utile pour réduire les omissions lors de recherches sur des noms propres, noms de produits, code, dates, etc.
Recherche GRPO
- Utilise une politique de recherche entraînée par apprentissage par renforcement
- Apprend la manière même de sélectionner les mémoires nécessaires à une question
- Vise à remplacer la recherche itérative basée sur LLM par un modèle local fine-tuné
- Actuellement classée comme fonctionnalité expérimentale
4. Génération de réponse
- Les mémoires retrouvées sont organisées selon un format défini
- Ce contenu est inséré dans le prompt du LLM
- Le LLM génère une réponse en utilisant à la fois la question et les souvenirs retrouvés
- La réponse est guidée pour s’appuyer sur les mémoires stockées
Fonctions de gestion pour maintenir la qualité des mémoires
-
Contrairement à un stockage plat qui se contente d’ajouter des mémoires, Memora gère l’état des mémoires existantes
-
Principales fonctions de gestion
- Suppression des souvenirs redondants
- Fusion des souvenirs similaires
- Mise à jour des faits modifiés
- Réorganisation de la structure de mémoire
-
Utilise la
Primary abstractioncomme référence pour la mise à jour et l’intégration des mémoires -
Vise à réduire l’accumulation illimitée de doublons au fil du temps
Prise en charge de différents types de mémoire
- En configurant différemment les valeurs de mémoire et les modes d’abstraction, il est possible de représenter plusieurs types de souvenirs
Mémoire factuelle
- Informations relativement stables telles que personnes, lieux, attributs et paramètres
- Exemples : lieu de travail d’un utilisateur donné, outils préférés, stack technique d’un projet
Mémoire épisodique
- Événements ou conversations survenus à un moment précis
- Exemples : décisions prises lors d’une réunion passée, processus de résolution d’une erreur donnée
Mémoire procédurale
- Méthodes de travail ou procédures reproductibles
- Exemples : procédure de déploiement serveur, ordre de vérification des erreurs, règles de génération de documents
Partage et isolation de la mémoire en multi-agent
-
Plusieurs agents opérant dans le même environnement peuvent utiliser un espace mémoire commun
-
Les informations stockées par un agent peuvent être réutilisées par un autre agent
-
Le périmètre de mémoire peut aussi être limité par agent ou par rôle
-
Effets attendus
- Réduction de la duplication de connaissances entre agents
- Amélioration de la passation de tâches
- Maintien de la cohérence des informations de projet partagées
-
Une structure qui prend en charge le partage sélectif et la protection des données personnelles via des fonctions de contrôle d’accès et d’isolation
Séparation entre infrastructure de stockage et structure de représentation
-
Conçu pour que le mode de représentation de la mémoire ne soit pas fortement dépendant d’un stockage particulier
-
La structure du projet inclut des fonctions de connexion aux bases de données suivantes
- ChromaDB
- Redis
-
Applicable à des environnements de stockage locaux ou distants
-
Même en changeant de backend de stockage, la structure d’abstraction et d’indices des mémoires peut être conservée
Utilisation de base
- Nécessite Python 3.10 ou supérieur
- Cloner le dépôt GitHub, puis installer le package
- Créer un
MemoraClientet préciser un identifiant utilisateur ou agent - Utiliser
add()pour ajouter des conversations ou des documents à la mémoire - Utiliser
query()pour effectuer une recherche sémantique - Utiliser
advance_query()pour effectuer une recherche avancée de type Prompted ou GRPO
Structure d’intégration avec un agent
-
Lorsqu’un message utilisateur est reçu, rechercher d’abord les mémoires pertinentes
-
Générer une réponse à partir des résultats de recherche et de la question utilisateur
-
Constituer un historique de conversation avec la réponse générée et le message utilisateur
-
Stocker à nouveau cette conversation dans Memora
-
Processus itératif
- Réception de la question
- Recherche des souvenirs pertinents
- Génération de la réponse
- Stockage de la conversation
- Réutilisation lors des questions suivantes
Évaluation des performances de mémoire long terme
Benchmark LoCoMo
-
Évalue la capacité de recherche de souvenirs dans des conversations qui se prolongent sur la durée
-
Principaux types d’évaluation
- Questions en une seule étape
- Questions multi-étapes combinant plusieurs informations
- Questions sur des relations temporelles
- Questions ouvertes
-
Permet d’expérimenter des combinaisons de Semantic, Prompted, Cue index, etc.
Benchmark LongMemEval
- Évalue la capacité d’un système de mémoire long terme à traiter différents types de questions
- Peut appliquer des paramètres de mémoire épisodique et de recherche sémantique
- Sert à vérifier la conservation des informations et les performances de recherche dans un environnement réel de conversation longue durée
Apprentissage d’une politique de recherche basée sur GRPO
-
Fonctionnalité expérimentale qui apprend la procédure de recherche sous forme de politique d’apprentissage par renforcement
-
Étapes de traitement
- Générer un chemin de recherche avec la politique actuelle
- Évaluer la justification, les redondances et le coût des résultats de recherche
- Calculer l’avantage relatif de groupe
- Entraîner la politique de recherche selon l’approche GRPO
-
Présente comme exemples des modèles de la famille Qwen 3B ou 7B et un fine-tuning LoRA
-
Nécessite un GPU pour l’entraînement
-
Objectifs
- Réduire le coût des appels à un LLM externe à chaque recherche
- Construire une stratégie de recherche optimisée pour des données et des tâches spécifiques
-
Limites
- Nécessite des données d’entraînement et des critères d’évaluation
- Ajoute la gestion de l’entraînement et de l’exploitation du modèle
- Plus complexe que la recherche Semantic pour un utilisateur généraliste
Principaux avantages
- Peut préserver les détails du texte source sans les compresser
- Structure de mémoire claire grâce à la séparation entre représentation de recherche et informations réelles
- Permet de gérer systématiquement la déduplication et la mise à jour des mémoires
- Permet de choisir entre recherche sémantique, recherche par mots-clés, recherche LLM et recherche par apprentissage par renforcement
- Permet de gérer des mémoires factuelles, épisodiques et procédurales dans un même framework
- Plusieurs agents peuvent partager les mêmes souvenirs
- Vise une intégration aux systèmes d’agents existants avec relativement peu de modifications
- Peut prendre en charge des architectures de stockage locales comme distantes
Limites structurelles et points d’attention
- La qualité des
Primary abstractionet desCue anchorsinfluence directement les performances de recherche - Si les abstractions générées automatiquement sont inexactes, le texte source peut être omis de la recherche même s’il est correct
- Une architecture qui n’indexe pas directement le texte source peut être défavorable à la recherche de formulations détaillées ou d’informations rares
- Lors de la déduplication et de la fusion, des événements différents peuvent être intégrés à tort dans un seul souvenir
- La recherche Prompted peut augmenter les coûts et la latence en raison de multiples appels LLM
- L’approche GRPO exige GPU, données d’entraînement et système d’évaluation, ce qui accroît la complexité opérationnelle
- La mémoire partagée multi-agent doit définir clairement les droits d’accès et l’isolation des informations
- Si des données personnelles ou des conversations sensibles sont stockées, des politiques distinctes de chiffrement, suppression et conservation sont nécessaires
- Le dépôt public n’a pas de release et présente peu de contributeurs et d’indicateurs d’usage, ce qui rend difficile de considérer sa stabilité à grande échelle comme suffisamment vérifiée
Conclusion
Une approche de mémoire long terme ajoutant une couche d’accès structurée
-
Memora s’écarte de la simple vectorisation de l’intégralité du texte source et propose la structure suivante
- Les détails sont conservés dans le
Memory value - Le sens représentatif est exprimé par la
Primary abstraction - Les différents chemins de recherche sont organisés via les
Cue anchors
- Les détails sont conservés dans le
-
Sa valeur centrale réside dans l’équilibre entre préservation de l’information et efficacité de recherche
-
Au-delà d’une simple recherche documentaire, il peut être particulièrement utile dans les environnements suivants
- Agents personnalisés interagissant avec l’utilisateur sur le long terme
- Systèmes accumulant en continu de nombreux documents de développement ou de travail
- Environnements où des agents aux rôles multiples partagent leurs connaissances
- Projets devant réutiliser des décisions passées et des procédures de travail
Validation nécessaire avant adoption
-
En cas d’application réelle, les éléments suivants doivent être vérifiés en priorité
- Qualité de l’abstraction et de la génération de Cue pour les documents en coréen
- Précision de recherche par rapport au RAG existant
- Taux d’erreur du processus de fusion des mémoires
- Croissance des données et vitesse de recherche en exploitation longue durée
- Coûts des API de LLM et d’embedding
- Modes de stockage des données personnelles et de contrôle d’accès
-
En phase initiale, il est pertinent de mener un petit PoC sur une partie des documents clés et de comparer les performances avec le RAG classique et la recherche hybride
Aucun commentaire pour le moment.