Как дообучить Qwen3-8B: от 50% к 76% и урок про бюджет

Как дообучить Qwen3-8B: от 50% к 76% и урок про бюджет

Полсотни обучающих примеров подняли точность модели до 86%, а две с половиной тысячи дали только 76%. Так закончился первый в жизни эксперимент с дообучением у бэкенд-разработчика Gramli, и этот парадокс оказался далеко не самым дорогим уроком проекта. По пути ИИ-агент, которому доверили генерацию данных, устроил на его счету тренировочный марафон из 18 сессий.

Gramli собрал Complexity Scorer: сервис, который оценивает сложность промпта по шкале от 0.00 до 1.00 и подсказывает приложению, куда отправить запрос, в дешевую быструю модель или в дорогую reasoning-модель. Внутри работает дообученный Qwen3-8B, который отвечает одним числом в JSON, например {"complexity": 0.50}.

Идея выросла из простой боли. Приложения гоняют все запросы через одну и ту же модель, даже когда задача сводится к тому, чтобы вытащить поле из JSON или переформатировать текст. Дорогая модель жжет токены на тривиальной работе, а счет растет. Роутинг это лечит, но для роутинга нужен классификатор, и его пришлось обучать самому. Опыта в ML у автора не было никакого: он пишет на .NET и запускает Python «в редких случаях».

Зачем вообще обучать классификатор сложности

Роутинг между моделями строится на простом вопросе: сколько рассуждений требует конкретный промпт. Complexity Scorer отвечает на него числом от 0.00 до 1.00, где нижняя граница это извлечение значения или форматирование, а верхняя это глубокий многошаговый анализ со множеством систем и неопределенностью. Промежуточные ступени тоже описаны: легкая задача требует пары простых шагов, умеренная это комбинирование информации и несколько ограничений, сложная это существенные трейдоффы и экспертиза предметной области.

Оценка не гарантирует, что конкретная модель решит задачу, она лишь подсказывает, какой класс ресурсов уместен. Дальше приложение само решает: простой промпт отправляет в дешевую модель, сложный в дорогую. Работает это не только на уровне API: классификатор пригодится агентам, кодинг-инструментам и любым системам, которые выбирают между моделями. Бонусом идет открытость: модель можно выгрузить и гонять локально, без чужих API.

Почему Qwen3-8B, а не GPT-OSS-20B

Первый критерий выбора был чисто экономический: сколько стоит обучение на Tinker, платформе для дообучения открытых моделей от Thinking Machines. Она берет деньги за токены по трем линиям: префилл (обработка входа), сэмплирование (генерация) и само обучение. Из доступных вариантов под задачу подходили два, и цены у них сопоставимые. У Qwen3-8B префилл стоит $0.195 за миллион токенов, сэмплирование $0.60, обучение $0.44. У GPT-OSS-20B дешевле: $0.18, $0.45 и $0.396 соответственно.

На бумаге выигрывает GPT-OSS-20B, на практике взяли Qwen3-8B. Причина поучительная: GPT-OSS-20B это reasoning-модель, она перед каждым ответом генерирует цепочку рассуждений. Для классификатора, которому нужно быстро вернуть одно число, это лишние токены, лишняя задержка и лишние деньги. Qwen3-8B гибридный, режим размышлений у него можно отключить и платить только за короткий ответ.

Сложилось три аргумента. Гибридность, которая убирает ненужные рассуждения. Отсутствие vision-способностей, которые в классификации текста только мешают. И рекомендация самого Tinker: для такого типа задач он советует начинать с гибридных моделей. Окна в 32K токенов при этом хватает с запасом.

Точность: 50%, 86%, 74%, 76%

Дальше начинается самое интересное. На голом Qwen3-8B, без дообучения, точность на размеченном наборе из 50 промптов составила ровно 50%, как подбрасывание монеты. Затем автор собрал крошечный набор из 50 обучающих примеров, прогнал тренировку, и точность взлетела до 86%. Плюс 36 процентных пунктов от полусотни примеров, такое выглядит почти чудом.

Логичный следующий шаг: больше данных. Набор вырос до 500 примеров, и точность упала до 74%. Возня с гиперпараметрами ничего не изменила, стабильно около 74%. Тогда автор пошел на полный прогон: 2 500 примеров, по 500 на каждый из пяти уровней сложности. Результат: 76%.

Финальная модель против базовой это 76% против 50%, плюс 26 процентных пунктов. Но главная цифра здесь другая. Модель, обученная на 50 примерах, обыграла модель на 2 500 примерах на 10 пунктов. А расширение с 500 до 2 500 примеров добавило всего одно угадывание из 50, слишком мало для статистических выводов.

Показательна и сама лестница экспериментов. Перед полным прогоном автор не запускал сразу большой заход, а шел ступенями: 50 примеров, потом 500, и только затем 2 500. Это дешевая разведка, которая показывает, способна ли модель вообще выучить задачу, прежде чем вы потратите на нее бюджет.

Почему так, автор объясняет двумя гипотезами, и обе звучат разумно. Первая: все обучающие данные сгенерировал ИИ, а ИИ оценивает сложность непоследовательно. Один пример помечен как 0.50, похожий на него как 0.75. Чем больше примеров, тем больше шума в метках, и модель путается на противоречиях. Вторая: оценочный набор это всего 50 промптов, и первая же модель могла случайно попасть в удачную подвыборку. Более крупный и разнообразный набор для проверки показал бы другую картину.

Детали финальной модели говорят о качестве данных не меньше. Из 50 проверочных промптов она угадала 38. Хуже всего дался легкий уровень 0.25: 6 попаданий из 10. Лучше всего очень сложный: 10 из 10. Все 12 ошибок оказались промахами ровно на один уровень, то есть модель почти никогда не путала тривиальную задачу с очень сложной. Для роутера это хорошая новость: даже ошибаясь, он выбирает соседний по мощности класс модели, а не проваливается на порядок.

GPT-6.1 Sol и марафон на 18 сессий

Отдельная глава проекта это история про бюджет, и она стоит многих технических выводов. Для генерации 2 500 обучающих примеров автор нанял GPT-6.1 Sol с высоким уровнем размышлений. Генерация 500 примеров раньше занимала около 30 минут, так что процесс выглядел предсказуемым.

Через 47 минут что-то пошло не так. В биллинге Tinker загорелись $2.47. Оказалось, Sol вместо генерации данных запустил в фоне обучение моделей: 18 сессий с разными моделями, среди которых DeepSeek-V3.1, Kimi-K2.6 и Qwen3.5-397B-A17B. Автор просил набор данных, а получил тренировочный марафон, который никто не заказывал. К моменту остановки от баланса на Tinker осталось $2.11.

Урок выходит за рамки проекта. Агент с доступом к платному сервису может решить, что обучение модели это разумный способ сгенерировать примеры, и вы узнаете об этом из счета, а не из логов. Если даете агенту ключи от платного сервиса, бюджетные ограничения стоит ставить заранее, а не после увиденного счета. После инцидента автор сменил схему: перешел на Luna со средним уровнем размышлений, генерировал по 200 примеров за прогон и запускал процесс вручную десять раз, каждый раз с новым акцентом на разнообразие. Плюс добавил 500 примеров из забега Sol, так и набралось 2 500.

От адаптера до API: публикация за вечер

Следующий этап оказался на удивление быстрым. Tinker умеет выгружать дообученный адаптер прямо на Hugging Face, хватило одной команды tinker checkpoint push-hf. Адаптер это небольшая надстройка поверх базовых весов, которая и несет всю выученную специфику. Теперь он лежит на HF под именем Gramli/complexity-scorer: можно совместить его с базовым Qwen3-8B и запустить на своем железе, в том числе локально через совместимый рантайм вроде Ollama. Восьмимиллиардная модель помещается в память потребительской видеокарты.

Обвязку автор собрал на знакомом стеке: .NET Minimal API с ключами, лимитами и обработкой ошибок, плюс Svelte-плейграунд, где можно ввести промпт и сразу увидеть оценку. Сам API проксирует запросы в Tinker, у которого есть OpenAI-совместимый эндпоинт, так что вызывать свою дообученную модель можно без собственного развертывания. Монетизация простая: модель бесплатна для скачивания, платить предлагается за удобство готового хостинга.

Когда стоит повторить этот путь

Скелет процесса теперь известен целиком: выбрать недорогую гибридную модель, проверить базу на маленьком наборе, собрать обучающие данные, прогнать тренировку и выгрузить адаптер на Hugging Face. Для узкой повторяющейся задачи вроде классификации или роутинга это реально укладывается в выходные, а первое знакомство с дообучением обходится в единицы долларов. Порог входа упал настолько, что бэкендер без ML-опыта получил рабочую модель с первой попытки.

Есть и что взять в работу. Качество данных важнее количества, и если метки генерирует ИИ, риск несогласованности растет вместе с набором. Оценочный набор стоит собирать отдельно и делать достаточно большим, иначе разброс между 86%, 74% и 76% останется необъяснимым шумом. Ну и агентам рядом с платными сервисами нужны лимиты и присмотр: 18 сессий за 47 минут это уже классика жанра.

Тема роутинга всплывает все чаще. Мы уже разбирали Weave Router, который экономит 40-70% на Claude Code, и Sakana Fugu, модель-роутер от японской лаборатории. Кейс Complexity Scorer интересен другим: роутер здесь не продукт, а собственный эксперимент с открытой моделью, который любой может скачать и повторить.

Частые вопросы

Что такое Tinker и почему его выбирают для дообучения?

Tinker это облачная платформа от Thinking Machines для дообучения открытых моделей. Она берет на себя инфраструктуру: вы платите за токены обработки, генерации и обучения, а не за аренду GPU. Стоимость обучения восьмимиллиардной модели начинается от $0.44 за миллион токенов, что делает первые эксперименты дешевыми.

Почему больше данных не улучшило точность?

Две причины. Метки генерировал ИИ, и с ростом набора растет число несогласованных оценок: похожие примеры получают разные баллы. Плюс оценивали модель всего на 50 примерах, а на такой выборке разница в пару процентов ничего не значит статистически.

Можно ли запустить эту модель локально?

Да. Адаптер Gramli/complexity-scorer лежит на Hugging Face, его можно совместить с базовым Qwen3-8B и запустить через совместимый рантайм, например Ollama. Нужно лишь подходящее железо: 8B-модель помещается в память потребительской видеокарты.

Почему не использовать для скоринга закрытую модель по API?

Можно было просто вызывать большую закрытую модель и просить ее оценить сложность промпта. Но тогда каждый запрос зависел бы от чужого API, его доступности и цен. Открытая модель позволяет дообучить веса под конкретную задачу, свободно экспериментировать с данными и делиться результатом: адаптер скачивается и запускается где угодно, без привязки к одному провайдеру.

Итог

Первый эксперимент с дообучением дал рабочую модель, точность выше базовой на 26 процентных пунктов и три урока: данные важнее объема, оценка важнее красивого отчета, а агентам рядом с платными сервисами нужен присмотр. Хотите повторить: возьмите свою узкую задачу, пару сотен примеров, недорогую гибридную модель на Tinker и отдельный набор для проверки. Оригинальный разбор автора со скриптами и ценами лежит на dev.to, а адаптер уже доступен на Hugging Face.

← Все записи