Skip to Content
DesignAuto MemoryMemory – Verwaltungssystem für automatische Erinnerungen

Memory – Verwaltungssystem für automatische Erinnerungen

Dieser Artikel beschreibt den Managed Auto-Memory (verwaltete automatische Erinnerungen) Mechanismus in Qwen Code, seine Auslöser und Implementierungsdetails.


Inhaltsverzeichnis

  1. Überblick
  2. Speicherstruktur
  3. Erinnerungstypen
  4. Format eines Erinnerungseintrags
  5. Kernlebenszyklus
  6. Extract – Extrahieren
  7. Dream – Konsolidieren
  8. Recall – Abrufen
  9. Forget – Vergessen
  10. Index-Neuerstellung
  11. Telemetrie-Events

Überblick

Managed Auto-Memory ist ein persistentes Erinnerungssystem, das während KI-Gesprächen automatisch benutzerrelevantes Wissen sammelt, integriert und abruft. Es pflegt den Erinnerungslebenszyklus über vier Kernoperationen:

OperationEnglischAuslöserWirkung
ExtrahierenExtractAutomatisch (nach jeder Runde)Neues Wissen aus Gesprächsverlauf extrahieren und in Dateien schreiben
KonsolidierenDreamAutomatisch (periodischer Hintergrundtask)Erinnerungsdateien deduplizieren, zusammenführen, sauber halten
AbrufenRecallAutomatisch (vor jeder Runde)Relevante Erinnerungen suchen und in das System-Prompt einfügen
VergessenForgetManuell (Benutzerbefehl /forget)Gezielten Erinnerungseintrag löschen

Speicherstruktur

Verzeichnisaufbau

~/.qwen/ ← Globales Basisverzeichnis (Standard) └── projects/ └── <sanitized-git-root>/ ← Projektkennung (basierend auf Git-Root-Pfad) ├── meta.json ← Metadaten (Extract-/Dream-Zeitstempel, Status) ├── extract-cursor.json ← Extract-Cursor (verarbeiteter Gesprächsoffset) ├── consolidation.lock ← Dream-Prozess-Mutex └── memory/ ← Hauptverzeichnis für Erinnerungen ├── MEMORY.md ← Indexdatei (automatisch generiert, fasst alle Einträge zusammen) ├── user.md ← Benutzerpräferenzen (Beispiel) ├── feedback.md ← Feedback/Regeln (Beispiel) ├── project/ │ └── milestone.md ← Projekterinnerungen (mit Unterverzeichnissen möglich) └── reference/ └── grafana.md ← Externe Ressourcen-Erinnerungen

Umgebungsvariablen-Überschreibung:

  • QWEN_CODE_MEMORY_BASE_DIR: Ersetzt das globale Basisverzeichnis
  • QWEN_CODE_MEMORY_LOCAL=1: Nutzt stattdessen den projektinternen Pfad .qwen/memory/

Wichtige Dateien

DateiBeschreibung
meta.jsonZeichnet Zeitstempel des letzten Extract/Dream, Session-ID, betroffene Erinnerungstypen, Ausführungsstatus
extract-cursor.jsonZeichnet, bis zu welchem Offset der Gesprächsverlauf bereits verarbeitet wurde, um Doppelextraktion zu vermeiden
consolidation.lockDateisperre während Dream; Inhalt ist die PID des Halters; verfällt nach 1 Stunde automatisch
MEMORY.mdIndex aller Themendateien; wird nach jedem Extract/Dream neu erstellt; Format: Markdown-Liste

Erinnerungstypen

Das System unterstützt vier integrierte Erinnerungstypen, jeder für eine andere Informationsdimension:

TypGespeicherter InhaltWann geschriebenWann gelesen
userRolle des Benutzers, Skills, ArbeitsgewohnheitenWenn Rolle/Präferenzen/Hintergrund bekannt werdenWenn Antwort an Benutzerhintergrund angepasst werden muss
feedbackAnweisungen des Benutzers: was vermeiden, was beibehaltenWenn Benutzer KI korrigiert oder eine nicht offensichtliche Vorgehensweise bestätigtWenn Verhalten der KI beeinflusst werden soll
projectProjektfortschritt, Ziele, Entscheidungen, Deadlines, Bug-TrackingWenn bekannt wird, wer was warum und bis wann machtWenn KI Arbeitskontext und Motivation verstehen soll
referenceZeiger auf externe Systeme/Ressourcen (Dashboard, Ticketsystem, Slack-Channel etc.)Wenn externe Ressource und ihr Zweck bekannt werdenWenn Benutzer externes System oder verwandte Information erwähnt

Nicht in Erinnerungen speichern: Codemuster/-konventionen, Git-Verlauf, Debug-Ansätze, temporäre Aufgaben, bereits in QWEN.md/AGENTS.md festgehaltene Inhalte.


Format eines Erinnerungseintrags

Jede Themendatei verwendet YAML Frontmatter + Markdown Body:

--- name: Name der Erinnerung description: Ein-Satz-Beschreibung (für Relevanzbestimmung beim Abruf; möglichst konkret) type: user|feedback|project|reference --- Hauptinhalt der Erinnerung (summary-Zeile) Why: Grund (damit KI Randfälle versteht, statt Regeln blind zu befolgen) How to apply: Einsatzkontext und Verwendungshinweise

Für die Typen feedback und project wird dringend empfohlen, Why und How to apply auszufüllen, damit die Erinnerung auch in Grenzfällen korrekt angewendet wird.


Kernlebenszyklus


Extract – Extrahieren

Auslöser

Wird nach jeder abgeschlossenen KI-Antwort automatisch von scheduleAutoMemoryExtract ausgelöst (Hintergrund, nicht blockierend).

Scheduling-Logik (extractScheduler.ts)

Übersprungsgründe:

GrundBedeutung
memory_toolDer Haupt-Agent hat in dieser Runde bereits direkt eine Erinnerungsdatei geschrieben – Überspringen, um Konflikte zu vermeiden
already_runningExtract läuft bereits und konnte nicht in die Warteschlange aufgenommen werden
queuedExtract läuft bereits; diese Anfrage wurde in die Warteschlange gestellt

Kern-Extract-Ablauf (extract.ts)

Hinweis: Die isUnderMemoryPressure-Gate befindet sich in MemoryManager.runExtract(), nicht in diesem Ablauf. Wenn der Monitor Hard- oder Critical-Druck meldet, überspringt MemoryManager den Extract-Aufruf und aktualisiert den Cursor nicht.

Extract-Cursor:

  • Felder: { sessionId, processedOffset, updatedAt }
  • Vor dem Extract wird über readExtractCursor der aktuelle Fortschritt gelesen; dann wird nur der unverarbeitete Teil mit history.slice(processedOffset) bearbeitet
  • Nach jedem Extract wird processedOffset auf die aktuelle Länge des Verlaufs gesetzt (params.history.length)
  • Bei Sessionswechsel (sessionId ändert sich) wird bei Offset 0 neu begonnen
  • Hinweis: Es wird kein buildTranscriptMessages / loadUnprocessedTranscriptSlice mehr zum Aufbauen von Transkripttext verwendet – hasNewUserMessages wird über history.slice(startOffset).some(m => m.role === 'user' && partToString(m.parts).trim().length > 0) ermittelt; nur der unverarbeitete Ausschnitt wird leichtgewichtig in Strings umgewandelt, der gesamte Verlauf wird nicht mehr verarbeitet

Patch-Filterregeln:

  • Zusammenfassung < 12 Zeichen → verwerfen
  • Zusammenfassung endet mit ? → verwerfen (Fragesatz)
  • Enthält temporäre Schlüsselwörter (today/now/currently/temporary usw.) → verwerfen
  • Gleiche topic:summary-Kombination → deduplizieren

Dream – Konsolidieren

Auslöser

Wird nach jeder abgeschlossenen KI-Antwort automatisch von scheduleManagedAutoMemoryDream ausgelöst (Hintergrund, nicht blockierend). Wird aber durch mehrere Gate-Bedingungen meistens übersprungen.

Scheduling-Gates (dreamScheduler.ts)

Gate-Parameter:

ParameterStandardBeschreibung
minHoursBetweenDreams24 StundenMindestzeit zwischen zwei Dream-Durchläufen
minSessionsBetweenDreams5 SessionsMindestanzahl neuer Sessions seit letztem Dream
SESSION_SCAN_INTERVAL_MS10 MinutenDrosselungsintervall für Session-Datei-Scans
DREAM_LOCK_STALE_MS1 StundeZeit, nach der die Lock-Datei als veraltet gilt

Lock-Mechanismus:

  • Lock-Datei unter <project-state-dir>/consolidation.lock
  • Inhalt: PID des haltenden Prozesses
  • Bei Prüfung: Wenn der PID-Prozess nicht mehr existiert (kill(pid, 0) fehlschlägt) oder die Lock älter als 1 Stunde ist → als veraltet betrachten und automatisch löschen

Dream-Ausführungsablauf (dream.ts)

Mechanische Deduplizierungslogik:

  1. Innerhalb jeder Themendatei: nach summary.toLowerCase() deduplizieren, why/howToApply-Felder zusammenführen
  2. Alphabetisch nach summary sortieren
  3. Dateiübergreifend: Einträge mit gleichem type:summary in die zuerst gefundene Datei verschieben, doppelte Dateien löschen

Recall – Abrufen

Auslöser

Wird vor jeder KI-Verarbeitung einer Benutzeranfrage automatisch von resolveRelevantAutoMemoryPromptForQuery ausgelöst; fügt relevante Erinnerungen in das System-Prompt ein.

Recall-Ablauf (recall.ts)

Bewertungsregeln (heuristisch):

BedingungPunkte
query-Token erscheint im Dokumentinhalt+2 (pro Token)
query-Token ist ein charakteristisches Schlüsselwort des Typs+1 (pro Token)
Dokument-Body ist nicht leer+1

Charakteristische Schlüsselwörter pro Typ:

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

Prompt-Erstellungsregeln:

  • Maximal 5 Dokumente einfügen (MAX_RELEVANT_DOCS)
  • Jeder Dokument-Body wird auf 1200 Zeichen gekürzt (MAX_DOC_BODY_CHARS)
  • Bei Kürzung wird ein Hinweis angehängt: “NOTE: Relevant memory truncated for prompt budget.”
  • Enthält Frische-Information (basierend auf Datei-mtime)

Forget – Vergessen

Auslöser

Wird durch den manuellen Benutzerbefehl /forget <query> ausgelöst.

Forget-Ablauf (forget.ts)

Entry-ID-Design:

  • Einzeilige Datei (häufig): relativePath (z. B. feedback/no-summary.md)
  • Mehrzeilige Datei: relativePath:index (z. B. feedback/style.md:2)
  • Stabile IDs ermöglichen dem Modell, exakt einen Eintrag zu adressieren, ohne andere Einträge derselben Datei zu beeinträchtigen.

Index-Neuerstellung

MEMORY.md ist der Navigationsindex aller Themendateien; wird nach jedem Extract oder Dream durch Aufruf von rebuildManagedAutoMemoryIndex neu erstellt:

- [Benutzerpräferenzen](user/preferences.md) — Benutzer ist Senior Go-Entwickler, zum ersten Mal mit React - [Feedbackregeln](feedback/style.md) — Antworten kurz halten, keine Zusammenfassung am Ende - [Projektmeilenstein](project/milestone.md) — Merge-Freeze-Fenster vor dem Branch für den Mobile-Release

Index-Beschränkungen:

  • Maximal 150 Zeichen pro Zeile (bei Überschreitung wird mit abgeschnitten)
  • Maximal 200 Zeilen
  • Gesamtgröße maximal 25.000 Byte

Telemetrie-Events

Das System enthält drei Arten von Telemetrie-Events zur Überwachung der Leistung und Effektivität der Erinnerungsoperationen.

Extract-Telemetrie

FeldTypBeschreibung
trigger'auto'Auslöser (derzeit nur automatisch)
status'completed' | 'failed'Ausführungsergebnis
patches_countnumberAnzahl gültiger extrahierter Patches
touched_topicsstring[]Liste der geschriebenen Erinnerungstypen
duration_msnumberGesamtdauer in Millisekunden

Dream-Telemetrie

FeldTypBeschreibung
trigger'auto'Auslöser
status'updated' | 'noop' | 'failed'Ausführungsergebnis
deduped_entriesnumberAnzahl der durch mechanischen Dedup entfernten Einträge
touched_topicsstring[]Liste der geänderten Erinnerungstypen
duration_msnumberGesamtdauer in Millisekunden

Recall-Telemetrie

FeldTypBeschreibung
query_lengthnumberLänge der Abfragezeichenkette
docs_scannednumberAnzahl gescannter Dokumente
docs_selectednumberAnzahl letztlich eingefügter Dokumente
strategy'none' | 'heuristic' | 'model'Auswahlstrategie
duration_msnumberGesamtdauer in Millisekunden

Verzeichnis der zugehörigen Quelldateien

DateiZuständigkeit
packages/core/src/memory/types.tsTypdefinitionen: AutoMemoryType, AutoMemoryMetadata, AutoMemoryExtractCursor
packages/core/src/memory/paths.tsPfadberechnung: getAutoMemoryRoot, isAutoMemPath, diverse Dateipfad-Helfer
packages/core/src/memory/store.tsGerüstinitialisierung: ensureAutoMemoryScaffold, Index-/Metadaten-Lese-/Schreibzugriffe
packages/core/src/memory/scan.tsScannen von Themendateien: scanAutoMemoryTopicDocuments, Frontmatter parsen
packages/core/src/memory/entries.tsEintrag parsen und rendern: parseAutoMemoryEntries, renderAutoMemoryBody
packages/core/src/memory/extract.tsExtract-Kernlogik: runAutoMemoryExtract, Cursor-Verwaltung, Patch-Dedup
packages/core/src/memory/extractScheduler.tsExtract-Scheduler: ManagedAutoMemoryExtractRuntime, Queue-/Run-Zustandsmaschine
packages/core/src/memory/extractionAgentPlanner.tsExtract-Agent: runAutoMemoryExtractionByAgent
packages/core/src/memory/dream.tsDream-Kernlogik: runManagedAutoMemoryDream, Agent-Pfad + mechanischer Dedup
packages/core/src/memory/dreamScheduler.tsDream-Scheduler: ManagedAutoMemoryDreamRuntime, Gate-Prüfung, Lock-Verwaltung
packages/core/src/memory/dreamAgentPlanner.tsDream-Agent: planManagedAutoMemoryDreamByAgent
packages/core/src/memory/recall.tsRecall-Logik: resolveRelevantAutoMemoryPromptForQuery, heuristischer + Modell-Pfad
packages/core/src/memory/forget.tsForget-Logik: forgetManagedAutoMemoryEntries, Kandidatengenerierung + präzises Löschen
packages/core/src/memory/indexer.tsIndex-Neuerstellung: rebuildManagedAutoMemoryIndex, buildManagedAutoMemoryIndex
packages/core/src/memory/prompt.tsSystem-Prompt-Templates: Beschreibung der Erinnerungstypen, Formatbeispiele, Nutzungsregeln
packages/core/src/memory/governance.tsGovernance-Vorschlagstyp: AutoMemoryGovernanceSuggestionType
packages/core/src/memory/state.tsExtract-Laufstatus: isExtractRunning, markExtractRunning, clearExtractRunning
packages/core/src/memory/memoryAge.tsFrischebeschreibung: memoryAge, memoryFreshnessText
Last updated on