Агент памяти, который забывает: как Synapse проверяли на бенчмарке

Соло-разработчик, собирающий долгоживущего агента, рано упирается не в промпт, а в политику памяти: что хранить, что выбрасывать и как не раздувать контекст. Автор Synapse для трека MemoryAgent хакатона Qwen Cloud сделал ставку на намеренное забывание — и потратил два дня на проверку, что механизм выдерживает нагрузку, а не только красиво звучит в README.
Почему «embed every message» — это индекс, а не память агента
Перед стартом автор смотрел на типичные AI memory agent и видел один паттерн: вшить каждое сообщение в эмбеддинги, положить в vector DB, на запросе взять top-k. Такой стек не забывает ничего, одинаково весит мелочи и критичные факты, а со временем retrieval шумит из-за near-duplicate без очистки. Для агента с ограниченным контекстным окном это не долговременная память, а поисковый индекс по всей истории чата.
Бриф трека MemoryAgent требовал трёх вещей: эффективное хранение и извлечение, своевременное забывание устаревшего и вспоминание критичных фактов в узком окне. Второй пункт почти никто не строит: наивное векторное хранилище «не знает, что устарело».
Salience, decay и «сон» агента: механизм забывания
В Synapse у каждой записи есть salience, который падает со временем. Базовая формула из поста:
salience(t) = importance_score * recall_boost(recall_count) * exp(-lambda * hours_since_last_recall)
recall_boost(n) = 1 + log(1 + n)
lambda = ln(2) / half_life_hours
importance_score при записи выдаёт structured-output вызов Qwen — не keyword-heuristic: учитываются явные сигналы вроде «remember this», decision-relevance и specificity. Half-life не одна на всё: эпизодические детали затухают примерно за 72 часа без подкрепления, семантические факты — около 30 дней. Замысел асимметричный: забывать «о чём говорили», а не «что сказали, что важно».
Поверх decay работает фоновый sleep pass с двумя механизмами, которых у наивного vector store нет. Consolidation схлопывает повторяющиеся эпизоды — например, пять сообщений про hackathon project — в одну семантическую память и выводит оригиналы из активного набора. Contradiction detection при прямом противоречии (Berlin → Lisbon) отправляет пару фактов в Qwen-судью и retire устаревшую запись.
Стек агента: Qwen Cloud, structured output и retry на битый JSON
Synapse — standalone MemoryAgent на Qwen Cloud, не обёртка вокруг IDE. Чат, scoring, extraction, contradiction, cluster summary и LLM-as-judge в бенчмарке идут через реальные endpoint-вызовы без моков: модели qwen-max / qwen3.7-plus, эмбеддинги text-embedding-v3, OpenAI-compatible endpoint с workspace-specific URL из консоли API-key. Деплой — на Alibaba Cloud ECS; код под MIT в репозитории github.com/Boweii22/Synapse, есть демо и видео.
Для соло-workflow с агентами на structured output важна не только модель, но и обработка shape-failure: быстрая qwen3.6-flash в бенчмарке иногда возвращала malformed JSON ({} вместо score). Автор обернул вызовы в _chat_json_retrying — до трёх попыток с re-prompt при невалидной форме, не только при сетевой ошибке. Паттерн переносим на любой агентный контур, где LLM пишет JSON в память или в tool-call.
Бенчмарк на 110 turns: честные цифры и баг, который всплыл на длине
Второй агент в сравнении — тот же Qwen и те же эмбеддинги, но zero decay, zero consolidation, zero pruning. Прогон: 110 turns, симулированный диалог на 40 дней; время сжимали через fabricated now в коде, а не ждали календарные сутки.
| Метрика | Synapse | Naive baseline |
|---|---|---|
| Активные воспоминания | плато ~117 | рост до ~220 |
| Token cost per query | 130–170 на всём прогоне | пик >2000 |
| Recall accuracy (LLM-as-judge) | 71% | 95% |
Автор не скрывает, что recall у Synapse ниже, и разбирает причины. До фиксов similarity pre-filter отсекал противоречие при разной формулировке — similarity до 0,59 при пороге 0,75; re-ranking иногда поднимал часто вспоминаемый generic fact выше более релевантного, но менее reinforced. Обе проблемы починили с targeted regression и live e2e на деплое; полный multi-hour бенчмарк на исправленном коде до дедлайна не перезапускали — это зафиксировано явно.
Критический баг нашли на длине: consolidation сравнивала «новее/старее» через timestamps, а одна функция fallback'ила на datetime.now() вместо симулированного now. Все записи бенчмарка оказались в одном wall-clock окне, contradiction check сравнивал шум, не хронологию диалога. Триггер — запрос к БД после «backwards result» со stale fact. Фикс: thread simulated now во все функции с timestamps плюс regression test test_stale_fact_loses_even_when_inserted_after_correct_one.
Баги механизма памяти всплывают только на 100+ turns, когда timestamps и salience расходятся. Naive baseline рядом с «умной» памятью превращает «trust me it's smart» в число.
Что вынести в свой агентный контур
Если вы собираете память для долгоживущего ассистента — в IDE, в боте или в отдельном сервисе — три практических вывода из build-story Synapse ложатся на любой стек. Во-первых, decay и consolidation — не украшение, а способ держать retrieval релевантным без линейного роста индекса. Во-вторых, contradiction detection нужен, если агент должен обновлять устаревшие факты, а не тащить Berlin, когда пользователь уже в Lisbon. В-третьих, long job с памятью требует regression на simulated time и параллельного naive baseline — иначе баги всплывают после дедлайна, когда метрики уже опубликованы.
Полный разбор с формулами, логом фиксов и ссылками на репозиторий — в первоисточнике ниже.
Источники
- _boweii: I Built an AI Memory Agent That Forgets on Purpose — Then Spent Two Days Proving It Actually Works — Dev.to, 2026-07-20
- Репозиторий Synapse (MIT): https://github.com/Boweii22/Synapse
- Демо: http://8.208.98.93
- Видео: https://youtu.be/0SXzcWqlZog
Зачем это разработчику
Материал «Агент памяти, который забывает: как Synapse проверяли на бенчмарке» относится к экосистеме AI-кодинг и vibe coding — теме, которую отслеживают разработчики и инди-хакеры, собирающие стек для быстрых прототипов. Даже узкая фича может повлиять на ежедневный workflow: деплой, агент, редактор или биллинг. Для инди-разработчика и небольшой команды в РФ/СНГ это снижает трение при переносе привычного локального workflow в облако. Зафиксируйте шаги в README repl и сделайте commit после проверки — иначе правки агента сложно откатить. Перед демо заказчику прогоните smoke на публичном URL деплоя.
Как попробовать
Откройте оригинальный источник из статьи и сопоставьте с вашим repl или локальным репозиторием. Если используете агента (AI-кодинг и vibe coding или Replit Agent), опишите задачу и попросите применить изменения к конкретным файлам. После правок — commit, smoke-тест и при необходимости redeploy. Для инди-разработчика и небольшой команды в РФ/СНГ это снижает трение при переносе привычного локального workflow в облако. Зафиксируйте шаги в README repl и сделайте commit после проверки — иначе правки агента сложно откатить. Перед демо заказчику прогоните smoke на публичном URL деплоя.
Нюансы
Новости AI-кодинг и vibe coding устаревают: проверяйте дату публикации и changelog вендора. Бесплатные tier и региональные ограничения для РФ/СНГ могут отличаться от англоязычных анонсов. Не переносите экспериментальные фичи в прод без review безопасности. Для инди-разработчика и небольшой команды в РФ/СНГ это снижает трение при переносе привычного локального workflow в облако. Зафиксируйте шаги в README repl и сделайте commit после проверки — иначе правки агента сложно откатить. Перед демо заказчику прогоните smoke на публичном URL деплоя.
Связка с vibe coding
Тема «Агент памяти, который забывает: как Synapse проверяли на бенчмарке» вписывается в стек vibe coding: один агентный чат, облачный repl или Cursor, git как источник правды. Зафиксируйте в README, что именно поменялось после анонса, чтобы через месяц не восстанавливать контекст. Для пет-проектов достаточно бесплатного tier; для продакшена заложите мониторинг и лимиты расходов на деплой и API.