Continual learning: как Shopify дообучает модель на ошибках
До 2 000 запросов в минуту обслуживает GraphQL-агент Shopify в продакшене. Если бы он работал на frontier-модели, инференс обошёлся бы примерно в $27 млн в год. На дообученной модели выходит около $1 млн, то есть на 96% дешевле. Дело не в удачном промпте: Shopify построила замкнутый цикл, в котором ошибки продакшена каждый день превращаются в обновления весов модели.
Кейс опубликовала инженерная команда Shopify, а PyTorch Blog перепечатал его для своего сообщества. Интересна здесь не экономия сама по себе, а механика: как именно производственный опыт попадает в веса и почему это принципиально другой способ доводить модель до продакшена, чем привычные промпты и обвязка.
Что такое continual learning
Continual learning это обучение модели после запуска: ошибки, правки и редкие удачные ответы из продакшена регулярно превращаются в обновления весов. В отличие от разового файнтюнинга, процесс не заканчивается после релиза и работает как маховик, который в Shopify называют flywheel. Каждый новый виток начинается с более сильной модели, а не только с более сложной обвязки.
Разница в том, где именно оседает опыт. Промпты, retrieval и правила роутинга живут в дискретных артефактах вокруг модели: отредактировал текст, перезапустил, получил эффект. Веса так не умеют. Но в весах оседает то, что не помещается в инструкцию: стиль ответов на тысячах формулировок, типичные шаги для повторяющихся запросов, терпимость к тому, как реальные мерчанты выражают свои мысли. Пока модель заморожена, весь продакшен-опыт копится в словах и коде, а не в параметрах.
Почему промпты и harness упираются в потолок
Типичный запуск на frontier-модели выглядит одинаково. Небольшая команда быстро выводит продукт к пользователям, собирает обратную связь, правит промпты, добавляет примеры в retrieval, настраивает нарезку задач и роутинг. Каждое такое улучшение записывается в обвязку, или harness. У этого пути есть потолок: замороженная модель не учится на исправлениях. Пользователь поправил ответ, та же ошибка повторилась у сотни других мерчантов, и следующий запрос всё равно упирается в ту же самую модель.
Вторая проблема экономическая. Frontier-модель универсальна, и вы платите за возможность решить любую задачу, включая те, которых в вашем продукте не бывает. Пока нагрузка небольшая, это терпимо. Когда через агента проходят миллионы запросов, универсальность превращается в постоянный налог, а время до первого токена напрямую влияет на то, останется пользователь или уйдёт.
Шаг первый: качество как контракт
Цикл Shopify начинается не с модели, а с определения качества. Рубрика переводит продуктовые требования в несколько оцениваемых критериев: полнота, исполнимость, качество ответа и безопасность. У каждого балла есть конкретные якоря, по которым размечают диалоги. По сути это контракт качества для всего конвейера, и первый потребитель здесь не модель, а люди.
Дальше команда делает то, что чаще всего пропускают. Два лучших специалиста по продукту вслепую размечают 25 случайных диалогов, и считается согласие между ними по каппе Коэна, метрике согласованности выше случайного уровня. Если каппа низкая, около 0,2, виновата рубрика: её формулировки слишком размытые. Если эксперты, которые работают с продуктом каждый день, расходятся в оценках, языковая модель разойдётся тем более. Согласие экспертов становится потолком для судьи: цель не идеальный судья, а судья, совпадающий с людьми примерно так же, как люди совпадают друг с другом.
Ещё две детали, которые легко потерять. В ground truth должны попадать случайные диалоги, а не только отобранные примеры: golden set проверяет то, что вы и так знаете, а случайная выборка показывает, как хорошее и плохое выглядят в реальном трафике. И аннотации нужны подробные: не балл, а объяснение, почему он такой. Эти объяснения становятся сырьём для калибровки, без них алгоритмы учатся вслепую.
Судья вместо человека на каждом запросе
Рубрика это только стартовый промпт судьи. Калибровка превращает её в оценщика, которого можно прогонять по неограниченному потоку продакшен-диалогов. Shopify делает это через DSPy с оптимизаторами, которые учатся на текстовых трейсах ошибок: GEPA (arXiv:2507.19457) эволюционирует промпт, отражая словарь неудач, и держит парето-фронт кандидатов вместо одного жадного победителя, а Agentic Context Engineering (arXiv:2510.04618) собирает структурированный плейбук мелкими правками.
Калиброванный судья это офлайн-метрика, против которой оптимизируется всё обучение. Но метрика остаётся прокси, поэтому её проверяют дважды. Сначала бэктест по прошлым A/B-тестам: способен ли судья восстановить направление уже известных побед и поражений по вовлечённости и удержанию. Потом тесты деградации: ухудшают одно конкретное поведение системы и убеждаются, что просаживается именно соответствующий критерий, а не что-нибудь случайное. Отдельный совет из кейса: не запихивайте всё качество продукта в одного судью, держите несколько маленьких и прицельных, их проще проверять и интерпретировать.
Авторесёрч: улучшения обвязки без гонки за весами
До обучения весов систему выжимают в пространстве артефактов. Обычный промпт-инжиниринг тут не работает: у зрелого агента нет одного промпта, есть динамически собираемый контекст, описания инструментов и код оркестрации, размазанные по большой кодовой базе. Поэтому команда ставит задачу как авторесёрч в духе недавнего проекта Андрея Карпати: агент предлагает изменение в промпте, описании инструмента или оркестрации, прогоняет против судьи и оставляет правку, если оценка выросла. Весь эксперимент описывается одним читаемым markdown-файлом: откуда брать данные, какие каталоги можно редактировать, какая метрика и какой оптимизатор используются. Когда этот цикл перестаёт давать прирост, начинается работа с весами.
Self-healing pipeline: из провалов в траектории
Следующий шаг это раскопка сложных случаев. Из анонимного продакшен-трафика выбираются hard negatives: диалоги, которые судья справедливо оценил низко и в которых модель слабее всего. Миллионы мерчантов дают непрерывный поток тяжёлых кейсов: неполный контекст, двусмысленные запросы, отраслевые процессы, отказы инструментов и десятки способов выразить одну и ту же мысль.
Дальше в дело вступает self-healing pipeline. Панель frontier-моделей критикует каждый провал, арбитр сводит критику в одну инструкцию по починке, и она подставляется перед репликой пользователя, приём, который авторы называют hinting. Диалог проигрывается заново, судья ставит новую оценку. Если починка прошла, реплей становится траекторией для обучения с подкреплением, где награда это оценка судьи. Если не прошла, диалог уходит людям: в кейсе это эксперты Toloka, которые правят разговор по той же рубрике, по которой калибровался судья.
Две стадии обучения: SFT и GRPO
Обучение идёт в два приёма. Сначала вылеченные траектории дистиллируются в компактную модель через supervised fine-tuning, причём обучение идёт на полных траекториях вместе с рассуждениями, а не только на финальных ответах. Так работает chain-of-thought дистилляция, подход Distilling Step-by-Step (arXiv:2305.02301): модель перенимает поведение, которое из одних ответов не выучишь. Второй приём это GRPO, где калиброванный судья выступает функцией награды. На каждый промпт модель сэмплирует группу ответов, судья их оценивает, а обучение усиливает те, что набрали больше баллов.
SFT показывает модели успешные траектории, чтобы она им подражала, GRPO оптимизирует её прямо против вашего определения качества. Конвейер самолечения крутится ежедневно и добавляет новые траектории в корпус; с той же частотой идёт полный файнтюнинг всех параметров на накопленных данных и повторный GRPO. Новые траектории обучаются вместе со старыми, и это ограничивает дрейф и катастрофическое забывание между циклами. Обновляются все параметры, а не адаптеры: распределением обучения по GPU с тензорным, контекстным и data-параллелизмом занимается PyTorch, и именно это делает полный файнтюнинг практичным на таком масштабе.
Сжатие промпта: 6 000 токенов в 1 500
У лучшей модели есть второй фронт экономии. Системный промпт агента длинный и статичный, а внимание растёт с длиной последовательности: каждый сгенерированный токен «просматривает» весь префикс. Выходит фиксированный налог на латентность и стоимость, который платится на каждом запросе.
Gist-сжатие снимает большую часть этого налога. Модель используется в двух ролях: учитель с полным системным промптом и ученик с короткой последовательностью выученных gist-токенов. Кастомный тренер на PyTorch учит эмбеддинги gist-токенов подгонять распределение выходов под учителя, а веса модели при этом заморожены. Подход развивает идею gist tokens (arXiv:2304.08467) и работы по сжатию промптов (arXiv:2210.03162). На выходе горстка токенов воспроизводит поведение полного промпта, измеримой потери качества на судье нет. В продакшене промпт GraphQL-агента сжался с примерно 6 000 токенов до 1 500.
Цифры агента GraphQL
Самый наглядный пример всего цикла это GraphQL-агент, который отвечает на вопросы мерчантов о магазинах и сам пишет запросы к Admin GraphQL API. Спросите, у каких товаров заканчивается запас, агент подберёт запрос, выполнит его и вернёт ответ человеческим языком. Через агента проходит до 2 000 запросов в минуту.
Что дал цикл. Во-первых, качество: специализированная модель обошла frontier-предшественника на тех же задачах, потому что ежедневно получает уроки из реальных разговоров. Во-вторых, цену: инференс на frontier-модели стоил бы около $27 млн в год, а дообученная модель обходится примерно в $1 млн, минус 96%. Это разница между функцией, которую больно держать включённой на масштабе Shopify, и функцией, доступной каждому мерчанту.
В-третьих, скорость: на нагрузочном тесте 350 запросов в минуту время до первого токена упало на 19%, а сквозная латентность на 38%. В-четвёртых, железо: сервировка через vLLM, инференс-движок на PyTorch с continuous batching, дала примерно +16% запросов в секунду и +12% выходных токенов в секунду на идентичных GPU, то есть на 14% меньше видеокарт на том же трафике.
Что из этого применимо вне Shopify
Полный цикл требует инфраструктуры, которой у большинства команд нет: и панели frontier-моделей для критики, и GRPO-обвязки, и аннотаторов. Но отдельные кирпичи полезны почти всем, кто строит агентов. Рубрика качества стоит копейки и дисциплинирует всё остальное: без неё невозможно ни измерить прогресс, ни поймать регрессии. Проверка согласия двух экспертов на 25 диалогах занимает вечер и сразу показывает, договорились ли вы о том, что такое хорошо.
Второй кирпич это дисциплина данных. Ошибки продакшена по умолчанию утекают в чаты и баг-трекер, а должны копиться в датасет. Даже без обучения модели этот корпус бесценен: он показывает, где именно ломается продукт. Третий урок в том, что дистилляция рассуждений эффективнее дистилляции ответов, если вы вообще думаете про меньшую модель. И четвёртый: статичный длинный промпт это ежемесячный счёт, сжатие стоит рассмотреть до того, как вы докупите ещё GPU.
Частые вопросы
Чем continual learning отличается от обычного файнтюнинга?
Обычный файнтюнинг это разовая акция: собрали датасет, обучили, выпустили и забыли. Continual learning превращает его в контур: продакшен-трафик непрерывно фильтруется судьёй, тяжёлые кейсы становятся обучающими примерами, и модель обновляется циклами. Каждый цикл опирается на предыдущий, поэтому качество накапливается, а не упирается в потолок статичного датасета.
Почему не обойтись одной frontier-моделью через API?
Можно, пока запросов мало и качество не критично. Проблема в экономике и в обучении: универсальная модель не перенимает специфику вашего продукта из продакшена, а счёт за токены растёт вместе с нагрузкой. В кейсе Shopify разница на одном агенте составила $27 млн против $1 млн в год, и это до учёта латентности и железа.
Насколько часто обновляется модель в цикле?
Self-healing pipeline прогоняется ежедневно: свежие провалы превращаются в траектории и добавляются к корпусу. С той же частотой идёт полный файнтюнинг на накопленных данных с повторным этапом GRPO. Между циклами обучаются и новые, и старые траектории, чтобы дрейф и забывание оставались под контролем, а судья продолжал измерять одно и то же качество.
Итог
История Shopify это про то, что главный ресурс AI-продукта не модель, а замкнутый цикл её улучшения. Frontier-модель помогает быстро стартовать, но стратегическое преимущество даёт контур, который каждый день превращает ошибки продакшена в более сильные веса. Continual learning перестаёт быть академической темой, когда рядом появляются калиброванный судья, self-healing pipeline и полный файнтюнинг на PyTorch.
Начать можно с малого: возьмите 25 случайных диалогов вашего агента, напишите рубрику из четырёх-пяти критериев и проверьте, сходятся ли два коллеги в оценках. Это самый дешёвый шаг из всего цикла, и он сразу покажет, готовы ли вы измерять качество, а не спорить о вкусах.