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
- Vue d’ensemble
- Structure de stockage
- Types de mémoire
- Format des entrées de mémoire
- Cycle de vie principal
- Extract — Extraction
- Dream — Consolidation
- Recall — Rappel
- Forget — Oubli
- Reconstruction de l’index
- 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ération | Terme anglais | Déclenchement | Rôle |
|---|---|---|---|
| Extraction | Extract | Automatique (après chaque tour de conversation) | Extrait les nouvelles connaissances des échanges et les écrit dans les fichiers de mémoire |
| Consolidation | Dream | Automatique (tâche de fond périodique) | Déduplique et fusionne les fichiers de mémoire pour les garder propres |
| Rappel | Recall | Automatique (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 |
| Oubli | Forget | Manuel (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 externesRemplacement par variable d’environnement :
QWEN_CODE_MEMORY_BASE_DIR: remplace le répertoire de base globalQWEN_CODE_MEMORY_LOCAL=1: utilise le chemin relatif au projet.qwen/memory/
Description des fichiers clés
| Fichier | Description |
|---|---|
meta.json | Enregistre 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.json | Enregistre l’offset de l’historique de conversation déjà traité pour éviter les extractions en double |
consolidation.lock | Fichier de verrou pendant l’exécution de Dream, contient le PID du détenteur, expire automatiquement après 1 heure |
MEMORY.md | Index 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 :
| Type | Contenu stocké | Écriture | Lecture |
|---|---|---|---|
user | Rôle, compétences, habitudes de travail de l’utilisateur | Lorsque le rôle/les préférences/le contexte de l’utilisateur sont identifiés | Lorsque la réponse doit être adaptée au contexte de l’utilisateur |
feedback | Directives de l’utilisateur sur le comportement de l’IA : quoi éviter, quoi continuer | Lorsque l’utilisateur corrige l’IA ou valide une approche non évidente | Lorsque cela influence la manière dont l’IA doit se comporter |
project | Avancement, objectifs, décisions, échéances, suivi de bugs du projet | Lorsque l’on sait qui fait quoi, pourquoi et pour quand | Pour aider l’IA à comprendre le contexte et les motivations du travail |
reference | Pointeurs vers des ressources externes (Dashboard, système de tickets, canal Slack, etc.) | Lorsqu’une ressource externe et son utilité sont identifiées | Lorsque 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'utilisationPour 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 :
| Raison | Signification |
|---|---|
memory_tool | L’agent principal a déjà écrit directement des fichiers mémoire ce tour, ignoré pour éviter les conflits |
already_running | L’extraction est en cours et ne peut pas être mise en file d’attente |
queued | Une 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 } processedOffsetest mis à jour avec la longueur actuelle de l’historique après chaque extraction- Lors de la prochaine extraction, seuls les messages avec
offset >= processedOffsetsont traités - En cas de changement de session (
sessionIdmodifié), 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:summaryidentique → 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ètre | Valeur par défaut | Description |
|---|---|---|
minHoursBetweenDreams | 24 heures | Intervalle minimum entre deux Dream |
minSessionsBetweenDreams | 5 sessions | Nombre minimum de nouvelles sessions requis pour déclencher un Dream |
SESSION_SCAN_INTERVAL_MS | 10 minutes | Intervalle de throttling pour le scan des fichiers de session |
DREAM_LOCK_STALE_MS | 1 heure | Seuil 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 :
- Pour chaque fichier thématique : déduplication par
summary.toLowerCase(), fusion des champswhy/howToApply - Retri par ordre alphabétique des summaries
- Inter-fichiers : les entries avec le même
type:summarysont 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) :
| Condition | Points |
|---|---|
| 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, tersefeedback: feedback, rule, avoid, style, summaryproject: project, goal, incident, deadline, releasereference: 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 mobileLimites 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
| Champ | Type | Description |
|---|---|---|
trigger | 'auto' | Mode de déclenchement (actuellement uniquement automatique) |
status | 'completed' | 'failed' | Résultat de l’exécution |
patches_count | number | Nombre de patches valides extraits |
touched_topics | string[] | Liste des types de mémoire modifiés |
duration_ms | number | Durée totale (millisecondes) |
Télémétrie Dream
| Champ | Type | Description |
|---|---|---|
trigger | 'auto' | Mode de déclenchement |
status | 'updated' | 'noop' | 'failed' | Résultat de l’exécution |
deduped_entries | number | Nombre d’entrées dédupliquées (chemin mécanique) |
touched_topics | string[] | Liste des types de mémoire modifiés |
duration_ms | number | Durée totale (millisecondes) |
Télémétrie Recall
| Champ | Type | Description |
|---|---|---|
query_length | number | Longueur de la chaîne de requête |
docs_scanned | number | Nombre total de documents analysés |
docs_selected | number | Nombre final de documents injectés |
strategy | 'none' | 'heuristic' | 'model' | Stratégie de sélection |
duration_ms | number | Durée totale (millisecondes) |
Index des fichiers sources
| Fichier | Responsabilité |
|---|---|
packages/core/src/memory/types.ts | Définitions de types : AutoMemoryType, AutoMemoryMetadata, AutoMemoryExtractCursor |
packages/core/src/memory/paths.ts | Calcul de chemins : getAutoMemoryRoot, isAutoMemPath, helpers pour divers chemins de fichiers |
packages/core/src/memory/store.ts | Initialisation du scaffolding : ensureAutoMemoryScaffold, lecture/écriture index/métadonnées |
packages/core/src/memory/scan.ts | Scan des fichiers thématiques : scanAutoMemoryTopicDocuments, analyse du frontmatter |
packages/core/src/memory/entries.ts | Analyse et rendu des entrées : parseAutoMemoryEntries, renderAutoMemoryBody |
packages/core/src/memory/extract.ts | Logique principale d’extraction : runAutoMemoryExtract, gestion du curseur, déduplication des patches |
packages/core/src/memory/extractScheduler.ts | Planificateur d’extraction : ManagedAutoMemoryExtractRuntime, file d’attente/machine d’états d’exécution |
packages/core/src/memory/extractionAgentPlanner.ts | Agent d’extraction : runAutoMemoryExtractionByAgent |
packages/core/src/memory/dream.ts | Logique principale de consolidation : runManagedAutoMemoryDream, chemin Agent + déduplication mécanique |
packages/core/src/memory/dreamScheduler.ts | Planificateur de consolidation : ManagedAutoMemoryDreamRuntime, vérification des garde-fous, gestion des locks |
packages/core/src/memory/dreamAgentPlanner.ts | Agent de consolidation : planManagedAutoMemoryDreamByAgent |
packages/core/src/memory/recall.ts | Logique de rappel : resolveRelevantAutoMemoryPromptForQuery, double chemin heuristique + modèle |
packages/core/src/memory/forget.ts | Logique d’oubli : forgetManagedAutoMemoryEntries, génération de candidats + suppression précise |
packages/core/src/memory/indexer.ts | Reconstruction d’index : rebuildManagedAutoMemoryIndex, buildManagedAutoMemoryIndex |
packages/core/src/memory/prompt.ts | Templates de prompt système : description des types de mémoire, exemples de format, règles d’utilisation |
packages/core/src/memory/governance.ts | Types 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.ts | Description de la fraîcheur : memoryAge, memoryFreshnessText |