Octobrain 0.7.0: память вашего ИИ теперь спит, забывает и фокусируется

Память, которая только растёт, — это не память. Это ящик с хламом.

Каждый инструмент памяти ИИ до сих пор был аддитивным: храни, храни, храни. Куча растёт, поиск шумит всё сильнее, а то, что вам реально нужно, погребено под пятью почти одинаковыми заметками, которые вы написали об этом в прошлый вторник. Больше воспоминаний перестаёт означать лучший recall.

Мозг устроен иначе. Он консолидирует, пока вы спите. Он даёт неиспользуемому угасать. Он организуется вокруг того, что вы пытались сделать, а не вокруг порядка событий. Этот отсев — не баг человеческой памяти, а ровно та причина, по которой recall остаётся острым.

0.6.0 была про то, что Octobrain мог находить — читать полные документы, грепать по индексированному контенту. 0.7.0 — про то, что память Octobrain делает, когда вы не смотрите. Она перестаёт быть пассивным логом и начинает вести себя как мозг.


Sleep Consolidation — память, которая прибирается сама

Это главное. Octobrain теперь прогоняет «сон» — проход, который находит кластеры недавних похожих воспоминаний и сворачивает каждый кластер в один консолидированный инсайт.

Допустим, за неделю ваш агент сохранил пять отдельных заметок, гоняясь за одним и тем же багом с rate limiting. До 0.7.0 поиск вернул бы пять размытых пересекающихся попаданий и оставил ранжирование на волю случая. После прохода sleep эти пять схлопываются в один чистый инсайт с более высоким confidence — а оригиналы не удаляются, они приглушаются и сохраняются как провенанс, так что путь обратно к сырым заметкам остаётся.

Важная часть: это автономно. Никакого cron-задания. Никакого инструмента, который ваш агент должен помнить вызвать. Он запускается лениво сам по себе — при следующем старте Octobrain, если с прошлого прохода прошёл день, он отрабатывает и тихо уходит с дороги. Медленный или упавший проход никогда ничего не блокирует.

[memory]
sleep_consolidation_enabled        = true   # opt-out, not opt-in
sleep_consolidation_interval_hours = 24     # once a day
sleep_consolidation_threshold      = 0.85   # how similar memories must be to cluster
sleep_consolidation_min_cluster_size = 3    # need at least 3 to bother
sleep_consolidation_max_age_days   = 7      # only recent memories

Если хотите форсировать проход — для тестов или прямо перед крупным извлечением — CLI-override никуда не делся:

octobrain memory sleep-consolidate

Но по умолчанию вы его не трогаете. Память держит себя в чистоте сама.


Half-Life Decay — забывание по умыслу

Octobrain теперь применяет кривую забывания. Importance каждого воспоминания со временем угасает по графику half-life — но в момент, когда вы обращаетесь к воспоминанию, оно подкрепляется. Часто вызываемые воспоминания остаются сильными; те, к которым ничего не обращается, мягко тускнеют.

Это кривая забывания Эббингауза, позаимствованная напрямую из того, как работает человеческая память. Эффект в том, что ранжирование улучшается само. Вы ничего не курируете. Воспоминания, которыми вы реально пользуетесь, всплывают; те, что вы сохранили однажды и больше не понадобились, тонут — так и не будучи выброшенными.

Здесь важны два предохранителя:

  • Ничто не обнуляется. Есть пол importance; редко вызываемое воспоминание уходит в хвост, но никогда не исчезает. Decay — это сигнал переранжирования, а не удаление.
  • Decay сохраняется. Счётчики обращений и таймстампы последнего доступа хранятся и переживают рестарты. Понимание памятью того, что «горячо», не сбрасывается каждую сессию.
[memory]
decay_enabled       = true
decay_half_life_days = 90   # higher = memories stay relevant longer

Можно также тюнить decay для каждого воспоминания — быстро устаревающей заметке можно сказать угасать вдвое быстрее, фундаментальному решению — вдвое медленнее, — но почти для всех дефолт просто работает.


Goal-Anchored Consolidation — память со смыслом

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

0.7.0 делает это полноценным workflow. Появился новый тип воспоминания Goal и настоящий жизненный цикл для каждого воспоминания — Working → Consolidated → Archived. Воспоминания, вносящие вклад в цель, связываются с ней отношением achieves. Когда цель закрыта, вы её завершаете, и Octobrain сворачивает каждое вносящее вклад воспоминание в один консолидированный инсайт: его importance поднимается выше источников, источники приглушаются и подвешиваются под ним как запись о том, как вы к этому пришли.

# Five scattered findings, one closed goal → one durable insight
octobrain memory consolidate goal_4f2a -s "Shipped rate limiting: token bucket, 429 + Retry-After"

Пропустите summary — и Octobrain синтезирует его из заголовков источников. В любом случае то, что было пятью разрозненными заметками, становится одним воспоминанием, которое что-то значит, — заякоренным к намерению, которое его породило.

И это та же машинерия, на которой под капотом работает sleep consolidation: каждый кластер получает синтетическую цель, а goal-пайплайн делает остальное. Один движок консолидации, два способа его запустить — вручную, когда вы что-то завершаете, и автоматически, пока вы спите.


Recall стал умнее — HyDE-lite, включён по умолчанию

Размытые запросы — это где семантический поиск обычно проваливается. «То, что про ретраи» не эмбедится никуда близко к заметке, которую вы реально написали.

0.7.0 приносит расширение запроса HyDE-lite и включает его по умолчанию. Механизм прост: делаем первый проход поиска, берём топ результатов, усредняем их в центроид и подмешиваем обратно в исходный запрос перед настоящим поиском. Запрос фактически выучивает, как выглядят его собственные ответы, и целится точнее.

На практике это +10–30% recall на long-tail и недоопределённых запросах — ровно тех, что люди реально набирают. Стоит это одного лишнего векторного lookup на поиск, не требует LLM (это чистая математика), и remember включает его автоматически. Ключевая (BM25) половина поиска по-прежнему использует ваш буквальный текст, так что запросы на точное совпадение не задеты.

Вы ничего не настраиваете. Размытые вопросы просто чаще находят нужное воспоминание.


Более компактная поверхность инструментов — с 8 MCP-инструментов до 5

Каждый инструмент, который вы выставляете через MCP, стоит вашему агенту контекста на каждом ходу — примерно 500–2000 токенов схемы, которую ему нужно прочитать, прежде чем что-то сделать. Раздутая поверхность инструментов — это налог на каждый запрос.

Поэтому мы урезали MCP-поверхность Octobrain с восьми инструментов до пяти отдельных глаголов:

memorize     store a memory   (now with optional related_to[])
remember     recall           (HyDE expansion + 1-hop neighbors, automatic)
forget       delete           (with confirmation)
consolidate  close a goal     (fold N memories into 1 insight)
knowledge    documents        (index, read, match, search)

Три инструмента ушли из MCP, потому что больше не оправдывали стоимость своей схемы:

  • sleep_consolidate — теперь автономен, так что агенту никогда не нужно его вызывать.
  • relate — вложен в memorize. Можно передать related_to[] и связать воспоминание с другими в том же вызове, который его сохраняет. Внести вклад в цель теперь — это один round-trip: сохранить находку и пометить, что она achieves цель, разом.
  • memory_graphremember уже возвращает ближайших соседей воспоминания, что покрывает типичный случай.

Ни один из них не исчез — все они по-прежнему живут в CLI для администрирования и отладки. Они просто больше не съедают контекст вашего агента ради фич, которыми он редко пользуется. Пять инструментов, пять глаголов, никаких перегруженных флагов режима.


Мы начали измерять качество памяти — LongMemEval

Нельзя улучшить то, что не измеряешь. 0.7.0 добавляет benchmark-харнесс LongMemEval — с чекпоинтингом для долгих прогонов — чтобы оценивать долгосрочный recall Octobrain между релизами на реальном бенчмарке, а не на ощущениях. Это инфраструктура, которую вы никогда не запустите, но именно она делает заявления о recall и консолидации выше теми заявлениями, за которые мы можем поручиться, — и так же будет с будущими.


Под капотом

Горстка более тихих изменений держит свет включённым по мере роста памяти:

  • Периодическое обслуживание LanceDB запускается автоматически, чтобы со временем держать векторное хранилище компактным и быстрым.
  • Асинхронные авто-связывание и graph-извлечение — связанные воспоминания соединяются в фоне, не тормозя запись, которая их запустила.
  • Консолидированный SQL-модуль с централизованным экранированием литералов и упрочнением — меньше острых углов, одно место, чтобы рассуждать о запросах.

Ничего из этого вы не заметите напрямую. В этом и смысл.


Как выглядит 0.7.0 на практике

Неделя из жизни воспоминания, от начала до конца:

  1. Понедельник. Ваш агент сохраняет три заметки, дебажа флакающий вебхук — каждую через memorize, одну из них помечая, что она achieves цель «починить ретраи вебхука», в том же вызове.
  2. Всю неделю. Вы продолжаете спрашивать об этом. Каждый remember подкрепляет воспоминания, к которым вы обращаетесь, и тихо гасит те, к которым нет.
  3. Пятница. Вы выкатываете фикс и делаете consolidate цели. Три заметки становятся одним прочным инсайтом: «Ретраи вебхука: экспоненциальный backoff, ключи идемпотентности, dead-letter после 5».
  4. Ночью. Sleep consolidation подметает почти одинаковые наблюдения, которые вы так и не связали явно, и сворачивает их тоже.
  5. Через месяц. Кто-то спрашивает «как мы обрабатывали сбои вебхуков?» — размытый запрос, который HyDE расширяет, попадая в консолидированный инсайт, а не в пять полузабытых фрагментов.

Никто ничего не курировал. Память организовала себя сама.


Апгрейд

С 0.6.x миграция небольшая:

Конфиг — один ренейм. Если в вашей секции [embedding] задан text_model, переименуйте его в model. Это единственное breaking-изменение конфига.

[embedding]
model = "fastembed:nomic-ai/nomic-embed-text-v1.5"   # was: text_model

MCP-клиенты — три инструмента переехали только в CLI. Если конфиг вашего клиента или промпты агента зовут sleep_consolidate, relate или memory_graph через MCP, обновите их:

  • Уберите вызовы sleep_consolidate целиком — теперь он автономен.
  • Замените relate на related_to[] у memorize, чтобы связывать по ходу сохранения (или используйте octobrain memory relate в CLI для связей между существующими).
  • Типичный случай memory_graph покрыт результатами соседей у remember; более глубокий обход остаётся в octobrain memory graph.
  • consolidate_goal переименован в consolidate — та же схема, более чистый глагол.

Хранилище — делать нечего. Новые колонки жизненного цикла и трекинга обращений добавляются при первом запуске, а legacy-воспоминания по умолчанию полностью активны. Ни ручной миграции, ни простоя.

Дефолты — sleep consolidation и HyDE теперь включены. Если хотите старое поведение, выставьте sleep_consolidation_enabled = false или [search.hyde] enabled = false. Большинству стоит оставить их включёнными.

Исходники и бинарники: github.com/muvon/octobrain. Что-то сломалось — открывайте issue, мы их читаем.