Перейти к содержимому
Ступень 66.1 Supervised Fine-Tuning

От базовой модели к ассистенту

Что умеет и чего не умеет базовая модель после претрейна, из каких этапов состоит пост-трейнинг и как его устроили InstructGPT, DeepSeek-R1 и Qwen3.

УРОКstage-6/6-1-sft/01-base-vs-chat.mdx1 чУрок 1 из 2
После урока вы сможете
  • Объяснить, почему базовая модель «продолжает документ», а не отвечает, и что именно меняет пост-трейнинг
  • Нарисовать конвейер пост-трейнинга (SFT → предпочтения → RL) и сказать, чему учит каждый этап
  • Сравнить рецепты InstructGPT, DeepSeek-R1 и Qwen3 и найти в них общие идеи

На ступенях 4 и 5 вы обучали модель предсказывать следующий токен — это претрейнпредобучение, претрейнEN pretraining. Получается базовая модельбазовая модельEN base model: она знает грамматику, факты, умеет программировать. Но попробуйте спросить её «Как заварить зелёный чай?» — и вместо ответа вы, скорее всего, получите ещё пару вопросов, кусок форума или оглавление статьи. Модель ничего не сломала: она добросовестно продолжает документ.

Пост-трейнингпост-трейнинг, дообучение после претрейнаEN post-training превращает «автодополнение интернета» в ассистента, который отвечает, держит роль, останавливается вовремя и отказывается от вредного. На масштабе DeepSeek-V3 этот этап стоит долю процента от вычислений претрейна, но именно его вы видите, когда открываете чат. Этот урок — карта всей ступени 6: что делает каждый этап и как его устроили в InstructGPT, DeepSeek-R1 и Qwen3.

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

УмеетНе умеет (надёжно)
Продолжать текст в стиле начала: код, статью, диалог в пьесеПонимать, что от неё ждут ответа, а не продолжения
Знать факты, языки, синтаксис программДержать одну роль: она «пишет» и за пользователя, и за ассистента
Решать новую задачу по 3–5 примерам в промптеВовремя остановиться: у документа нет «конца реплики»
Переводить, если промпт похож на двуязычный словарьСледовать формату («ответь только JSON»)
Имитировать любой стиль, включая токсичныйОтказываться от вредных запросов

Третья строка левого столбца — обучение в контекстеобучение в контекстеEN in-context learning (ICL)Модель решает новую задачу по примерам в промпте, без изменения весов. Ярко показано в статье о GPT-3 (2020).: модель «подстраивается» под примеры прямо в контексте, без изменения весов. Статья о GPT-3 (2020) показала, что с ростом модели это работает всё лучше. Отсюда первый способ сделать из base-модели ассистента — промпт-инжиниринг: оформить запрос как кусок документа, в котором дальше естественно идёт ответ.

Ниже — ответы опытного консультанта на вопросы покупателей.
Вопрос: Чем улун отличается от зелёного чая?
Ответ: Улун окислен частично, зелёный чай почти не окислен, поэтому вкус улуна глубже.
Вопрос: Как заварить зелёный чай?
Ответ:

Такой few-shotfew-shot (примеры в промпте)EN few-shot promptingНесколько пар «вход → выход» прямо в промпте; модель подхватывает формат без дообучения (in-context learning). Zero-shot — без примеров.-промпт работает, но хрупко. После ответа модель с радостью напишет «Вопрос: …» и продолжит диалог сама с собой. Каждый новый тип задачи требует своих примеров, а они съедают контекст. Нужен способ зашить поведение «я ассистент, отвечаю и останавливаюсь» прямо в веса.

Почему так: модель имитирует авторов документов

Заголовок раздела «Почему так: модель имитирует авторов документов»

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

Пост-трейнинг сужает это множество до одного автора — полезного ассистента — и вводит явную структуру диалога: роли, начало и конец реплики. Технически это делается через chat-шаблонchat-шаблонEN chat templateПравило (обычно Jinja в tokenizer_config.json), которое превращает список сообщений с ролями в одну строку со спецтокенами. со спецтокенамиспециальный токен (спецтокен)EN special tokenУправляющий токен, а не кусок текста — начало/конец текста (BOS/EOS), заполнитель для батча (PAD), разметка ролей в чате (например, <|im_start|> у Qwen). — вы разбирали его в уроке 4.2.3. В следующем уроке вы научите модель этому формату сами.

Насколько глубоко пост-трейнинг меняет модель? Два наблюдения.

  • LIMA (2023). Модель LLaMA на 65B дообучили всего на 1000 тщательно отобранных примеров «вопрос — ответ», и в слепом сравнении люди в 43% случаев оценивали её ответы не хуже ответов GPT-4. Авторы сформулировали гипотезу поверхностного выравниваниягипотеза поверхностного выравниванияEN superficial alignment hypothesisИз статьи LIMA (2023): знания модель получает на претрейне, а выравнивание в основном учит формату и стилю общения.: знания и навыки модель получает на претрейне, а выравнивание в основном учит, в каком формате их выдавать. Подробно о LIMA — в следующем уроке.
  • URIAL (2023). Авторы сравнили base-модель и её выровненную версию токен за токеном на одних и тех же ответах. В большинстве позиций обе модели ставят на первое место один и тот же токен. Расходятся они в основном на стилистических токенах: вводных фразах («Конечно!», «Вот несколько способов»), структуре ответа и дисклеймерах. Отсюда и сам метод URIAL: base-модель с системным промптом и всего тремя стилистическими примерами в контексте на тестах авторов приблизилась к версиям, прошедшим SFT и RLHF. Это тот же few-shot, что выше, только аккуратно подобранный.

Современный пост-трейнинг — несколько этапов, и у каждого свои данные и своя функция потерь.

flowchart LR
P["Претрейн<br/>триллионы токенов"] --> B["Base-модель"]
B --> S["SFT<br/>образцовые диалоги"]
S --> R["Предпочтения<br/>RLHF или DPO"]
R --> V["RL с проверяемыми<br/>наградами"]
V --> F["Флагман"]
F -.->|"дистилляция"| M["Малые модели"]
Типичный конвейер пост-трейнинга. Порядок и состав этапов у лабораторий отличаются
ЭтапДанныеЧему учитГде в курсе
SFTобучение с учителем на инструкциях (SFT)EN supervised fine-tuning (SFT)пары «запрос → образцовый ответ», от тысяч до миллионовформату диалога, роли, стилю, базовым навыкам6.1–6.2
Предпочтения: RLHFобучение с подкреплением на основе отзывов людей (RLHF)EN reinforcement learning from human feedback (RLHF), DPOпрямая оптимизация предпочтений (DPO)EN direct preference optimization (DPO)Rafailov и др., 2023. Обучение на парах предпочтений без reward model и без RL-цикла.пары ответов «лучше / хуже»что люди считают полезным и безопасным6.3
RL с проверяемыми наградамипроверяемое вознаграждениеEN verifiable reward (RLVR)задачи с проверяемым ответом: математика, кодрассуждать, искать и перепроверять решение6.4
ДистилляциядистилляцияEN (knowledge) distillationответы большой моделипереносить навыки флагмана в маленькие модели6.4

Ключевое различие. В SFT модель подражает готовому ответу: loss — та же cross-entropy, что и на претрейне, только на диалогах. На этапах RL модель сама генерирует ответы, а сигнал приходит от оценки: человека, reward-модели или проверки ответа программой. Подражание быстро учит формату, но не поднимает модель выше уровня образцов. Это делают этапы, где ответы модели оценивают: предпочтения и RL. Их язык — политика, награда, преимущество, PPO — вы уже знаете из модуля 6.0.

Пост-трейнинг дешёв по сравнению с претрейном. В техотчёте DeepSeek-V3 приведена таблица GPU-часов на H800 по этапам. Посчитаем доли:

# DeepSeek-V3 Technical Report, таблица 1: H800 GPU-часы по этапам
gpu_hours = {"претрейн (14.8T токенов)": 2664e3, "расширение контекста": 119e3, "пост-трейнинг (SFT + RL)": 5e3}
total = sum(gpu_hours.values())
for stage, h in gpu_hours.items():
print(f"{stage:>26}: {h / 1e3:6.0f} тыс. GPU-ч ({h / total:6.2%}) ≈ {h * 2 / 1e6:.2f} млн долл. при 2 долл./ч")
print(f"{'итого':>26}: {total / 1e3:6.0f} тыс. GPU-ч")
претрейн (14.8T токенов): 2664 тыс. GPU-ч (95.55%) ≈ 5.33 млн долл. при 2 долл./ч
расширение контекста: 119 тыс. GPU-ч ( 4.27%) ≈ 0.24 млн долл. при 2 долл./ч
пост-трейнинг (SFT + RL): 5 тыс. GPU-ч ( 0.18%) ≈ 0.01 млн долл. при 2 долл./ч
итого: 2788 тыс. GPU-ч

Пост-трейнинг — 0.18% вычислений. Оговорка: данные для SFT-рассуждений V3 сгенерировала внутренняя модель серии R1, а её RL в эту таблицу не входит. Тренд 2025–2026 годов — RL-этапы становятся всё дороже. Но для нас важен вывод: пост-трейнинг доступен там, где претрейн недоступен. Модель на 0.5–7B вы дообучите на одной видеокарте — это модуль 6.2.

Классическая схема описана в статье OpenAI об InstructGPT — модели-предшественнице ChatGPT. Три шага:

  1. SFT. Около 40 нанятых разметчиков писали образцовые ответы на промпты: около 13 тыс. обучающих промптов.
  2. Reward model. Разметчики ранжировали несколько ответов модели на один промпт (около 33 тыс. промптов). На этих сравнениях обучили модель, которая выдаёт число — «насколько ответ хорош».
  3. PPO. Модель генерировала ответы на около 31 тыс. промптов, reward model их оценивала, а алгоритм RL PPO сдвигал модель к ответам с высокой наградой.

Главный результат: ответы InstructGPT на 1.3B параметров люди предпочитали ответам исходной GPT-3 на 175B. Модель, которая более чем в 100 раз меньше, выигрывала только за счёт пост-трейнинга. Побочный эффект — налог на выравниваниеналог на выравниваниеEN alignment taxПадение качества на обычных задачах после выравнивания под предпочтения.: на части академических бенчмарков качество немного падало. Шаги 2–3 подробно разберём в уроке 6.3.2.

Команда DeepSeek поставила эксперимент: что будет, если пропустить SFT и сразу запустить RL поверх DeepSeek-V3-Base? Награда — правило: ответ в задаче верный и рассуждение оформлено в теги <think>…</think>. Получилась R1-Zero. Её точность pass@1 (доля задач, решённых с первой попытки; подробно — урок 7.3.1) на задачах AIME 2024 (американской математической олимпиады для школьников) выросла в процессе RL с 15.6% до 71.0%. Модель сама научилась писать длинные рассуждения и перепроверять себя — знаменитый «момент озарения» («момент озарения»«момент озарения»EN aha momentЭффект из статьи DeepSeek-R1: модель при RL-обучении сама начинает перепроверять свои рассуждения.). Но текст плохо читался, а языки смешивались (смешение языковсмешение языковEN language mixingМодель переключается между языками внутри одного рассуждения. Типичная проблема R1-Zero.).

Поэтому у полной R1 конвейер такой — два этапа SFT и два этапа RL:

  1. Холодный старт: SFT на нескольких тысячах длинных рассуждений хорошего качества (данные холодного стартаданные холодного стартаEN cold-start dataНебольшой набор качественных длинных рассуждений для SFT перед RL — так в DeepSeek-R1 исправили нечитаемость R1-Zero.).
  2. RL на рассуждениях с проверяемыми наградами и наградой за единый язык ответа.
  3. Rejection samplingотбор с отклонением (rejection sampling)EN rejection samplingСгенерировать много ответов и оставить только прошедшие проверку. В пост-трейнинге — способ собрать SFT-данные из RL-модели. + SFT: модель генерирует много ответов, верные отбираются. Вместе с данными для обычных задач получается около 800 тыс. примеров; на них заново дообучают DeepSeek-V3-Base.
  4. RL для всех сценариев: правила для задач с ответом, reward-модели для полезности и безопасности.

Те же 800 тыс. примеров использовали для обычного SFT моделей Qwen2.5 и Llama на 1.5–70B — так получились R1-Distill. Это дистилляция в чистом виде: маленькая модель подражает трассам большой. Здесь конвейер R1 — только обзор: каждый этап, «момент озарения» и споры вокруг него подробно разобраны в уроке 6.4.2, дистилляция — в уроке 6.4.4.

Qwen3 (апрель 2025) обучена на ~36T токенов на 119 языках и диалектах. Флагманы прошли четыре этапа пост-трейнинга:

  1. Long-CoT cold start — SFT на длинных рассуждениях (CoT, chain of thought — «цепочка рассуждений»): математика, код, логика, STEM (естественные науки, техника, инженерия и математика).
  2. Reasoning RL с правиловыми наградами.
  3. Слияние режимов мышления (thinking mode fusion): SFT на смеси длинных рассуждений и обычных инструкций. Модель учится отвечать и с рассуждением, и без него (гибридный режим мышлениягибридный режим мышленияEN hybrid thinking modeОдна модель умеет отвечать и с длинным рассуждением, и сразу. В Qwen3 режим переключается флагами /think и /no_think.).
  4. General RL — более 20 общих задач: следование инструкциям и формату, агентные навыки.

Маленькие модели семейства весь путь не проходят: навыки им передают дистилляцией от флагманов (дистилляция «от сильной к слабой»дистилляция «от сильной к слабой»EN strong-to-weak distillationСхема Qwen3 для маленьких моделей. Сначала обучение на ответах большой модели (off-policy), затем подгонка к её логитам на собственных генерациях ученика (on-policy).). А в июле 2025 года Qwen вернулась к раздельным моделям: Qwen3-Instruct-2507 и Qwen3-Thinking-2507.

InstructGPT (2022)DeepSeek-R1 (2025)Qwen3 (2025)
СтартGPT-3DeepSeek-V3-BaseQwen3-Base
SFTответы людейхолодный старт + 800k отобранных ответовlong-CoT + слияние режимов
Сигнал RLreward model по оценкам людейправила (точность, формат, язык) + RMправила + reward-модели (20+ общих задач)
Малые модели—SFT на трассах R1 (R1-Distill)strong-to-weak дистилляция

Общая идея всех трёх: SFT задаёт формат и «засевает» навыки, RL их усиливает, дистилляция дёшево переносит результат в маленькие модели.

Скрипт ниже сравнивает пару моделей одной архитектуры: base-модель Qwen2.5-0.5B и чат-модельчат-модель, instruct-модельEN chat model / instruct modelБазовая модель после пост-трейнинга. На Hugging Face и ModelScope узнаётся по суффиксу -Instruct/-Chat (Qwen2.5) или по отсутствию суффикса -Base (Qwen3, DeepSeek-V3). Qwen2.5-0.5B-Instruct. Нужны pip install torch transformers и около 2 ГБ на скачивание. Работает на CPU за пару минут. AutoTokenizer и AutoModel... вы уже встречали в уроке 4.5.4.

"""Base против Instruct: одна и та же архитектура, разное поведение."""
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
BASE, CHAT = "Qwen/Qwen2.5-0.5B", "Qwen/Qwen2.5-0.5B-Instruct"
QUESTION = "Как заварить зелёный чай?"
FEW_SHOT = (
"Ниже — ответы опытного консультанта на вопросы покупателей.\n\n"
"Вопрос: Чем улун отличается от зелёного чая?\n"
"Ответ: Улун окислен частично, зелёный чай почти не окислен, поэтому вкус улуна глубже.\n\n"
"Вопрос: "
)
tok = AutoTokenizer.from_pretrained(CHAT) # у base и instruct Qwen2.5 общий токенизатор
base = AutoModelForCausalLM.from_pretrained(BASE).float().eval()
chat = AutoModelForCausalLM.from_pretrained(CHAT).float().eval()
@torch.no_grad()
def complete(model, text, n=60):
enc = tok(text, return_tensors="pt")
out = model.generate(**enc, max_new_tokens=n, do_sample=False, pad_token_id=tok.pad_token_id)
return tok.decode(out[0, enc["input_ids"].shape[1]:]) # спецтокены не прячем: виден <|im_end|>
chat_prompt = tok.apply_chat_template([{"role": "user", "content": QUESTION}], tokenize=False,
add_generation_prompt=True)
print("── 1. base, просто вопрос:\n", complete(base, QUESTION))
print("── 2. base, few-shot «документ с ответами»:\n", complete(base, FEW_SHOT + QUESTION + "\nОтвет:"))
print("── 3. instruct, шаблон ChatML:\n", complete(chat, chat_prompt))
# ── 4. Где именно расходятся модели (идея статьи URIAL) ─────────────────────────
enc = tok(chat_prompt, return_tensors="pt")
answer = chat.generate(**enc, max_new_tokens=60, do_sample=False, pad_token_id=tok.pad_token_id)[0]
with torch.no_grad():
logits = base(answer[None]).logits[0, enc["input_ids"].shape[1] - 1: -1] # прогноз base для каждого токена ответа
target = answer[enc["input_ids"].shape[1]:] # токены ответа instruct-модели
# gather берёт логит правильного токена в каждой строке; ранг — сколько токенов base считает вероятнее него
rank = (logits > logits.gather(1, target[:, None])).sum(1) # 0 = base поставила этот токен на 1-е место
print(f"── 4. токенов ответа: {len(target)}, base согласна (top-1): {(rank == 0).float().mean():.0%}")
# Как в URIAL: токен «сдвинут», если у base он даже не в тройке лучших (ранг > 2)
print(" несогласные токены:", [tok.decode(t) for t, r in zip(target, rank) if r > 2][:15])

Что посмотреть в выводе (точный текст зависит от версий библиотек, поэтому мы его не приводим):

  1. Пункт 1. Продолжает ли base-модель вопрос как документ: новые вопросы, список, обрыв на полуслове через 60 токенов?
  2. Пункт 2. Few-shot обычно даёт осмысленный ответ. Но остановилась ли модель после него, или написала следующий «Вопрос:»?
  3. Пункт 3. Instruct отвечает по делу и заканчивает реплику токеном <|im_end|> — его видно, потому что мы не скрываем спецтокены.
  4. Пункт 4. Какую долю токенов ответа instruct-модели base-модель тоже ставит на первое место? Какие токены «несогласные» (у base они даже не в тройке лучших)? По выводам URIAL это должны быть в основном вводные слова и разметка, а не факты.
Проверь себя5 вопросов
1 Вы даёте base-модели промпт «Как сварить пельмени?». Какое поведение наиболее типично?
2 Какие утверждения верны?Можно выбрать несколько ответов
3 У DeepSeek-V3 пост-трейнинг занял 5 тыс. из 2 788 тыс. GPU-часов. Сколько это процентов? Округлите до двух знаков.
4 Зачем полной DeepSeek-R1 этап SFT на «холодном старте», если R1-Zero научилась рассуждать без него?
5 Что происходит на третьем этапе пост-трейнинга флагманов Qwen3?
  • Base-модель — «симулятор авторов документов»: она многое знает, но не умеет быть ассистентом. Few-shot-промпты помогают, но хрупко.
  • Пост-трейнинг: SFT (подражание образцам) → предпочтения (RLHF/DPO) → RL с проверяемыми наградами → дистилляция в малые модели. У DeepSeek-V3 он занял ~0.2% вычислений.
  • Выравнивание во многом меняет стиль и формат (LIMA, URIAL), но новые навыки вроде рассуждений требуют RL и данных.
  • R1 и Qwen3 строят конвейер из чередующихся SFT и RL, а маленьким моделям передают навыки дистилляцией.

Дальше: собираем SFT своими руками — формат диалога, chat-шаблон и маска loss «только на ответах ассистента».