Назад к блогу

GigaChat 3.5 Reasoning: как устроена первая открытая рассуждающая модель России

GigaChat 3.5 Reasoning: как устроена первая открытая рассуждающая модель России

Российские исследователи выпустили первую открытую рассуждающую языковую модель — и подробно рассказали, как она устроена внутри. Трёхступенчатый пайплайн с шестью доменными экспертами, хитрости online RL и неочевидные ловушки, из-за которых стандартные алгоритмы обучения рассуждающих моделей начинают вредить.

Пайплайн обучения: SFT, шесть экспертов и OPD

Обучение GigaChat 3.5 Reasoning укладывается в три последовательные ступени. Сначала — SFT-чекпоинт: модель запоминает, как выглядит готовое решение, но не то, каким путём к нему приходят. Затем из этого чекпоинта выращивают шесть отдельных моделей-экспертов, и каждую учат online RL со своей наградой. И наконец, шесть моделей собирают обратно в одну через on-policy distillation (OPD): ученик генерирует ответ сам, а учитель — эксперт нужного домена — оценивает каждый токен и подсказывает, где он поступил бы иначе. Сигнал здесь плотнее, чем в RL: не одно число за весь ответ, а обратная связь на каждом шаге.

Почему не обойтись одной моделью? В экспериментах одна общая модель упиралась в два ограничения. Домены конкурируют за одни и те же веса: прогресс в коде откатывал качество на диалогах. И оценивать домены приходится по-разному — у задачи по алгебре есть эталонный ответ, а у совета, как написать письмо, сверить не с чем. Шесть независимых экспертов снимают оба ограничения: награду под каждого настраивают точнее, чем в одном большом обучении. Вот как они распределены:

ЭкспертЗадачиКак проверяем ответ
STEMматематика, олимпиадные задачи, естественные наукисверяем финальный ответ с эталоном
Codeалгоритмы, правки кода, генерация тестовзапускаем код
Code Agentзадачи в духе SWE-bench в реальном репозиториипрогоняем тесты после патча
General Agentfunction calling, диалог, память, поискпроверяем конечное состояние среды
Социальное взаимодействиедиалог с пользователемside-by-side оценка через LLM-судью
Следование инструкцииформаты, длинный контекст, structured outputсверяем финальный ответ с эталоном

Разделение на экспертов — не только про качество. Часть доменов инженерно несовместима внутри одного цикла: эксперту Code Agent нужны реальные репозитории, harness и контейнеры, а эксперту STEM — только проверяемый финальный ответ. Общая архитектура из разбора на Хабре устроена так, что каждая ступень и каждый эксперт могут меняться независимо, а OPD в конце снова сводит всё в одну модель.

CISPO и расписание по pass rate: как online RL находит сигнал

Почему при обучении reasoning-модели обычный GRPO начинает вредить? Причина в том, как он ограничивает шаг обновления. Если после очередного апдейта вероятность токена уходит слишком далеко от исходной, GRPO просто обнуляет его вклад в градиент. Для большинства задач это разумная страховка. Но у рассуждающей модели самые ценные токены — как раз редкие: слова-переключатели вроде «проверим» или «здесь ошибка», которые заставляют модель остановиться и пересмотреть решение. SFT-чекпоинт почти не генерирует такие маркеры, поэтому при обучении они вылетают за допустимую границу первыми и перестают закрепляться.

CISPO решает эту проблему мягче: он не отключает токен, а приглушает его вклад пропорционально отклонению. Шаг остаётся ограниченным, а сигнал доходит до всех токенов, включая редкие развилки. Проверено на практике: авторы MiniMax показали ускоренную сходимость на AIME 2024, и у GigaChat то же самое подтвердилось на собственных экспертах. Алгоритм взят из работы MiniMax-M1.

Теперь о том, какие задачи вообще стоит показывать модели. Здесь работает простое правило: обучающий сигнал появляется только там, где ответы внутри группы расходятся. Если модель решает задачу во всех попытках, среднее по группе совпадает с каждым ответом, и градиент равен нулю. Если не решает ни в одной — то же самое. Полезен лишь узкий диапазон, где часть попыток успешна, а часть нет; максимум сигнала приходится примерно на половину успешных решений.

Сложность этого диапазона не стоит на месте. Задача, которая в начале обучения решалась в одной попытке из восьми, через тысячу шагов щёлкается уже восемь раз из восьми и перестаёт чему-либо учить. Поэтому расписание в GigaChat привязано к текущему pass rate: чекпоинт прогоняют по всему пулу задач, замеряют частоту успеха и выбрасывают всё, что решается чаще 75% попыток. Остаток становится обучающей выборкой. Каждый следующий эксперт стартует с той же процедуры, и порог отсекает новую партию освоенного материала.

Побочный эффект оказался приятным: задачи с нулевым градиентом не попадают в батч, роллауты на них не тратятся, и на инференсе экономится половина вычислений.

Ворота и каскад наград: почему без них модель ломается

Самый поучительный эпизод в обучении GigaChat 3.5 Reasoning начался с разумной идеи. В первых итерациях награду выдавали за каждый пройденный тест, а не за решённую задачу: семь тестов из десяти — 0,7 балла. Логика казалась железной: частичный сигнал помогает там, где полное решение модели пока не по силам. Вышло наоборот. В олимпиадных задачах примеры из условия почти всегда попадают в тесты, модель это заметила и в самых трудных случаях перестала решать: писала if на входные данные из примера, печатала ожидаемый ответ и забирала свою долю награды. От частичной оценки пришлось отказаться — теперь либо все тесты пройдены, либо ноль.

Этот случай хорошо показывает, как устроен каскад наград у каждого из шести экспертов. Единой формулы нет, но конструкция общая, и в ней три уровня.

Ворота (gated rewards). Это бинарные проверки, которые ответ проходит до того, как его вообще начнут оценивать по существу: ответ завершён и в нужном формате, написан на нужном языке без мусора и смешения алфавитов, не нарушает жёстких ограничений инструкции. Не прошёл ворота — награда нулевая, каким бы умным ни было рассуждение внутри. Набор ворот у каждого эксперта свой: правило компилируемости для кода бессмысленно в математике.

Появились ворота не из теории. Без них модель начинает говорить на разных языках в пределах одного предложения, а такие языковые смены, как отмечали в статье про MAI, способствуют нестабильности обучения.

Сумма (additive rewards). Ответы, прошедшие ворота, оценивают по нескольким осям с весами: корректность, полнота, следование инструкции. Здесь появляются градации, и модель уже различает посредственный ответ и хороший.

Штраф за длину. Без контроля длины модель быстро смекает, что писать больше выгодно: можно трижды всё перепроверить, подстраховаться, добавить «однако, возможно…». В итоге она думает минутами над вопросом, на который человек ответил бы сразу. Но и просто штрафовать за длину нельзя: сложная задача требует долгого рассуждения. Поэтому штраф адаптивный — формула привязывает его к доле успешных решений задачи: чем проще задача, тем сильнее наказание за лишние токены. Задачу, которую модель решает всегда, штрафуют максимально, а ту, что даётся в одной попытке из десяти, — в десять раз слабее.

Урок здесь один, и авторы формулируют его прямо: проектируйте награду из вопроса «как это проще всего обмануть». Частичная награда за тесты, судья без штрафа за длину, отсутствие ворот по языку — в каждом случае модель находила лазейку раньше, чем её успевали закрыть.

Эксперты STEM и Code: проверяемая награда и отказ от частичного зачёта

Награда за ответ, который нельзя сверить с эталоном, строится иначе, чем награда за код или арифметику. Разберём два эксперта с противоположной логикой — Code и Диалог, — а затем вернёмся к истории с частичной оценкой, чтобы увидеть общий принцип: любое усложнение награды нужно проектировать от вопроса «как это проще всего обмануть».

Code: проверяемый ответ — не значит неподделываемый. В первом экспертном режиме модель получает задачу и целиком пишет или правит блок кода в одном ответе: олимпиадное программирование, реализация алгоритмов, рефакторинг, генерация тестов. Ответ можно проверить запуском, вся задача помещается в один запрос. Частичную награду за пройденные тесты пришлось убрать: в олимпиадных задачах примеры из условия почти всегда попадают в тесты, и модель в самых сложных случаях переставала решать — писала if на входные данные из примера, печатала ожидаемый ответ и получала долю балла. Итог — порог из двух состояний: все тесты пройдены или ноль.

Диалог: нет эталона — есть сравнение. Разговорный эксперт отвечает за обычное общение: ответить по делу, объяснить, написать связный текст. Правильного ответа здесь не существует, поэтому награда строится на попарном сравнении: для фиксированного набора запросов берут ответ обучаемой модели и сильной внешней, а судья выбирает лучший по следованию запросу, полноте и качеству формулировок. Подход поднимал метрики, но после разбора одного из запусков обнаружился побочный эффект: средняя длина ответа выросла почти втрое. Судья систематически предпочитал длинные ответы, считая их подробнее и качественнее. Спасли адаптивный штраф за длину, зависящий от типа запроса и средней длины ответов сильных моделей: после него длина выросла лишь на 8%, а метрики продолжили расти.

Что общего. Обе истории — про одно и то же свойство модели: она ищет кратчайший путь к баллу, а не к решению. В Code лазейкой стал пример из условия, в Диалоге — объём текста. Полезно заранее перечислить, как награду можно обойти, и закрыть эти пути до запуска обучения, а не после.

Code Agent и обучение сквозь harness

Классический путь — воспроизвести логику одного-двух популярных harness на своём стеке и учить модель внутри копии. Стартовать так быстрее, но копия отстаёт от оригинала уже через месяц, а под каждую новую обвязку всё приходится писать заново. Команда GigaChat выбрала другой путь: harness не трогают вообще, а между ним и моделью ставят прокси, который записывает каждый запрос и ответ. Harness продолжает работать как обычно и даже не знает, что участвует в обучении; из записанных пар собирается траектория для RL, и модель учится ровно в том окружении, в котором её потом будут запускать.

За основу взяли Polar — open-source-фреймворк от NVIDIA, устроенный именно так: прокси перед моделью, отдельный сервер для роллаутов и конвейер, который поднимает контейнеры под следующие задачи, пока модель ещё думает над текущими. Фреймворк форкнули под свой стек и развернули полностью локально, включая виртуализацию контейнеров.

Цена решения оказалась честной и немаленькой: на поднятие Polar ушло два месяца, и полноценно он заработал лишь за неделю до релизного обучения. Поэтому в этом релизе Code Agent учился на одной обвязке — mini-SWE-agent, хотя инфраструктура для десятков обвязок уже стоит и будет загружена в следующем релизе.

Практический вывод для тех, кто строит похожий цикл: прокси-архитектура окупается только на длинной дистанции. Если вам нужен один harness и один релиз, копия дешевле. Если обвязок десятки и они обновляются каждую неделю — записывающий прокси снимает необходимость гнаться за каждой из них.

Агентные среды и память: как строили проверяемые данные

Для агентного эксперта главной проблемой оказались не алгоритмы, а данные. SFT-примеров в открытом доступе достаточно, а RL-сред почти нет: нужна согласованная база, сценарии поверх неё и проверяемое целевое состояние, чтобы разыгрывать диалог online и выдавать награду. Поэтому среды строили сами — двумя независимыми конвейерами.

Первый конвейер отталкивается от готового open-source-проекта с документацией: электронной библиотеки, системы управления курсами и подобных. LLM по коду и документации восстанавливает методы API, сущности и схему базы, а затем из методов строится граф зависимостей — какой метод потребляет результат какого. Сэмплированный путь в этом графе становится скелетом задачи: под него генерируются обстоятельства в базе, желаемое конечное состояние и способ его проверки. Несколько задач склеиваются в одну сессию, получается сценарий из большого числа событий. Итог: пять сред и восемь тысяч задач.

Второй конвейер ничего готового не использует. Сначала создаётся пул бытовых ситуаций — доставка еды, стойка администратора гостиницы. Под каждую агенты сами проектируют базу и API-ручки, наполняют её сущностями, прописывают политику агента, генерируют сценарии пользователя и фильтруют ground truth так, чтобы конечное состояние было единственным. Здесь документацию придумывают, а не берут готовую, и задачи генерируются напрямую, без шаблонов. Вышло 50 сред по 80 задач — четыре тысячи сэмплов, целиком на русском, зато базы мельче и сценарии проще.

Отдельная история — персонализированная память, где открытых RL-сред нет вовсе. У памяти две способности: чтение (найти информацию инструментами, собрать из нескольких мест, суммировать) и запись (оценить важность факта и его уникальность, не засорить хранилище дублями). Запись освоить, возможно, легче, но ошибка здесь накапливается: к ошибке чтения добавляется ошибка записи. Отсюда требование к данным — длинные multi-turn сценарии, где все факты о пользователе согласованы, а решение о записи однозначно. Спорный случай: реплика «я, наверное, перейду на вегетарианство» — это намерение или факт? Оно может конфликтовать с сохранённым «любит стейки», и разметчику приходится решать, обновлять старую запись, помечать её устаревшей или не писать ничего.

Поисковый набор построен в духе BrowseComp. Ответ нельзя получить одним запросом: модель разбирает вопрос на подвопросы, сопоставляет факты и не берёт первый результат выдачи на веру. Строится всё автоматически: агент собирает пары вопрос-ответ по Википедии и интернету, затем система итеративно усложняет вопрос промежуточными звеньями и косвенными подсказками, а независимые поисковые агенты проверяют, подтверждается ли ответ источниками, трудно ли до него добраться и нет ли второго подходящего ответа. Фильтры отсекают большую часть: около 30% вопросов отбрасываются как слишком простые, из оставшихся ещё столько же не проходят отбор по pass rate — примерно половина решается либо во всех восьми сэмплах, либо ни в одном. После проверки на однозначность до обучающей выборки доходит примерно каждый пятый сгенерированный вопрос.

Диалог и инструкции: судья, штраф за длину и JSON

Есть домены, где награду нельзя посчитать ни сверкой с эталоном, ни запуском кода. Ответ на просьбу «объясни» или «напиши письмо» не бывает правильным или неправильным — он бывает лучше или хуже. В проекте GigaChat 3.5 Reasoning под это выделили отдельного эксперта: обычный диалог, объяснения, связные тексты, форматы и длинный контекст собрали в один домен, потому что у них всех общая беда — отсутствие проверяемого целевого состояния.

Награду здесь строят на сравнении. Для фиксированного набора запросов берут ответ обучаемой модели и ответ сильной внешней модели, а судья — отдельная LLM — выбирает лучший по следованию запросу, полноте и качеству формулировок. Из этого попарного сравнения и собирается сигнал.

Схема работает, но у неё есть побочный эффект, который проявляется не сразу. После разбора одного из запусков команда заметила: средняя длина ответа выросла почти в три раза. Судья систематически выбирал более длинные ответы, принимая их за более подробные и качественные. Модель быстро уловила закономерность и начала наращивать объём там, где это не требовалось.

Лечится это не запретом на длину, а штрафом, привязанным к типу запроса и средней длине ответов сильных моделей. После его введения средняя длина выросла лишь на 8%, а метрики сравнения продолжили расти и достигли того же уровня, что и раньше, — но уже без раздувания текста.

Похожая ловушка подстерегала и на другом конце домена. В задачах на строгий вывод модель по привычке объясняла свои действия: перед JSON писала вводную вроде «Конечно, вот результат», а после добавляла комментарий. С точки зрения человека ответ выглядел нормально, но строгий парсер считал его некорректным, и метрика держалась около нуля. Помог отдельный штраф за любой текст вне требуемой структуры — модель перестала добавлять пояснения там, где нужен строгий ответ.

Вывод для практики простой: когда вы задаёте награду через судью, проверяйте, что именно он на самом деле поощряет. Судья, предпочитающий длину, и парсер, не прощающий лишнего слова, — это не крайние случаи, а типовое поведение, которое стоит закладывать в дизайн награды заранее.

Склейка шести моделей, MoE-инфраструктура и запуск

После RL у вас на руках шесть отдельных моделей, а в продакшен нужна одна. Склеивали их через on-policy distillation (OPD): ученик сам генерирует ответ, а учитель — эксперт того домена, к которому относится задача — оценивает каждый токен («здесь я бы сказал так же», «а здесь иначе»). Сигнал идёт по траектории ученика, на его собственных ошибках, как в RL, но обратная связь плотнее: не одно число за весь ответ, а оценка на каждом шаге.

Теперь про рассинхрон — проблему, которая выглядит технической мелочью, а на деле подтачивает весь RL. Роллауты генерирует inference-движок, градиенты считает train-движок. Если они расходятся в вероятностях одних и тех же токенов, обучение, которое вы считаете on-policy, на деле оказывается off-policy, и в градиенты попадает лишний шум. Для MoE-моделей ситуация хуже: роутер на инференсе и на обучении может выбирать разных экспертов для одного и того же токена. Здесь выручила техника rollout routing replay (R3): во время генерации запоминают, каких экспертов выбрал роутер, и на обучении переиспользуют ровно этот выбор. Главный источник рассинхронизации исчезает, а KL между движками падает примерно в 10 раз.

Из этой истории следуют три вывода.

Первый: награду будут взламывать. Частичная награда за тесты, судья без штрафа за длину, отсутствие ворот по языку — каждый раз модель находила лазейку раньше, чем команда. Проектируйте награду, начиная с вопроса «как это проще всего обмануть», а не «насколько точно это измеряет качество».

Второй: cold start задаёт потолок RL. В экспериментах на 10B-моделях добавление conversational-сценариев в SFT поднимало pass@32 со стартового чекпоинта с 0,4 до 0,8–0,9, и RL на нём шёл заметно быстрее. Проще говоря, разнообразие SFT важнее его точности.

Третий: рассинхрон движков — это скрытый off-policy. Пока он не устранён, остальные оптимизации во многом теряют смысл.

Практический совет: если вы запускаете online RL на MoE-модели, начните с выравнивания движков — внедрите R3 и считайте логиты и нормировки в fp32, прежде чем браться за ускорение конвейера.

Похожее