Как я сравнивал память для ИИ-агентов и почему обычные файлы оказались не хуже

Сторонние движки памяти, WireCat Memo и просто папка с файлами на одних и тех же вопросах. Что агент отвечает, на какую запись ссылается и сколько это стоит, плюс публичный LifeBench.

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

Памяти для ИИ-агентов сейчас появилось много, и почти каждая обещает, что агент наконец перестанет все забывать. Мне надо было понять, насколько мое видение памяти верно. Я взял самые популярные решения, дал их одинаковым агентам и задал одни и те же вопросы. Смотрел, что агент отвечает, на какую запись ссылается и сколько это стоит.

Кто участвовал:

  • Mem0 - облачный сервис, модель вытаскивает из сообщений факты и хранит их вместо самих сообщений.
  • Supermemory - тоже облако, режет документы на куски для поиска, а сверху модель строит граф фактов. Ищет и по кускам, и по графу.
  • Honcho - open source, в фоне делает выводы о каждом участнике разговора и хранит уже их.
  • Hindsight - open source, модель достает факты, людей и связи между ними, а ищет он сразу по смыслу, по словам, по графу и по времени.
  • WireCat Memo - наш, работает локально, хранит сами записи как есть и ищет по словам и по смыслу.
  • И просто папка с файлами, по которой агент ищет сам обычными командами.

Агенты - ассистенты OpenClaw и Hermes, потому что их человек ставит первыми, когда хочет личного ИИ-ассистента, т.е. память нужна как раз там. Плюс у Hermes из коробки есть плагины для всех четырех движков, так что они подключены своим родным способом, а не моими костылями.

В начале ноября я все это и гонял. WireCat я делаю как локальный контекст человека для любого агента (чаты, почта, заметки, встречи), так что вопрос для меня не академический - есть ли смысл в нашем Memo, или агенту хватит папки с файлами.

По факту обычные файлы оказались не хуже. На самой сложной версии моего набора OpenClaw с Memo ответил на 50 вопросов из 50 и в 46 сослался на правильную запись, а с файлами тоже 50 из 50 и 47 ссылок. С Memo вышло немного дешевле ($1.92 против $2.19), но это 1 прогон. А вот движки, которые хранят пересказ модели вместо самих записей, теряют либо факты, либо источник.

На моем наборе агент во всех прогонах работает на Claude Sonnet 5.5, я менял только память. Все данные синтетические, это выдуманная команда с выдуманными проектами.

Первый заход: Memo не нашел почти ничего

Сначала я сделал небольшой набор, 2 000 записей про 10 проектов - сообщения, письма, заметки итд. Большая часть просто шум, а по каждому проекту есть несколько важных записей, например в чате назначили дату сдачи, а потом письмом ее перенесли. 50 вопросов, по 5 на проект, и 10 из них про бюджет, которого в записях нет, там правильный ответ "неизвестно". Ответы проверяет скрипт по ключу, без ИИ-судьи.

Сначала я проверил один поиск, без агента, и отправлял в него вопрос как есть, как его набрал бы человек. Другие движки так и работают, а вот поиск Memo по словам не нашел ничего, 50 пустых ответов из 50. Это был наш баг - он хотел, чтобы все слова вопроса были в одной записи, а записи, где одновременно есть "what", "is", "current" и название проекта, понятно, не бывает. С поиском по смыслу нужная запись попадала в первую десятку только в 30% вопросов. Плюс почта и заметки выдавались через одну, а поиск по смыслу ни разу не вернул письмо. OpenClaw, Supermemory и Mem0 те же вопросы переваривали нормально.

Агент с Memo при этом все равно ответил на 50 из 50, потому что скилл memo подсказывал искать по паре ключевых слов, и Sonnet переписывал вопрос сам. Т.е. на 2 000 коротких записей сильная модель вытягивает все и без нас. А стоило это с WireCat где-то в 1.8 раза дороже, чем просто с файлами, тк агент перед каждым вопросом читал всю инструкцию memo, а ответы memo тоже были длинные.

Поиск я починил (вопрос как есть, один общий список по всем источникам, письма по смыслу), но цена от этого не упала, даже выросла. Самое смешное, что больше всего денег уходило не на поиск, а на инструкцию. Скилл, который агент читает перед работой с memo, весил 22 KB, это примерно 8 100 токенов, и агент читал его целиком перед каждым вопросом. Я урезал его до 3 KB, а остальное агент получает по запросу (ни разу не попросил, кстати).

АгентЦена 50 ответов доПослеПравильных до / после
OpenClaw + WireCat$2.73$1.4550 / 50
Hermes + WireCat$2.07$0.9850 / 50

OpenClaw считает цену сам, у Hermes она посчитана по токенам, так что сравнивать стоит по строкам, а не между агентами. Это уровень обычных файлов ($1.33 и $0.88 на тех же вопросах), но разница в пределах шума одного прогона, поэтому писать "дешевле файлов" я тут не стал.

10 000 записей, и почему Supermemory ответил на 16 из 50

На 2 000 записях агенты и с файлами, и с Memo ответили на все 50 вопросов, разницы не видно, поэтому потом я сделал набор потяжелее: 10 000 записей, те же 10 проектов плюс 2 похожих для путаницы. У каждой даты 2-4 переноса, в пересказах встреч всплывает уже старая дата, а имена похожие (Ari Vale и Ari Vail, Amber Kite и Amber Kitchen). Mem0 получил 6 500 записей из 10 000, на все не хватило бесплатного тарифа, но все записи с ответами в этот кусок попали.

Сначала только поиск, без агента. Memo с поиском по словам и по смыслу поставил нужную запись первой в 72% вопросов и в первую пятерку во всех 40 вопросах, где такая запись есть. У Supermemory 20% и 70%, у Mem0 10% и 53%. Плюс время загрузки: Memo локально проиндексировал все примерно за 2.5 минуты (с моделью e5-small), Supermemory строил память около 14 часов, Mem0 обрабатывал свои 6 500 записей 19 часов. Это бесплатные тарифы, быстрее ли платные, я не проверял.

Потом я прогнал агентов на тех же 50 вопросах:

ПамятьOpenClawHermes
Обычные файлы5049
WireCat Memo5045
Mem0 (6 500 записей)4235
Supermemory1616

У Hermes с WireCat 4 из 5 промахов это правильный ответ плюс пояснение в скобках, а проверка точная, так что засчитаны как ошибка. А вот 16 у Supermemory надо читать еще жестче: 10 из них это вопросы про бюджет, где правильный ответ "неизвестно", их берут все. Т.е. на остальные 40 вопросов 6 правильных.

Мне кажется, тут хорошо видна главная проблема подхода, когда память хранит пересказ модели, а не сами записи. Из 10 051 документа Supermemory оставил 1 585 воспоминаний, и плагины агентов ищут только по ним. Владельцев проектов агенты не нашли ни разу из 10, хотя у 6 из них владелец вообще не менялся, так что дело не только в датах. Судя по всему, их просто нет среди воспоминаний (это мой вывод, я его отдельно не проверял). При этом поиск самого Supermemory по документам находил всех владельцев в первой десятке, только агент этот поиск не видит.

Кстати, первый прогон OpenClaw с Mem0 вообще не дошел до Mem0. Встроенная память OpenClaw, отмеченная как выключенная, все равно занимала имена инструментов memory_search и memory_get, и инструменты плагина отбрасывались, а предупреждение о конфликте имен уходило только в stderr. Агент добросовестно искал в пустом индексе и на каждый вопрос про проекты отвечал "неизвестно". Любой, кто поставит этот плагин на ту же версию OpenClaw, получит то же самое.

Деньги, календарь и вопросы другими словами

Потом я усложнил вопросы. В третьей версии 10 444 записи и 50 вопросов 21 вида, там уже цена после правки, оплата частями, встреча, которую отменили и потом вернули, итд. А еще 18 вопросов я переписал так, чтобы они не совпадали с записью ни одной фразой ("арендованные серверы" вместо "договор на хостинг").

Каждую связку агента с памятью я прогнал по 1 разу. У Hermes цена посчитана по токенам, OpenClaw считает ее сам:

СвязкаПравильных из 50С правильным источникомЦена 50 ответов
OpenClaw + WireCat Memo5046$1.92
OpenClaw, файлы5047$2.19
OpenClaw + Honcho504$2.29
Hermes + Honcho504~$3.19
Hermes + WireCat Memo4930~$1.49
Hermes, файлы4935~$2.41
OpenClaw + Hindsight4334$2.34
Hermes + Hindsight378~$4.56
OpenClaw + Supermemory194$1.71
Hermes + Supermemory184~$3.70

Honcho отвечает на все, но его выводы не хранят имя записи, поэтому сослаться на источник агент может только там, где ответ "неизвестно".

Hindsight в первых прогонах набрал 4 из 50, потому что агенты ни разу не добрались до памяти. Hermes требует ровно одну старую версию клиента Hindsight, а новую, которая установлена, просто не видит. А плагин OpenClaw отказывался работать в сессии, где не указан источник сообщений. В таблице вторые прогоны.

Mem0 на этот раз не прогнался вообще, на каждый запрос он отвечал HTTP 429, думаю, кончился месячный лимит бесплатного тарифа. А Cognee я так и не собрал: 3 сборки графа подряд упали, и последняя через час с лишним заявила, что хранилище уперлось в лимит 32 GiB, при том что в его папке лежало около 0.5 GB.

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

Отдельно я посмотрел поиск без агента на 17 переписанных вопросах из 18, у которых есть запись-источник (доля вопросов, где нужная запись в первой десятке). Как только слова не совпадают, поиск по словам с 0.91 падает до 0.14. Memo в начале дня давал 0.48, Honcho 0.76, Supermemory 0.88, но это его поиск по документам, а не то, что видят его агенты. При этом та же модель e5-small, которая стоит в Memo, сама по себе находила 0.71 (правда, это в полной точности, а в Memo она сжата до 8 бит), т.е. большую часть мы теряли не в модели, а в том, как Memo ранжирует и склеивает результаты.

И тут вылез еще один баг, опять в моем бенче. Скрипт загрузки ставил каждому письму в Memo отправителя "Synthetic Sender" и номер записи вместо темы. Memo кладет отправителя и тему в вектор вместе с текстом, так что одна и та же строчка сидела в каждом письме, а остальные движки получали чистый текст. Т.е. я мерил свой продукт с гандикапом, который сам ему и выдал. Прогоны агентов в таблице выше, кстати, еще со старыми заголовками писем.

Вот как это менялось по шагам, на тех же 17 вопросах:

Что поменялВ первой десятке
Memo в начале дня0.48
у каждого письма свой отправитель и тема (фикс бенча)0.53
общий поиск больше не берет по очереди из каждого источника0.62
находки только по словам получают сравнимый счет, чтобы точные совпадения не терялись0.59
текст письма без строки отправителя в начале0.65
модель EmbeddingGemma 300M внутри Memo0.79
плюс переписывание записей моделью при записи (включается отдельно)0.94

Шаг с 0.62 на 0.59 сделал хуже, и я его все равно оставил, иначе точные совпадения по словам проваливались вниз. Строчки взяты из разных сборок, так что это шаги, а не одна чистая серия. У последнего шага есть минусы. Записи переписывает gpt-4o-mini, т.е. они уходят в OpenAI (около $0.60 за 10 000 записей), и вопрос словами самой записи реже находит ее первой (0.41 вместо 0.54), хотя в пятерке и десятке не теряет.

EmbeddingGemma теперь модель по умолчанию. Она индексирует в 5 раз медленнее, чем e5-small, и у нее лицензия Gemma Terms, а не MIT, ее принимаешь при скачивании. Но ни одна бесплатная модель покрупнее, которую я пробовал, ее не обошла, bge-m3 максимум сравнялась.

LifeBench: чужой бенч вместо своего

Свой набор я придумал сам, а на своих чатах такое не покажешь, да они и не репрезентативны, поэтому я пошел искать существующие бенчмарки и нашел LifeBench 2.0. Это 1 год из жизни человека, данные с телефона (смс, календарь, фото итд), всего 10 выдуманных людей и 3 380 вопросов, и для каждого вопроса известно, в каких записях ответ. Достаточно релевантный датасет.

Сначала я посадил на него того же OpenClaw с Sonnet, 46 вопросов одного человека. Memo 93%, файлы 96%. Разница в 1 вопрос на таком объеме ничего не значит, но файлы при этом на 16% дешевле и на 30% быстрее по медиане, а агент с файлами ни разу не вызвал поиск по памяти, он просто гонял команды shell по 4 986 маленьким файлам с датой в каждом. Плюс у Memo длинный хвост: один вопрос без ответа съел 176 вызовов инструментов, 4 минуты и $0.46, прежде чем агент сдался. Я думаю, на годах настоящей почты такой фокус с файлами уже не прокатит, но тут он сработал.

Когда агент может искать сколько хочет, слабый поиск не заметен, поэтому потом я сделал как на лидерборде LifeBench: один поиск Memo, первые 20 записей уходят в 1 вызов модели, отвечает DeepSeek-V4-Flash, судит deepseek-chat по промпту самого LifeBench. 2 человека, 700 вопросов, поиск видит только записи, датированные раньше вопроса.

Система (отвечает DeepSeek-V4-Flash)MicroMacro (среднее по 9 видам)
Ответ по правильным записям (потолок)97.696.5
Memo + EmbeddingGemma77.774.5
Memo + e5-small75.372.0
Hindsight (опубликовано, все 10 человек)72.066.6
Mem0 (опубликовано, все 10 человек)61.555.0

Потолок у меня вышел 97.6 против опубликованных 97.3, т.е. сама схема воспроизводится. Но напрямую с лидербордом это сравнивать нельзя. У меня 2 человека из 10, а в хранилище с самого начала весь год (по дате режется только поиск, а лидерборд загружает записи день за днем), плюс есть мелкие отличия в формате записей и промпте судьи. И Memo тут еще старой сборки, до последних фиксов поиска.

И одна вещь, которая мне не очень нравится. Hindsight впереди как раз на вопросах, где факт со временем обновился, 85.1 против 79.8. Т.е. ровно в той теме, про которую весь этот пост, он пока лучше.

Отдельно я померил шум, на 70 вопросах каждого человека для каждой модели. Тот же вопрос, те же 20 записей в том же порядке, температура 0, ответить и рассудить еще раз - меняется 49 вердиктов из 280, примерно 1 из 6. Совпало слово в слово только 39 ответов из 280. Изменения идут в обе стороны и в сумме гасятся, так что итог по сотням вопросов держится где-то в пределах 1 пункта, а вот отдельный вердикт ничего не значит.

Это хорошо видно на выборе модели. На первых 46 вопросах (тогда еще с 40 записями в контексте) Gemma проигрывала e5-small, 37 против 39, а на всех 700 выиграла, 78% против 74% на прогоне по всему году (p = 0.045, это на грани значимости). Выигрыш, скорее всего, реальный, но небольшой, а по 46 вопросам модель выбирать нельзя.

Кстати, в одном вопросе, где файловый агент "ошибся", ошибка, судя по всему, в самом ключе: агент нашел в записях пробежку на 10 км быстрее той, что указана как личный рекорд.

Что я не мерил

  • Mem0 на третьей версии вопросов и Cognee. Mem0 упирался в 429, Cognee не собрался. Graphiti я мерил только поиском, без агента.
  • Больше одного прогона агента. Разница в цене в десятки центов между связками, скорее всего, внутри шума.
  • Настройку чужих движков. Конкуренты работали почти с настройками по умолчанию (в OpenClaw я выключил у плагинов памяти автозапись и автоподстановку, чтобы хранилище не менялось между вопросами, а Hermes с Mem0 так и писал в память каждый ход), а свой Memo я по ходу теста чинил и выпускал.
  • Весь LifeBench. 2 человека из 10, только английский, загрузка не день за днем.
  • Настоящие данные и русский язык. Все записи выдуманные. Модели на русском я сравнивал отдельно, это другая история.
  • Слабые и локальные модели в роли агента. На моем наборе везде отвечал сильный Sonnet, и с ним папка файлов отвечает почти на все.

В целом, на таких объемах агент находит ответ и с файлами, разница в том, сколько это стоит и может ли он показать, откуда ответ взялся. А память, которая хранит пересказ вместо исходной записи, на этом и проигрывает.

Дальше я хочу написать еще про пару вещей из этих тестов. Во-первых, про переписывание записей моделью при загрузке - оно подняло поиск по вопросам другими словами с 0.79 до 0.94, но у него есть своя цена, и это не только деньги. Во-вторых, почему модель эмбеддингов покрупнее не значит лучше: EmbeddingGemma на 300M обошла все, что я пробовал, включая модели в 2 раза больше. А главное, хочу наконец прогнать тест на сотне тысяч записей за несколько лет, где, как я думаю, файлы уже начнут сдавать. Посмотрим, прав ли я.

Все данные, скрипты и таблицы лежат в открытом репозитории cli-testing: память для агентов и LifeBench. Сам WireCat на wirecat.dev. Если у вас на своих данных цифры другие, напишите, очень хочу понять, где мой бенч врет.