Перейти к содержанию

Защита от зацикливания

Иногда модель застревает: раз за разом повторяет один и тот же текст, рассуждение или вызов инструмента с теми же аргументами и результатом, но задача не двигается. Чтобы сессия не тратила время и токены впустую, Koda распознаёт такие повторы и вмешивается.

Как распознаётся повтор

Koda следит за потоком ответа модели и сравнивает его с недавней историей. Повтором считается, если подряд воспроизводится одно и то же:

  • фрагмент обычного текста длиной не меньше 100 символов — пять раз;
  • фрагмент рассуждений — по той же проверке;
  • вызов инструмента с тем же именем и аргументами — на пятый раз, если совпадают и результаты предыдущих вызовов;
  • последовательность вызовов инструментов или смешанный блок текста, рассуждений и действий — пять раз.

Незначительные различия в пробелах не мешают распознаванию, а изменившийся результат инструмента разрывает повтор — значит, работа идёт. Параллельные вызовы, результаты которых ещё неизвестны, зацикливанием не считаются.

Что происходит при повторе

На первом срабатывании Koda прерывает текущую попытку и просит модель продолжить задачу другим способом, учитывая уже полученные результаты. Ещё не выполненный вызов инструмента отменяется и не исполняется. Если модель снова возвращается к повторам, Koda останавливает запуск.

При остановке выполненные действия и их результаты сохраняются, а Koda предлагает выход: сжать контекст командой /compress, начать новую сессию с кратким описанием задачи, разбить задачу на части или выбрать другую модель.

Где это работает

Защита действует в интерактивной сессии, в неинтерактивном режиме и в ACP-сессиях. Это же правило применяется и к фоновым субагентам: повтор у субагента прерывается, а при возврате к нему задача останавливается.

В ACP-клиенте остановка по зацикливанию приходит как end_turn с пометкой в _meta, а не очередным абзацем от модели — подробнее в спецификации ACP-сервера.