Почему нейронка не пользуется отладчиком – и как харнесс перекрывает класс модели

Увидел

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

А где же отладчик?

Проверил

Проверил выборочно на своих сессиях Claude и Codex на Python и JavaScript и обнаружил, что действительно, в этих эпизодах отладчик не использовался ни разу.

При этом агенты читали исходники, писали проверочные скрипты, изучали процессы и ставили эксперименты, чтобы найти ошибки. Просто обходились без отладчика.

Но почему?

Казалось бы, отладчик – базовый инструмент программиста. Почему агент так редко его использует? Или это особенность моих задач?

Разобрался

В debug-gym и других работах нашлись объяснения:

  1. Интерфейс рассчитан на человека. Отладчиком приходится управлять пошагово, а его ответы бывают многословными. Агенту приходится значительно чаще обращаться к модели, а ее контекст заполняется командами и ответами отладчика.

  2. Агенты неохотно используют инструмент. Авторы debug-gym предполагают, что дело в обучающих выборках, в которых много готовых правок кода и мало записей работы с отладчиком. Возможно, поэтому модели охотнее переписывают код, чем исследуют его выполнение.

  3. Прямой доступ работает не всегда. В эксперименте Microsoft (Debug2Fix) Sonnet с прямым доступом к отладчику вызвала его всего в 9% задач, а общий результат оказался хуже, чем без отладчика. Агенту приходится одновременно управлять отладчиком и искать причину ошибки. Вероятно, чем слабее модель, тем труднее ей совмещать эти задачи.

Исследователи пробуют три разных ответа на эту проблему.

Не может? Научим

В SWE-PDB модели сначала показали примеры того, как искать ошибки с помощью отладчика, а затем дали практиковаться, поощряя успешные решения. После такого обучения Qwen3-14B стала исправлять 38% задач вместо прежних 10%. Правда, после такого обучения с подкреплением она научилась лучше чинить код и без отладчика, показав результат в 33,4%. То есть обучение улучшило саму модель, а использование отладчика дало еще прибавку сверху.

Неудобно? Переделаем

Обычный отладчик требует от агента множества мелких действий, например, выполни следующую строку, покажи переменную, зайди в функцию. В FramePilot агенту по запросу дают целую историю выполнения выбранной функции: какие данные она получила, как менялись переменные и что вернула. Если подозрение падает на другую функцию, можно перейти к истории ее вызова. Меньше возни с управлением отладчиком – больше внимания самой ошибке.

Не хочет? Заставим

В работе Debug2Fix сделали две вещи:

  1. Спрятали отладчик за субагента. Главному агенту вместо команды pdb или jdb дают один инструмент – “спроси отладочного субагента”. Главный агент задает вопрос на естественном языке: “Какое значение возвращает метод X при таком тесте?”. Субагент в своем изолированном контексте рулит отладчиком, находит ответ и возвращает сухие факты: переменные, стек вызовов, наблюдения. Соответственно, контекст главной модели остается чистым.

  2. Связали руки (tool-limit). Чтобы модель “не ленилась”, ей в харнессе заблокировали редактирование файлов, пока она хотя бы один раз не сходит к субагенту-отладчику. Хочешь чинить код? Сначала выясни в рантайме, что реально сломалось, и только потом трогай файлы.

И на бенчмарке GitBug-Java это дало существенный эффект:

  • Базовая Claude Sonnet 4.5 без специальной обвязки решила 75,7% задач.
  • А младшая и легкая Claude Haiku 4.5 с отладочным субагентом и обязательным обращением к нему – 82,3%.

То есть младшая модель обошла старшую того же поколения за счет того, как был организован процесс (к слову, когда тот же харнесс дали самой Sonnet, результат вырос до 85,5%).

Вывод

Очередное напоминание, что результат определяется не одной моделью, а связкой модели и среды.

Где меня найти: LinkedInGitHubTelegramMax