TL;DR
MACLA — система, которая отделяет рассуждения от обучения: LLM остаётся замороженной, а вся адаптация происходит через внешнюю процедурную память. Система извлекает из опыта переиспользуемые процедуры (цель → предусловия → действия → постусловия), оценивает надёжность каждой через байесовскую статистику, выбирает следующее действие через expected utility (баланс релевантности, вероятности успеха, риска провала и информационной ценности), и улучшает процедуры через контрастное сравнение успешных и провальных выполнений.
Ключевая находка: контрастное обучение (сравнение что сработало vs что провалилось) даёт больше сигнала, чем простой подсчёт успехов. Провальная траектория может содержать правильные шаги ("успешно нашёл яйцо, но провалил варку"), а успешная — субоптимальные действия, которые случайно компенсировали друг друга. Традиционное fine-tuning оценивает траекторию целиком по финальному результату, теряя эти детали. Байесовская статистика (Beta-распределение) накапливает счёт успехов α и провалов β для каждой процедуры, давая не только среднюю надёжность α/(α+β), но и неопределённость — низкая при большом опыте, высокая при малом.
Система работает в три механизма: (1) Байесовский выбор — ранжирование процедур через expected utility с балансом эксплуатации (высокая надёжность) и исследования (высокая неопределённость); (2) Контрастная доводка — когда процедура накопила ≥3 успеха и ≥3 провала, LLM сравнивает контексты и ужесточает предусловия, чинит действия, уточняет постусловия; (3) Мета-процедуры — если последовательность процедур стабильно приводит к успеху, система создаёт иерархический "плейбук" с условной логикой (продолжить, пропустить, повторить, прервать).
Схема метода
Система состоит из 4 компонентов:
КОМПОНЕНТ 1: Извлечение процедур
Траектория (task→actions→observations→rewards)
→ LLM сегментирует на подзадачи
→ Каждая подзадача = процедура:
• Цель (Goal)
• Предусловия (Ψ) — паттерны в наблюдениях ДО
• Действия (π) — абстрактная последовательность
• Постусловия (Φ) — паттерны в наблюдениях ПОСЛЕ
→ Semantic embedding для поиска похожих
КОМПОНЕНТ 2: Байесовская оценка
Для каждой процедуры: Beta(α, β) posterior
α = счётчик успехов, β = счётчик провалов
Expected Utility = Relevance × (α/(α+β)) × R_max
- Risk × (β/(α+β)) × C_fail
+ λ × Entropy
Выбор: argmax EU среди кандидатов
Если EU < порог → zero-shot LLM reasoning
КОМПОНЕНТ 3: Контрастная доводка
Когда |successes| ≥ 3 AND |failures| ≥ 3:
LLM сравнивает контексты успехов vs провалов
→ ΔΨ⁺: что было в успехах (добавить в preconditions)
→ ΔΨ⁻: что было в провалах (добавить как ¬ψ)
→ Δπ: различия в действиях (починить последовательность)
→ ΔΦ: различия в результатах (уточнить postconditions)
КОМПОНЕНТ 4: Мета-процедуры
Если процедуры A→B→C стабильно ведут к успеху:
Создать MetaProc = ⟨Goal_meta, Ψ_meta, [A,B,C], Θ⟩
Θ = control policy(observation, step) → {continue, skip, repeat, abort}
Пример: skip B если его preconditions уже выполнены
Принципы для применения
1. Контрастное обучение через успехи vs провалы
Суть: Сравнивай что общего в успешных примерах и чего не было в провалах. Это точнее, чем просто "что сработало".
Применение в чате:
Когда учишь LLM на твоих примерах или анализируешь что работает/не работает:
Вот 3 успешных [текста/питча/решения]:
[пример 1]
[пример 2]
[пример 3]
Вот 3 провальных:
[пример 4]
[пример 5]
[пример 6]
Задача: найди РАЗЛИЧИЯ (не сходства внутри групп):
1. Что есть во всех успешных, но отсутствует в провалах?
2. Что есть в провалах, но отсутствует в успехах?
3. Сформулируй правила: "Для успеха нужно X и избегать Y"
2. Байесовское мышление: счётчик успехов и провалов
Суть: Не просто "сработало/не сработало", а накопление статистики с учётом неопределённости.
Применение в чате:
Веди явную таблицу надёжности методов:
У меня есть 3 подхода к [задаче]:
Подход A:
• Успехов: 8
• Провалов: 2
• Надёжность: 80% (8/10)
• Уверенность: высокая (10 попыток)
Подход B:
• Успехов: 2
• Провалов: 0
• Надёжность: 100% (2/2)
• Уверенность: низкая (всего 2 попытки)
Подход C:
• Успехов: 5
• Провалов: 5
• Надёжность: 50% (5/10)
• Уверенность: средняя (10 попыток)
Задача: какой выбрать для [новой ситуации]?
Учитывай баланс:
• Эксплуатацию (выбрать A — высокая надёжность при большом опыте)
• Исследование (попробовать B — мало данных, но пока 100%)
• Релевантность (насколько новая ситуация похожа на прошлый контекст каждого подхода)
3. Процедурная память: структурированное "что работает"
Суть: Не хранить "вот успешный пример", а извлекать процедуру: когда применимо → что делать → как проверить результат.
Применение в чате:
Вместо копипаста удачного промпта создавай структурированную процедуру:
Процедура: [Название]
ПРЕДУСЛОВИЯ (когда применять):
• [условие 1]
• [условие 2]
ДЕЙСТВИЯ:
1. [шаг 1]
2. [шаг 2]
3. [шаг 3]
ПОСТУСЛОВИЯ (как проверить успех):
• [критерий 1]
• [критерий 2]
НАДЁЖНОСТЬ:
• Успехов: X
• Провалов: Y
• Лучше всего работает когда: [контекст]
• Не работает когда: [анти-паттерн]
Попроси LLM адаптировать эту структуру под новую задачу.
4. Иерархические процедуры для сложных задач
Суть: Когда последовательность шагов A→B→C стабильно работает, упакуй в мета-процедуру с условной логикой.
Применение в чате:
МетаПроцедура: [Название сложной задачи]
ПОСЛЕДОВАТЕЛЬНОСТЬ:
1. Процедура A: [название]
→ Если результат A уже выполнен: SKIP
2. Процедура B: [название]
→ Если B провалилась: REPEAT до 2 раз
→ Если провалилась снова: ABORT
3. Процедура C: [название]
→ Всегда выполнять
УСЛОВИЯ ПРЕРЫВАНИЯ:
• [критерий когда остановиться]
НАДЁЖНОСТЬ:
• Успешных прогонов: X
• Провальных: Y
Пример применения
Задача: Ты тестируешь разные подходы к написанию продающих описаний для товаров в своём интернет-магазине. Одни форматы конвертят в продажи, другие нет. Нужно понять что работает и создать надёжную процедуру.
Промпт:
Контекстная задача: анализ эффективности форматов описаний товаров.
УСПЕШНЫЕ примеры (3 описания → высокая конверсия):
[Описание товара 1 — сработало]
Конверсия: 8.2%
Контекст: категория "Электроника", ценник 15000₽
[Описание товара 2 — сработало]
Конверсия: 9.1%
Контекст: категория "Товары для дома", ценник 3500₽
[Описание товара 3 — сработало]
Конверсия: 7.8%
Контекст: категория "Спорт", ценник 8900₽
ПРОВАЛЬНЫЕ примеры (3 описания → низкая конверсия):
[Описание товара 4 — не сработало]
Конверсия: 1.2%
Контекст: категория "Электроника", ценник 14500₽
[Описание товара 5 — не сработало]
Конверсия: 0.9%
Контекст: категория "Товары для дома", ценник 3200₽
[Описание товара 6 — не сработало]
Конверсия: 1.5%
Контекст: категория "Спорт", ценник 9200₽
Задачи:
1. Контрастный анализ: что ОБЩЕЕ во всех успешных, но ОТСУТСТВУЕТ во всех провальных?
2. Что есть в провалах, чего нет в успехах?
3. Создай ПРОЦЕДУРУ в формате:
Процедура: "Конвертящее описание товара"
ПРЕДУСЛОВИЯ (когда применять):
• [паттерны из успехов]
ДЕЙСТВИЯ:
1. [шаги на основе различий]
2. [...]
НЕ ДЕЛАТЬ (анти-паттерны):
• [что было в провалах]
ПОСТУСЛОВИЯ (как проверить):
• [критерии успешного описания]
4. Оцени надёжность: если бы эту процедуру применили к 10 новым товарам, сколько из них получат высокую конверсию? Какие ограничения?
Результат:
Модель выдаст: - Дискриминативные паттерны: конкретные элементы (структура, язык, акценты), которые различают успехи и провалы - Структурированную процедуру с чёткими предусловиями (когда применять), действиями (как писать) и постусловиями (как проверять) - Анти-паттерны — что было в провалах и чего избегать - Байесовскую оценку: ожидаемую надёжность процедуры + контексты где неопределённость высока - Чек-лист проверки под каждое новое описание
Почему это работает
Слабость LLM: Модель не помнит что сработало в прошлых сессиях. Каждый раз начинает с нуля. Даже в рамках одного чата она не накапливает статистику — просто видит историю, но не извлекает структурированные паттерны надёжности.
Сильная сторона LLM: Отличный дискриминативный анализатор — если дать явные примеры "успех vs провал", модель находит тонкие различия. Хорошо абстрагирует конкретные действия в общие процедуры. Умеет структурировать знания когда даёшь формат.
Как принципы используют сильные стороны:
Контрастное обучение даёт LLM чёткий сигнал: вместо "вот что сработало" (модель не знает почему), даём "вот успехи и провалы, найди РАЗЛИЧИЯ" (модель видит сигнал).
Явная байесовская статистика превращает опыт в структурированные данные: LLM видит не просто примеры, а счётчики с контекстами. Это компенсирует отсутствие внутренней памяти.
Процедурный формат (предусловия → действия → постусловия) структурирует знания переиспользуемо: вместо "вот удачный пример текста" получаешь "когда применять → как делать → как проверить".
Иерархические мета-процедуры используют способность LLM к композиции: модель хорошо понимает условную логику ("если A не сработало, попробуй B").
Рычаги управления:
- Количество примеров (3 успеха / 3 провала) — минимум для паттернов. Увеличь до 5-7 для сложных задач, уменьши до 2-2 если данных мало.
- Структура процедуры — добавь секции "Варианты" (если процедура работает по-разному в разных контекстах) или "Контрольные точки" (промежуточные проверки).
- Порог надёжности — при какой статистике (X успехов из Y попыток) считать процедуру надёжной. 8/10 = высокая уверенность, 2/2 = низкая (мало данных).
- Условия в мета-процедурах — настраивай логику (skip/repeat/abort) под свою задачу. Например, "repeat до 3 раз" или "abort если 2 провала подряд".
Шаблон промпта: контрастный анализ для извлечения процедуры
Контекстная задача: {описание что ты делаешь и хочешь улучшить}
УСПЕШНЫЕ примеры ({N} примеров где сработало):
Пример 1:
{контекст/ситуация}
Действия: {что делал}
Результат: {конкретная метрика успеха}
Пример 2:
{...}
Пример {N}:
{...}
ПРОВАЛЬНЫЕ примеры ({M} примеров где не сработало):
Пример 1:
{контекст/ситуация}
Действия: {что делал}
Результат: {конкретная метрика провала}
Пример 2:
{...}
Пример {M}:
{...}
Задачи:
1. КОНТРАСТНЫЙ АНАЛИЗ:
• Что есть во ВСЕХ успешных, но ОТСУТСТВУЕТ в провальных?
• Что есть в провалах, чего нет в успехах?
• Найди тонкие различия: не только "что делали", но и "как", "в каком порядке", "с каким акцентом"
2. ИЗВЛЕЧЬ ПРОЦЕДУРУ:
Название процедуры: {короткое название}
ПРЕДУСЛОВИЯ (когда применять):
• {паттерн контекста 1}
• {паттерн контекста 2}
• {...}
ДЕЙСТВИЯ:
1. {абстрактный шаг 1 — не "напиши о телефоне", а "опиши ключевую выгоду"}
2. {шаг 2}
3. {...}
НЕ ДЕЛАТЬ (анти-паттерны из провалов):
• {что было в провалах}
• {...}
ПОСТУСЛОВИЯ (как проверить успех):
• {критерий 1}
• {критерий 2}
3. БАЙЕСОВСКАЯ ОЦЕНКА:
• Надёжность: {X} успехов из {X+Y} попыток = {X/(X+Y)}%
• Уверенность: {высокая если ≥10 попыток, низкая если <5}
• Ожидаемая работа: если применить к {Z} новым случаям, сколько сработает?
• Ограничения: в каких контекстах неопределённость высока?
4. УСЛОВНАЯ ЛОГИКА (если применимо):
• При каких условиях пропустить (SKIP) шаг?
• Когда повторить (REPEAT)?
• Критерий прерывания (ABORT)?
Что подставлять:
- {описание задачи} — твоя рабочая задача (написание текстов, анализ данных, принятие решений, etc.)
- {N} и {M} — количество примеров (минимум 3-3, оптимально 5-5)
- {контекст/ситуация} — исходные данные для каждого примера
- {действия} — что конкретно делал в каждом случае
- {метрика} — измеримый результат (конверсия, время, деньги, качество по шкале)
🚀 Быстрый старт — вставь в чат:
Вот шаблон контрастного анализа для извлечения процедур. Адаптируй под мою задачу: {твоя задача}.
Задавай вопросы о примерах успехов и провалов.
[вставить шаблон выше]
LLM спросит конкретные примеры успехов и провалов с контекстами — потому что без них невозможен контрастный анализ. Она возьмёт структуру (предусловия→действия→постусловия→байесовская оценка) и заполнит под твои данные.
Ограничения
⚠️ Требуется инфраструктура для полной системы: Оригинальная MACLA — это сложная система с semantic embeddings для поиска процедур, approximate nearest neighbor index, автоматическим извлечением из траекторий. В чате доступны только принципы, которые нужно применять вручную: ты сам создаёшь таблицу успехов/провалов, сам запускаешь контрастный анализ, сам ведёшь библиотеку процедур.
⚠️ Нужно накопить статистику: Байесовская оценка и контрастное обучение работают когда есть ≥3 успехов и ≥3 провалов. Если ты только начал задачу — данных мало, принципы неприменимы. Это техника для улучшения существующей практики, не для старта с нуля.
⚠️ Ручное ведение памяти: Система MACLA автоматически сохраняет процедуры, обновляет счётчики, запускает доводку. В чате тебе придётся вести структуру самому: документ с процедурами, таблица надёжности, явные запросы на контрастный анализ. Это трудозатратно для десятков процедур.
⚠️ Контрастный анализ требует сравнимости: Примеры успехов и провалов должны быть структурно похожи (одна задача, разные исполнения), иначе LLM найдёт поверхностные различия ("в примере 1 про телефон, в примере 2 про пылесос"). Метод не работает для разнородных задач.
Ресурсы
Learning Hierarchical Procedural Memory for LLM Agents through Bayesian Selection and Contrastive Refinement
Saman Forouzandeh, Wei Peng, Parham Moradi, Xinghuo Yu, Mahdi Jalili
School of Engineering, Royal Melbourne Institute of Technology University
Код: github.com/S-Forouzandeh/MACLA-LLM-Agents-AAMAS-Conference
