Модуль 3.5 · Урок 3
Урок 3: Система памяти
Содержание
- Чему вы научитесь
- Проблема: агент забывает
- Аналогия: как устроена человеческая память
- Шаг 1. Посмотрите, что у вас есть
- Что загружается и когда
- Шаг 2. Настройте Daily Notes
- Как это выглядит
- Как агент записывает
- Как агент читает
- Шаг 3. Создайте MEMORY.md
- Правила работы с MEMORY.md
- MEMORY.md не загружается в группах
- Шаг 4. Настройте компактификацию
- Что происходит при компактификации
- Настройка
- Что делает каждый параметр
- Ручная компактификация
- Известная проблема
- Шаг 5. Настройте семантический поиск
- Как это работает
- Настройка
- Параметры
- Для России: локальные embeddings
- Шаг 6. Управление сессиями
- Настройка
- Рабочий процесс: как всё сочетается
- Утро
- В течение дня
- Вечер
- Еженедельно
- Пусть агент управляет памятью сам
- Правила памяти в AGENTS.md
- Автоматическая курация через cron
- Ограничьте поиск в группах
- 3. Git backup для workspace
- 4. Для мультиагентных систем: изоляция
- Продвинутое: Mem0
- Практическое задание
- Главное
Чему вы научитесь
- Понимать, как OpenClaw запоминает и забывает информацию
- Настраивать компактификацию, memory flush и семантический поиск
- Организовывать workspace-файлы для эффективной работы
- Применять лучшие практики памяти для мессенджеров
Проблема: агент забывает
Вы настроили OpenClaw, подключили Telegram, проработали с агентом неделю. Он знает ваше расписание, помнит, что вы предпочитаете краткие ответы, знает имена коллег. Потом контекст переполняется, происходит сжатие — и агент «забывает» половину.
Или хуже: вы перезапускаете gateway, и агент начинает с чистого листа. Как будто вы познакомились заново.
Это главная проблема AI-агентов: контекстное окно — не память. Это временный буфер, который очищается. Настоящая память — это файлы на диске.
Аналогия: как устроена человеческая память
У людей память работает в несколько слоёв:
- Оперативная память — то, о чём вы думаете прямо сейчас. Ограничена: 5-7 элементов
- Краткосрочная — события за последние часы. Помните, но легко забудете
- Долгосрочная — навыки, факты, решения. Помните месяцами и годами
- Внешняя — записная книжка, заметки, календарь. Не в голове, но всегда можно посмотреть
У OpenClaw точно так же, только с другими названиями:
| Человек | OpenClaw | Время жизни |
|---|---|---|
| Оперативная память | Session Context (контекстное окно) | До конца сессии |
| Краткосрочная | Daily Notes (memory/YYYY-MM-DD.md) | Постоянно на диске |
| Долгосрочная | MEMORY.md (курированные факты) | Постоянно на диске |
| Внешняя | Semantic Search (поиск по файлам) | Постоянно в индексе |
Ключевой принцип: диск — источник правды, контекст LLM — временный кеш. Если факт не записан в файл, он будет потерян.
flowchart TD
MSG["Сообщение пользователя"] --> SC["Session Context\n(контекстное окно LLM)"]
SC -->|"Контекст заполнен?"| CF{"Да"}
CF -->|"Memory Flush"| DN["Daily Notes\n(memory/YYYY-MM-DD.md)"]
CF -->|"Compaction"| SUM["Сводка старой истории"]
SUM --> SC
DN -->|"Вручную или автоматически"| MEM["MEMORY.md\n(курированные факты)"]
MEM -.->|"Semantic Search"| SC
DN -.->|"Semantic Search"| SC
style MSG fill:#f8fafc,stroke:#1e293b
style SC fill:#fef3c7,stroke:#d97706
style CF fill:#fee2e2,stroke:#dc2626
style DN fill:#dbeafe,stroke:#2563eb
style SUM fill:#f3e8ff,stroke:#9333ea
style MEM fill:#dcfce7,stroke:#16a34a
Шаг 1. Посмотрите, что у вас есть
Откройте директорию workspace вашего агента:
ls -la ~/.openclaw/workspace/default/
Вы увидите файлы, которые мы создали в модуле 3.3:
SOUL.md -- кто агент, как себя вести
AGENTS.md -- операционные инструкции
USER.md -- информация о вас
IDENTITY.md -- имя агента
TOOLS.md -- заметки об инструментах
HEARTBEAT.md -- чек-лист фоновых проверок
memory/ -- директория с ежедневными заметками
Это и есть постоянная память вашего агента. Каждый раз, когда начинается сессия, OpenClaw читает эти файлы и загружает их в контекст модели.
Что загружается и когда
Не все файлы загружаются одинаково:
| Файл | Когда загружается | Стоимость |
|---|---|---|
| SOUL.md, AGENTS.md, USER.md, IDENTITY.md, TOOLS.md | Каждое сообщение | Токены x каждый API-вызов |
| HEARTBEAT.md | Только при heartbeat | Только фоновые проверки |
| MEMORY.md | Только в личных чатах | Не в группах (защита данных) |
| memory/YYYY-MM-DD.md | Сегодня + вчера при старте сессии | Два файла при первом сообщении |
| BOOT.md | При перезагрузке gateway | Один раз |
| BOOTSTRAP.md | Один раз, при первом запуске | Удаляется после |
Важный нюанс: файлы, загружаемые каждое сообщение, стоят денег на каждый API-вызов. Раздутый SOUL.md в 300 строк — это тысячи лишних токенов на каждое сообщение. Держите эти файлы компактными.
Шаг 2. Настройте Daily Notes
Daily Notes — это ежедневный лог агента. Файл memory/2026-03-20.md содержит всё, что агент посчитал важным за этот день.
Как это выглядит
Пример memory/2026-03-20.md:
## 09:15 -- Утренний брифинг
- 3 важных письма, 12 рассылок
- Встреча с командой в 14:00 (перенесена с 15:00)
## 11:30 -- Анализ продаж
- Выручка за март: 2.4M руб (+12% к февралю)
- Топ-3 продукта: виджеты, API, консалтинг
## 16:00 -- Решение
- Перешли на DeepSeek для рутинных задач (экономия ~80%)
Как агент записывает
Агент записывает в daily notes двумя способами:
-
Автоматически — перед компактификацией (сжатием контекста) OpenClaw запускает «тихий» ход, который напоминает агенту: «запиши всё важное в daily notes». Это называется memory flush.
-
По вашей просьбе — скажите агенту «запомни это» или «запиши в заметки», и он сохранит информацию в
memory/YYYY-MM-DD.md.
Как агент читает
При старте новой сессии OpenClaw загружает сегодняшние и вчерашние daily notes. Агент видит контекст последних двух дней без загрузки полной истории.
А что с позавчерашними? Они доступны через семантический поиск — агент может найти их по смыслу, если нужно.
Шаг 3. Создайте MEMORY.md
MEMORY.md — это курированная база знаний агента. В отличие от daily notes (сырой лог), здесь только устойчивые факты, решения и предпочтения.
Создайте файл:
nano ~/.openclaw/workspace/default/MEMORY.md
Пример содержимого:
# Обо мне
- Часовой пояс: MSK (UTC+3)
- Предпочитаю краткие ответы
- Рабочие часы: 09:00-18:00
# Рабочие решения
- API: DeepSeek для рутины, Claude Sonnet для сложных задач
- Формат отчётов: таблицы, не списки
- Бюджет API: $30/мес максимум
# Проекты
- «Магазин»: PostgreSQL 16, деплой через GitHub Actions
- «Бот поддержки»: Python + aiogram, сервер на Hetzner
# Контакты
- Дизайнер Аня -- пишет в Telegram @anya_design
- PM Кирилл -- Slack, канал #project-x
Правила работы с MEMORY.md
Обновляйте, не дополняйте. Если факт изменился — замените старую запись. Не добавляйте «Обновление от 20.03: теперь используем другой сервер». Просто замените строку.
Удаляйте устаревшее. Накопление мусора снижает качество поиска и тратит токены. Если проект завершён — уберите его из MEMORY.md.
Не дублируйте. Если что-то уже есть в SOUL.md или USER.md — не повторяйте в MEMORY.md.
MEMORY.md не загружается в группах
Это правильное поведение: в группах могут быть посторонние, а MEMORY.md содержит личные данные. OpenClaw защищает вашу приватность. Не переопределяйте это.
Шаг 4. Настройте компактификацию
Компактификация — самый важный процесс в системе памяти. Это момент, когда агент решает, что «помнить», а что «забыть».
Что происходит при компактификации
- Контекст приближается к лимиту модели (200K токенов для Claude)
- Срабатывает порог — осталось мало свободного места
- Memory flush: агент получает «тихий» запрос — «запиши всё важное в daily notes»
- Агент записывает критичные факты в
memory/YYYY-MM-DD.md - Старые сообщения сжимаются в краткую сводку
- Последние ~20 000 токенов остаются нетронутыми
- Сводка заменяет старую историю — и контекст снова свободен
Настройка
В ~/.openclaw/openclaw.json:
{
"agents": {
"defaults": {
"compaction": {
"enabled": true,
"model": "ollama/llama3.1:8b",
"identifierPolicy": "strict",
"reserveTokensFloor": 20000,
"memoryFlush": {
"enabled": true,
"softThresholdTokens": 40000
}
}
}
}
}
Что делает каждый параметр
model — модель для суммаризации. Compaction — простая задача, ей не нужен Opus. Используйте дешёвую модель или локальную через Ollama.
identifierPolicy: "strict" — при сжатии сохраняет имена файлов, ID, URL. Без этого агент может «забыть», с каким файлом работал.
reserveTokensFloor: 20000 — сколько токенов оставить свободными после compaction. 20K — запас для memory flush и следующих сообщений.
memoryFlush.enabled: true — перед сжатием агент записывает важное в daily notes. Обязательно включите — без этого агент теряет контекст при каждой компактификации.
softThresholdTokens: 40000 — за сколько токенов до лимита запустить memory flush. 40K даёт агенту достаточно места для записи.
Ручная компактификация
Перед большой задачей полезно освободить контекст:
/compact
Можно добавить инструкции:
/compact Сохрани информацию о проекте «Магазин» -- она понадобится дальше
Известная проблема
Memory flush срабатывает только перед автоматической компактификацией. Если вы пишете /new (новая сессия) или происходит ежедневный сброс — memory flush не запускается. Контекст теряется.
Обходной путь: перед /new попросите агента вручную:
Запиши всё важное из нашего разговора в daily notes
А потом:
/new
Шаг 5. Настройте семантический поиск
Семантический поиск позволяет агенту находить информацию во всех файлах workspace — не только в загруженных при старте, но и в архивных daily notes, документах, заметках.
Как это работает
- Все файлы workspace индексируются (преобразуются в числовые вектора)
- Когда агент ищет информацию, запрос тоже преобразуется в вектор
- Находятся файлы, ближайшие по смыслу
- Релевантные фрагменты подгружаются в контекст
Например: вы спрашиваете «какой был бюджет проекта в январе?». Агент ищет по памяти, находит daily note от 15 января с записью о бюджете, и подгружает её — даже если этот файл не загружен по умолчанию.
Настройка
{
"agents": {
"defaults": {
"memorySearch": {
"provider": "openai",
"model": "text-embedding-3-small",
"query": {
"hybrid": {
"enabled": true,
"vectorWeight": 0.7,
"textWeight": 0.3,
"temporalDecay": {
"enabled": true,
"halfLifeDays": 30
}
}
},
"cache": {
"enabled": true,
"maxEntries": 50000
}
}
}
}
}
Параметры
provider — кто делает embeddings. Варианты: openai, gemini, ollama, local. Для России: ollama с моделью nomic-embed-text — работает локально, бесплатно.
hybrid.enabled — комбинированный поиск: и по смыслу (вектора), и по ключевым словам (BM25). Точнее, чем каждый метод по отдельности.
temporalDecay — свежие записи ранжируются выше старых. halfLifeDays: 30 значит: запись месячной давности получает вдвое меньший вес. Полезно в мессенджерах, где каждый день генерируются десятки заметок.
cache — кеш embeddings, чтобы не пересчитывать вектора при каждом запросе.
Для России: локальные embeddings
Если нет доступа к OpenAI/Google API для embeddings:
{
"memorySearch": {
"provider": "ollama",
"model": "nomic-embed-text"
}
}
Установите модель: ollama pull nomic-embed-text. Работает локально, без интернета, бесплатно. Качество достаточное для поиска по памяти.
Шаг 6. Управление сессиями
В мессенджерах сессии растут быстро. 35 сообщений в Telegram могут создать транскрипт в несколько мегабайт. Без управления это заполняет диск и тормозит агента.
Настройка
{
"session": {
"maintenance": {
"mode": "enforce",
"pruneAfter": "7d",
"maxEntries": 500,
"maxDiskBytes": "200mb"
},
"reset": {
"idleMinutes": 120
}
}
}
pruneAfter: "7d" — транскрипты сессий старше 7 дней удаляются. Не путайте с daily notes — те хранятся вечно.
maxDiskBytes: "200mb" — лимит дискового пространства на все сессии. При превышении старые удаляются.
idleMinutes: 120 — если вы не пишете агенту 2 часа, следующее сообщение начнёт новую сессию. Это предотвращает бесконечный рост контекста.
Рабочий процесс: как всё сочетается
Вот как выглядит типичный день с правильно настроенной памятью:
Утро
- Вы пишете агенту «Доброе утро»
- OpenClaw загружает: SOUL.md + AGENTS.md + USER.md + IDENTITY.md + TOOLS.md
- Загружает daily notes: сегодня (пустой) + вчера (события вчерашнего дня)
- В личном чате загружает MEMORY.md (ваши предпочтения, проекты)
- Агент «помнит» вчерашний контекст и отвечает осмысленно
В течение дня
- Вы общаетесь, контекст растёт
- При необходимости агент ищет в памяти через semantic search
- К обеду контекст приближается к лимиту
- Срабатывает memory flush — агент записывает важное в
memory/2026-03-20.md - Компактификация сжимает старую историю, контекст освобождается
Вечер
- Вы уходите, agнт idle 2 часа
- Следующее сообщение начнёт новую сессию (idleMinutes: 120)
- Но daily notes сохранены — завтра агент прочитает их
Еженедельно
- Просмотрите daily notes за неделю
- Перенесите устойчивые факты в MEMORY.md
- Удалите устаревшее из MEMORY.md
Можно автоматизировать через HEARTBEAT.md:
## Воскресенье, 20:00
- Просмотри memory/ за последнюю неделю
- Перенеси устойчивые решения и факты в MEMORY.md
- Удали дубликаты и устаревшее из MEMORY.md
Пусть агент управляет памятью сам
Вам не нужно вручную переносить факты из daily notes в MEMORY.md или следить за размером файлов. Настройте агента — и он будет делать это автоматически.
Правила памяти в AGENTS.md
Добавьте в ~/.openclaw/workspace/default/AGENTS.md:
## Управление памятью
- Перед действием -- проверь memory: может, ты уже это делал
- После важного решения -- запиши в daily notes с пометкой [РЕШЕНИЕ]
- Раз в неделю (воскресенье) -- перенеси записи [РЕШЕНИЕ] из daily notes в MEMORY.md
- Удаляй устаревшее из MEMORY.md: если проект завершён, информация неактуальна
- Не дублируй: если факт уже есть в MEMORY.md, не повторяй его в daily notes
- Если контекст превысил 80K токенов -- выполни /compact
Теперь агент будет:
- Проверять свою память перед каждым действием (не переспрашивать одно и то же)
- Записывать решения с пометкой для последующей курации
- Еженедельно наводить порядок в MEMORY.md
- Следить за размером контекста и сжимать его при необходимости
Автоматическая курация через cron
Добавьте cron-задачу в openclaw.json:
{
"cron": [
{
"name": "memory-cleanup",
"schedule": "0 21 * * 0",
"prompt": "Просмотри daily notes (memory/) за последнюю неделю. Перенеси устойчивые решения и факты в MEMORY.md. Удали дубликаты и устаревшее из MEMORY.md. Отправь мне краткий отчёт: что добавлено, что удалено.",
"agent": "default",
"channel": "telegram"
}
]
}
Каждое воскресенье в 21:00 агент сам наводит порядок и присылает отчёт.
flowchart LR
DN["Daily Notes\n(за неделю)"] -->|"cron: воскресенье"| AG["Агент курирует"]
AG -->|"Устойчивые факты"| MEM["MEMORY.md"]
AG -->|"Удалено устаревшее"| DEL["Очистка"]
AG -->|"Отчёт"| TG["Telegram"]
style DN fill:#dbeafe,stroke:#2563eb
style AG fill:#eef2ff,stroke:#4f46e5
style MEM fill:#dcfce7,stroke:#16a34a
style DEL fill:#fee2e2,stroke:#dc2626
style TG fill:#f8fafc,stroke:#1e293b
Ограничьте поиск в группах
В группе агент не должен показывать личные заметки. QMD scope ограничивает поиск по памяти только личными чатами:
{
"memory": {
"qmd": {
"scope": {
"default": "deny",
"rules": [
{ "action": "allow", "match": { "chatType": "direct" } }
]
}
}
}
}
3. Git backup для workspace
Workspace — это память вашего агента. Потерять её — всё равно что потерять записную книжку за полгода. Поставьте под git:
cd ~/.openclaw/workspace
git init
git add AGENTS.md SOUL.md TOOLS.md IDENTITY.md USER.md HEARTBEAT.md MEMORY.md memory/
git commit -m "Initial workspace"
Регулярно:
git add . && git commit -m "Update memory" && git push
Не коммитьте: API-ключи, OAuth-токены, файлы из
~/.openclaw/credentials/.
4. Для мультиагентных систем: изоляция
Каждый агент получает свой workspace, свои сессии, свой индекс памяти. Агенты не видят память друг друга. Это правильно — рабочий бот не должен знать ваши личные заметки.
Продвинутое: Mem0
Если хотите автоматическое управление памятью, есть плагин Mem0. Он сам решает, что запоминать:
- Auto-Recall — перед ответом ищет релевантные воспоминания и подгружает в контекст
- Auto-Capture — после ответа определяет новые факты, сохраняет их, обновляет устаревшие
Установка:
openclaw plugins install @mem0/openclaw-mem0
Конфигурация:
{
"plugins": {
"slots": {
"memory": "@mem0/openclaw-mem0"
}
}
}
Mem0 добавляет агенту дополнительные инструменты: memory_store, memory_list с разделением на краткосрочную и долгосрочную память.
Практическое задание
- Посмотрите содержимое вашего workspace:
ls ~/.openclaw/workspace/default/ - Проверьте размер bootstrap-файлов:
wc -l ~/.openclaw/workspace/default/*.md - Если SOUL.md больше 100 строк — сократите до 50-70 (каждая строка стоит токенов)
- Создайте MEMORY.md с базовой информацией о себе и проектах
- Добавьте правило про память в AGENTS.md
- Настройте compaction: дешёвая модель + memory flush
- Настройте session maintenance:
pruneAfter: "7d",idleMinutes: 120 - Попросите агента: «Запиши в заметки, что я предпочитаю отчёты в формате таблиц»
- Проверьте, появился ли файл
memory/YYYY-MM-DD.mdс записью
Главное
- Контекст LLM — временный буфер, файлы на диске — настоящая память
- SOUL.md, AGENTS.md, USER.md загружаются каждое сообщение — держите их короткими
- Daily Notes — автоматический лог дня, загружаются сегодня + вчера
- MEMORY.md — курированные факты, обновляйте и чистите регулярно
- Memory flush перед compaction — критичен, иначе агент теряет контекст
- Перед
/newпросите агента записать важное вручную (баг: flush не срабатывает) - Семантический поиск находит информацию в архивных daily notes
- Git backup для workspace — защита от потери памяти