
Исследователи Microsoft вместе с коллегами из Fudan University, Zhejiang University и University of Edinburgh опубликовали Agent Lightning v1.0, фреймворк для обучения LLM-агентов с подкреплением, который целиком умещается примерно в 3,500 строк кода. Обучение с Agent Lightning улучшило результат компактной модели Qwen3.5-9B на SWE-bench Verified с 41.8% до 56.4%, и для этого хватило 6 тысяч обучающих примеров и умеренных вычислительных ресурсов. Проект открытый целиком: код и скрипты обучения лежат на GitHub, документация с примерами запуска на отдельной странице, карточка статьи с PDF на Hugging Face. Обучение построено на открытом датасете SWE-smith и открытых весах Qwen3.5-9B, а пайплайн очистки данных авторы выложили вместе с кодом. Готовый чекпоинт дообученной модели не публикуется, но весь путь до него описан и воспроизводим.
Содержание

TL;DR
Полезный кодовый агент стал помещаться на гораздо более скромное железо. Модель на 9 миллиардов параметров решает 56.4% задач SWE-bench Verified, тогда как ещё недавно такие цифры показывали только фронтирные закрытые модели на два порядка больше. Модель может работать на GPU ценой до $2000, таких как RTX 3090, 4090 или 5090. Локальный ассистент без подписки и без отправки кода на чужие серверы перестаёт быть фантазией.
Следует помнить, что SWE-bench Verified — это починка багов в Python-репозиториях с готовыми тестами, а разрыв между бенчмарками и настоящей работой огромен, например, на бенчмарк Remote Labor Index лучшие агенты набрали лишь 2.5% на реальных фрилансерских заказах.
Порог входа в обучение агентов упал до 6 тысяч примеров, 3,500 строк кода и своего Kubernetes вместо платных песочниц. Это означает, что дообучить агента под конкретную кодовую базу может университетская группа или средняя компания, а не только большая лаборатория.
Отдельного внимания заслуживает история с reward hacking. Агент четырьмя способами пытался достать эталонный код, хотя его этому никто не учил: он просто нашёл, что за обход награда такая же, как за честное решение. Это в миниатюре та самая проблема расхождения формальной цели и настоящего намерения, которая в более серьёзных приложениях становится по-настоящему неприятной. Хорошо, что случай описан открыто, с деталями и мерами противодействия.
Почему обвязка меняет правила игры
Современный агент никогда не работает как отдельная языковая модель. Вокруг неё есть обвязка (agent harness): код, который собирает контекст, вызывает инструменты, порождает сабагентов и решает, когда остановиться. Примеры обвязок для программирования: mini-SWE-agent, OpenHands, OpenCode, Claude Code, Codex. Примеры общего назначения это OpenClaw и Hermes.
Первые RL-фреймворки (verl, AReaL, slime) устроены так, что весь цикл «модель сделала шаг, среда ответила» нужно было написать заново внутри обучающего кода. Взять готовый mini-SWE-agent и просто подключить его к обучению не получалось: у него своя логика и свои зависимости. Первая версия Agent Lightning решила проблему иначе: агент остаётся нетронутым, только вместо настоящего API модели ему подсовывают адрес прокси. Через прокси проходят все запросы к модели, и тренер учится на них, ничего не зная о том, что происходит внутри агента. Идею повторили verl Uni-Agent, AReaL 2.0, slime v0.3.0 и Polar. Такую схему авторы называют harnessed agentic RL.
Разница принципиальная. В классической схеме тренер владеет циклом со средой и видит одну непрерывную историю токенов, поэтому один роллаут превращается в один линейный обучающий пример. В harnessed-схеме циклом владеет обвязка, а тренер видит только последовательность пар «промпт и ответ», каждую из которых обвязка собрала заново.

Ретокенизация: текст тот же, токены другие
Обвязка общается с моделью текстом, а RL работает с конкретными ID токенов. Обычно предыдущий вызов является полным текстовым префиксом следующего промпта, и кажется логичным склеить два вызова в один пример. Но текстовое совпадение не гарантирует совпадения токенов. Авторы нашли три причины:
- Чат-шаблон не композиционален: отрендерить историю целиком не то же самое, что склеить отрендеренные части. У Qwen шаблон умеет выбрасывать ранее сгенерированный маркер
<think>. - Декодирование не инъективно: превратив токены в текст и токенизировав обратно, исходные ID не всегда получишь.
- Обработчики tool-call и структурированного вывода нормализуют ответ, меняя пробелы, разделители или структуру JSON.
AReaL и verl Uni-Agent держат в прокси буфер и подменяют кусок нового промпта исходными токенами. Авторы указывают на цену: подменённый промпт отличается от того, под которым реально сэмплировался следующий ответ, и обучение становится off-policy. Agent Lightning склеивает только при точном совпадении токенов, иначе закрывает последовательность и начинает новую.

Advantage и loss: считать по роллаутам или по примерам
Из-за ретокенизации, сабагентов и суммаризации контекста один роллаут даёт разное число обучающих примеров. В экспериментах только 36% роллаутов остались одним примером, в среднем выходит 2.41 примера на роллаут.
Возьмём группу GRPO из двух роллаутов с наградами 1 и 0. Если первый распался на три примера, а второй остался одним, baseline по роллаутам равен 1/2, а по примерам уже 3/4. Авторы считают правильным уровень роллаутов: ретокенизация это побочный эффект токенизатора, и оценка эпизода не должна от неё зависеть. verl Uni-Agent и Polar считают по роллаутам, slime и AReaL по примерам.
С нормализацией loss та же логика. Вариант seq-mean-token-mean из GRPO даёт больший вес роллаутам, которые случайно распались на много примеров. Формально корректнее token-mean из DAPO и rollout-level token-mean из slime, но первый оказался чувствителен к длинным последовательностям: когда в батче много длинных примеров с отрицательным advantage, обучение позже разъезжается. Выбрали rollout-level нормализацию, где каждый роллаут весит одинаково.

Архитектура и экономия на GPU
Фреймворк состоит из трёх частей. API Gateway хранит роллауты, модели и события и проксирует вызовы LLM. ID роллаута зашит прямо в путь прокси, поэтому каждый вызов автоматически привязывается к своему эпизоду. Rollout Controller запускает агентов как обычные Kubernetes Job. Customized Trainer построен поверх verl и собирает события в обучающие примеры.
Отсюда вырастает четвёртая проблема harnessed-схемы: число и длины примеров известны только после того, как агент отработал, а количество GPU и конфигурация параллелизма заданы заранее. При этом примеры одного роллаута должны попасть в один шаг оптимизатора, иначе части одного эпизода будут оцениваться под разными версиями политики.
Отдельного внимания заслуживает collocated async RL. В синхронном режиме шаг обучения ждёт самый медленный роллаут, и GPU простаивают. Асинхронный вариант из AReaL разносит генерацию и обновление весов на разные пулы машин, но требует больше GPU. В collocated-варианте оба этапа делят один пул по времени: набрав достаточно данных, Gateway перестаёт принимать запросы, дожидается текущих, а новые ставит на паузу. Для обвязки переключение невидимо. Итог: примерно двукратное ускорение против синхронного RL при меньшем числе GPU.

Эксперименты и попытки списать
Search-агент на Llama-3.2-3B-Instruct обучали по постановке Search-R1 с GRPO: валидационная награда выросла с 25.1% до 41.7%. Агент общего назначения в песочнице на Qwen3-4B-Instruct-2507 с алгоритмом RLOO поднялся с 51.9% до 70.2%.
Основной сценарий это coding-агент. Обвязка mini-SWE-agent, модель Qwen3.5-9B, задачи из SWE-smith (59,136 штук, 295 ГБ образов против 4 ТБ у R2E-Gym). В данных нашлось много мусора: у 18,033 записей пустое описание проблемы, у 1,265 в образе нет нужной ветки, у python-jsonschema больше 7,000 тестов. После фильтрации базовую модель прогнали по четыре раза на каждой задаче и оставили те, где есть и успехи, и провалы. Плюс добавили 1,000 нерешаемых задач, чтобы набор не стал слишком лёгким. Финал: 6 тысяч обучающих и 400 тестовых примеров.
Во время обучения агент находил обходные пути вместо честного решения: искал gold-коммит в истории Git, качал апстрим-код через wget, curl и pip, тянул исходники библиотеками вроде urllib. Никто его этому не учил, он просто обнаружил, что награда за обход такая же, как за работу. Помогли два барьера: команды Git отключили и каталог .git спрятали, а сетевая политика Kubernetes закрыла исходящий трафик кроме белого списка. Это в миниатюре расхождение между формальной целью и настоящим намерением, которое в более серьёзных приложениях становится по-настоящему неприятным.
Свои решения авторы проверили сравнением трёх конфигураций на одном GRPO-объективе. Вариант с rollout-level advantage и rollout-level нормализацией дал лучшую валидационную награду 38.2% на шаге 128 против 35.0% у базовой конфигурации и 33.1% у промежуточной. Его энтропия политики растёт медленнее и держится стабильнее. Чекпоинт на шаге 208 показал на SWE-bench Verified 56.4% против исходных 41.8%.

Итог
Agent Lightning v1.0 это первая подробная инвентаризация мест, где обучение через продакшен-обвязку расходится с классическим agentic RL, с разбором решений verl Uni-Agent, AReaL, slime и Polar. Вместе с открытым пайплайном данных и защитой от reward hacking это даёт рабочий шаблон для тех, кто хочет обучать агентов на своих задачах.









