3,583 papers
arXiv:2610.30205 73 21 окт. 2026 г. FREE

Abstract-описание сбоя: как не заставить модель повторить ход, который только что провалился

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

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).

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

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

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

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

Контраст двух сообщений об ошибке. Старый вариант: «действие + ошибка». Строка хода снова лежит в контексте, и модель её подхватывает. Новый вариант: «первая попытка не удалась: столбец уже заполнен; этот ход не повторяется». Строки хода нет. Потом заново показываешь то же состояние. Смысл сбоя оставляем, строку, которую можно скопировать, убираем. Это как предупредить водителя «впереди яма на этой дороге», не рисуя саму яму у него перед глазами. Контекст при этом не стираем. Модель должна знать, что попытка уже была. Ещё два приёма. Вместо числа пиши порядковое слово: «первая», «вторая». Цифра в сообщении в играх может сама оказаться ходом.

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

Авторы разобрали, что именно толкает модель к повтору. Вклад смысла ошибки почти нулевой. Вклад копирования строки большой. Поэтому «не повторяй» в системном промпте ничего не даёт. Модель почти не вчитывается в смысл ошибки, зато охотно копирует всё, что снова увидела в контексте. Ещё два факта. «Чистый перезапуск» со стиранием неудачи оказался худшим вариантом: модель забывает, что попытка была. Бан повторов в декодере режет только дословные совпадения. Нелегальные ходы всё равно проскакивают. Есть и нюанс. Если провалился ход, который модель сама собиралась сделать, запись сбоя помогала. Повторов становилось меньше. Инверсия бьёт по ходам, которых модель выбирать не собиралась. После записи вероятность неудачного хода почти не зависит от прежней (наклон 0,18).

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

Небольшие модели (в статье от 135M до 1,7B параметров), которые крутятся локально или в дешёвой автоматизации → агенты с циклом повтора после ошибки, особенно когда действие явно нелегальное: несуществующее поле, занятый слот, неверная команда. НЕ подходит для крупных моделей через API: там эффект не проверен. Проверка на 7B авторам не удалась. Для «легальных, но проигрышных» ходов эффект слабый и статистически ненадёжный. Одна из моделей (Llama-3.2-1B) вела себя вообще наоборот. Всё измерено на играх (Sokoban, «Четыре в ряд», Реверси), а не на бизнес-агентах.

Мини-рецепт

1. Найди цикл ошибок: посмотри логи, где бот повторяет один и тот же вызов или ход после сбоя.
2. Выкинь цитату: уберь из сообщения об ошибке название действия, номера, идентификаторы и названия полей.
3. Опиши сбой словами: «первая попытка не удалась: [причина своими словами]; это действие не повторяется».
4. Замени число словом: «первая», «вторая» вместо «1», «2».
5. Покажи состояние заново: то же самое, без изменений, и проси следующее действие.
6. Не стирай историю: чистый перезапуск был худшим вариантом.
7. Замерь: доля повторов одного вызова до и после. Гарантий нет, у части моделей инверсия остаётся.

Примеры

Задача: бот на локальной модели класса Qwen3-1.7B в n8n разбирает заявки с Авито и кладёт сделки в amoCRM через программный интерфейс (API). Иногда указывает несуществующее поле. [ПЛОХО]: `Ошибка API: поле budget_total не найдено. Вызов: set_field("budget_total", 450000). Попробуй ещё раз.` [ХОРОШО]: `Первая попытка не удалась: в вызове указано поле, которого нет в схеме сделки; это действие не повторяется. Текущая заявка (без изменений): клиент ООО «Тепло-Сервис», Казань, бюджет 450 000 ₽, запрос — монтаж отопления в складе. Выбери следующее действие.` Тот же приём для «Четыре в ряд». [ПЛОХО]: `Ход 4 не удался: столбец 4 заполнен. Ходи снова.` [ХОРОШО]: `Первая попытка не удалась: выбранный столбец уже заполнен; этот ход не повторяется. Доска (без изменений): [текущая позиция]. Выбери следующий ход.`
Источник: Feedback That Backfires in Games: Do LLM Players Repeat the Move They Just Watched Fail?
ArXiv ID: 2610.30205 | Сгенерировано: 2026-10-26 15:20

Проблемы LLM

ПроблемаСутьКак обойти
Модель повторяет действие, которое только что провалилось, если оно записано в историюДействие не прошло. Ты пишешь в историю «действие + текст ошибки». Строка с действием снова в контексте. Модель продолжает текст по образцу того, что видит. Эта строка становится для неё привычнее. Смысл ошибки почти не влияет. Фраза «не повторяй» в инструкции тоже мало помогает. Любая цитата неудачного действия подталкивает к его повторению. Это важно для любых циклов повтора: вызовы API, команды, выбор поля, ход в игре. Эффект сильнее у малых моделей (до ~2B). Для больших моделей он не проверенНе цитируй неудачное действие в истории. Опиши сбой словами, без названия действия, команды, номера или идентификатора. Не стирай историю целиком. Покажи текущее состояние задачи заново. Подробности в методе ниже

Методы

МетодСуть
Описание сбоя словами вместо цитаты действия — меньше повторов ошибкиЧто делать: после неудачи рантайм пишет в историю не «действие + ошибка», а смысл сбоя. В тексте нет строки действия, номеров, названий полей и команд. Вместо числа используй порядковое слово: «первая попытка», «вторая попытка». Затем заново покажи то же состояние и попроси следующее действие. Шаблон: Попытка {первая} не удалась: {причина своими словами}; это действие не повторяется. Текущее состояние (без изменений): {состояние}. Выбери следующее действие. Пример: вместо вызов set_field("budget_rub") → ошибка: поле не найдено пиши Первая попытка не удалась: в вызове указано поле, которого нет в схеме; это действие не повторяется. Почему работает: убираем строку, которую модель может скопировать. Смысл сбоя остаётся, а его модель понимает и без цитаты. Контекст не стираем, поэтому модель знает, что попытка уже была. Когда да: небольшие модели, локальные или дешёвые автоматизации, явно «нелегальные» ошибки (несуществующее поле, занятый слот, неверная команда). Когда слабее: действие допустимо, но просто плохое. Там эффект слабый и ненадёжный. Оговорка: помогает не у каждой модели. Меряй долю повторов одного и того же действия до и после на своих логах
📖 Простыми словами

Feedback That Backfires in Games: DoLLMPlayers Repeat the Move They Just Watched Fail?

arXiv: 2610.30205

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

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

В тестах на играх вроде Sokoban и Реверси физика процесса показала себя во всей красе. Смысловой вклад текста об ошибке равен чистому нулю, а решает банальное копирование токенов. Что реально работает: убрать саму строку действия из промпта. Опиши сбой общими словами, выбрось конкретный триггер — и модель внезапно перестанет долбиться лбом в ту же закрытую дверь.

Эффект жестко доказан на моделях от 135M до 1.7B параметров, но грабли бьют по всей дешевой автоматизации. Любые локальные агенты, тул-коллинг или скриптовые боты на легковесных сетках ловят эту петлю за секунду. Если твой парсер упал на несуществующем слоте, возвращать ему в контекст упавшую команду — верный способ повесить процесс.

Короче: хватит воспитывать мелкие модели нравоучениями в духе «ты оступился, вот твоя команда, больше так не делай». Вычищай ошибочные действия из контекста под ноль. Описывай проблему абстрактно либо просто стирай неверный шаг из истории. Иначе вместо исправления бага ты собственными руками гарантируешь повторный провал.

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

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

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