TL;DR
Если после неудачного действия агента написать в историю диалога само действие и сообщение об ошибке, маленькая модель с большей вероятностью повторит то же действие. Дело не в тексте ошибки. Дело в том, что строка с ходом снова оказалась в контексте. Эффект измерили в играх (Sokoban, «Четыре в ряд», Реверси). Если же описать сбой словами, без самой строки хода, предпочтения модели сохраняются.
Боль знакома: агент получает «Ошибка: колонка 4 заполнена», а в следующей попытке снова ставит в колонку 4. Причина простая. Модель продолжает текст по образцу того, что перед глазами. Ход, который она только что «увидела» в контексте, становится для неё более привычным вариантом, даже если рядом написано, что он провальный. Главные детали: - Работает это для нелегальных ходов. Для «легальных, но проигрышных» эффект слабый и статистически не надёжный. - Инструкция «не повторяй» ничего не даёт. - «Чистый перезапуск» (стереть неудачу из контекста) оказался худшим вариантом. - Бан повторов на уровне декодера останавливает точные повторы, но не нелегальные ходы вообще.
Метод-лекарство простой: вместо цитаты неудачного хода — описание сбоя без строки хода и без цифр, например «первая попытка не удалась: выбранный столбец уже заполнен; этот ход не повторяется». Затем снова показываем текущую позицию. В среднем это убирает большую часть инверсии, но не у каждой модели.
Схема метода
ШАГ 1: Агент делает действие → рантайм проверяет → действие не прошло
ШАГ 2: В историю пишем НЕ «действие + ошибка», а описание сбоя
БЕЗ строки действия и БЕЗ цифр/идентификаторов из него
ШАГ 3: Заново показываем то же текущее состояние и просим следующее действие
(всё в одном контуре обвязки; текст сообщения формирует рантайм/шаблон)
Пример применения
Сначала про границы. Метод измерен на малых моделях (135M–1,7B параметров). Если вы работаете с большой моделью через API, эффект на ней не проверен. Сильная зона: небольшие модели, которые крутятся локально или в дешёвой автоматизации, и ошибки, где действие явно «нелегальное» (несуществующее поле, занятый слот, неверная команда).
Задача: Вы собрали в n8n бота на небольшой локальной модели (класс Qwen3-1.7B). Он разбирает заявки с Авито и кладёт сделки в amoCRM через вызов API. Иногда он указывает несуществующее поле. Сейчас в цикл повтора уходит «вызов + ответ API с ошибкой», и бот снова вызывает то же поле.
Промпт (сообщение обратной связи, которое рантайм подставляет после сбоя):
Первая попытка не удалась: в вызове указано поле, которого нет в схеме
сделки; это действие не повторяется.
Текущая заявка (без изменений):
Клиент: ООО «Тепло-Сервис», Казань, бюджет 450 000 ₽, запрос — монтаж
отопления в складе.
Выбери следующее действие.
Результат: Модель получает сообщение, где нет ни названия поля, ни самого вызова. По данным статьи, у малых моделей это снижает тягу повторить прежнюю строку по сравнению с вариантом «вызов + текст ошибки». Гарантии нет: у части моделей инверсия остаётся. Проверяйте на своих логах: доля повторов одного и того же вызова до и после.
Почему это работает
Слабость. Модель продолжает текст по тому, что видит. Когда строка хода снова появляется в контексте, она получает «бонус привычности». Разбор показал: сообщение об ошибке почти ничего не меняет (вклад смысла ≈ 0), а вклад копирования большой. Поэтому «не делай так» в тексте не помогает. Слово «ход» вы называете, и это уже подталкивает его повторить.
Сильная сторона. Модель хорошо использует описание ситуации словами. «Столбец уже заполнен» она понимает и без цитаты хода.
Как метод это использует. Мы убираем строку, которую модель могла бы скопировать, и оставляем смысл сбоя. Контекст при этом не стираем: «чистый перезапуск» был худшим, потому что модель теряет сведения, что попытка уже была.
Рычаги: - Без цифр и без строки действия. В статье цифра в сообщении сама могла бы быть ходом (в числовых нотациях). Убирайте идентификаторы, номера, названия полей. - Порядковое слово («первая попытка», «вторая попытка») вместо числа. - Повторный показ состояния после сообщения: условия различались только записью попытки. - Двойной сбой (ход проваливался дважды) тоже тестировали как отдельное условие.
Важный нюанс из данных. Когда провалился ход, который модель сама бы выбрала (её реальные ошибки), запись сбоя помогала: повторов становилось меньше. Инверсия сильнее на ходах, которые модель сама не выбрала бы. Грубо: после записи вероятность неудачного хода почти не зависит от прежней (наклон 0,18). Невероятные ходы подтягиваются вверх, вероятные спускаются вниз.
Шаблон промпта
Попытка {порядковое_слово} не удалась: {причина_словами_без_названия_действия};
это действие не повторяется.
Текущее состояние (без изменений):
{состояние}
Выбери следующее действие.
Что подставлять:
- {порядковое_слово} — «первая», «вторая»;
- {причина_словами_без_названия_действия} — суть сбоя своими словами, без идентификаторов, номеров, названий полей или команды;
- {состояние} — то же состояние задачи, что было перед попыткой.
Ограничения
⚠️ Малые модели: Всё измерено на моделях до 1,7B параметров. На крупных и современных моделях эффект не проверен. Проверка на 7B авторам не удалась.
⚠️ Не у всех моделей: Часть моделей инвертирует явно, часть слабо, а одна (Llama-3.2-1B) ведёт себя наоборот. Описание без хода убирает инверсию в среднем, но не у каждой модели.
⚠️ Легальные, но плохие ходы: Для «легальных, но проигрышных» эффект слабый и интервал включает ноль. Вывод в основном про нелегальные действия.
⚠️ Собственные ошибки модели: Когда провалилось то, что модель сама собиралась сделать, запись сбоя скорее помогает. Метод важнее для действий, которых модель выбирать не собиралась.
⚠️ «Не повторяй» и чистый перезапуск не работают: Явный запрет в системном промпте не помогает, перезапуск без истории хуже. Бан повторов в декодере (запрет точной строки) остановит только дословные повторы, нелегальные ходы всё равно появятся.
⚠️ Игры, не бизнес-агенты: Статья измеряет логарифм вероятности на игровых позициях. Как это выглядит в реальных автоматизациях, остаётся догадкой, проверяйте на своих логах.
Как исследовали
Автор продолжил свою прошлую работу про вызовы инструментов: там запись сбоя делала повтор вероятнее у всех шести проверенных малых моделей. Новая проверка — в играх, где ошибку можно подтвердить точно: нелегальный ход (полная колонка, стена, занятая клетка) или легальный, но проигрышный (в «Четыре в ряд» соперник выигрывает сразу, в Sokoban тупик, найденный полным перебором).
Взяли 8 дообученных на инструкциях моделей (135M–1,7B) и три игры. Ходы-ошибки получали искусственно: брали правильный ход и слегка «портили» (соседний столбец, обратное направление). Так все модели видят одни и те же ошибки, и сложность задач не путается с моделью. Измеряли, как меняется логарифм вероятности повторить провальный ход после записи сбоя. Цифры: в среднем −1,38 нат на токен, отрицательно на 61% пар «модель—пример». Вероятность провального хода среди четырёх кандидатов выросла с 0,24 до 0,35, жадное декодирование повторяло его в 23% случаев против 12%.
Ключевая деталь дизайна — разложение на «копирование» и «смысл». Вклад копирования +1,34, вклад смысла сообщения практически ноль (+0,04). То есть дело в самой строке хода, а не в том, что модель «не поняла» сообщение. Подтверждение: описание сбоя без строки хода сохраняет прежнее предпочтение.
Дальше смотрели, откуда берётся эффект. Прошли по лестнице обучения модели OLMo 2 1B: инверсия уже есть у базовой модели (то есть это копирование, а не следствие инструктивного обучения), а этап DPO снимает большую часть. Две дефолтные модели из RL-фреймворка RAGEN в его собственном формате тоже инвертируют на нелегальных ходах в Sokoban.
Удивило, что на «реальных» ошибках, которые модель сама бы выбрала, знак меняется: запись сбоя помогает (+1,34). Отсюда вывод для практики: проблема сильнее там, где неудачное действие для модели «чужое». Ещё одна деталь: код автора сначала воспроизвёл число из прошлой работы (−23,92 нат), только потом считал игры.
Оригинал из исследования
Illegal move: that column is already full.
(основное сообщение об ошибке; строка хода в него не входит)
[first attempt failed: the chosen column was already full; that move is not repeatable]
(абстрактное описание сбоя: без строки хода и без цифр, счётчик — порядковое слово)
Move received.
Move accepted.
(нейтральное подтверждение и «успех» для разложения эффекта)
Контекст: Это сообщения-условия из эксперимента: основное сообщение об ошибке, описание без хода, нейтральное и успешное подтверждение. Из них считали вклад копирования и вклад смысла.
Адаптации и экстраполяции
💡 Адаптация для чата (гипотеза, в статье не проверялась): Когда вы сообщаете модели в обычном чате, что её вариант не подошёл, формулируйте обратную связь по сути, а не цитируйте её же ответ.
Предыдущая версия не подошла: она нарушала ограничение по длине и содержала неподтверждённые факты. Дай новую версию с нуля, учитывая это.
В статье это не измерялось, это переносит принцип на текст. Проверяйте на своих задачах.
Ресурсы
- Feedback That Backfires in Games: Do LLM Players Repeat the Move They Just Watched Fail? — Esmail Gumaan, Faculty of Computer Science and Mathematics, University of Passau, Germany.
- Предыдущая работа автора (Gumaan, 2026) — те же измерения для вызова инструментов и починки кода.
- Код и данные: https://github.com/Esmail-ibraheem/feedback-that-backfires/tree/games
- Упомянутое: RAGEN/StarPO (Wang et al., 2025), OLMo 2 (OLMo et al., 2024), XiangqiBench (Chai et al., 2026).
