Разбор готов
Mem0 Dream: как поддерживать память агента без потери истории
Агент, который общается с человеком месяцами, сохраняет в Mem0 отдельные сведения о нём. Со временем одна и та же привычка появляется в памяти разными словами, прежний адрес соседствует с новым, а разрозненные наблюдения не складываются в общую картину. Простая проверка одинаковых строк не решает этих проблем: смысл записей может совпадать без буквального совпадения, а обновление не всегда видит нужную старую запись. В Dream Mem0 разделяет объединение повторов, замещение устаревших фактов и осторожное обобщение привычек. Разберём, когда выполняется каждое действие, почему старые записи не удаляют и как приложение выбирает между актуальной памятью и историей.
Полезно инженерам, которые разрабатывают агентов с долговременной памятью или подключают к ним Mem0: здесь показаны условия безопасного изменения записей, разница между поиском актуальных фактов и историей, а также границы фоновой обработки.
Статья · на английском
Dream: Background memory consolidation for AI agentsRudraj Mehta · Опубликовано: 4 августа 2026 г.
Почему память постепенно перестаёт быть надёжной
Агент может помнить сведения о пользователе между разговорами: предпочтения, место проживания или привычки. Для этого он превращает важные реплики в отдельные записи памяти, которые впоследствии можно найти и добавить к контексту нового разговора. Пока записей мало, кажется достаточным просто сохранять новые факты. Но человек меняет планы и переезжает, говорит об одном и том же разными словами, а устойчивые привычки обнаруживаются лишь после нескольких разговоров.
Запись происходит прямо во время разговора. Этот участок системы автор называет write path — путём записи: он должен сработать быстро и потому видит текущий диалог и лишь небольшую подборку похожих старых воспоминаний. Он не просматривает всё хранилище. Такое ограничение помогает не превращать каждое добавление памяти в долгую проверку всех прежних фактов, но оставляет часть связей незамеченной.
Отсюда важная граница: даже корректно извлечённый новый факт не обязательно приведёт в порядок остальные записи. Если нужное прежнее воспоминание не попало в контекст записи, система может не заметить, что два фрагмента говорят об одном и том же или что один уже опровергнут. Dream предназначен для поддержания порядка в этой накопленной памяти. Образ сна в начале статьи — аналогия с организацией воспоминаний, а не описание работы человеческого мозга или обучения весов языковой модели.
How agent memory degrades over timeТри проблемы, которые проявляются со временем
Первая проблема — повторы разными словами. Автор сопоставляет записи «prefers window seats» и «always books window seats on long-haul flights»: обе связаны с местом у окна в самолёте, но это разные строки. Проверка на точное совпадение текста их не устранит. При этом близость формулировок ещё не доказывает, что второе утверждение полностью заменяет первое: смысловое объединение требует более строгой проверки.
Вторая проблема — устаревший факт. Четыре месяца назад в память могли сохранить «lives in Tokyo», а теперь пользователь сообщил «moved to Osaka». Если старый факт не оказался среди найденных при записи воспоминаний, оба могут остаться действующими и появляться в поиске. Для ответа о нынешнем месте проживания это риск ошибки, но для вопроса об истории переездов прежняя запись может оказаться полезной.
Третья проблема — разрозненные наблюдения. В январе человек рассказывал о занятиях йогой, в марте — о ранних подъёмах, в мае — о сне. Каждая запись полезна сама по себе, однако общий распорядок из них не сформулирован. Простая борьба с дублями тут ничего не решает: нужно осторожно связать независимые наблюдения в новое обобщение. Эти три случая похожи лишь внешне; Dream обрабатывает их разными операциями.
This means some problems are invisible at write time, no matter how good the extraction is:Почему это влияет на ответы агента
Поиск памяти обычно возвращает ограниченный набор наиболее подходящих записей. Дубли и устаревшие факты занимают места в этом наборе и увеличивают объём текста, который приходится передавать агенту. В результате свежая полезная запись может конкурировать с несколькими старыми формулировками, а агент — уверенно повторить сведения, которые уже перестали быть верными.
Mem0 описывает проблему на собственных рабочих данных: по словам разработчика, медианный активный проект содержит несколько сотен воспоминаний, которые дублируют другие записи того же проекта или противоречат им. Это приблизительный самоотчёт поставщика о состоянии его данных, а не значение, которое следует ожидать в любом агенте.
Автор проводит аналогию с обслуживанием баз данных. Хранилища сначала принимают записи, а затем выполняют работу по поддержанию порядка: например, уплотнение LSM-структур или очистку в PostgreSQL. Идея Dream похожа по разделению обязанностей: быстро сохранить полезную информацию и отдельно управлять её состоянием. Аналогия не означает, что Mem0 буквально использует перечисленные механизмы базы данных.
Stale and duplicate memories occupy retrieval slotsТри действия над памятью
Dream различает три отношения между воспоминаниями. Объединение (merge) фиксирует, что новая запись полностью включает старую. Замещение (supersede) отмечает, что прежний факт заменён более новым. Синтез (synthesize) создаёт отдельное обобщение, если несколько наблюдений поддерживают одну закономерность. Они не взаимозаменяемы: от выбранной операции зависят дальнейший поиск и сохранение истории.
Таблицу можно прокрутить по горизонтали.
Важное различие во времени выполнения: объединение и замещение принимаются при извлечении новой памяти, когда подходящее старое воспоминание уже найдено в контексте записи. Синтез запускается отдельно по расписанию. Поэтому выражение «фоновая консолидация» из названия Dream не означает, что все три операции выполняются в одной фоновой задаче.
Dream runs three operations on your project's memories.Объединение: новая запись содержит старую
Объединение уместно, когда более новое воспоминание не просто похоже на прежнее, а полностью сохраняет его смысл и добавляет сведения. Тогда два текста не должны продолжать соперничать за место в ответе поиска. Прежней записи присваивают состояние merged и сохраняют ссылку на ту запись, которая её поглотила. По умолчанию поиск больше не показывает поглощённый вариант.
Это правило строже поиска похожих формулировок. В примере с местом у окна первая запись описывает предпочтение вообще, а вторая — поведение на дальних перелётах. Система не должна автоматически объявлять одну другой только потому, что обе о кресле у окна. Для merge нужно удостовериться, что информация из старого текста действительно целиком присутствует в новом. В сомнительных случаях автор предпочитает оставить записи как есть.
Скрытая запись не уничтожена. Если требуется восстановить, откуда появилась актуальная формулировка, или посмотреть прежние версии, Mem0 разрешает отдельно включить merged в результаты поиска параметром include_merged=true. Таким образом, экономия мест в обычной выдаче сочетается с сохранением исторического следа.
Merge.Замещение: старый факт сохраняется как история
Замещение отвечает на другую ситуацию: новый факт действительно заменяет старый. Пользователь жил в Токио, затем переехал в Осаку. Прежняя запись перестаёт описывать его нынешнее место проживания, хотя остаётся верным историческим сведением. Если обе записи видны во время извлечения памяти, старую помечают superseded и связывают с новой через указатель на заменяющую запись.
В отличие от merged, устаревшие записи Mem0 по умолчанию не скрывает в поиске. Это намеренное решение: агенту может понадобиться история, например при обсуждении прежнего города. Когда задача требует только текущих фактов, предусмотрен latest_only=true. Значит, само состояние superseded и политика конкретного запроса решают разные вопросы: первое хранит историю изменений, второе определяет, какую часть истории показать.
Для решения о supersede автор требует ясной замены одного и того же факта. Простого тематического конфликта недостаточно. Кроме того, механизм при записи может сравнить новый факт только с тем, что уже попало в его небольшой контекст. Если прежняя запись туда не попала, из описания нельзя заключить, что её позже автоматически найдёт и пометит именно операция supersede.
Supersede.Синтез: осторожное обобщение независимых наблюдений
Не все связи между воспоминаниями означают повтор или исправление. Иногда они вместе описывают привычку, которую никто не формулировал в одном разговоре. Для этого Dream использует синтез — создание новой сводной записи на основании нескольких связанных воспоминаний. В отличие от объединения и замещения, эта работа вынесена из обработки текущего разговора.
Автор приводит пример: в отдельных записях есть занятия йогой по вторникам и четвергам, подъёмы в 6:45 утра и вопросы о качестве сна. Фоновая задача группирует подходящие записи по сходству, оценивает их совместно и при достаточных основаниях создаёт воспоминание об утренней привычке, связанной с йогой. В новую запись заносятся идентификаторы всех исходных воспоминаний. По ним можно проследить, какие наблюдения легли в основу общего вывода.
Подход намеренно осторожный. Единственная запись, разовое событие или множество повторных вопросов об одной теме не должны превращаться в утверждение об устойчивой привычке. Повторные вопросы о качестве сна не доказывают устойчивую привычку, а отдельный визит на тренировку — регулярность занятий. Важен именно набор независимых подтверждений, а не одна удачная фраза или большое число похожих вопросов.
Синтез работает по расписанию, не в момент пользовательского запроса. Поэтому нельзя считать новую обобщающую память обязательным немедленным результатом каждого добавления. В этой архитектуре LLM не дообучает свои веса на истории пользователя: изменяются записи хранилища и связи между ними.
Synthesize.Как обновляют состояние и защищают историю
У каждого нового факта при извлечении есть лишь ограниченный набор старых воспоминаний для сравнения. Если новая запись содержит все сведения старой, допустимо merge. Если очевидно заменяет значение того же факта, допустимо supersede. Если отношение неоднозначно, автор задаёт правило ничего не менять. Это защищает от поспешного объединения частично похожих сведений и потери важных различий.
Изменения состояния выполняются условными операциями записи — обновление применяется с проверкой необходимого условия. Это важно, когда несколько процессов одновременно пытаются изменить одну память: Mem0 описывает такой механизм как защиту от конфликтующих изменений. Точный протокол конкурентного доступа статья не раскрывает, но обозначает требуемое свойство — не перезаписывать один и тот же объект без согласования.
Ни объединение, ни замещение, ни синтез не удаляют старые записи. Изменения фиксируются через состояние памяти и, когда запись заменена, указатель на новую. Результаты изменений можно просмотреть в панели управления. Для записей, которые не следует затрагивать этой обработкой, предусмотрены признаки immutable и exclude_from_dream: Dream их полностью пропускает.
Это управление жизненным циклом памяти, а не очистка всех следов прошлого. Исторический факт может оставаться доступным, даже когда исключён из обычного поиска. Ссылки между записями и ID исходных наблюдений позволяют разобраться в происхождении обновлённой или синтезированной информации.
How it worksКак получать актуальные факты и историю
После изменения состояния памяти важно правильно настроить чтение. В Python- и TypeScript-SDK Mem0 методы search и get_all принимают параметры latest_only и include_merged. Объект памяти содержит поля lifecycle_state — состояние жизненного цикла — и replacement_memory_id — идентификатор записи, которая её заменила. Так приложение может отличить обычную найденную запись от устаревшей или поглощённой.
Состояние хранится в отдельном индексированном столбце памяти. Благодаря этому фильтрация latest_only, по описанию Mem0, сводится к запросу по индексу, а не к чтению каждой записи и повторному смысловому анализу. Это свойство хранилища при поиске; оно не является этапом обучения модели и не означает, что синтез происходит в момент поиска.
Настройка зависит от вопроса. Для ответа о нынешнем месте проживания нужны актуальные сведения; для восстановления истории переездов важна возможность увидеть старые версии. Статья описывает основные параметры, но не задаёт исчерпывающую таблицу поведения для всех их сочетаний, поэтому нет оснований выдумывать дополнительные вызовы SDK или правила разрешения конфликтов.
In the SDKs (Python and TypeScript), search and get_all acceptВключение, периодичность и границы результата
На дату статьи Mem0, опубликованной 4 августа 2026 года, Dream доступен пользователям тарифов Pro и Enterprise самой Mem0. В тарифе Mem0 Pro его включают для конкретного проекта на вкладке Dream панели управления. Это не тариф ChatGPT Pro и не автоматическое включение памяти во всех проектах. После активации обрабатывается новая активность; накопленные до включения воспоминания Dream задним числом не пересматривает.
Фоновая работа запускается раз в неделю для каждого проекта и подходящих user_ids. Поэтому между новым наблюдением и появлением синтезированной привычки может пройти время. Объединение и замещение остаются решениями этапа извлечения новой записи; еженедельный график относится к фоновой обработке, а не переносит эти решения в отдельную недельную задачу.
Разработчик утверждает, что добавление и поиск не получают дополнительных этапов консолидации и их задержка не меняется. В статье не представлены отдельные измерения времени, контрольное сравнение качества ответов или численная оценка уменьшения дублей после включения Dream. Пример с несколькими сотнями противоречащих или повторяющихся воспоминаний на медианный активный проект — наблюдение Mem0 о собственных данных. Он объясняет масштаб проблемы, но не измеряет эффект исправления.
Самые важные границы применения следуют из механики решения. Ограниченный контекст записи не позволяет уверенно сопоставить каждый новый факт со всей историей. Строгие правила могут сознательно оставить неоднозначные сведения нетронутыми. Синтез требует независимых свидетельств, а ретроактивной переработки старого архива после включения не обещано. Статья также не раскрывает конкретный способ группировки, пороги подтверждения привычек и порядок исправления неверных обобщений через интерфейс. Это инженерное описание функции Mem0, а не отчёт о внешнем A/B-тесте.
Turning it onИтог: обновление памяти без потери прошлого
Dream решает проблему, которая появляется у агента с долгой историей общения: отдельные записи могут повторяться, устаревать и не складываться в целостную картину. Центральное решение Mem0 — сохранять быстрый путь записи, но при наличии нужного контекста строго определять отношения между новым и прежним фактом. Ниже показано именно обновление одной записи при извлечении памяти, а не полный цикл ответа агента.
- 01
Извлечь новый факт
Во время разговора система выделяет сведения, которые могут стать отдельной записью памяти.
- 02
Найти близкий контекст
Для сравнения доступны текущий диалог и небольшая подборка похожих сохранённых воспоминаний, а не всё хранилище.
- 03
Проверить отношение
Если новый факт включает весь старый — объединить; если явно заменяет тот же факт — пометить старый как superseded. При сомнении ничего не менять.
- 04
Условно обновить запись
Изменить состояние прежнего воспоминания с защитой от конкурирующих записей и сохранить указатель на заменяющую память; историю не удалять.
Отдельно по недельному расписанию Dream группирует связанные наблюдения и осторожно создаёт обобщения, сохраняя ID их источников. При чтении merged по умолчанию скрыты, superseded остаются доступны; latest_only выбирает актуальные факты, include_merged открывает поглощённые версии. Защищённые признаками immutable и exclude_from_dream записи обработка пропускает.
По самоотчёту Mem0, в медианном активном проекте встречаются несколько сотен дублей или противоречащих записей. Автор заявляет, что задержка добавления и поиска не увеличивается, но не публикует численного выигрыша в качестве ответов или времени. Dream касается новой активности после включения, а не всего старого архива. Ценность описанной архитектуры — в раздельной работе с актуальностью, историей и осторожным обобщением, без обещания автоматически разрешить каждое противоречие.
Dream is the maintenance process.