Skip to Content
ДизайнAuto MemoryMemory: система управления памятью

Memory: система управления памятью

В этом документе описывается механизм управления памятью Managed Auto-Memory (управляемая автоматическая память) в Qwen Code, условия её активации и детали реализации.


目录

  1. Обзор
  2. Структура хранения
  3. Типы памяти
  4. Формат записи памяти
  5. Основной жизненный цикл
  6. Extract — извлечение
  7. Dream — консолидация
  8. Recall — поиск
  9. Forget — удаление
  10. Перестроение индекса
  11. Телеметрия

概述

Managed Auto-Memory — это система постоянной памяти, которая автоматически накапливает, консолидирует и извлекает знания о пользователе в процессе AI-сессий. Жизненный цикл памяти поддерживается с помощью четырёх основных операций:

ОперацияАнгл. названиеУсловие активацииНазначение
ИзвлечениеExtractАвтоматически (после каждого раунда диалога)Выделение новых знаний из истории диалога и запись в файлы памяти
КонсолидацияDreamАвтоматически (периодическая фоновая задача)Дедупликация и объединение файлов памяти для поддержания порядка
ПоискRecallАвтоматически (перед каждым раундом диалога)Поиск релевантной памяти и инъекция в системный промпт
УдалениеForgetВручную (команда пользователя /forget)Точное удаление указанных записей памяти

存储结构

目录布局

~/.qwen/ ← 全局基础目录(默认) └── projects/ └── <sanitized-git-root>/ ← 项目标识(基于 Git 根路径) ├── meta.json ← 元数据(提取/整合时间戳、状态) ├── extract-cursor.json ← 提取游标(已处理的对话偏移量) ├── consolidation.lock ← Dream 进程互斥锁 └── memory/ ← 记忆主目录 ├── MEMORY.md ← 索引文件(自动生成,汇总所有条目) ├── user.md ← 用户偏好记忆(示例) ├── feedback.md ← 反馈规范记忆(示例) ├── project/ │ └── milestone.md ← 项目记忆(支持子目录) └── reference/ └── grafana.md ← 外部资源记忆

Переопределение через переменные окружения:

  • QWEN_CODE_MEMORY_BASE_DIR: заменяет глобальный базовый каталог
  • QWEN_CODE_MEMORY_LOCAL=1: использует путь внутри проекта .qwen/memory/

关键文件说明

ФайлОписание
meta.jsonФиксирует время последнего Extract / Dream, ID сессии, затронутые типы памяти и статус выполнения
extract-cursor.jsonХранит смещение (offset) в истории диалога, до которого обработана текущая сессия, чтобы избежать повторного извлечения
consolidation.lockФайловая блокировка во время работы Dream. Содержит PID процесса-владельца. Автоматически истекает через 1 час
MEMORY.mdИндекс всех тематических файлов. Перестраивается после каждого Extract/Dream в формате Markdown-списка

记忆类型

Система поддерживает четыре встроенных типа памяти, каждый из которых соответствует своему измерению информации:

ТипХранимые данныеУсловие записиУсловие чтения
userРоль пользователя, навыки, рабочие привычкиПри выявлении роли/предпочтений/бэкграунда пользователяКогда ответ требует кастомизации под бэкграунд пользователя
feedbackИнструкции пользователя по поведению AI: чего избегать, что продолжатьПри коррекции AI пользователем или подтверждении неочевидного подходаКогда влияет на стиль поведения AI
projectПрогресс проекта, цели, решения, дедлайны, отслеживание баговПри получении информации о том, кто что делает, зачем и к какому срокуКогда помогает AI понять контекст работы и мотивацию
referenceУказатели на внешние ресурсы (дашборды, тикет-системы, Slack-каналы и т.д.)При обнаружении внешнего ресурса и его назначенияКогда пользователь упоминает внешнюю систему или связанную информацию

Что не следует сохранять в памяти: паттерны/соглашения кода, история Git, схемы отладки, временные статусы задач, информация, уже задокументированная в QWEN.md/AGENTS.md.


记忆条目格式

Каждый тематический файл использует формат YAML frontmatter + Markdown body:

--- name: Название памяти description: Краткое описание в одно предложение (используется для оценки релевантности при поиске, должно быть конкретным) type: user|feedback|project|reference --- Основное содержание памяти (строка summary) Why: Причина (позволяет AI понимать граничные случаи, а не слепо следовать правилам) How to apply: Сценарии применения и способ использования

Для типов feedback и project настоятельно рекомендуется заполнять поля Why и How to apply, чтобы память корректно применялась в граничных случаях.


核心生命周期


Extract — 提取

触发时机

Автоматически вызывается функцией scheduleAutoMemoryExtract после каждого ответа AI (фоновый неблокирующий процесс).

调度逻辑(extractScheduler.ts

Причины пропуска:

ПричинаЗначение
memory_toolОсновной агент в этом раунде уже записал файлы памяти напрямую. Пропуск для избежания конфликтов
already_runningИзвлечение уже выполняется, задача не может быть добавлена в очередь
queuedИзвлечение уже запущено, текущий запрос добавлен в очередь

核心提取流程(extract.ts

Курсор извлечения (Cursor):

  • Поля: { sessionId, processedOffset, updatedAt }
  • После каждого извлечения processedOffset обновляется до текущей длины истории
  • При следующем извлечении обрабатываются только сообщения с offset >= processedOffset
  • При смене сессии (изменение sessionId) процесс начинается со смещения 0

Правила фильтрации патчей:

  • Длина summary < 12 символов → отбрасывается
  • Summary заканчивается на ? → отбрасывается (вопросительное предложение)
  • Содержит временные ключевые слова (today/now/currently/temporary и т.д.) → отбрасывается
  • Одинаковая комбинация topic:summary → дедупликация

Dream — 整合

触发时机

Автоматически вызывается функцией scheduleManagedAutoMemoryDream после каждого ответа AI (фоновый неблокирующий процесс). Защищён несколькими условиями-гейтами, поэтому в большинстве случаев пропускается.

调度门控(dreamScheduler.ts

Параметры гейтов:

ПараметрЗначение по умолчаниюОписание
minHoursBetweenDreams24 часаМинимальный интервал между двумя запусками Dream
minSessionsBetweenDreams5 сессийМинимальное количество новых сессий для активации Dream
SESSION_SCAN_INTERVAL_MS10 минутИнтервал троттлинга при сканировании файлов сессий
DREAM_LOCK_STALE_MS1 часПорог времени, после которого lock-файл считается истёкшим

Механизм блокировки:

  • Lock-файл находится в <project-state-dir>/consolidation.lock
  • Содержит PID процесса-владельца
  • При проверке: если процесс с PID больше не существует (ошибка kill(pid, 0)) или lock старше 1 часа → считается истёкшим и автоматически удаляется

整合执行流程(dream.ts

Логика механической дедупликации:

  1. Внутри каждого тематического файла: дедупликация по summary.toLowerCase(), объединение полей why/howToApply
  2. Повторная сортировка по алфавиту на основе summary
  3. Между файлами: записи с одинаковым type:summary объединяются в первый найденный файл, дубликаты удаляются

Recall — 召回

触发时机

Автоматически вызывается функцией resolveRelevantAutoMemoryPromptForQuery перед обработкой каждого запроса пользователя AI. Внедряет релевантную память в системный промпт.

召回流程(recall.ts

Правила скоринга (эвристические):

УсловиеБаллы
Токен запроса найден в содержимом документа+2 (за каждый токен)
Токен запроса является характерным ключевым словом для данного типа+1 (за каждый токен)
Body документа не пуст+1

Характерные ключевые слова для каждого типа:

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

Правила сборки промпта:

  • Внедряется не более 5 документов (MAX_RELEVANT_DOCS)
  • Body каждого документа обрезается до 1200 символов (MAX_DOC_BODY_CHARS)
  • При превышении лимита добавляется предупреждение: “NOTE: Relevant memory truncated for prompt budget.”
  • Включает информацию о свежести документа (на основе mtime файла)

Forget — 遗忘

触发时机

Активируется вручную пользователем через команду /forget <query>.

遗忘流程(forget.ts

Дизайн Entry ID:

  • Файлы с одной записью (частый случай): relativePath (например, feedback/no-summary.md)
  • Файлы с несколькими записями: relativePath:index (например, feedback/style.md:2)
  • Использование стабильных ID позволяет модели точно указывать на запись, не затрагивая другие записи в том же файле

索引重建

Файл MEMORY.md служит навигационным индексом для всех тематических файлов. Перестраивается функцией rebuildManagedAutoMemoryIndex после каждого Extract или Dream:

- [用户偏好](user/preferences.md) — 用户是资深 Go 工程师,第一次接触 React - [反馈规范](feedback/style.md) — 保持回复简洁,不要尾部总结 - [项目里程碑](project/milestone.md) — 移动端发布切分支前的合并冻结窗口

Ограничения индекса:

  • Не более 150 символов на строку (при превышении обрезается с помощью )
  • Не более 200 строк
  • Общий размер не превышает 25 000 байт

遥测埋点

В систему встроены три типа телеметрических событий для мониторинга производительности и эффективности операций с памятью:

Extract 遥测

ПолеТипОписание
trigger'auto'Способ активации (на данный момент только автоматический)
status'completed' | 'failed'Результат выполнения
patches_countnumberКоличество извлечённых валидных патчей
touched_topicsstring[]Список затронутых типов памяти
duration_msnumberОбщее время выполнения (мс)

Dream 遥测

ПолеТипОписание
trigger'auto'Способ активации
status'updated' | 'noop' | 'failed'Результат выполнения
deduped_entriesnumberКоличество записей, обработанных механической дедупликацией
touched_topicsstring[]Список изменённых типов памяти
duration_msnumberОбщее время выполнения (мс)

Recall 遥测

ПолеТипОписание
query_lengthnumberДлина строки запроса
docs_scannednumberОбщее количество просканированных документов
docs_selectednumberКоличество документов, внедрённых в итоге
strategy'none' | 'heuristic' | 'model'Стратегия выбора
duration_msnumberОбщее время выполнения (мс)

相关源文件索引

ФайлНазначение
packages/core/src/memory/types.tsОпределение типов: AutoMemoryType, AutoMemoryMetadata, AutoMemoryExtractCursor
packages/core/src/memory/paths.tsВычисление путей: getAutoMemoryRoot, isAutoMemPath, хелперы для путей к файлам
packages/core/src/memory/store.tsИнициализация структуры: ensureAutoMemoryScaffold, чтение/запись индекса и метаданных
packages/core/src/memory/scan.tsСканирование тематических файлов: scanAutoMemoryTopicDocuments, парсинг frontmatter
packages/core/src/memory/entries.tsПарсинг и рендеринг записей: parseAutoMemoryEntries, renderAutoMemoryBody
packages/core/src/memory/extract.tsОсновная логика извлечения: runAutoMemoryExtract, управление курсором, дедупликация патчей
packages/core/src/memory/extractScheduler.tsПланировщик извлечения: ManagedAutoMemoryExtractRuntime, очередь/машина состояний выполнения
packages/core/src/memory/extractionAgentPlanner.tsАгент извлечения: runAutoMemoryExtractionByAgent
packages/core/src/memory/dream.tsОсновная логика консолидации: runManagedAutoMemoryDream, путь через агент + механическая дедупликация
packages/core/src/memory/dreamScheduler.tsПланировщик консолидации: ManagedAutoMemoryDreamRuntime, проверка гейтов, управление блокировками
packages/core/src/memory/dreamAgentPlanner.tsАгент консолидации: planManagedAutoMemoryDreamByAgent
packages/core/src/memory/recall.tsЛогика поиска: resolveRelevantAutoMemoryPromptForQuery, двойной путь (эвристика + модель)
packages/core/src/memory/forget.tsЛогика удаления: forgetManagedAutoMemoryEntries, генерация кандидатов + точное удаление
packages/core/src/memory/indexer.tsПерестроение индекса: rebuildManagedAutoMemoryIndex, buildManagedAutoMemoryIndex
packages/core/src/memory/prompt.tsШаблоны системных промптов: описание типов памяти, примеры формата, правила использования
packages/core/src/memory/governance.tsТипы рекомендаций по управлению: AutoMemoryGovernanceSuggestionType
packages/core/src/memory/state.tsСостояние выполнения извлечения: isExtractRunning, markExtractRunning, clearExtractRunning
packages/core/src/memory/memoryAge.tsОписание свежести: memoryAge, memoryFreshnessText
Last updated on