Память рабочего пространства v2 (оффлайн): исследовательские заметки
Цель: Рабочее пространство в стиле Clawd (agents.defaults.workspace, по умолчанию ~/.openclaw/workspace), где "память" хранится как один файл Markdown в день (memory/YYYY-MM-DD.md) плюс небольшой набор стабильных файлов (например, memory.md, SOUL.md).
Этот документ предлагает архитектуру памяти с приоритетом оффлайн, которая сохраняет Markdown как канонический, проверяемый источник истины, но добавляет структурированное воспроизведение (поиск, сводки по сущностям, обновления уверенности) через производный индекс.
Зачем менять?
Текущая настройка (один файл в день) отлично подходит для:
- Журналирования "только добавление"
- Редактирования человеком
- Надежности и аудируемости на основе git
- Низкой фрикционности захвата ("просто запишите")
Слабые стороны:
- Высокая полнота извлечения ("что мы решили о X?", "когда мы в последний раз пробовали Y?")
- Ответы, ориентированные на сущности ("расскажи мне об Alice / The Castle / warelay") без перечитывания многих файлов
- Стабильность мнения/предпочтения (и доказательства, когда оно меняется)
- Временные ограничения ("что было правдой в ноябре 2025?") и разрешение конфликтов
Цели дизайна
- Оффлайн: работает без сети; может работать на ноутбуке/Castle; без зависимости от облака
- Объяснимо: извлеченные элементы должны быть атрибутируемыми (файл + местоположение) и отделимыми от вывода
- Низкие церемонии: ежедневное логирование остается Markdown, без тяжелой работы со схемой
- Инкрементально: v1 полезен только с FTS; семантический/векторный и графы являются опциональными обновлениями
- Дружелюбно к агенту: упрощает "воспроизведение в рамках бюджета токенов" (возвращает небольшие пакеты фактов)
Модель Полярной звезды (Hindsight × Letta)
Две части для смешивания:
Контрольный цикл в стиле Letta/MemGPT
- Всегда держите небольшое "ядро" в контексте (персона + ключевые факты о пользователе)
- Все остальное вне контекста и извлекается через инструменты
- Записи в память — это явные вызовы инструментов (append/replace/insert), сохраняются, затем повторно вводятся в следующем ходе
Субстрат памяти в стиле Hindsight
- Разделить наблюдаемое vs верованное vs суммированное
- Поддержка retain/recall/reflect
- Мнения с уверенностью, которые могут эволюционировать с доказательствами
- Извлечение с учетом сущностей + временные запросы (даже без полных графов знаний)
Предлагаемая архитектура (Markdown как источник истины + производный индекс)
Канонический магазин (git-дружественный)
Сохраните ~/.openclaw/workspace как каноническую человекочитаемую память.
Предлагаемая структура рабочего пространства:
~/.openclaw/workspace/
memory.md # маленький: долговечные факты + предпочтения (core-ish)
memory/
YYYY-MM-DD.md # ежедневный лог (добавление; нарратив)
bank/ # "типизированные" страницы памяти (стабильные, проверяемые)
world.md # объективные факты о мире
experience.md # что делал агент (от первого лица)
opinions.md # субъективные предпочтения/суждения + уверенность + указатели на доказательства
entities/
Peter.md
The-Castle.md
warelay.md
...
Примечания:
- Ежедневный лог остается ежедневным логом. Нет необходимости превращать его в JSON
- Файлы bank/ курируются, создаются заданиями рефлексии и все еще могут редактироваться вручную
- memory.md остается "маленьким + core-ish": то, что вы хотите, чтобы Clawd видел в каждой сессии
Производный магазин (машинное воспроизведение)
Добавьте производный индекс под рабочим пространством (не обязательно отслеживается git):
~/.openclaw/workspace/.memory/index.sqlite
Поддерживается:
- Схема SQLite для фактов + связи сущностей + метаданные мнений
- SQLite FTS5 для лексического воспроизведения (быстро, крошечно, оффлайн)
- Опциональная таблица встраиваний для семантического воспроизведения (все еще оффлайн)
Индекс всегда восстанавливается из Markdown.
Retain / Recall / Reflect (операционный цикл)
Retain: нормализация ежедневных логов в "факты"
Ключевая идея Hindsight, которая здесь важна: хранить нарративные, самодостаточные факты, а не крошечные фрагменты.
Практическое правило для memory/YYYY-MM-DD.md:
- В конце дня (или во время), добавьте секцию ## Retain с 2–5 пунктами, которые:
- Нарративны (сохранен контекст между ходами)
- Самодостаточны (имеют смысл позже как самостоятельные)
- Помечены типом + упоминаниями сущностей
Пример:
## Retain
- W @Peter: В настоящее время в Марракеше (27 ноября – 1 декабря 2025) на день рождения Энди.
- B @warelay: Я исправил сбой Baileys WS, обернув обработчики connection.update в try/catch (см. memory/2025-11-27.md).
- O(c=0.95) @Peter: Предпочитает краткие ответы (<1500 символов) в WhatsApp; длинный контент идет в файлы.
Минимальный парсинг:
- Префикс типа: W (мир), B (опыт/биографический), O (мнение), S (наблюдение/сводка; обычно генерируется)
- Сущности: @Peter, @warelay и т. д. (слаги отображаются в bank/entities/*.md)
- Уверенность мнения: O(c=0.0..1.0) опционально
Если вы не хотите, чтобы авторы об этом думали: задание рефлексии может вывести эти пункты из остальной части лога, но наличие явной секции ## Retain — самый простой "рычаг качества".
Recall: запросы к производному индексу
Воспроизведение должно поддерживать:
- Лексическое: "найти точные термины / имена / команды" (FTS5)
- Сущность: "расскажи мне об X" (страницы сущностей + факты, связанные с сущностями)
- Временное: "что случилось около 27 ноября" / "с прошлой недели"
- Мнение: "что предпочитает Питер?" (с уверенностью + доказательствами)
Формат возврата должен быть дружелюбным к агенту и ссылаться на источники:
- kind (world|experience|opinion|observation)
- timestamp (исходный день или извлеченный временной диапазон, если присутствует)
- entities (["Peter","warelay"])
- content (нарративный факт)
- source (memory/2025-11-27.md#L12 и т.д.)
Reflect: создание стабильных страниц + обновление убеждений
Рефлексия — это запланированное задание (ежедневное или heartbeat ultrathink), которое:
- Обновляет bank/entities/*.md из недавних фактов (сводки по сущностям)
- Обновляет уверенность bank/opinions.md на основе подкрепления/противоречия
- Опционально предлагает правки в memory.md ("core-ish" долговечные факты)
Эволюция мнения (простая, объяснимая):
-
У каждого мнения есть:
- Утверждение
- Уверенность c ∈ [0,1]
- last_updated
- Ссылки на доказательства (поддерживающие + противоречащие ID фактов)
-
Когда прибывают новые факты:
- Найти кандидатов мнений по перекрытию сущностей + сходству (сначала FTS, позже встраивания)
- Обновить уверенность небольшими дельтами; большие скачки требуют сильного противоречия + повторяющихся доказательств
Интеграция CLI: автономная vs глубокая интеграция
Рекомендация: глубокая интеграция в OpenClaw, но сохранение отделяемой основной библиотеки.
Почему интегрироваться в OpenClaw?
-
OpenClaw уже знает:
- Путь к рабочему пространству (agents.defaults.workspace)
- Модель сессии + heartbeats
- Паттерны логирования + устранения неполадок
-
Вы хотите, чтобы сам агент вызывал инструменты:
- openclaw memory recall "…" --k 25 --since 30d
- openclaw memory reflect --since 7d
Почему все же разделить библиотеку?
- Сохранить логику памяти тестируемой без gateway/runtime
- Повторное использование из других контекстов (локальные скрипты, будущее настольное приложение и т.д.)
Форма: Инструментарий памяти предназначен быть небольшим слоем CLI + библиотека, но это только исследовательское.
"S-Collide" / SuCo: когда использовать (исследование)
Если "S-Collide" относится к SuCo (Subspace Collision): это подход извлечения ANN, который нацелен на сильные компромиссы recall/latency, используя обученные/структурированные столкновения в подпространствах (статья: arXiv 2411.14754, 2024).
Прагматический взгляд для ~/.openclaw/workspace:
- Не начинайте с SuCo
- Начните с SQLite FTS + (опционально) простые встраивания; вы сразу получите большинство UX побед
- Рассматривайте решения класса SuCo/HNSW/ScaNN только когда:
- Корпус большой (десятки/сотни тысяч фрагментов)
- Поиск встраиваний методом перебора становится слишком медленным
- Качество воспроизведения значительно ограничено лексическим поиском
Оффлайн-дружественные альтернативы (в порядке возрастания сложности):
- SQLite FTS5 + фильтры метаданных (нулевой ML)
- Встраивания + перебор (работает удивительно далеко, если количество фрагментов низкое)
- Индекс HNSW (распространенный, надежный; требует привязки библиотеки)
- SuCo (исследовательского уровня; привлекателен, если есть надежная реализация, которую можно встроить)
Открытый вопрос:
- Какая лучшая оффлайн модель встраивания для "памяти личного помощника" на ваших машинах (ноутбук + настольный компьютер)?
- Если у вас уже есть Ollama: встраивайте с локальной моделью; в противном случае поставьте небольшую модель встраивания в инструментальной цепочке
Минимальный полезный пилот
Если вы хотите минимальную, но все еще полезную версию:
- Добавьте страницы сущностей bank/ и секцию ## Retain в ежедневных логах
- Используйте SQLite FTS для воспроизведения с цитатами (путь + номера строк)
- Добавляйте встраивания только если качество воспроизведения или масштаб требуют этого
Ссылки
- Концепции Letta / MemGPT: "блоки основной памяти" + "архивная память" + самоедактирующая память, управляемая инструментами
- Технический отчет Hindsight: "retain / recall / reflect", четырехсетевая память, извлечение нарративных фактов, эволюция уверенности мнений
- SuCo: arXiv 2411.14754 (2024): извлечение приблизительного ближайшего соседа "Subspace Collision"