TL;DR
MemCo — это устройство памяти для нескольких агентов, которые работают каждый в своей среде. После каждого эпизода опыт делится на две части. Локальная память хранит привязанные к среде детали: где что лежит, какие были конкретные шаги. Глобальная память получает только очищенные от деталей рабочие схемы вместе с условиями, когда они применимы. Перед каждым действием агент достаёт по 5 записей из локальной и глобальной памяти и собирает их в три блока: «что вокруг», «как действовать», «чего избегать».
Главная находка: общая память вредит, когда подтягивает опыт не того размера. Слишком конкретная запись («чайник стоит на второй полке») тащит чужие детали в новую среду. Слишком общая («сначала подготовь предмет») не подсказывает следующий шаг. Агент либо повторяет чужие ошибки, либо не получает пользы вообще.
Решение в три хода. Первое: перед отправкой в общую память вырезать из записи всё привязанное к среде (конкретный предмет заменяется ролью «предмет», «инструмент»), но оставить условия применимости. Второе: пускать запись в общую память только после подтверждения в нескольких эпизодах, одного удачного раза мало. Третье: при выборе записи проверять, не противоречит ли она текущему состоянию, и отбрасывать противоречащие.
Схема метода
ШАГ 1 (после эпизода): разложить траекторию на записи
→ паттерны (схемы, предусловия, исправления, провалы),
практические знания, конкретные случаи и рефлексии
ШАГ 2: у каждой переносимой записи отметить
«подтверждает / противоречит / нет прогресса»
→ не больше одного голоса на эпизод
ШАГ 3: убрать привязку к среде (предметы → роли),
оставить условия применимости, действия и исход
→ абстрактная запись
ШАГ 4: сложить голоса от всех агентов по одинаковым записям
→ в общую память идут записи с достаточным
и согласованным подтверждением
ШАГ 5 (перед каждым действием): достать ≤5 локальных и ≤5 глобальных записей
→ отфильтровать противоречащие состоянию,
ранжировать по состоянию, этапу и цели
ШАГ 6: собрать контекст из трёх блоков
→ grounding (где мы) / workflow (как делать) / reflection (чего избегать)
Всё это работает на коде (AutoGen), а не в одном промпте.
Пример применения
В статье промптов нет: метод реализован кодом. Ниже ручная версия идеи для чата или агента, это моя адаптация, не оригинал.
Задача: Вы руководите интернет-магазином. Три сотрудника работают с ассистентом (Claude, ChatGPT) по трём площадкам: Wildberries, Ozon и собственный сайт на Битриксе. У каждой свои правила и свои глюки. Хочется, чтобы удачный приём с одной площадки помогал на другой. При этом нельзя тащить туда чужие артикулы, ссылки и особенности кабинета.
Промпт (в конце рабочей сессии):
Ниже лог моей сессии по загрузке карточек товаров на Ozon.
Выпиши записи памяти двух типов.
ЛОКАЛЬНЫЕ (только для Ozon, с конкретикой):
- артикулы, названия полей кабинета, конкретные ошибки и их тексты.
КАНДИДАТЫ В ОБЩУЮ ПАМЯТЬ (без привязки к Ozon):
- замени конкретные названия на роли: «площадка», «кабинет», «поле категории»;
- обязательно укажи, КОГДА схема применима (условия);
- укажи шаги и результат;
- отметь для каждой: подтвердилась / не подтвердилась / не было прогресса.
Если схему нельзя отделить от Ozon — оставь её только в локальных.
Лог: {лог_сессии}
Результат: Модель выдаст два списка. В локальном будут детали, привязанные к Ozon. В списке кандидатов будут короткие схемы вида «условие → шаги → исход» без названий площадки и полей. Рядом с каждой появится пометка об исходе. Записи, которые нельзя очистить, останутся только локальными.
Почему это работает
Слабость. Если складывать весь опыт в одну кучу, агент получает либо слишком конкретные записи, либо слишком расплывчатые. Конкретные тянут детали другой среды: чужой путь, чужой объект. Расплывчатые не говорят, что делать дальше. Опыт, который сработал один раз, может быть случайностью.
Сильная сторона LLM — переписывать записи под заданную структуру. Она умеет заменять конкретику ролями и формулировать условия «когда применимо». Она также неплохо проверяет, не противоречит ли запись текущей ситуации.
Как метод это использует. Он разделяет что случилось здесь и что работает вообще. Общим становится только очищенное и многократно подтверждённое. Выбор записи зависит от шага: на каждом шаге заново смотрят, подходит ли запись под текущее состояние и этап.
Рычаги: - Лимит записей (в статье 5 локальных + 5 глобальных) → уменьшите для коротких задач, увеличьте для долгих. - Порог подтверждения (в статье нижняя граница Вилсона ≥ 0,35 при уровне 0,05) → поднимите, если общая память засоряется, снизьте, если она пустая. - Три роли записей (grounding / workflow / reflection) → уберите «reflection», если не хотите, чтобы агент перестраховывался. - Условия применимости → чем строже, тем меньше переноса, но и меньше вреда.
Шаблон промпта
В статье готового промпта нет, он реализован кодом. Это ручной вариант того же принципа.
Промпт 1. Разбор сессии в записи (после каждой сессии):
Ты — архивариус опыта агента. Твоя задача — превратить лог работы в записи памяти двух видов:
локальные (с деталями среды) и переносимые (очищенные от деталей).
1. Каждая запись имеет тип: workflow (последовательность шагов), precondition (что должно быть истинно перед действием), repair (как исправили ошибку), failure (что не сработало), fact (конкретный факт).
2. Переносимой может быть только запись типа workflow, precondition, repair или failure.
3. Для переносимой записи: замени конкретные названия, ID, ссылки, имена на роли ({предмет}, {инструмент}, {площадка}).
4. Обязательно сохрани: условия применимости, последовательность действий, исход.
5. Если схему нельзя очистить от среды — оставь её локальной.
6. Для каждой переносимой записи пометь исход в этой сессии: ПОДТВЕРДИЛАСЬ / ПРОТИВОРЕЧИТ / НЕТ ПРОГРЕССА. Одна запись — один голос за сессию.
LOCAL:
- [тип] {запись с деталями}
GLOBAL_CANDIDATES:
- [тип] Когда: {условия} | Шаги: {действия} | Исход: {результат} | Голос: {ПОДТВЕРДИЛАСЬ/ПРОТИВОРЕЧИТ/НЕТ ПРОГРЕССА}
Лог сессии: {лог_сессии}
Среда: {название_среды}
Промпт 2. Продвижение в общую память (раз в неделю или после нескольких сессий):
Вот кандидаты в общую память из сессий {список_сред}.
1. Объедини записи, у которых совпадают тип, условия, шаги и исход.
2. Для каждой объединённой посчитай: сколько голосов ПОДТВЕРДИЛАСЬ, сколько ПРОТИВОРЕЧИТ.
3. В общую память включай запись, только если:
— подтверждений не меньше 2 и противоречий нет, ИЛИ
— подтверждений минимум 3 из 4 голосов.
4. Остальные оставь в списке «ждут подтверждения» с текущим счётом.
5. Удали из общей памяти записи, которые больше не проходят порог.
Кандидаты: {кандидаты}
Текущая общая память: {общая_память}
Пороги в промпте 2 — моя ручная прикидка под параметры статьи (расчёт нижней границы Вилсона). Это не цифры из статьи.
Промпт 3. Использование перед задачей:
Задача: {задача}. Текущая ситуация: {состояние}.
Из локальной памяти ({локальная}) и общей ({общая}) выбери не более 5 записей из каждой.
Отбрось записи, чьи условия противоречат текущей ситуации.
Собери три блока:
1. ГДЕ МЫ — факты и детали из локальной памяти.
2. КАК ДЕЙСТВОВАТЬ — схемы и предусловия.
3. ЧЕГО ИЗБЕГАТЬ — провалы и исправления.
Затем действуй.
🚀 Быстрый старт — вставь в чат:
Вот шаблон «разбор сессии → записи памяти». Адаптируй под мою задачу: {твоя задача}.
Задавай вопросы, чтобы заполнить поля.
[вставить шаблон выше]
LLM спросит, какие у вас среды (площадки, проекты, клиенты) и что в них конкретное. Это нужно, чтобы отделить детали среды от переносимых схем. Она возьмёт структуру из шаблона и подстроит типы записей и условия под вашу работу.
Ограничения
⚠️ Нужен код: в статье память собрана программно, на AutoGen. В обычном чате метод получится только в ручном варианте. Автоматического хранилища, ранжирования и подсчёта голосов там не будет.
⚠️ Нужно много эпизодов: переносимые записи появляются после повторных подтверждений от нескольких агентов. Если у вас одна-две сессии, общая память останется пустой.
⚠️ Очистка от деталей настраивается вручную: замена конкретного на роли опирается на сопоставление «предмет → роль», заданное под каждый бенчмарк. В новой области его придётся придумывать самому.
⚠️ Только симуляторы: проверяли на учебных средах: домашние задачи ALFWorld, планирование PDDL, проверка фактов FEVER. Переносимость на реальные рабочие процессы не показана.
⚠️ Не всегда лучший: на одной из слабых моделей MemCo в двух из шести замеров не был первым по точности. Часть текста статьи, включая ScienceWorld и разбор вклада отдельных частей, недоступна, поэтому какой из блоков важнее — неизвестно.
Как исследовали
Авторы взяли четыре среды: ALFWorld (бытовые задачи в симуляции), PDDL (планирование), FEVER (проверка утверждений) и ScienceWorld. Каждому агенту дали свою среду: четыре агента для ALFWorld и PDDL, два для FEVER, десять для ScienceWorld. Память строили на одних задачах, а проверяли на других. Для ALFWorld отдельно проверяли знакомые и новые планировки комнат.
С MemCo сравнивали обычный промпт без памяти (ICL) и четыре конкурирующих подхода: A-Mem, MemRL, MemSkill и G-Memory. Тестировали три модели (Qwen3-4B, GPT-4o-mini, Qwen3-32B), по три прогона. Измеряли долю решённых задач и число шагов.
MemCo получил лучшую точность в 10 из 12 сочетаний «модель × задача» и самые короткие траектории в 9 из 12. Сильнее всего он выиграл на ALFWorld. У Qwen3-4B точность на новых планировках выросла с 46% до 83%, а шаги сократились с 22 до 14. У Qwen3-32B точность выросла с 80% до 97%, шаги — с 17,5 до 11,2. На FEVER у GPT-4o-mini точность выросла с 63% до 71%, а число шагов упало с 6,3 до 2,6.
Эффект сильнее у маленьких и средних моделей и на новых средах. Это вписывается в идею авторов: чужой опыт полезнее всего там, где модели самой не хватает знаний и где свои детали ещё не накоплены. Конкурент G-Memory на ALFWorld иногда выигрывал. Авторы объясняют это тем, что он не умеет отфильтровывать опыт, не подходящий под текущую ситуацию.
Адаптации и экстраполяции
🔧 Техника: ограничить число записей → меньше шума. В статье агент получает не больше 5 локальных и 5 глобальных записей. В ручном варианте добавьте в промпт 3 строку «не больше 5 из каждой памяти; если сомневаешься, бери меньше». Это защищает контекст от лишних советов.
🔧 Техника: добавить жёсткий фильтр до ранжирования → меньше вредных советов. Авторы разделяют условия применимости (запись отбрасывается при нарушении) и предпочтения (запись понижается в рейтинге). Попросите модель сначала вычеркнуть записи, чьи «Когда» не выполняются, и только потом выбирать лучшие.
Экстраполяция — файл правил агента. Идею можно перенести в CLAUDE.md: два раздела, «Локальное для проекта» и «Переносимые правила». Новое правило попадает во второй раздел только после того, как подтвердилось в двух разных проектах:
## Правила переноса
- В «Переносимые» добавляй правило, только если оно сработало минимум в двух разных проектах и не противоречило ни разу.
- У каждого правила пиши: «Когда: …» и «Не применять, если: …».
- Пути, имена сервисов и ключи — только в «Локальное».
Это моё продолжение идеи, в статье такого эксперимента нет.
Ресурсы
- MemCo: Memory-Centric Collaboration for Generalizing LLM Agents to Unseen Environments
- Авторы: Xinting Liao, Siyan Liu, Rabab K. Ward, Holger R. Roth, Xiaoxiao Li. The University of British Columbia, Vector Institute, NVIDIA
- Код: https://github.com/SYannL/nvdamas
- Сравнивали с: G-Memory, MemRL, MemSkill, A-Mem, Reflexion
- Среды: ALFWorld, PDDL, FEVER, ScienceWorld
