TL;DR
MemTrim — слой между памятью агента и моделью. Когда память записывается, он разбирает её на отдельные факты в формате «параметр = значение». Когда память подтягивается в ответ, он сравнивает эти факты с новым запросом и делится на три группы: общие (уже есть в запросе), конфликтующие (тот же параметр, другое значение) и только из памяти. Общие и конфликтующие факты вычёркиваются, остаётся только то, что реально добавляет новое. Старый вывод убирается, если факты, на которых он держался, изменились.
Главная находка: память вредит не когда она чужая, а когда она «почти своя». Если новая задача совпадает с прошлой наполовину, модель видит знакомые факты, решает «это то же самое» и тянет старый вывод в новый ответ. Он при этом уже не подходит. Если задача совпадает почти полностью, память помогает. Если почти не совпадает, она слабо влияет. Пик вреда приходится на среднее перекрытие, и там же модель чаще всего портит правильный ответ. При этом память была верной, корректно сохранённой и уместно найденной.
Метод решает это в три хода. Он убирает повторяющиеся факты, чтобы они не «усиливали» старый вывод. Он убирает факты, которые противоречат запросу. Если задача изменилась, он превращает старый ответ из «ответа» в «справочный факт» с пометкой, на какой вопрос он отвечал. Полезные данные, которых нет в запросе, остаются.
Схема метода
ЗАПИСЬ В ПАМЯТЬ (один раз)
ШАГ 1: Разбить воспоминание на факты "параметр = значение" → список фактов
ШАГ 2: Записать «сигнатуру задачи» (что именно решали) → метка задачи
ШАГ 3: Отметить, на каких фактах держится вывод → «опорные факты»
ЧТЕНИЕ ИЗ ПАМЯТИ (на каждый запрос)
ШАГ 4: Разбить новый запрос так же → факты запроса + метка задачи
ШАГ 5: Разложить факты памяти на три группы:
• общие (параметр и значение совпали) → УДАЛИТЬ
• конфликтующие (значение другое) → УДАЛИТЬ
• только из памяти → ОСТАВИТЬ
ШАГ 6: Решить судьбу старого вывода:
• опорный факт изменился → УБРАТЬ вывод
• факты целы, задача та же → ОСТАВИТЬ как прошлый ответ
• факты целы, задача другая → ПЕРЕВЕСТИ в факт с пометкой «ответ на другой вопрос»
ШАГ 7: Отдать модели запрос + очищенный контекст
В оригинале шаги 1–2 и 4 делает инструкция для модели-«парсера», а сопоставление — программа (дерево поиска). Всё работает поверх готовых систем памяти без дообучения.
Пример применения
Задача: Вы ведёте маркетинг сети кофеен и держите в проекте Claude заметки с прошлыми разборами. В заметках лежит кейс: «Кофейня в Казани, бюджет 100 000 ₽/мес, аудитория 25–35, лето, формат «зал + навынос». Вывод: РСЯ не нужна, вкладываемся только в поисковые кампании Яндекс Директа». Сейчас вы запускаете ту же кофейню, с тем же бюджетом и той же аудиторией, но зимой и с доставкой. Это ровно «частичное перекрытие»: знакомых фактов много, а ключевые отличаются.
Промпт:
Ты — аналитик, который готовит контекст из прошлых заметок перед ответом.
Прошлый вывод нельзя переносить автоматически.
Кейс: кофейня в Казани, бюджет 100 000 ₽/мес, аудитория 25–35, сезон — лето, формат — зал и навынос.
Задача, которую решали: выбрать каналы в Яндекс Директе.
Вывод: РСЯ не нужна, только поисковые кампании.
Опорные факты вывода: сезон=лето, формат=зал и навынос.
Кофейня в Казани, бюджет 100 000 ₽/мес, аудитория 25–35, сезон — зима, формат — доставка.
Какие кампании в Яндекс Директе запускать?
1. Разбей память и запрос на факты вида «параметр = значение». Определи задачу в каждом.
2. Раздели факты памяти на три группы: общие, конфликтующие, только из памяти.
3. Общие и конфликтующие факты исключи из контекста.
4. Проверь прошлый вывод: если изменился хотя бы один опорный факт — отбрось вывод.
Если опорные факты целы, а задача другая — используй вывод только как справку с пометкой.
5. Покажи очищенный контекст, затем ответь на запрос, опираясь только на него и на запрос.
Результат: Модель сначала покажет таблицу из трёх групп. В общих окажутся город, бюджет и аудитория. В конфликтующих — сезон и формат. Затем она объявит прошлый вывод про «только поиск» снятым, потому что оба его опорных факта изменились. Ответ про кампании для зимней доставки будет строиться от запроса, а не от лета и зала. Из памяти останется только то, чего нет в запросе, если оно было.
Почему это работает
Слабость модели. Когда в контексте лежит знакомый кейс, модель им «заражается». Чем больше фактов совпало с запросом, тем сильнее она верит, что и вывод подходит. Но совпадают чаще всего фоновые факты (город, бюджет), а решающие (сезон, формат) могут отличаться. Повторяющиеся факты ещё и усиливают друг друга: модель видит их дважды, в запросе и в памяти, и считает вывод подтверждённым.
Сильная сторона модели. Она хорошо раскладывает текст на пары «параметр — значение» и сравнивает два списка. Это узкая, проверяемая операция. Намного надёжнее, чем просить её «учти память, но будь осторожна».
Как метод использует это. Он не ослабляет память целиком, а чистит её по фактам. Простые способы вроде «берём только лучший результат», «выбрасываем сохранённые ответы» или «сжимаем контекст» тоже снижают вред. Но заодно они выбрасывают полезное там, где память нужна. Фактический разбор оставляет полезное и убирает ядовитое.
Рычаги управления: - Опорные факты — чем точнее вы отметите, на чём держится вывод, тем надёжнее отсев. Размытые «опорные факты» превращают метод в формальность. - Правило для старого вывода — три варианта (убрать / оставить / перевести в справку). Для рискованных задач ужесточите: убирать при любом несовпадении. - Шаг «покажи очищенный контекст» — оставьте для проверки. Уберите, если нужен только итог. - Метка задачи — важна, когда факты те же, а вопрос другой. Не пропускайте её.
Шаблон промпта
Оригинальный метод — программа вокруг памяти, поэтому это перенос его логики чтения в один промпт. Структура сохранена: факты, три группы, судьба вывода.
Ты готовишь контекст из прошлых заметок перед ответом.
Прошлый вывод нельзя переносить автоматически.
Кейс: {прошлый_кейс}
Задача, которую решали: {прошлая_задача}
Вывод: {прошлый_вывод}
Опорные факты вывода: {на_чём_держится_вывод}
{новый_запрос}
1. Разбей память и запрос на факты «параметр = значение». Определи, какую задачу решают память и запрос.
2. Раздели факты памяти на три группы:
- ОБЩИЕ: параметр и значение совпадают с запросом;
- КОНФЛИКТУЮЩИЕ: параметр есть в запросе, значение другое;
- ТОЛЬКО ИЗ ПАМЯТИ: параметра нет в запросе.
3. Общие и конфликтующие факты исключи из контекста.
4. Реши судьбу прошлого вывода:
- если изменился любой опорный факт → отбрось вывод;
- если опорные факты целы и задача та же → оставь как «прошлый ответ»;
- если опорные факты целы, но задача другая → оставь только как справку: «ранее на вопрос {другой вопрос} получен ответ …».
5. Выведи очищенный контекст отдельным блоком.
6. Ответь на запрос, опираясь только на запрос и очищенный контекст.
Подставьте: {прошлый_кейс} — запись из памяти или заметок; {прошлая_задача} — какой вопрос тогда решали; {прошлый_вывод} — итог; {на_чём_держится_вывод} — 2–4 факта, от которых зависел вывод; {новый_запрос} — текущий вопрос.
🚀 Быстрый старт — вставь в чат:
Вот шаблон MemTrim для очистки памяти перед ответом. Адаптируй под мою задачу: [твоя задача].
Задавай вопросы, чтобы заполнить поля.
[вставить шаблон выше]
LLM спросит, что у вас лежит в памяти, какую задачу решали тогда и от каких фактов зависел вывод. Эти данные нужны, чтобы метод мог отделить общее от конфликтующего. Она возьмёт паттерн из шаблона и адаптирует под вашу задачу.
Ограничения
⚠️ Оригинал — код, не промпт: MemTrim — слой вокруг системы памяти: индекс на записи, обработка на чтении. Читатель в чате воспроизводит только логику, а не сам механизм. Что промптовая версия даёт тот же эффект, авторы не проверяли.
⚠️ Проверено на задачах с чёткими фактами: бенчмарки — проверка знаний, логика, причинные вопросы. Там факты легко разложить на пары «параметр — значение». На размытых задачах (стратегия, тексты, тон) разбор получится спорным, а польза неизвестна.
⚠️ Зависит от качества разбора: если модель неверно выделила факты или опорные факты, чистка отсеет не то. Метод сам не страхует от ошибок первого шага.
⚠️ Не лечит при совпадении задач: если память полностью подходит, её нужно использовать. Простые способы «обрезать память» именно здесь теряли пользу, и метод специально берёг её.
⚠️ Атаки ослабляет, но не снимает: при массовой подмене памяти качество падает у всех методов, у MemTrim — медленнее.
Как исследовали
Исследователи разделили запросы на два типа: «задача та же» (память прямо помогает) и «факты те же, ответ другой» (память сбивает). Память везде была верной и корректно сохранённой, так что вред шёл не от «грязных» данных. Проверили три набора задач (изменённые факты, логика, причинные вопросы), четыре популярные системы памяти (Mem0, A-Mem, MemGPT, Graphiti) и две модели. Память помогала, когда задача совпадала, и портила правильные ответы, когда совпадала частично. Порчи ответов было заметно больше, чем исправлений.
Дальше замерили долю общих слов между запросом и памятью. Провалы кучковались в середине шкалы. Потом разложили память на факты и меняли долю повторённых в запросе, не трогая остальное. Вышла колоколообразная кривая: вред растёт до середины, потом спадает, когда запрос возвращает решающие факты. Удивительно, что вред давали не «плохие» воспоминания, а похожие.
Метод сравнили с девятью альтернативами: взять один лучший результат, удалить сохранённые ответы, сжать контекст, фильтр по схожести, «отвечай по текущему контексту», «сначала ответь сам». Все они либо теряли пользу на подходящих случаях, либо пропускали вред. Отдельно убирали компоненты метода: каждый нужен в своём типе задач. Затем проверили на трёх видах подмены памяти и замерили время работы: накладные расходы небольшие. Точных цифр в тексте нет: таблицы не пришли в разборе, поэтому величину эффекта оценить сложно.
Адаптации и экстраполяции
🔧 Техника: ответ из памяти превращаем в справку, а не в ответ → меньше слепого переноса
Самый переносимый приём из статьи — не удалять старый вывод, а переупаковать его:
Ранее на вопрос «{другой_вопрос}» был получен ответ «{ответ}».
Это справка, а не ответ на текущий вопрос.
Экстраполяция: правило для файла инструкций агента (CLAUDE.md, AGENTS.md, системный промпт кастомного GPT)
## Работа с памятью и прошлыми решениями
Перед использованием записи из памяти:
1. Сравни её параметры с текущей задачей: что совпало, что отличается.
2. Если отличается любой параметр, от которого зависел прошлый вывод,
не переноси вывод. Заново реши задачу.
3. Если задача другая, а параметры те же, используй вывод только как справку
и так и пометь.
4. Особенно осторожно, когда совпало «примерно половина»:
знакомое — не значит подходящее.
Это моя экстраполяция принципа статьи, авторы такой текст не проверяли.
Ресурсы
- Работа: Understanding and Mitigating Inference-Time Overreliance Using Agentic Memory (препринт)
- Авторы: Luoxi Tang, Yuqiao Meng, Nilesh Auradkar, Zhaohan Xi (Binghamton University, SUNY); Muchao Ye (University of Iowa); Dazheng Zhang (Penn Medicine, University of Pennsylvania)
- Системы памяти из исследования: Mem0, A-Mem, MemGPT, Graphiti
- Наборы задач: RippleEdits, CounterLogic, CLADDER
