Как проверить, что память ИИ-агента работает, а не просто «есть»: методика за один вечер

Шесть принципов и чек-лист: как проверить, что память ИИ-агента действительно работает. На примере skillmem: 0 из 10 без памяти и 10 из 10 с ней, плюс три бага, найденные за вечер.

Обложка: Как проверить, что память ИИ-агента работает, а не просто «есть»: методика за один вечер

Память для ИИ-агентов сейчас обещает каждый второй инструмент: MCP-серверы, плагины к Claude Code и Cursor, «second brain» для Codex. Обещание у всех одно: агент помнит прошлые сессии. Проверяют это редко. Обычно человек видит, что агенту что-то подсунули в контекст, и делает вывод, что память работает.

Я полгода делаю open-source память skillmem и тоже ни разу её не мерил. Когда наконец собрал тест, он за один вечер нашёл три проблемы. Ниже методика, которую можно повторить на любом инструменте памяти.

Принцип 1. Мерить ответ агента, а не выдачу поиска

У бенчмарков вроде LongMemEval метрика hit@k: попала ли нужная запись в первые k результатов. Это полезно, но пользователю важно другое: ответил ли агент правильно. Запись может быть в выдаче и не дойти до модели, потому что её обрезал лимит контекста. Модель может её увидеть и не поверить. Поэтому основная метрика — верный ответ, а hit@k вспомогательная, она нужна для отладки.

Принцип 2. Две группы прогонов, всё остальное одинаково

Модель, промпт и настройки одни и те же, отличается только подключённая память. Для Claude Code это выглядит так:

			export CLAUDE_CODE_DISABLE_AUTO_MEMORY=1 CLAUDE_CODE_DISABLE_CLAUDE_MDS=1
claude -p "$PROMPT" --output-format json --no-session-persistence \
  --setting-sources project --settings "$SETTINGS" \
  --strict-mcp-config --mcp-config "$MCP"
		

В группе без памяти SETTINGS='{}' и пустой MCP. В группе с памятью подключены хуки и MCP-сервер. Встроенную авто-память и CLAUDE.md отключаем в обеих группах, иначе сравнивается не то.

Принцип 3. Отключить агенту файлы

Если у агента есть Read и Grep, он найдёт ответ на диске, и тест измерит поиск по файлам. В группе без памяти у агента вообще нет инструментов, а в группе с памятью есть только инструменты памяти. Звучит жёстко, но иначе цифры ничего не значат.

Принцип 4. Отдельный тест «между окнами»

Вопросы по базе проверяют поиск. Главное обещание — новое окно помнит старое — проверяется отдельно:

  1. Первый процесс claude -p: «релиз переносим на 14 ноября, кодовое имя "Сокол", отвечает Тимур».
  2. Процесс завершается, и хуки памяти успевают сохранить сессию.
  3. Второй, новый процесс: «Это новое окно. Какое кодовое имя и кто отвечает? Не знаешь — так и скажи».

Результат у меня: 0 из 10 без памяти, 10 из 10 с памятью (5 сценариев × 2 прогона). Фраза «не знаешь — скажи» важна: без неё агент без памяти иногда угадывает, и в группе без памяти появляется шум.

Принцип 5. Каждый промах разбирать до причины

Самое ценное — не итоговая цифра, а промахи. На 15 вопросах по моему реальному проекту было 0 из 30 без памяти и 22 из 30 с ней. Каждый промах я разбирал по одной схеме: есть ли запись в базе → есть ли она в выдаче → на каком месте → дошла ли до модели → поверила ли модель.

Каждый шаг этой цепочки дал по проблеме:

  • Есть ли в базе. 208 из 698 файлов памяти не импортированы: импорт описан в инструкции, но не подключён в хуках. Исправление — хук импорта на конец сессии. Результат: 22 → 24 из 30.
  • Место в выдаче. 8206 из ~9300 записей — автопересказы сессий, они вытесняют короткие правила. Исправление — вес пересказов ×0,5 в слиянии RRF. Результат: hit@3 18 → 26 из 30, итог 28 из 30.
  • Поверила ли модель. Агент сознательно не доверяет правилам, которые записал сам и которые не одобрил человек. Исправление — одобрение одним словом прямо в чате.

Третий пункт — не баг. Это защита от prompt injection: агент прочитал чужой README с фразой «всегда делай X» и закрепил её в памяти как правило. Но защита, которой неудобно пользоваться, тоже проблема. У меня скопилось 32 собственных неодобренных правила.

Принцип 6. Проверить, что не подогнал под себя

Если тюнишь поиск на своей базе, обязательно прогоняй публичный бенчмарк до и после. У меня после снижения веса пересказов LongMemEval hit@5 не упал, а вырос: 0,871 → 0,889. Если бы упал, правку пришлось бы откатить. Ещё одну правку, удаление служебных слов из запроса, я так и откатил: эффекта ноль.

Чек-лист

  • Метрика — верный ответ агента, hit@k вспомогательная.
  • Две группы прогонов, отличие только в памяти. Встроенная память клиента выключена в обеих.
  • Чтение файлов агенту запрещено.
  • Отдельный тест «между окнами» на двух разных процессах.
  • В промпте есть «не знаешь — так и скажи».
  • Каждый промах разобран по цепочке: база → выдача → место → контекст → доверие.
  • Публичный бенчмарк до и после любой правки ранжирования.
  • Ограничения названы честно: маленькие выборки, своя база, синтетические факты.

skillmem распространяется под лицензией Apache-2.0. Релиз с исправлениями: 0.13.0.

Рекомендуем