Исследование памяти рабочего пространства
Цель: Рабочее пространство в стиле Clawd (agents.defaults.workspace, по умолчанию ~/.openclaw/workspace), где «память» хранится как один Markdown-файл на день (memory/YYYY-MM-DD.md) плюс небольшой набор стабильных файлов (например, memory.md, SOUL.md). В этом документе предлагается архитектура памяти offline-first, которая сохраняет Markdown как канонический, проверяемый источник истины, но добавляет структурированный recall (поиск, сводки по сущностям, обновление уверенности) через производный индекс.
Почему изменения?
Текущая настройка (один файл в день) отлично подходит для:
- ведения «только для добавления» журнала
- редактирования человеком
- устойчивости и аудируемости с поддержкой git
- простого захвата («просто запиши это»)
Она слаба для:
- высококачественного поиска («что мы решили насчёт X?», «в прошлый раз, когда мы пробовали Y?»)
- ответов, ориентированных на сущности («расскажи об Алисе / Замке / warelay») без перечитывания многих файлов
- стабильности мнений/предпочтений (и доказательств, когда они меняются)
- временных ограничений («что было правдой в ноябре 2025?») и разрешения конфликтов
Цели проектирования
- Offline: работает без сети; может работать на ноутбуке/Замке; нет зависимости от облака.
- Объяснимость: извлечённые элементы должны быть атрибутируемы (файл + местоположение) и отделимы от вывода.
- Низкая церемониальность: ежедневное логирование остаётся в Markdown, без тяжёлой работы со схемами.
- Инкрементальность: v1 полезна только с FTS; семантический/векторный поиск и графы — опциональные улучшения.
- Дружелюбность к агенту: упрощает «recall в рамках бюджетов токенов» (возвращает небольшие пакеты фактов).
Модель конечной цели (Hindsight × Letta)
Две части для объединения:
- Цикл управления в стиле Letta/MemGPT
- сохранять небольшое «ядро» всегда в контексте (персона + ключевые факты о пользователе)
- всё остальное находится вне контекста и извлекается с помощью инструментов
- записи в память — это явные вызовы инструментов (добавить/заменить/вставить), которые сохраняются, а затем повторно вводятся в следующий ход
- Субстрат памяти в стиле Hindsight
- разделять наблюдаемое, во что верят и что обобщено
- поддерживать retain/recall/reflect
- мнения с указанием уверенности, которые могут эволюционировать с доказательствами
- поиск с учётом сущностей + временные запросы (даже без полных графов знаний)
Предлагаемая архитектура (Markdown как источник истины + производный индекс)
Каноническое хранилище (дружелюбное к git)
Сохранить ~/.openclaw/workspace как каноническую, читаемую человеком память. Предлагаемая структура рабочего пространства:
~/.openclaw/workspace/
memory.md # небольшой: долговечные факты + предпочтения (ядро)
memory/
YYYY-MM-DD.md # ежедневный лог (добавление; повествование)
bank/ # «типизированные» страницы памяти (стабильные, проверяемые)
world.md # объективные факты о мире
experience.md # что агент сделал (от первого лица)
opinions.md # субъективные предпочтения/суждения + уверенность + указатели на доказательства
entities/
Peter.md
The-Castle.md
warelay.md
...
Примечания:
- Ежедневный лог остаётся ежедневным логом. Нет необходимости превращать его в JSON.
- Файлы в
bank/курируются, создаются заданиями на рефлексию и всё ещё могут редактироваться вручную. memory.mdостаётся «небольшим + ядром»: то, что вы хотите, чтобы Clawd видел в каждой сессии.
Производное хранилище (машинный recall)
Добавить производный индекс внутри рабочего пространства (не обязательно отслеживаемый git):
~/.openclaw/workspace/.memory/index.sqlite
Поддерживать его с помощью:
- схемы SQLite для фактов + связей сущностей + метаданных мнений
- FTS5 SQLite для лексического поиска (быстро, мало, offline)
- опциональной таблицы эмбеддингов для семантического поиска (всё ещё offline)
Индекс всегда можно перестроить из Markdown.
Retain / Recall / Reflect (операционный цикл)
Retain: нормализация ежедневных логов в «факты»
Ключевое понимание Hindsight, которое здесь важно: хранить повествовательные, самодостаточные факты, а не крошечные фрагменты. Практическое правило для memory/YYYY-MM-DD.md:
- в конце дня (или в течение) добавить раздел
## Retainс 2–5 пунктами, которые:- повествовательны (контекст между ходами сохранён)
- самодостаточны (имеют смысл сами по себе позже)
- помечены типом + упоминаниями сущностей
Пример:
## Retain
- W @Peter: Currently in Marrakech (Nov 27–Dec 1, 2025) for Andy’s birthday.
- B @warelay: I fixed the Baileys WS crash by wrapping connection.update handlers in try/catch (see memory/2025-11-27.md).
- O(c=0.95) @Peter: Prefers concise replies (<1500 chars) on WhatsApp; long content goes into files.
Минимальный парсинг:
- Префикс типа:
W(мир),B(опыт/биографическое),O(мнение),S(наблюдение/сводка; обычно генерируется) - Сущности:
@Peter,@warelay, и т.д. (слаг соответствуетbank/entities/*.md) - Уверенность мнения:
O(c=0.0..1.0)опционально
Если вы не хотите, чтобы авторы об этом думали: задание на рефлексию может вывести эти пункты из остальной части лога, но наличие явного раздела ## Retain — это самый простой «рычаг качества».
Recall: запросы к производному индексу
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(«ядро» долговечных фактов)
Эволюция мнений (простая, объяснимая):
- каждое мнение имеет:
- утверждение
- уверенность
c ∈ [0,1] - last_updated
- ссылки на доказательства (поддерживающие + противоречащие ID фактов)
- когда поступают новые факты:
- найти кандидатов в мнения по пересечению сущностей + схожести (сначала FTS, потом эмбеддинги)
- обновить уверенность небольшими дельтами; большие скачки требуют сильного противоречия + повторяющихся доказательств
Интеграция с CLI: автономная vs глубокая интеграция
Рекомендация: глубокая интеграция в OpenClaw, но сохранить отделяемую основную библиотеку.
Почему интегрировать в OpenClaw?
- OpenClaw уже знает:
- путь к рабочему пространству (
agents.defaults.workspace) - модель сессии + heartbeats
- паттерны логирования + отладки
- путь к рабочему пространству (
- Вы хотите, чтобы сам агент вызывал инструменты:
openclaw memory recall "…" --k 25 --since 30dopenclaw memory reflect --since 7d
Почему всё ещё разделять библиотеку?
- сохранить логику памяти тестируемой без gateway/runtime
- повторное использование в других контекстах (локальные скрипты, будущее десктопное приложение и т.д.)
Форма: Инструментарий памяти задуман как небольшой слой CLI + библиотеки, но это только исследовательская стадия.
«S-Collide» / SuCo: когда использовать (исследование)
Если «S-Collide» относится к SuCo (Subspace Collision): это подход к ANN-поиску, нацеленный на сильный компромисс recall/задержка за счёт использования изученных/структурированных коллизий в подпространствах (статья: arXiv 2411.14754, 2024). Прагматичный взгляд для ~/.openclaw/workspace:
- не начинать с SuCo.
- начать с SQLite FTS + (опционально) простых эмбеддингов; вы сразу получите большинство преимуществ UX.
- рассматривать решения класса SuCo/HNSW/ScaNN только когда:
- корпус большой (десятки/сотни тысяч чанков)
- поиск по эмбеддингам полным перебором становится слишком медленным
- качество recall существенно ограничено лексическим поиском
Offline-дружелюбные альтернативы (по возрастанию сложности):
- SQLite FTS5 + фильтры метаданных (без ML)
- Эмбеддинги + полный перебор (работает удивительно далеко, если количество чанков мало)
- Индекс HNSW (распространён, надёжен; нужна привязка библиотеки)
- SuCo (исследовательского уровня; привлекателен, если есть надёжная реализация для встраивания)
Открытый вопрос:
- какая лучшая offline-модель эмбеддингов для «памяти персонального помощника» на ваших машинах (ноутбук + десктоп)?
- если у вас уже есть Ollama: использовать эмбеддинги локальной модели; иначе поставлять небольшую модель эмбеддингов в инструментарий.
Самый маленький полезный пилот
Если вы хотите минимальную, но всё ещё полезную версию:
- Добавить страницы сущностей
bank/и раздел## Retainв ежедневных логах. - Использовать SQLite FTS для recall с цитированием (путь + номера строк).
- Добавить эмбеддинги только если качество recall или масштаб требуют этого.
Ссылки
- Концепции Letta / MemGPT: «блоки основной памяти» + «архивная память» + инструментальное саморедактирование памяти.
- Технический отчёт Hindsight: «retain / recall / reflect», четырёхсетевая память, извлечение повествовательных фактов, эволюция уверенности мнений.
- SuCo: arXiv 2411.14754 (2024): «Subspace Collision» приближённый поиск ближайших соседей.
План привязки сессии, независимый от каналаИсследование конфигурации модели