Skip to Content
DesignAuto MemorySystème de gestion de la mémoire

Système de gestion de la mémoire

Ce document détaille le mécanisme de gestion de la mémoire, les conditions de déclenchement et les détails d’implémentation de Managed Auto-Memory (mémoire automatique managée) dans Qwen Code.


Table des matières

  1. Vue d’ensemble
  2. Structure de stockage
  3. Types de mémoire
  4. Format des entrées de mémoire
  5. Cycle de vie principal
  6. Extract — Extraction
  7. Dream — Consolidation
  8. Recall — Rappel
  9. Forget — Oubli
  10. Reconstruction de l’index
  11. Télémétrie

Vue d’ensemble

Managed Auto-Memory est un système de mémoire persistante qui accumule, consolide et récupère automatiquement les connaissances liées à l’utilisateur pendant les sessions IA. Il maintient le cycle de vie de la mémoire via quatre opérations principales :

OpérationTerme anglaisDéclenchementRôle
ExtractionExtractAutomatique (après chaque tour de conversation)Extrait les nouvelles connaissances des échanges et les écrit dans les fichiers de mémoire
ConsolidationDreamAutomatique (tâche de fond périodique)Déduplique et fusionne les fichiers de mémoire pour les garder propres
RappelRecallAutomatique (avant chaque tour de conversation)Récupère les mémoires pertinentes pour la requête actuelle et les injecte dans le prompt système
OubliForgetManuel (commande utilisateur /forget)Supprime précisément les entrées de mémoire spécifiées

Structure de stockage

Arborescence des répertoires

~/.qwen/ ← Répertoire de base global (par défaut) └── projects/ └── <sanitized-git-root>/ ← Identifiant du projet (basé sur le chemin racine Git) ├── meta.json ← Métadonnées (horodatages extraction/consolidation, état) ├── extract-cursor.json ← Curseur d'extraction (offset des conversations traitées) ├── consolidation.lock ← Mutex pour le processus Dream └── memory/ ← Répertoire principal de la mémoire ├── MEMORY.md ← Fichier d'index (généré automatiquement, résume toutes les entrées) ├── user.md ← Mémoire des préférences utilisateur (exemple) ├── feedback.md ← Mémoire des règles de feedback (exemple) ├── project/ │ └── milestone.md ← Mémoire du projet (sous-répertoires pris en charge) └── reference/ └── grafana.md ← Mémoire des ressources externes

Remplacement par variable d’environnement :

  • QWEN_CODE_MEMORY_BASE_DIR : remplace le répertoire de base global
  • QWEN_CODE_MEMORY_LOCAL=1 : utilise le chemin relatif au projet .qwen/memory/

Description des fichiers clés

FichierDescription
meta.jsonEnregistre l’heure, l’ID de session, les types de mémoire concernés et l’état d’exécution du dernier Extract / Dream
extract-cursor.jsonEnregistre l’offset de l’historique de conversation déjà traité pour éviter les extractions en double
consolidation.lockFichier de verrou pendant l’exécution de Dream, contient le PID du détenteur, expire automatiquement après 1 heure
MEMORY.mdIndex de tous les fichiers thématiques, reconstruit après chaque Extract/Dream, formaté en liste Markdown

Types de mémoire

Le système prend en charge quatre types de mémoire intégrés, chacun correspondant à une dimension d’information différente :

TypeContenu stockéÉcritureLecture
userRôle, compétences, habitudes de travail de l’utilisateurLorsque le rôle/les préférences/le contexte de l’utilisateur sont identifiésLorsque la réponse doit être adaptée au contexte de l’utilisateur
feedbackDirectives de l’utilisateur sur le comportement de l’IA : quoi éviter, quoi continuerLorsque l’utilisateur corrige l’IA ou valide une approche non évidenteLorsque cela influence la manière dont l’IA doit se comporter
projectAvancement, objectifs, décisions, échéances, suivi de bugs du projetLorsque l’on sait qui fait quoi, pourquoi et pour quandPour aider l’IA à comprendre le contexte et les motivations du travail
referencePointeurs vers des ressources externes (Dashboard, système de tickets, canal Slack, etc.)Lorsqu’une ressource externe et son utilité sont identifiéesLorsque l’utilisateur mentionne un système externe ou des informations connexes

Contenu à ne pas stocker en mémoire : conventions/modes de code, historique Git, stratégies de débogage, états de tâches temporaires, contenu déjà documenté dans QWEN.md/AGENTS.md.


Format des entrées de mémoire

Chaque fichier thématique utilise le format YAML frontmatter + corps Markdown :

--- name: Nom de la mémoire description: Description en une phrase (utilisée pour évaluer la pertinence du rappel, doit être précise) type: user|feedback|project|reference --- Contenu principal de la mémoire (ligne summary) Why: Raison sous-jacente (permet à l'IA de comprendre les cas limites au lieu de suivre aveuglément les règles) How to apply: Contextes d'application et méthode d'utilisation

Pour les types feedback et project, il est fortement recommandé de remplir Why et How to apply afin que la mémoire reste applicable même dans des cas limites.


Cycle de vie principal


Extract — Extraction

Conditions de déclenchement

Déclenché automatiquement (arrière-plan non bloquant) par scheduleAutoMemoryExtract après chaque réponse de l’IA.

Logique de planification (extractScheduler.ts)

Explication des raisons d’ignorage :

RaisonSignification
memory_toolL’agent principal a déjà écrit directement des fichiers mémoire ce tour, ignoré pour éviter les conflits
already_runningL’extraction est en cours et ne peut pas être mise en file d’attente
queuedUne extraction est déjà en cours, cette requête a été mise en file d’attente

Flux d’extraction principal (extract.ts)

Curseur d’extraction (Cursor) :

  • Champs : { sessionId, processedOffset, updatedAt }
  • processedOffset est mis à jour avec la longueur actuelle de l’historique après chaque extraction
  • Lors de la prochaine extraction, seuls les messages avec offset >= processedOffset sont traités
  • En cas de changement de session (sessionId modifié), le traitement reprend à l’offset 0

Règles de filtrage des patches :

  • Résumé de moins de 12 caractères → ignoré
  • Résumé se terminant par ? → ignoré (phrase interrogative)
  • Contient des mots-clés temporaires (today/now/currently/temporary, etc.) → ignoré
  • Combinaison topic:summary identique → dédupliqué

Dream — Consolidation

Conditions de déclenchement

Déclenché automatiquement (arrière-plan non bloquant) par scheduleManagedAutoMemoryDream après chaque réponse de l’IA. Protégé par plusieurs garde-fous, il est ignoré dans la plupart des cas.

Garde-fous de planification (dreamScheduler.ts)

Paramètres des garde-fous :

ParamètreValeur par défautDescription
minHoursBetweenDreams24 heuresIntervalle minimum entre deux Dream
minSessionsBetweenDreams5 sessionsNombre minimum de nouvelles sessions requis pour déclencher un Dream
SESSION_SCAN_INTERVAL_MS10 minutesIntervalle de throttling pour le scan des fichiers de session
DREAM_LOCK_STALE_MS1 heureSeuil d’expiration du fichier lock

Mécanisme de verrouillage :

  • Le fichier lock se trouve dans <project-state-dir>/consolidation.lock
  • Contient le PID du processus détenteur
  • Vérification : si le processus PID n’existe plus (kill(pid, 0) échoue) ou si le lock a plus d’1 heure → considéré comme expiré, supprimé automatiquement

Flux d’exécution de la consolidation (dream.ts)

Logique de déduplication mécanique :

  1. Pour chaque fichier thématique : déduplication par summary.toLowerCase(), fusion des champs why/howToApply
  2. Retri par ordre alphabétique des summaries
  3. Inter-fichiers : les entries avec le même type:summary sont fusionnées dans le premier fichier détecté, les fichiers en double sont supprimés

Recall — Rappel

Conditions de déclenchement

Déclenché automatiquement par resolveRelevantAutoMemoryPromptForQuery avant que l’IA ne traite la requête de l’utilisateur, pour injecter les mémoires pertinentes dans le prompt système.

Flux de rappel (recall.ts)

Règles de scoring (heuristique) :

ConditionPoints
Token de la query présent dans le contenu du document+2 (par token)
Token de la query est un mot-clé caractéristique du type+1 (par token)
Body du document non vide+1

Mots-clés caractéristiques par type :

  • user : user, preference, background, role, terse
  • feedback : feedback, rule, avoid, style, summary
  • project : project, goal, incident, deadline, release
  • reference : reference, dashboard, ticket, docs, link

Règles de construction du Prompt :

  • Maximum 5 documents injectés (MAX_RELEVANT_DOCS)
  • Body de chaque document tronqué à 1200 caractères (MAX_DOC_BODY_CHARS)
  • En cas de troncature, ajout de la mention : “NOTE: Relevant memory truncated for prompt budget.”
  • Inclut les informations de fraîcheur du document (basées sur le mtime du fichier)

Forget — Oubli

Conditions de déclenchement

Déclenché manuellement par l’utilisateur via la commande /forget <query>.

Flux d’oubli (forget.ts)

Conception des Entry ID :

  • Fichier à entrée unique (cas courant) : relativePath (ex. feedback/no-summary.md)
  • Fichier à entrées multiples : relativePath:index (ex. feedback/style.md:2)
  • L’utilisation d’ID stables permet au modèle de cibler précisément une entrée sans affecter les autres entrées du même fichier

Reconstruction de l’index

MEMORY.md est l’index de navigation de tous les fichiers thématiques. Il est reconstruit après chaque Extract ou Dream via rebuildManagedAutoMemoryIndex :

- [Préférences utilisateur](user/preferences.md) — L'utilisateur est un ingénieur Go senior, découvre React - [Règles de feedback](feedback/style.md) — Garder les réponses concises, pas de résumé en fin de message - [Jalons du projet](project/milestone.md) — Fenêtre de gel avant merge pour la release mobile

Limites de l’index :

  • Maximum 150 caractères par ligne (tronqué avec si dépassé)
  • Maximum 200 lignes
  • Taille totale ne dépassant pas 25 000 octets

Télémétrie

Le système intègre trois types d’événements de télémétrie pour surveiller les performances et l’efficacité des opérations de mémoire :

Télémétrie Extract

ChampTypeDescription
trigger'auto'Mode de déclenchement (actuellement uniquement automatique)
status'completed' | 'failed'Résultat de l’exécution
patches_countnumberNombre de patches valides extraits
touched_topicsstring[]Liste des types de mémoire modifiés
duration_msnumberDurée totale (millisecondes)

Télémétrie Dream

ChampTypeDescription
trigger'auto'Mode de déclenchement
status'updated' | 'noop' | 'failed'Résultat de l’exécution
deduped_entriesnumberNombre d’entrées dédupliquées (chemin mécanique)
touched_topicsstring[]Liste des types de mémoire modifiés
duration_msnumberDurée totale (millisecondes)

Télémétrie Recall

ChampTypeDescription
query_lengthnumberLongueur de la chaîne de requête
docs_scannednumberNombre total de documents analysés
docs_selectednumberNombre final de documents injectés
strategy'none' | 'heuristic' | 'model'Stratégie de sélection
duration_msnumberDurée totale (millisecondes)

Index des fichiers sources

FichierResponsabilité
packages/core/src/memory/types.tsDéfinitions de types : AutoMemoryType, AutoMemoryMetadata, AutoMemoryExtractCursor
packages/core/src/memory/paths.tsCalcul de chemins : getAutoMemoryRoot, isAutoMemPath, helpers pour divers chemins de fichiers
packages/core/src/memory/store.tsInitialisation du scaffolding : ensureAutoMemoryScaffold, lecture/écriture index/métadonnées
packages/core/src/memory/scan.tsScan des fichiers thématiques : scanAutoMemoryTopicDocuments, analyse du frontmatter
packages/core/src/memory/entries.tsAnalyse et rendu des entrées : parseAutoMemoryEntries, renderAutoMemoryBody
packages/core/src/memory/extract.tsLogique principale d’extraction : runAutoMemoryExtract, gestion du curseur, déduplication des patches
packages/core/src/memory/extractScheduler.tsPlanificateur d’extraction : ManagedAutoMemoryExtractRuntime, file d’attente/machine d’états d’exécution
packages/core/src/memory/extractionAgentPlanner.tsAgent d’extraction : runAutoMemoryExtractionByAgent
packages/core/src/memory/dream.tsLogique principale de consolidation : runManagedAutoMemoryDream, chemin Agent + déduplication mécanique
packages/core/src/memory/dreamScheduler.tsPlanificateur de consolidation : ManagedAutoMemoryDreamRuntime, vérification des garde-fous, gestion des locks
packages/core/src/memory/dreamAgentPlanner.tsAgent de consolidation : planManagedAutoMemoryDreamByAgent
packages/core/src/memory/recall.tsLogique de rappel : resolveRelevantAutoMemoryPromptForQuery, double chemin heuristique + modèle
packages/core/src/memory/forget.tsLogique d’oubli : forgetManagedAutoMemoryEntries, génération de candidats + suppression précise
packages/core/src/memory/indexer.tsReconstruction d’index : rebuildManagedAutoMemoryIndex, buildManagedAutoMemoryIndex
packages/core/src/memory/prompt.tsTemplates de prompt système : description des types de mémoire, exemples de format, règles d’utilisation
packages/core/src/memory/governance.tsTypes de suggestions de gouvernance : AutoMemoryGovernanceSuggestionType
packages/core/src/memory/state.tsÉtat d’exécution de l’extraction : isExtractRunning, markExtractRunning, clearExtractRunning
packages/core/src/memory/memoryAge.tsDescription de la fraîcheur : memoryAge, memoryFreshnessText
Last updated on