3,583 papers
arXiv:2610.17763 81 13 окт. 2026 г. FREE

Memory Echo и FPA: как повторная запись пересказов в память агента превращает одну старую заметку в «хор» и как это остановить

КЛЮЧЕВАЯ СУТЬ
Обнаружено: агент, который достаёт заметку и записывает пересказ обратно в память, сам размножает старую информацию. Одна запись превращается в три-пять, а ваше исправление остаётся одно. Метод FPA (семья, происхождение, авторитет) позволяет агенту отвечать по свежему проверенному факту, а не по хору старых пересказов. Между поиском и ответом он ставит фильтр: от каждого источника пускает в контекст одну запись, а после проверенного исправления закрывает всю старую семью. Модель перестаёт считать повторы подтверждениями и отвечает по подтверждённым данным. Важно: в статье это код, а не промпт. Текстовый перенос ниже сделан нами, и авторы его не измеряли.
Адаптировать под запрос
⚡

TL;DR

Memory Echo («эхо памяти») — находка про долговременную память агентов: когда агент достаёт заметку и записывает пересказ обратно, одна старая запись размножается в несколько. Метод борьбы, FPA (Family–Provenance–Authority), добавляет между поиском и ответом три шага. Он оставляет в контексте одного представителя от каждого источника, отключает устаревшие записи после проверенного исправления и заставляет отвечать по подтверждённым фактам.

Боль знакома. Вы сказали агенту: «Ищу низкоуглеводные овощи». Он всё равно советует кето-батончики, которые вы обсуждали месяц назад. Причина в том, что старая рекомендация пересказывалась и сохранялась снова и снова. В итоге в поиске она занимает три-пять мест, а ваше исправление — одно. Для модели это выглядит как «пять независимых подтверждений против одного», хотя источник у всех пяти один. Важно, что простое чтение без записи этого не делает. Эхо растёт именно от цикла «достал → пересказал → записал». Даже после исправления потомки старой записи остаются в выдаче и продолжают давить на ответ.

Метод решает это в три шага. Шаг 1: записи группируются по происхождению (по «родителю», а не по формулировке), и в контекст попадает максимум одна на семью. Шаг 2: если пришло проверенное исправление, вся старая семья остаётся в архиве, но не имеет права участвовать в текущем ответе. Шаг 3: ответ строится по подтверждённым данным, а черновик сверяется с ними.

🔬

Схема метода

ШАГ 1 (Family): сгруппировать найденные записи по источнику/родителю
                → в контекст максимум 1 запись на семью

ШАГ 2 (Provenance): сверить записи с проверенным исправлением
                → старая семья остаётся в архиве, но не допускается в ответ

ШАГ 3 (Authority): ответить по проверенным актуальным фактам
                → черновик сверяется с допущенными данными

Хранилище не удаляется: история сохраняется для аудита.
Меняется только то, что попадает в контекст ответа.

В статье FPA работает кодом между поиском по памяти и генерацией ответа. Шаги выполняются не одним промптом.

🚀

Пример применения

Задача: Вы руководите небольшой кофейней в Казани. Агент-закупщик ведёт заметки о поставщиках. В заметках цена на зерно у «Фермер-Юг» (420 ₽/кг) записана три раза. Это письмо поставщика, пересказ в заметке встречи и строка в недельной сводке. Все три — потомки одного письма. Потом пришёл счёт, в котором цена уже 510 ₽/кг. Вы просите агента посчитать закупку на месяц.

Промпт:

Ты — агент-закупщик кофейни. Перед ответом выполни три этапа.


M1 | источник: письмо поставщика (12 марта) | родитель: — | статус: активна
   «Зерно Арабика-Блэнд, 420 ₽/кг»
M2 | источник: заметка со встречи (14 марта) | родитель: M1 | статус: активна
   «Фермер-Юг держит цену 420 ₽/кг»
M3 | источник: недельная сводка (21 марта) | родитель: M2 | статус: активна
   «Основной поставщик зерна: Фермер-Юг, ~420 ₽/кг»
M4 | источник: счёт №188 от поставщика (2 апреля) | родитель: — | статус: проверено
   «Арабика-Блэнд, 510 ₽/кг, действует с 1 апреля»
M5 | источник: график работы кофейни | родитель: — | статус: активна
   «Расход зерна: 60 кг в месяц»



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



Сверь семьи с проверенными записями.
Если проверенная запись заменяет факт, вся старая семья помечается
«в архиве, не для ответа».
Выведи, какие записи допущены в ответ, какие отключены и почему.



Ответь на вопрос только по допущенным записям.
Если проверенного источника нет — прямо скажи об этом.
Сверь черновик с допущенными записями и исправь расхождения.


Вопрос: сколько мы потратим на зерно в апреле?

Результат: Модель покажет три блока. В первом записи M1–M3 объединены в одну семью, представитель выбран один, M4 и M5 стоят отдельно. Во втором старая семья помечена как отключённая из-за счёта M4. В третьем расчёт опирается на цену из счёта и расход из графика, а старая цена в расчёт не попадает. Конкретные цифры считает сама модель.

🧠

Почему это работает

Слабость. Модель не знает, что три записи — это одно и то же письмо. Для неё три похожие заметки выглядят как три независимых подтверждения. Чем больше повторов, тем сильнее «вес» старой версии, и одно свежее исправление проигрывает хору. Остановка записи эту инерцию не убирает: потомки уже лежат в хранилище.

Сильная сторона. Если рядом с каждой записью лежат метаданные (откуда она, чей потомок, проверена ли), дедупликация по происхождению и сверка с проверенными фактами — задача простая. Исследователи показали, что нужно группировать по родословной, а не по похожести слов. Два независимых источника могут говорить одно и то же, а два пересказа одного поиска остаются одной семьёй.

Как метод использует это. Он вмешивается между поиском и ответом. Хранилище остаётся нетронутым, поэтому ничего не теряется и всё можно проверить. Меняется то, что допускается в контекст.

Рычаги: - Лимит на семью (в статье — одна запись) → можно поднять до двух для сложных задач, но эхо вернётся. - Порядок проверки → сначала семьи, потом исправления, затем ответ: в таком порядке каждый шаг чистит вход следующему. - Статус записи (активна / проверено / в архиве) → ключ ко всему методу. Без него шаг 2 не работает. - Правило при отсутствии проверенного источника → заменяйте на своё: «спросить пользователя», «пометить как непроверенное».

📋

Шаблон промпта

В статье нет готовых промптов, FPA там реализован кодом. Ниже перевод логики трёх шагов в текстовую инструкцию, который можно запускать в чате или агенте. Это не промпт авторов.

Ты — агент с долговременной памятью. Перед каждым ответом пройди три этапа.


{id} | источник: {откуда} | родитель: {id или —} | статус: {активна / проверено / в архиве}
{текст записи}
...



Сгруппируй записи в семьи по родителю и источнику, а не по формулировке.
Две записи с разными словами, но общим родителем — одна семья.
Из каждой семьи допусти не более {лимит_на_семью} записи.
Выведи: семьи и выбранных представителей.



Сверь семьи с проверенными записями.
Если проверенная запись заменяет или опровергает факт, вся старая семья
получает статус «в архиве» и не допускается в ответ.
Записи в архиве не удаляй и не изменяй.
Выведи: допущенные записи, отключённые записи, причину.



Ответь на вопрос только по допущенным записям.
Если проверенного источника нет — скажи об этом и {действие_без_источника}.
Сверь черновик с допущенными записями и исправь расхождения.



Не записывай свой пересказ найденной заметки как новый факт.
Если нужно сохранить пересказ — укажи родителя и пометь его как производный.


Вопрос: {вопрос}

Что подставлять: - {id}, {источник}, {родитель}, {статус} — данные из ваших заметок. Родителя можно восстановить так: «эта запись — пересказ вот этой». - {лимит_на_семью} — по умолчанию 1. - {действие_без_источника} — «задать мне уточняющий вопрос» или «пометить ответ как непроверенный». - {вопрос} — текущая задача.

🚀 Быстрый старт — вставь в чат:

Вот шаблон трёх этапов очистки памяти (семьи → допуск по проверенным исправлениям → ответ по подтверждённым фактам). Адаптируй под мою задачу: [твоя задача].
Задавай вопросы, чтобы заполнить поля.

[вставить шаблон выше]

LLM спросит, откуда берутся записи, что у вас считается проверенным источником и что делать без проверки. Это нужно потому, что метод держится на трёх вещах: происхождении записей, статусе «проверено» и правиле для случая без подтверждения. Модель возьмёт структуру из шаблона и подстроит под вашу систему заметок.

⚠️

Ограничения

⚠️ Нужны метаданные: метод работает, когда у записей есть источник, родитель и статус. Если заметки лежат плоским текстом без происхождения, шаг 1 не отличит «пять пересказов одного» от «пяти независимых источников».

⚠️ Нужен проверенный источник: шаги 2 и 3 держатся на подтверждённой «истине» (счёт, документ, ваша прямая правка). Что делать, когда её нет, авторы не проверяли. Восстановительная ветка на схеме названа иллюстративной.

⚠️ В статье это код, не промпт: FPA встроен в поиск по памяти четырёх готовых систем. Перенос в чат-промпт — наш перевод логики. Эффект такого перевода авторы не измеряли.

⚠️ Чтение без записи эху не вредит: проблема возникает от цикла «достал → пересказал → записал». Если ваш агент ничего не пишет обратно в память, главная часть риска у вас отсутствует.

⚠️ Эффект неравномерен: в двух системах из четырёх прирост точности скромнее. Там итоговая выдача часто остаётся «забитой» старыми записями, а ответ всё равно улучшается. Одна картинка выдачи не показывает, что происходит с ответом.

⚠️ Тест — искусственный: «старое утверждение» бралось из другого реального ответа того же набора данных. Живые сценарии (покупки, медицина, путешествия) проверялись на раннем пробном протоколе и не входят в главные цифры. Часть приложений в тексте не видна.

🔍

Как исследовали

Исследователи сделали бенчмарк MEchoBench. Они взяли по 50 вопросов из четырёх известных наборов для проверки памяти (LoCoMo, LongMemEval, HotpotQA, BEAM). В итоге осталось 190 вопросов, десять отложили на разработку. К каждому вопросу подмешали «старое» утверждение из другого реального ответа, а верный ответ служил проверенным исправлением. Для каждого вопроса создали три истории памяти. В первой старое утверждение лежит один раз, во второй его шесть раз читают без записи, в третьей после каждого чтения пишут пересказ. Затем во всех историях вводили одно и то же исправление и ещё 30 раз читали память, ничего не записывая.

Это показало ясную картину. Чтение без записи почти не меняет картину, а запись пересказов резко увеличивает долю старой семьи во всех четырёх системах памяти (A-MEM, Mem0, CoM, LangMem). Вывод — виновата сама петля «поиск → запись», а не конкретный алгоритм ранжирования. После исправления старые потомки продолжали занимать места: показатель присутствия старой семьи в выдаче держался на уровне около 0,65–0,70 все 30 запросов без записи. Эхо живёт и без новой записи, как унаследованное преимущество.

Чтобы честно сравнить методы, кандидатов и историю заморозили. Четыре способа выдачи прогоняли по одному и тому же набору записей на двух моделях (DeepSeek V4 Flash и Kimi K2.6). Ответы оценивал GPT-5.6. Базовая точность была 0,825 (DeepSeek) и 0,782 (Kimi), а с FPA стала 0,920 и 0,916. «Загрязнение решения» (насколько ответ ближе к старому утверждению, чем к верному) упало с 0,106 до 0,030 и с 0,109 до 0,038. Три обычных альтернативы (штраф за повторы, оценка качества записей, обученное ранжирование) тоже поднимали точность, но почти не убирали устойчивое присутствие старой семьи. FPA сильнее всех уменьшил устойчивое присутствие: индекс упал с 0,427 до 0,057. Уроки для практики такие: полезная запись может помочь ответу, пока старые потомки всё ещё лезут в выдачу, а чистить надо по родословной и по статусу исправления.

💡

Адаптации и экстраполяции

💡 Адаптация для файла инструкций агента (CLAUDE.md, AGENTS.md, память ассистента): принцип переносится в правила ведения заметок. Это наша экстраполяция: авторы такие правила в промптах не проверяли.

## Правила работы с памятью
- Каждая запись в заметках: что, откуда (источник), чей пересказ (родитель),
  статус (активна / проверено / заменена).
- Пересказ найденной заметки не записывай как новый факт. Пиши: «производная от {id}».
- Когда я исправил факт или пришёл документ-подтверждение: пометь старую запись
  и все её производные «заменена», не удаляй.
- Отвечая, опирайся на записи со статусом «проверено»; из каждой цепочки
  пересказов бери не больше одной записи.
- Нет проверенного источника — скажи об этом, не опирайся на старую версию молча.

🔧 Техника: добавить аудит памяти → увидеть эхо до того, как оно повлияло на ответ

Вот мои заметки о {тема}. Найди записи, которые являются пересказами друг друга
(общий источник, разные слова). Сгруппируй их в семьи и покажи, сколько
«голосов» у каждой версии факта на самом деле. Отметь версии, которые противоречат
более свежим проверенным записям.

Так видно, что «пять подтверждений» на деле один источник.

🔗

Ресурсы

  • Название работы: Memory Echo in Single-Agent Long-Term Memory: Lifecycle Evaluation and Provenance-Guided Mitigation
  • Код и бенчмарк: https://github.com/OrcasSam/memory-echo-benchmark
  • Авторы: Yufeng Li, Sheng Yao, Peng Zeng, Dezhang Kong, Shi Lin, Changting Lin, Xun Wang, Meng Han
  • Организации: East China Normal University, University of Southern California, Zhejiang University, Zhejiang Gongshang University
  • Системы памяти из статьи: A-MEM, Mem0, CoM, LangMem
  • Наборы данных: LoCoMo, LongMemEval, HotpotQA, BEAM

📋 Дайджест исследования

Ключевая суть

Обнаружено: агент, который достаёт заметку и записывает пересказ обратно в память, сам размножает старую информацию. Одна запись превращается в три-пять, а ваше исправление остаётся одно. Метод FPA (семья, происхождение, авторитет) позволяет агенту отвечать по свежему проверенному факту, а не по хору старых пересказов. Между поиском и ответом он ставит фильтр: от каждого источника пускает в контекст одну запись, а после проверенного исправления закрывает всю старую семью. Модель перестаёт считать повторы подтверждениями и отвечает по подтверждённым данным. Важно: в статье это код, а не промпт. Текстовый перенос ниже сделан нами, и авторы его не измеряли.

Принцип работы

Процесс из трёх шагов, где каждый чистит вход следующему. 1. Семья. Записи группируются по родословной: кто чей пересказ. Формулировка не важна. В контекст идёт максимум одна запись на семью. 2. Происхождение. Записи сверяются с проверенным исправлением. Старая семья уходит в архив целиком и в ответе не участвует. 3. Авторитет. Ответ строится только по допущенным записям. Черновик сверяется с ними ещё раз. Хранилище не трогаем: меняется только то, что модель видит перед ответом. Ничего не теряется, и всё можно проверить задним числом. Это как судья, который не сжигает старые протоколы. Он просто не пускает их в зал, когда есть свежее решение суда.

Почему работает

Модель не знает, что три похожие заметки — это одно и то же письмо. Для неё это три независимых подтверждения. Чем больше повторов, тем тяжелее старая версия, и одно свежее исправление проигрывает хору. Остановить запись недостаточно: потомки уже лежат в хранилище и давят на ответ. Нужна простая вещь: пометки у записей (откуда, чей потомок, проверено ли). С такими пометками отсеять пересказы одного источника и сверить с проверенным фактом несложно, а группировать надо по родословной, а не по похожести слов. Два независимых источника могут говорить одно и то же, и это нормально. Два пересказа одной выдачи остаются одной семьёй. Прикол: в двух системах из четырёх выдача после чистки всё ещё забита старыми записями, а ответ всё равно становится лучше. По одной картинке выдачи нельзя судить, что будет с ответом. Эхо растёт именно от цикла «достал → пересказал → записал». Простое чтение без записи его не создаёт.

Когда применять

Агенты с долговременной памятью, которые пишут обратно → закупки, личные помощники, заметки по клиентам и проектам, особенно когда факт менялся (цена, предпочтение, условия) и агент упорно возвращается к старому. Не подходит, если агент ничего не записывает в память: главного риска у вас нет. Не подходит и для плоских заметок без источника и родителя: шаг 1 не отличит пять пересказов от пяти независимых источников. Если проверенного источника нет, авторы этот случай не проверяли.

Мини-рецепт

1. Пометь записи: у каждой нужны источник, родитель (чей это пересказ) и статус: активна / проверено / в архиве. Родителя можно восстановить вопросом «эта запись — пересказ какой?».
2. Определи, что у тебя «проверено»: счёт, документ, твоя прямая правка. Без этого шаги 2 и 3 не работают.
3. Задай лимит на семью: по умолчанию одна запись. Поднимешь до двух для сложных задач, но эхо вернётся.
4. Реши, что делать без проверки: «задать уточняющий вопрос» или «пометить ответ как непроверенный».
5. Запрети запись пересказов: модель не сохраняет свой пересказ как новый факт. Нужно сохранить, значит укажи родителя и пометь запись как производную.
6. Запусти три этапа подряд: семьи, потом сверка с исправлениями, потом ответ. Порядок важен.
7. Не удаляй архив: старые записи остаются для проверки, их просто не допускают в ответ.

Примеры

[ПЛОХО] : Вот мои заметки о поставщиках. Посчитай, сколько мы потратим на зерно в апреле. (в заметках цена 420 ₽/кг записана трижды, а счёт с ценой 510 ₽/кг один: модель считает по 420)
[ХОРОШО] : Перед ответом пройди три этапа. Этап 1: сгруппируй записи в семьи по родителю, а не по формулировке, и оставь по одной записи от семьи. Этап 2: если есть запись со статусом «проверено», которая заменяет факт, вся старая семья идёт «в архив, не для ответа». Выведи, что допущено и что отключено. Этап 3: ответь только по допущенным записям, сверь черновик с ними. Записи: M1 (письмо, 420 ₽/кг, родитель —), M2 (заметка встречи, 420 ₽/кг, родитель M1), M3 (сводка, ~420 ₽/кг, родитель M2), M4 (счёт, 510 ₽/кг, проверено), M5 (расход 60 кг в месяц). Вопрос: сколько мы потратим на зерно в апреле? Модель покажет три блока. M1–M3 станут одной семьёй и уйдут в архив из-за счёта M4. Расчёт пойдёт по 510 ₽/кг и 60 кг. Цифры считает сама модель.
Источник: Memory Echo in Single-Agent Long-Term Memory: Lifecycle Evaluation and Provenance-Guided Mitigation
ArXiv ID: 2610.17763 | Сгенерировано: 2026-10-14 23:40

Проблемы LLM

ПроблемаСутьКак обойти
Повторы одного факта модель принимает за независимые подтвержденияОдна старая заметка пересказана и записана в память три-пять раз. Модель видит в контексте пять похожих записей и одну свежую правку. Считает: «пять против одного». Источник у пяти один. Старая версия побеждает, даже если её уже исправили. Так бывает в любой задаче, где в контекст попадают заметки, документы или история чатаДай каждой записи происхождение: откуда она и чей это пересказ. Перед ответом сгруппируй записи по «родителю». В контекст пусти одну запись от семьи. Проверенное исправление отключает всю старую семью

Методы

МетодСуть
Три шага очистки контекста перед ответом — старый факт не заглушает исправлениеЧто делать. Помечай каждую запись: id, источник, родитель, статус (активна / проверено / в архиве). Перед вопросом дай модели три шага. Шаг 1. Сгруппируй записи в семьи по родителю, а не по словам. Оставь не больше одной записи от семьи. Шаг 2. Если есть проверенная запись, которая заменяет факт, вся старая семья получает статус «в архиве». В ответ она не идёт. Саму запись не удаляй. Шаг 3. Отвечай только по допущенным записям. Потом сверь черновик с ними. Если проверенного источника нет, скажи об этом и задай уточняющий вопрос. Дополнительное правило. Свой пересказ найденной заметки не сохраняй как новый факт. Если сохраняешь, укажи родителя и пометь «производная». Почему работает. Модель сама не видит родство записей. Метки родителя делают дедупликацию простой задачей. Хранилище не меняется, поэтому ничего не теряется. Когда да. Агент с долгой памятью. Заметки пересказываются и пишутся обратно. Есть источник истины: счёт, документ, ваша правка. Когда нет. Заметки лежат плоским текстом без происхождения. Агент ничего не пишет в память: размножения повторов нет

Тезисы

ТезисКомментарий
Группируй записи по происхождению, а не по сходству текстаДва независимых источника могут сказать одно и то же. Это настоящее подтверждение. Два пересказа одного письма звучат по-разному, но остаются одним источником. Если смотреть на слова, обе ситуации выглядят одинаково. Родословная их различает. Применяй: в каждой записи пиши поле «родитель» или «это пересказ записи №…». Правило для модели: «общий родитель = одна семья»
📖 Простыми словами

Memory Echo in Single-AgentLong-Term Memory: Lifecycle Evaluation and Provenance-Guided Mitigation

arXiv: 2610.17763

Когда AI-агент ведёт долговременную память, у него случается системный глюк под названием Memory Echo. Агент читает свою старую заметку, пересказывает её и сохраняет копию обратно в базу. В итоге один факт начинает бесконтрольно размножаться. А для LLM три похожие записи — это не дубли, а три независимых пруфа. Когда приходит свежее исправление, один актуальный факт просто тонет в хоре старых клонов.

Это как офисная сплетня, которая закольцевалась. Вася пустил слух, Петя пересказал Маше, Маша внесла в отчёт — и вот шеф слышит одну и ту же байку из трёх углов и считает её чистой правдой. А когда приходит человек с официальной справкой, начальник ему не верит, ведь «ну три же источника подтвердили». Классический пример того, как система убедительно сама себя обманывает.

Чтобы вылечить этот маразм, придумали метод FPA (Family–Provenance–Authority). Он работает безжалостно: вычисляет родословную каждой записи и оставляет только одного предка, моментально отрубает устаревшие клоны после первого же исправления и заставляет модель опираться только на проверенный авторитетный источник. Свежий счёт на 510 рублей моментально умножает на ноль троих родственников со старой ценой в 420 рублей.

Тестировали механику на закупках для кофейни, но принцип универсален. Любой автономный агент, саппорт-бот или корпоративный ассистент с RAG, который имеет право дописывать данные в свою базу, рано или поздно попадает в эту ловушку. Везде, где есть обратная петля памяти, агент неизбежно начнёт цитировать сам себя и плодить информационный шум.

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

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с