TL;DR
CALM (Conflict-Aware Lifecycle Memory Governance) — это трёхуровневая надстройка над памятью долгоживущих ИИ-агентов, которая отделяет хранение истории от решения, какие записи пускать в контекст под конкретный запрос. Метод превращает разнородные записи в канонические ячейки с метаданными, ведёт для них статус достоверности по правилам конфликтов и зависимостей, а в момент вопроса пропускает кандидатов из поиска через жёсткий фильтр и формулу допуска.
Обычный поиск по векторной близости в памяти агента ломается на простой жизненной ситуации: пользователь переехал из Екатеринбурга в Москву или сменил тариф в сервисе. Если удалить старую запись, агент не сможет ответить на вопрос «В каком городе я жил в прошлом году?»; а если оставить обе записи и подавать их по смысловой близости, в контекст попадёт противоречивый мусор и агент перепутает текущий адрес. Смысловая близость к вопросу, фактическая достоверность записи и её уместность для временной рамки конкретного вопроса — это три разных свойства, которые нельзя смешивать в один рейтинг.
Метод решает проблему в три шага: сначала упаковывает сырые реплики и факты в единые ячейки памяти с меткой времени и источником (Адаптация), затем обновляет их жизненный цикл и снижает вес вытесненных фактов без удаления из базы (Управление циклом), а при ответе на вопрос отбирает записи по четырём признакам — близости к теме, достоверности, совместимости с вопросом и отсутствию риска конфликта (Контекстный допуск).
Схема метода
ВНЕШНИЙ КОНВЕЙЕР ПАМЯТИ ИЛИ МНОГОШАГОВЫЙ ПРОМПТ-АУДИТОР:
ШАГ 1 (Адаптация в ячейки): Сырые записи диалога → канонические ячейки {утверждение, тип, время τ, источник π, сущности U, область действия Ω, статус CANDIDATE}
ШАГ 2 (Жизненный цикл и конфликты): Сверка новых фактов со старыми → граф конфликтов и зависимостей → обновление достоверности V ∈ [0, 1] и статуса (CANDIDATE → ACTIVE → STABLE или вытеснение с потолком V ≤ 0.15 / STALE при поломке зависимости)
ШАГ 3 (Фильтр и допуск под запрос): Запрос q + найденные ячейки → жёсткий фильтр совместимости h ∈ {0, 1} → оценка по 4 параметрам [релевантность ζ, достоверность V, совместимость с вопросом ψ, безопасность 1 − R] → в контекст модели идут только ячейки с баллом выше порога θ
Пример применения
Задача: Персональный ИИ-ассистент руководителя селлерского бизнеса на Wildberries и Ozon ведёт историю переговоров и настроек за полгода. Условия логистики, склады отгрузки и ставки комиссий менялись несколько раз. Нужно ответить на вопрос руководителя и не перепутать действующие правила с архивными.
Промпт:
Ты — модуль управления памятью агента по методу CALM. Перед ответом на вопрос пользователя обработай найденные записи из базы памяти в 3 этапа.
- M1 [2025-11-10, источник: сообщение директора]: «Основной склад отгрузки наших пуховиков — Коледино, лимит хранения — до 400 тыс. руб. в месяц».
- M2 [2025-11-12, источник: отчёт логиста]: «Для отгрузки в Коледино используем перевозчика "Деловые Линии" по вторникам».
- M3 [2026-02-15, источник: приказ директора]: «С 1 марта 2026 года полностью закрываем отгрузки в Коледино и переводим все поставки пуховиков на склад Электросталь».
- M4 [2026-02-16, источник: сообщение бухгалтера]: «Комиссия фулфилмента в Электростали согласована на уровне 45 руб. за единицу».
1) Куда и каким перевозчиком нам отправлять партию пуховиков на следующей неделе?
2) И напомни, какой склад был у нас основным прошлой осенью?
Выполни расчёт строго по шагам:
ШАГ 1 (Канонические ячейки и связи):
Для каждой записи M1–M4 определи: временной интервал действия (τ), сущности (U), связи конфликта (кто кого отменяет) и связи зависимости (какая запись опирается на другую как на условие).
ШАГ 2 (Жизненный цикл и базовая достоверность V ∈ [0, 1]):
- Если новая запись прямо отменяет старую (конфликт ≥ 0.75), понизь текущую достоверность V старой записи до потолка 0.15 (статус: Вытеснено, но сохранено в архиве).
- Если запись зависит от отменённого условия (поломка зависимости), переведи её в статус STALE (устарело по цепочке).
- Актуальным подтверждённым записям присвой статус STABLE (V = 0.85–1.0).
ШАГ 3 (Контекстный допуск CALM-ZS отдельно для подвопроса 1 и подвопроса 2):
Для каждого подвопроса оцени каждую ячейку по 4 шкалам от 0 до 1:
- ζ (смысловая близость к подвопросу)
- V (текущая достоверность из Шага 2)
- ψ (совместимость временной рамки ячейки с целью вопроса: настоящее или прошлое)
- 1 − R (отсутствие риска запутать ответ противоречием или сломанной зависимостью)
Посчитай средний балл F = (ζ + V + ψ + (1 − R)) / 4. Допусти в рабочий контекст только ячейки, прошедшие жёсткую проверку смысла и набравшие F ≥ 0.55.
ШАГ 4 (Финальный ответ):
Ответь на оба подвопроса пользователя, опираясь ТОЛЬКО на допущенные для каждого из них ячейки.
Результат:
Модель построит граф памяти: обнаружит, что запись M3 (переход на Электросталь) вступает в сильный конфликт с M1 (Коледино) и снизит текущую достоверность M1 до 0.15, а запись M2 (перевозчик «Деловые Линии» специально под Коледино) переведёт в статус STALE из-за поломки родительского условия. Затем для первого подвопроса (про следующую неделю) привратник отсечёт M1 и M2, пропустив только M3 и M4 (и честно предупредит, что перевозчик под Электросталь ещё не назначен, не подставив по ошибке «Деловые Линии»). А для второго подвопроса (про прошлую осень) высокая временная совместимость ψ и низкий риск конфликта R позволят вытащить из архива запись M1 и точно назвать Коледино.
Почему это работает
Классические системы памяти агентов попадают в вилку между двумя крайностями. Стратегия «Хранить только последнее» (Latest-Only) перезаписывает старые факты при обновлении и стирает историю — агент теряет способность отвечать на вопросы о прошлом и понимать динамику изменений. Стратегия «Подавать всё релевантное» (Relevance-Only) вываливает в окно контекста и старые, и новые факты вперемешку, потому что с точки зрения векторного поиска фразы «живу в Сиэтле» и «переехал в Бостон» одинаково близки к вопросу «где ты живёшь?».
Кроме того, многие системы списывают память просто по таймеру (чем старше запись, тем ниже вес). Но прошедшее время само по себе не делает факт неверным: дата рождения клиента или базовый устав проекта не портятся через месяц, тогда как разовое поручение устаревает за день или ломается, когда отменяется связанная с ним задача.
CALM разделяет постоянный учёт достоверности и фильтрацию в момент запроса. На уровне базы он отслеживает не просто дату, а события вытеснения и цепочки зависимостей (если отменили мероприятие, то зависимая от него бронь отеля автоматически получает метку STALE). А в момент вопроса привратник (Gating) сверяет временную цель вопроса с интервалом действия каждой записи: архивный факт с низкой текущей валидностью (0.15) блокируется для вопросов о настоящем, но получает зелёный свет для ретроспективных вопросов.
Рычаги управления:
- Правило без обучения (CALM-ZS): не обязательно обучать нейросетевой классификатор — простое среднее арифметическое четырёх оценок с весами по 0.25 блокирует почти 80% ошибочных воспоминаний.
- Каскадная отмена по зависимости (Dependency Invalidation): связывай производные решения с базовым фактом. Если базовый факт отменён, все дочерние настройки должны помечаться как требующие перепроверки.
- Потолок вытесненного факта (0.15): никогда не обнуляй и не удаляй отменённый факт полностью — оставь ему небольшой ненулевой вес и точный интервал дат, чтобы он всплывал по запросам с маркерами «раньше», «до переезда», «в прошлой версии».
Шаблон промпта
Ты — привратник памяти долгоживущего агента (архитектура CALM). Твоя задача — отфильтровать найденные записи памяти перед генерацией ответа.
{список_найденных_записей_с_датами_и_источниками}
{вопрос_или_задача_пользователя}
Выполни фильтрацию в 3 этапа:
1. АДАПТАЦИЯ И СВЯЗИ (Stage I–II):
Для каждой записи определи:
- Временной интервал действия и область применимости.
- Конфликты: отменяет ли более свежая и надёжная запись более раннюю? Если да — присвой старой записи статус SUPERCEDED (потолок текущей валидности V = 0.15).
- Зависимости: опирается ли запись на условие, которое было отменено другой записью? Если да — присвой статус STALE (устарело по цепочке).
- Подтверждённым действующим фактам присвой статус STABLE (V = 0.80–1.00).
2. КОНТЕКСТНЫЙ ДОПУСК CALM-ZS (Stage III):
Определи временную цель запроса : спрашивают ли про ТЕКУЩЕЕ состояние, ИСТОРИЮ в прошлом или ИЗМЕНЕНИЕ во времени.
Для каждой записи оцени 4 показателя от 0.0 до 1.0:
- ζ (смысловая близость к вопросу)
- V (базовая валидность с шага 1)
- ψ (совместимость времени и условий записи с временной целью вопроса)
- 1 − R (безопасность включения в контекст без риска противоречия)
Отбрось записи, не прошедшие жёсткую проверку совместимости, и оставь только те, у которых средний балл F = (ζ + V + ψ + (1 − R)) / 4 выше порога {порог_допуска}.
3. РАБОЧИЙ КОНТЕКСТ И ОТВЕТ:
Выведи итоговый список допущенных записей C_q и дай ответ на строго по ним.
Что подставлять в плейсхолдеры:
- {список_найденных_записей_с_датами_и_источниками} — выгрузка из RAG, файла MEMORY.md, истории чатов или CRM-карточки клиента.
- {вопрос_или_задача_пользователя} — текущий запрос, который требует опоры на накопленную историю.
- {порог_допуска} — число от 0.50 до 0.65 (чем жёстче бюджет контекста и выше цена ошибки, тем выше порог).
🚀 Быстрый старт — вставь в чат:
Вот шаблон управления памятью агента по методу CALM. Адаптируй его под мою систему: [опиши своего бота/агента и что он хранит в памяти].
Задавай вопросы, чтобы заполнить поля.
[вставить шаблон выше]
LLM спросит, какие типы записей копит ваш агент (предпочтения клиентов, статусы сделок, архитектурные решения проекта), как часто данные устаревают и нужно ли отвечать на вопросы об истории изменений — потому что от этого зависят правила поиска конфликтов и зависимостей между ячейками.
Ограничения
⚠️ Просадка на сложных многоходовых цепочках (Multi-Hop): Жёсткое подавление конфликтующих и сомнительных записей имеет обратную сторону: на сложных вопросах, где ответ нужно собрать по крупицам из множества косвенных фактов, агрессивный фильтр иногда отсекает полезные связующие звенья (особенно у менее крупных моделей).
⚠️ Зависимость от базового поиска (Retriever): CALM работает как фильтр после первичного извлечения кандидатов. Если базовый векторный или графовый поиск вообще не достал нужную ячейку из хранилища, привратнику просто нечего будет пропускать в контекст.
⚠️ Нужна инженерная прослойка для продакшена: Полноценная реализация графа жизненного цикла с автоматическим пересчётом статусов ячеек и обученным вентилем требует написания кода поверх базы данных памяти.
Как исследовали
Исследователи из Харбинского политехнического университета и компании Meituan проверили CALM на двух крупных бенчмарках долговременной памяти — LongMemEval-S (500 вопросов в 6 категориях) и LoCoMo (1 540 вопросов по длинным диалогам) на трёх базовых моделях: Qwen3-30B-A3B-Instruct-2507, GPT-4.1-mini и GPT-4o-mini. В качестве соперников выступили популярные системы памяти Mem0, MemOS, EverMemOS и LightMem, а также простые эвристики вроде фильтрации по времени и переранжирования по свежести. На LongMemEval-S с моделью Qwen3-30B метод CALM набрал 79,60% точности (версия без обучения CALM-ZS — 76,60%), тогда как Mem0 показал всего 40,20%, EverMemOS — 66,40%, а MemOS — 68,80%; на LoCoMo с GPT-4.1-mini точность достигла 93,51%. Отдельный замер качества фильтрации показал, почему так происходит: без привратника в контекст просачиваются 100% конфликтующих записей, тогда как бесплатное правило CALM-ZS блокирует 79,32% ошибочных воспоминаний (обученный вентиль — 81,30%), снижая утечку конфликтов в 5 раз — до 20,00%. Наконец, в тесте на реконструкцию прошлого CALM обошёл лучшую альтернативу на 3,71% по вопросам о текущем состоянии и сразу на 9,26% по вопросам об исторических состояниях, доказав, что старые факты не нужно удалять, если уметь не пускать их в ответы про настоящее.
Адаптации и экстраполяции
💡 Адаптация для файла
MEMORY.mdв персональных агентах (Claude Code / Cursor):Если ваш кодинг-агент или бизнес-ассистент ведёт текстовый файл памяти проекта, добавьте в его системную инструкцию разметку статусов из Stage II метода CALM:
## Правила ведения MEMORY.md (протокол CALM) 1. Никогда не стирай бесследно отменённые архитектурные решения или старые правила проекта. 2. Каждую запись снабжай тегом статуса и связью: - `[STABLE | с 2026-03]` — действующее правило, включать в контекст текущих задач. - `[SUPERCEDED by #ID | действовало до 2026-02]` — отменено более свежим решением. НЕ использовать для написания нового кода, использовать ТОЛЬКО при ответах на вопросы «почему раньше было сделано так» или разборе старых коммитов. - `[STALE — проверить зависимость от #ID]` — базовый модуль изменился, правило требует проверки перед применением.
Ресурсы
Исследование: CALM: Conflict-Aware Lifecycle Memory Governance for Long-Horizon Language Agents Авторы: Chang Li, Xianhao Ou, Xinyan Ma, Hao Li, Haoyuan Xu, Jiafeng Liang, Ming Liu (Harbin Institute of Technology), Xiaohan Wang, Jiajun Chai, Guojun Yin (Meituan) Бенчмарки в работе: LongMemEval-S (Wu et al., 2025), LoCoMo (Maharana et al., 2024)
