Qwen2.5-Coder и Qwen3: промежуточное дообучение подняло точность кодовых агентов на SWE-Bench

ИИ-агенты для написания кода должны на лету встраивать результаты вызовов внешних инструментов (например, вывод компилятора или ответ API) в своё продолжающееся рассуждение. Но обычное предобучение на коде читает его только слева направо и не учит модель принимать значение, вычисленное где-то в стороне, и продолжать рассуждение с его учётом.
Авторы (среди них Yubo Wang) заметили, что цикл «действие агента → наблюдение от инструмента → продолжение рассуждения» структурно совпадает с местом вызова функции в коде: вызывающий код передаёт аргументы, вызываемая функция возвращает значение, вычисленное в другом месте, а код после вызова использует это значение. Такая структура в обычном коде встречается в интернете в огромных объёмах, и это можно использовать напрямую для обучения.
Метод, function-aware fill-in-the-middle (FIM) как промежуточное дообучение (стадия между предобучением и агентным постобучением): самообучаемая задача, в которой маскируются функции, отобранные через анализ графа зависимостей программы (program dependency graph) и двойной критерий «сложность-выводимость» (функция должна быть достаточно информативной, но всё же выводимой из контекста). Этим методом дообучили Qwen2.5-Coder-Instruct (7B и 14B) и Qwen3-8B на очищенном от посторонних совпадений корпусе объёмом 2,6 млрд токенов, собранном из 968 GitHub-репозиториев, а затем применили к моделям обычные пайплайны агентного постобучения.
Результаты: точность на SWE-Bench Verified выросла на +2,8 п.п. (7B), +3,0 п.п. (14B) и +3,2 п.п. (Qwen3-8B); на SWE-Bench Lite прирост составил +3,7/+4,0/+5,4 п.п. на тех же трёх моделях соответственно. Эффект сохраняется при двух разных пайплайнах постобучения (R2E-Gym и SWE-Smith) и на модели вне линейки Qwen2.5 (Qwen3-8B с пайплайном SWE-Lego), то есть прирост не привязан к одному конкретному пайплайну или семейству моделей.
Помимо прямого прироста на задачах агентного кодинга, промежуточное дообучение смягчает и «эрозию навыков», деградацию неагентных способностей к написанию кода (замер на LiveCodeBench) и работы с инструментами вне кода (tau-bench, BFCL), которую обычно вызывает агентное постобучение. Хотя корпус для промежуточного дообучения состоял только из Python-кода, заложенная в модель склонность к обработке вызовов функций сохраняется и после постобучения и даёт устойчивый прирост на этих сторонних тестах.
Ключевые факты
- Новый метод промежуточного дообучения function-aware FIM готовит кодовые модели к роли агентов, маскируя функции по графу зависимостей программы и критерию «сложность-выводимость».
- Опробован на Qwen2.5-Coder-Instruct (7B/14B) и Qwen3-8B на корпусе 2,6 млрд токенов из 968 GitHub-репозиториев.
- SWE-Bench Verified: +2,8/+3,0/+3,2 п.п.; SWE-Bench Lite: +3,7/+4,0/+5,4 п.п. на трёх моделях соответственно.
- Прирост сохраняется на двух разных пайплайнах постобучения (R2E-Gym, SWE-Smith) и на модели вне линейки Qwen2.5.
- Метод также снижает деградацию неагентных навыков кодинга (LiveCodeBench) и работы с инструментами (tau-bench, BFCL) после агентного постобучения.
Почему это важно
Работа закрывает конкретный методический пробел: обычное предобучение на коде читает текст только слева направо и не учит модель встраивать в рассуждение значение, полученное извне (например, результат вызова инструмента). Авторы заметили, что вызов функции в обычном коде структурно устроен так же, как цикл «действие агента, наблюдение, продолжение», и превратили эту аналогию в задачу дообучения: маскирование функций по графу зависимостей программы. Это не новая модель и не новый бенчмарк, а способ подготовить существующие модели к роли агентов лучше, чем это делает стандартный пайплайн.
Кому это важно
В первую очередь, исследовательским командам и компаниям, которые дообучают открытые кодовые модели (в частности, семейство Qwen) под задачи ИИ-агентов: автономных помощников, которые пишут код, запускают тесты и обрабатывают их результат. Полезно и тем, кто строит пайплайны агентного постобучения (R2E-Gym, SWE-Smith и аналоги), метод встраивается как дополнительная стадия перед ними, а не заменяет их.
Как это применить
Метод описан как отдельная стадия «промежуточного дообучения» между обычным предобучением на коде и агентным постобучением: нужен корпус кода (в эксперименте, 2,6 млрд токенов из 968 репозиториев), анализ графа зависимостей программы для выбора функций на маскирование и обучение по self-supervised задаче заполнения пропуска (fill-in-the-middle). После этого модель проходит стандартный агентный постобучающий пайплайн без изменений. Подход применим к любой кодовой модели-основе, для которой можно построить такой корпус и провести анализ зависимостей.
Можно ли доверять
Это исследовательская статья с воспроизводимой методикой: результаты проверены на признанных бенчмарках (SWE-Bench Verified и Lite), а эффект подтверждён не на одной конфигурации, а сразу на трёх моделях, двух разных пайплайнах постобучения и одной модели вне исходного семейства (Qwen3-8B). Это снижает риск, что прирост, случайность конкретного пайплайна. Ограничение в том, что все проверенные модели относятся к семейству Qwen, и независимого подтверждения на моделях других разработчиков в тексте нет.
Риски и подводные камни
Прирост измеряется единицами процентных пунктов (от +2,8 до +5,4), а не кратным улучшением, и подтверждён пока только на моделях Qwen, неясно, перенесётся ли эффект на кодовые модели других семейств. Корпус для промежуточного дообучения состоит только из Python-кода: авторы показывают, что выученная склонность к обработке вызовов функций переносится на другие тесты, но насколько она перенесётся на код на других языках программирования, из текста не следует. Также не указана дополнительная вычислительная стоимость стадии промежуточного дообучения по сравнению со стандартным пайплайном.