Jupyter Agents: training LLMs to reason with notebooks Не статья, но блогпост от 🤗Huggingface про то, как они дообучали Qwen3-4b как Jupyter Agent — для генерации кода блоками и выполнения мини-исследований в Jupyter. Мне показалось, что в блоге есть много интересных технических деталей, которые показывают, сколько разных направлений можно копать, пока улучшаешь данные для дообучения под конкретную задачу. В качестве горы для покорения выбрали бенчмарк DABStep (Data Agent Benchmark for Multi-step Reasoning), выпущенный Huggingface в начале года — он как раз направлен на решение задач по анализу данных. Поскольку модель маленькая, 4b, то решили фокусироваться на лёгкой половине задач, чтобы наблюдать прогресс. Что сделали: — заменили обёртку агента (набор промптов и функций) со своей на Qwen Agent, так как модель наверняка лучше работает в родном инструменте и под него тюнилась. По ходу переписали в более компактной форме, уложившись всего в 200 строк кода. Только это дало рост качества с 38.7% до 52.8% — решили собрать датасет Jupyter-ноутбуков и дообучить модель на нём. Скачали 2 терабайта ноутбуков с Kaggle, удалили дубликаты, получилось 250 гигабайт. Но ноутбуки ничего без данных (обычно, данных соревнований), поэтому скачали их их, всего 5 терабайт. Удалили те, которые хранят чекпоинты моделей, а также всё, что больше 10 гигабайт. И после, что логично, оставили только те ноутбуки, для которых данные были скачаны и остались после фильтрации. — многие ноутбуки грязные и вообще смысла в них мало. Поэтому взяли Qwen3-32B и запромптили его оценивать «ценность в образовательных целях» по пятибальной шкале. Выкинули худшие 70% оставшихся ноутбуков. Ещё часть выкинули через промптинг того же Qwen3-32B на релевантность анализу данных. Если, например, в ноутбуке тренировали LLM (не связано с аналитикой) — его выкидывали. — дальше начали генерировать синтетические пары запрос и ответ, код ноутбука, который отвечает на вопрос по данным, рисует графики итд. Для этого сначала промптили Qwen3-32B на генерацию вопросов, на которые можно было бы ответить уже имеющимся в ноутбуке кодом. Говоря грубо, «на какой вопрос отвечает вот этот код?». Вторым шагом стала фильтрация вопросов, чтобы убедиться, что ответ на них действительно есть в коде. — (если вам интересно, все промпты тут) — Наконец, будем генерировать финальный чистовой код, поскольку исходный даже после фильтраций зачастую наполнен нерелевантным контентом. Тут взяли модель посерьёзнее, Qwen-3-Coder-480B, подавали на вход сгенерированный выше вопрос, код Jupyter и просили переписать решение, чтобы не было ничего ненужного. Затем код исполняли, и новый Jupyter-ноутбук сохраняли, а вместе с ним — промежуточный вывод (картинки, логи исполнения, результаты принтов). — ... в процессе выяснилось, что многие датасеты почему-то недоступны. Авторы запромптили Qwen-3-Coder-480B генерировать фейковые результаты выполнения кода 👍 (НЕ данные): `You are a stateful Python code interpreter that executes code in a persistent environment. Your role is to execute Python code while maintaining state across multiple code cells, similar to a Jupyter notebook environment. [REST OF THE PROMPT]`. То есть если данных не было, и их не получалось считать, но по коду видно, что там были колонки «дата, сумма платежа, назначение», то Qwen просто генерировал примерно разумные логи выполнения кода поверх данных, какими они могли бы быть. В результате получилось 51 тысяча синтетических ноутбуков, примерно 0.2B токенов для дообучения. Запустили SFT на Qwen3-4b на 5 эпох, замерили качество — выросло с 52.8% до 75%, солидный прирост. 75% тут — это уровень Claude 3.7 / o4-mini. На практике модель теперь может решать широкий спектр задач анализа данных в Kaggle-like стиле с последовательным выполнением нескольких блоков кода. Ну а команда дальше обещает попробовать модели побольше и прикрутить к ним RL и рассуждения. Поиграться с Jupyter Agent 2 бесплатно тут