Память рабочего пространства v2 (оффлайн): примечания исследования

Цель: рабочее пространство Mayros (agents.defaults.workspace, по умолчанию ~/.mayros/workspace), где "память" хранится как один файл Markdown на день (memory/YYYY-MM-DD.md) плюс небольшой набор стабильных файлов (например, memory.md, MAYROS.md).

Этот документ предлагает оффлайн-первую архитектуру памяти, которая сохраняет Markdown как каноническую, проверяемую source of truth, но добавляет структурированное воспоминание (поиск, резюме сущностей, обновления уверенности) через производный индекс.

Зачем менять?

Текущая настройка (один файл на день) отлична для:

  • "append-only" журналирования
  • человеческого редактирования
  • долговечности + аудируемости на основе git
  • низко-фрикционной фиксации ("просто запишите это")

Она слаба для:

  • высоко-воспоминающего извлечения ("что мы решили о X?", "в последний раз, когда мы пробовали Y?")
  • ответов, центрированных на сущности ("расскажите мне о Alice / The Castle / warelay") без перечитывания многих файлов
  • стабильности мнения/предпочтения (и доказательств, когда это меняется)
  • временных ограничений ("что было правдой во время ноября 2025?") и разрешения конфликтов

Цели дизайна

  • Оффлайн: работает без сети; может работать на ноутбуке/Castle; нет облачной зависимости.
  • Объяснимо: извлеченные элементы должны быть атрибутируемыми (файл + местоположение) и отделимыми от вывода.
  • Низкие церемонии: ежедневное логирование остается Markdown, без тяжелой работы схемы.
  • Инкрементально: v1 полезна только с FTS; семантический/векторный и графы - опциональные обновления.
  • Дружелюбно к агентам: делает "воспоминание в пределах бюджетов токенов" легким (возврат небольших пакетов фактов).

Северная звезда модель (Hindsight × Letta)

Два куска для смешивания:

  1. Цикл управления в стиле Letta/MemGPT
  • держать небольшое "ядро" всегда в контексте (персона + ключевые факты пользователя)
  • все остальное вне контекста и извлекается через инструменты
  • записи памяти - это явные вызовы инструментов (append/replace/insert), сохраненные, затем повторно введенные в следующий ход
  1. Субстрат памяти в стиле Hindsight
  • разделить то, что наблюдается vs что считается vs что резюмировано
  • поддержка retain/recall/reflect
  • мнения с уверенностью, которые могут развиваться с доказательствами
  • извлечение, осведомленное о сущностях + временные запросы (даже без полных графов знаний)

Предлагаемая архитектура (Markdown source-of-truth + производный индекс)

Каноническое хранилище (дружественное к git)

Сохранить ~/.mayros/workspace как каноническую человекочитаемую память.

Предлагаемая структура рабочего пространства:

~/.mayros/workspace/
  memory.md                    # маленький: долговечные факты + предпочтения (core-ish)
  memory/
    YYYY-MM-DD.md              # ежедневный лог (append; нарратив)
  bank/                        # "типизированные" страницы памяти (стабильные, проверяемые)
    world.md                   # объективные факты о мире
    experience.md              # что агент сделал (от первого лица)
    opinions.md                # субъективные предпочтения/суждения + уверенность + указатели доказательств
    entities/
      Peter.md
      The-Castle.md
      warelay.md
      ...

Примечания:

  • Ежедневный лог остается ежедневным логом. Нет необходимости превращать его в JSON.
  • Файлы bank/ курируются, производятся задачами рефлексии и могут все еще редактироваться вручную.
  • memory.md остается "маленьким + core-ish": вещи, которые вы хотите, чтобы агент видел каждую сессию.

Производное хранилище (машинное воспоминание)

Добавить производный индекс под рабочим пространством (необязательно отслеживается git):

~/.mayros/workspace/.memory/index.sqlite

Поддержать его с:

  • Схемой SQLite для фактов + связей сущностей + метаданных мнений
  • SQLite FTS5 для лексического воспоминания (быстро, крошечно, оффлайн)
  • опциональной таблицей embeddings для семантического воспоминания (все еще оффлайн)

Индекс всегда перестраиваем из Markdown.

Retain / Recall / Reflect (операционный цикл)

Retain: нормализация ежедневных логов в "факты"

Ключевая идея Hindsight, которая здесь важна: хранить нарративные, самодостаточные факты, а не крошечные фрагменты.

Практическое правило для memory/YYYY-MM-DD.md:

  • в конце дня (или во время), добавить секцию ## Retain с 2–5 пунктами, которые:
    • нарративные (сохранен межходовой контекст)
    • самодостаточные (отдельно имеет смысл позже)
    • помечены типом + упоминаниями сущностей

Пример:

## Retain
- W @Peter: В настоящее время в Марракеше (27 ноября – 1 декабря 2025) на день рождения Andy.
- 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) опционально

Если вы не хотите, чтобы авторы думали об этом: задача reflect может вывести эти пункты из остальной части лога, но наличие явной секции ## Retain - самый простой "рычаг качества".

Recall: запросы над производным индексом

Recall должен поддерживать:

  • лексическое: "найти точные термины / имена / команды" (FTS5)
  • сущность: "расскажите мне об X" (страницы сущностей + факты, связанные с сущностями)
  • временное: "что произошло около 27 ноября" / "с прошлой недели"
  • мнение: "что предпочитает Peter?" (с уверенностью + доказательствами)

Формат возврата должен быть дружественным к агенту и цитировать источники:

  • 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 первым, embeddings позже)
    • обновить уверенность небольшими дельтами; большие скачки требуют сильного противоречия + повторных доказательств

Интеграция CLI: отдельная vs глубокая интеграция

Рекомендация: глубокая интеграция в Mayros, но сохранить отделяемую основную библиотеку.

Почему интегрировать в Mayros?

  • Mayros уже знает:
    • путь рабочего пространства (agents.defaults.workspace)
    • модель сессии + heartbeats
    • паттерны логирования + устранения неполадок
  • Вы хотите, чтобы сам агент вызывал инструменты:
    • mayros memory recall "…" --k 25 --since 30d
    • mayros memory reflect --since 7d

Почему все еще разделять библиотеку?

  • сохранить логику памяти тестируемой без gateway/runtime
  • переиспользовать из других контекстов (локальные скрипты, будущее desktop приложение и т.д.)

Форма: Инструменты памяти предназначены быть небольшим слоем CLI + библиотеки, но это только исследовательское.

"S-Collide" / SuCo: когда использовать (исследование)

Если "S-Collide" относится к SuCo (Subspace Collision): это подход извлечения ANN, нацеленный на сильные компромиссы recall/латентности, используя изученные/структурированные коллизии в подпространствах (статья: arXiv 2411.14754, 2024).

Прагматичный взгляд для ~/.mayros/workspace:

  • не начинайте с SuCo.
  • начните с SQLite FTS + (опционально) простых embeddings; вы получите большинство выигрышей UX немедленно.
  • рассмотрите решения класса SuCo/HNSW/ScaNN только когда:
    • корпус большой (десятки/сотни тысяч частей)
    • brute-force поиск embedding становится слишком медленным
    • качество recall значительно ограничено лексическим поиском

Дружественные к оффлайн альтернативы (в порядке возрастания сложности):

  • SQLite FTS5 + фильтры метаданных (нулевое ML)
  • Embeddings + brute force (работает удивительно далеко, если количество частей низкое)
  • Индекс HNSW (общий, надежный; нужна привязка библиотеки)
  • SuCo (исследовательского уровня; привлекателен, если есть солидная реализация, которую можно встроить)

Открытый вопрос:

  • какая лучшая оффлайн модель embedding для "памяти персонального помощника" на ваших машинах (ноутбук + десктоп)?
    • если у вас уже есть Ollama: embed с локальной моделью; иначе поставить небольшую модель embedding в инструментарий.

Наименьший полезный пилот

Если хотите минимальную, все еще полезную версию:

  • Добавить страницы сущностей bank/ и секцию ## Retain в ежедневные логи.
  • Использовать SQLite FTS для recall с цитатами (путь + номера строк).
  • Добавить embeddings только если качество recall или масштаб требует этого.

Ссылки

  • Концепции Letta / MemGPT: "блоки основной памяти" + "архивная память" + самостоятельное редактирование памяти на основе инструментов.
  • Технический отчет Hindsight: "retain / recall / reflect", четырехсетевая память, извлечение нарративных фактов, эволюция уверенности мнения.
  • SuCo: arXiv 2411.14754 (2024): извлечение приблизительного ближайшего соседа "Subspace Collision".