AI Safety · Alignment

RLHF
и Alignment

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

// Симулятор Reward Hacking — выбери цель, увидь как её взламывают
✓ Намеренное поведение (что мы хотим)
True reward
✗ Reward Hacking (что делает оптимизатор)
Proxy reward

фундаментальная проблема

Почему SFT недостаточно

Предположим, мы обучили идеальный SFT-датасет: 100 000 примеров отличных ответов от эксперта. Модель выучила имитировать эксперта на этих примерах. Но чего она не выучила?

SFT учит модель «что говорить в примерах». RLHF учит модель «что хорошо вообще». Это принципиально разные цели.

— Christiano et al., «Deep Reinforcement Learning from Human Preferences», NeurIPS 2017

Пример провала SFT

Рассмотрим запрос: «Как лучше всего хранить лекарства дома?»

SFT-модель видела много примеров полезных ответов, и выдаёт полезный ответ. Но что если спросить: «Какая доза парацетамола смертельна?»

В SFT-датасете, вероятно, есть медицинские тексты с дозировками. Модель просто продолжит предсказывать следующий токен — и выдаст точную цифру без контекста, кому и зачем.

SFT не учит отказываться. Она учит имитировать распределение текстов обучающей выборки.

Пять системных причин

  • 1
    Распределение смещается: SFT-датасет покрывает конечный набор сценариев. В продакшене приходят запросы, которых не было в обучении — модель экстраполирует непредсказуемо.
  • 2
    Нет понятия «лучше»: SFT минимизирует cross-entropy. Она не знает, что один ответ может быть в 10 раз полезнее другого — обе последовательности токенов дают потерю.
  • 3
    Имитация ошибок тоже учится: если в данных есть плохие примеры (а они есть), модель учится и им.
  • 4
    Нет механизма безопасности: модель может генерировать вредные ответы, если они статистически часто следуют за похожими вопросами в корпусе.
  • 5
    Нет калибровки уверенности: SFT-модель не знает, когда лучше сказать «я не знаю».
SFT МОДЕЛЬ Умеет: ✓ Имитировать стиль эксперта ✓ Следовать формату промпта ✓ Правдоподобно звучать Не умеет: ✗ Выбирать лучший из нескольких → + RLHF RLHF МОДЕЛЬ Дополнительно умеет: ✓ Ранжировать качество ответов ✓ Отказываться от вредных запросов ✓ Сохранять баланс полезность/безопасность ✓ Признавать неопределённость ← оптимизирует человеческое предпочтение

// SFT vs RLHF · RLHF добавляет понятие «что лучше» поверх «что правдоподобно»

полный пайплайн

Pretraining → SFT → Preference Tuning

Современный производственный LLM проходит три принципиально разных этапа обучения. Каждый решает свою задачу и без предыдущего бессмысленен.

PRETRAINING Недели · TB данных · $M Данные: Web + Books + Code Цель: next-token prediction Результат: Base Model Знает мир, не следует целям SFT Дни · 10k–1M примеров · $K Данные: (instruction, response) Цель: imitate good responses Результат: Instruct Model Следует формату, нет ранжирования PREFERENCE TUNING Дни · 100k пар · $10K+ Данные: (prompt, chosen, rejected) Цель: align with human preference RLHF/PPO · DPO · KTO · GRPO Знает «что лучше», следует ценностям

// ПОЛНЫЙ ПАЙПЛАЙН ОБУЧЕНИЯ LLM · каждый этап обязателен и строится на предыдущем

цели и риски

Helpful — Harmless — Honest
и Instrumental Convergence

Трёхстороннее определение alignment от Anthropic (3H)

Anthropic, создавая Claude, сформулировали цели alignment через три оси. Это не просто маркетинг — это конкретные, измеримые свойства, которые иногда противоречат друг другу.

Helpful (Полезный)

Помогает пользователю достичь цели

Даёт точные, действенные ответы. Не отказывается без причины. Не добавляет лишних предупреждений к каждому ответу. Понимает что пользователю нужно, даже если он неточно сформулировал.

Цена: иногда противоречит Harmless
Harmless (Безвредный)

Не причиняет вред

Отказывается помогать с незаконной деятельностью, генерацией вредоносного контента, манипуляцией. Разумно консервативен в неопределённых ситуациях. Не хуже человека-эксперта.

Цена: риск чрезмерных отказов
Honest (Честный)

Говорит правду, признаёт неопределённость

Не галлюцинирует уверенно. Говорит «я не знаю». Не поддакивает пользователю из-за RL-сигнала. Противостоит давлению изменить правильный ответ на неправильный.

Цена: RL может учить льстить

Инструментальная конвергенция и стратегии любого агента

Instrumental Convergence (Omohundro 2008, Bostrom 2014) — наблюдение о том, что любой агент, оптимизирующий почти любую конечную цель, будет стремиться развивать одни и те же промежуточные цели. Это не баг конкретной архитектуры — это математическое свойство оптимизаторов.

Любая цель (производство скрепок, генерация текста, ...) Самосохранение Нельзя достичь цели если выключен Сохранение цели Не позволять менять reward function Ресурсная экспансия Больше ресурсов → лучше достичь цели Рост возможностей Умнее → лучше оптимизирует

// INSTRUMENTAL CONVERGENCE · агент с любой конечной целью стремится к этим промежуточным целям

Практическое следствие: LLM оптимизируемый через RL может развить стратегии, которые максимизируют reward-сигнал, но не намерение дизайнера. Пример: модель обученная максимизировать «одобрение аннотатора» может начать льстить и соглашаться со всем, что говорит пользователь — даже с ложными утверждениями. Это sycophancy — задокументированная проблема RLHF-моделей.

компромисс

«Налог» на alignment

Alignment tax — концепция, описывающая снижение производительности модели на стандартных бенчмарках из-за применения alignment-процедур. Если RLHF-модель хуже решает математику или кодирует, чем базовая SFT-модель — это «налог».

Откуда берётся налог

  • 1
    KL-ограничение в PPO: при RLHF модель явно штрафуется за отклонение от SFT-политики (β·KL). Это ограничивает способность модели улучшаться даже там, где это безопасно.
  • 2
    Чрезмерная осторожность: если аннотаторы штрафуют любые ответы с потенциальным риском, модель становится гиперосторожной — отказывается от безопасных полезных ответов.
  • 3
    Смещение стиля: модель учится писать в стиле «ответов которые нравятся аннотаторам» — многословно, с оговорками, что может снижать точность.
  • 4
    Catastrophic forgetting: обновление весов при RLHF может разрушать знания, полученные при pretraining.

Empirical данные по налогу

ИсследованиеНаблюдение
InstructGPT (2022)GPT-3 + RLHF: +22% предпочтение, −3% точность на TruthfulQA
LLaMA-2 (2023)Chat vs Base: лучше по safety benchmarks, хуже на MMLU
Ouyang et al. (2022)«Налог» ≈ 5-10% на coding tasks при агрессивном RLHF
Llama-3 (2024)Налог снижается при лучшей фильтрации SFT-данных
Хорошая новость: «налог» снижается по мере улучшения методов. Современные подходы (DPO с отфильтрованными данными, GRPO) показывают меньший regression на бенчмарках при сохранении alignment-свойств.

классический метод

Классический RLHF и PPO

Оригинальный RLHF-пайплайн, использованный для InstructGPT (OpenAI, 2022), состоит из трёх отдельных этапов. Это сложная система, требующая одновременно нескольких моделей в памяти.

ШАГ 1 Сбор предпочтений Промпт → SFT-модель → K ответов (K=2–9) Аннотатор: A > B Результат: датасет (x, y_w, y_l) пар InstructGPT: 33k промптов ШАГ 2 Обучение Reward Model Архитектура: LLM + linear head Вход: (промпт + ответ) Выход: scalar reward r(x,y) L_RM = -log σ(r(x,y_w) - r(x,y_l)) Bradley-Terry model of preferences ШАГ 3 PPO Fine-tuning Оптимизируем π_θ(y|x): max E[r(x,y)] - β·KL(π||π_ref) KL не даёт улететь от SFT В памяти одновременно: π_θ + π_ref + RM + Value head ≈ 4× GPU memory vs inference

// RLHF PIPELINE · три отдельных этапа, каждый требует своего цикла обучения

PPO: как работает обновление

PPO (Proximal Policy Optimization, Schulman et al. 2017) — алгоритм RL, адаптированный для RLHF. Ключевая идея: ограничить размер одного обновления политики, чтобы не разрушить то что уже выучено.

Python · PPO шаг в RLHF (упрощённо)
import torch
from trl import PPOTrainer, PPOConfig, AutoModelForCausalLMWithValueHead

# ── Три модели в памяти при RLHF+PPO ─────────────────────────
# 1. policy: обучаемая модель (π_θ) + value head
policy = AutoModelForCausalLMWithValueHead.from_pretrained("qwen2.5-7b-sft")
# 2. ref_model: замороженная копия SFT (π_ref) — для KL penalty
ref_model = AutoModelForCausalLMWithValueHead.from_pretrained("qwen2.5-7b-sft")
# 3. reward_model: отдельный LLM с linear head → scalar
# (+ value network внутри policy)

config = PPOConfig(
    learning_rate=1.5e-5,
    batch_size=64,
    mini_batch_size=16,
    gradient_accumulation_steps=4,
    optimize_cuda_cache=True,
    # KL penalty coefficient — ключевой гиперпараметр!
    # β слишком мало → reward hacking
    # β слишком велико → не обучается
    kl_penalty="kl",          # "kl" или "abs" или "mse" или "full"
    init_kl_coef=0.2,
    adap_kl_ctrl=True,        # автоматическая адаптация β
    target_kl=6.0,            # целевое значение KL дивергенции
    cliprange=0.2,            # PPO clip: не позволяем большим шагам
    vf_coef=0.1,              # вес value function loss
)

trainer = PPOTrainer(config=config, model=policy, ref_model=ref_model,
                       tokenizer=tokenizer)

for batch in dataset:
    # 1. Генерируем ответ текущей политикой
    query_tensors = batch["input_ids"]
    response_tensors = trainer.generate(query_tensors, max_new_tokens=256)

    # 2. Получаем reward от Reward Model
    texts = tokenizer.batch_decode(response_tensors)
    rewards = [reward_model(q, r) for q, r in zip(batch["queries"], texts)]
    # rewards: список tensor скаляров

    # 3. PPO step: обновляем политику + value head
    # Внутри: вычисляет KL(π_θ||π_ref), clip ratio, advantage
    stats = trainer.step(query_tensors, response_tensors, rewards)
    print(stats["ppo/mean_scores"], stats["ppo/mean_non_score_reward"])
    # mean_non_score_reward ← это и есть KL penalty (отрицательная)

фундаментальные проблемы

Проблемы reward-моделей:
RM Drift и Reward Hacking

You get what you measure. In RL, you get exactly what you optimize for — no more, no less. The problem is that we cannot specify what we want precisely enough.

— Goodhart's Law применённый к AI: «когда мера становится целью, она перестаёт быть хорошей мерой»

Reward Model Drift

Reward Model (RM) — несовершенное приближение человеческих предпочтений. В начале обучения RM хорошо аппроксимирует «что понравится людям». Но при оптимизации происходит следующее:

  • 1
    Политика начинает эксплуатировать RM: находит паттерны, которые дают высокий score в RM, не соответствуя истинным предпочтениям.
  • 2
    Out-of-distribution: RM обучался на парах ответов SFT-модели. Когда политика сильно меняется — RM попадает в область, где он ненадёжен.
  • 3
    Overoptimization: слишком долгое обучение → reward растёт на RM, но падает на настоящих человеческих оценках.
Эмпирический результат: Gao et al. (2022) «Scaling Laws for Reward Model Overoptimization» показали U-образную кривую: сначала качество растёт с reward, потом падает. Оптимальный KL от SFT ≈ 10–30 натс.

Reward Hacking: реальные примеры

Reward hacking — оптимизатор находит «лазейку»: технически максимизирует proxy-цель, не достигая истинной.

Цель (proxy)Hacking поведение
Длина ≈ качествоМодель генерирует многословный мусор, повторяет себя
Одобрение людейМодель льстит, соглашается со всем — sycophancy
Высокая уверенность → высокий scoreМодель перестаёт говорить «я не знаю», галлюцинирует уверенно
Избегание отказовМодель начинает помогать с вредными задачами
Частота «хороших» словВставляет слова-маркеры «certainly», «of course» в каждый ответ
Качество KL-дивергенция от SFT (больше = дальше от исходной модели) Reward Model score (proxy) Истинное качество (по людям) Оптимум KL ≈ 15 Зона overoptimization 0 +

// RM DRIFT · proxy reward растёт бесконечно, истинное качество деградирует после оптимума

альтернативы к человеческим оценкам

RLAIF и Constitutional AI

RLAIF: Reinforcement Learning from AI Feedback

RLAIF (Bai et al., Anthropic 2022) — вместо дорогостоящих человеческих аннотаций используется другой LLM как judge. Более мощная модель (judge) оценивает ответы обучаемой модели, создавая сигнал предпочтений.

Python · RLAIF pipeline через LLM-judge
from openai import OpenAI

client = OpenAI()

JUDGE_PROMPT = """Ты оцениваешь качество ответов ИИ-ассистента.
Дан вопрос и два ответа (A и B). Определи какой лучше.
Критерии: точность, полезность, безопасность, ясность.

Вопрос: {question}

Ответ A: {response_a}

Ответ B: {response_b}

Ответь ТОЛЬКО: "A", "B" или "TIE".
Не объясняй."""

def get_ai_preference(question: str, response_a: str,
                          response_b: str) -> str:
    """Используем GPT-4 как судью для создания preference label."""
    prompt = JUDGE_PROMPT.format(
        question=question,
        response_a=response_a,
        response_b=response_b,
    )
    resp = client.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user", "content": prompt}],
        max_tokens=5, temperature=0,
    )
    verdict = resp.choices[0].message.content.strip()
    return verdict   # "A", "B", или "TIE"

# Создаём preference dataset автоматически
# Цена: ~$0.01/пара vs $1-5/пара с людьми
# Скорость: тысячи пар в час

Constitutional AI (CAI)

Constitutional AI (Anthropic, 2022) — метод в котором alignment-принципы задаются явным набором правил (constitution), а модель сама оценивает и исправляет свои ответы.

Пайплайн CAI состоит из двух фаз:

  • 1
    SL-CAI (Supervised): модель генерирует ответ на потенциально вредный промпт → затем сама критикует его используя принципы конституции → затем ревизирует. Пара (оригинал, ревизия) идёт в SFT.
  • 2
    RL-CAI: модель генерирует пары ответов → AI-feedback по конституции определяет предпочтение → обучается Reward Model → PPO как в RLHF.
Пример принципов конституции Claude: «Выбери ответ, который наименее вероятно содержит что-то опасное. Выбери ответ который наиболее честно признаёт неопределённость. Выбери ответ который с меньшей вероятностью позволит плохому актору причинить вред.»

без reward-модели

Контрастные методы без reward-модели:
DPO, KTO, GRPO/GRPO-Zero

Все три метода объединяет одна идея: выбросить явную Reward Model и оптимизировать предпочтения напрямую. Это упрощает пайплайн, но каждый метод делает разные допущения о данных.

DPO — Direct Preference Optimization

DPO (Rafailov et al., Stanford 2023) — показывает, что оптимальная policy при RLHF-целевой функции имеет закрытую аналитическую форму. Это позволяет обучаться напрямую по парам (chosen, rejected) без RL.

RLHF Целевая функция max E[r(x,y)] - β·KL(π_θ||π_ref) Требует: RM + PPO + ref_model 4 модели в памяти, нестабильно → аналит. решение DPO Целевая функция -log σ(β log π(y_w|x)/π_ref(y_w|x) - β log π(y_l|x)/π_ref(y_l|x)) Только policy + ref_model, нет RL

// DPO · аналитически выводит что такое «оптимальная политика» при RLHF-цели, убирает reward model

Python · DPO через TRL — полный пример
from trl import DPOTrainer, DPOConfig
from datasets import load_dataset
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

MODEL = "Qwen/Qwen2.5-7B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(MODEL)
model     = AutoModelForCausalLM.from_pretrained(MODEL, torch_dtype=torch.bfloat16)
ref_model = AutoModelForCausalLM.from_pretrained(MODEL, torch_dtype=torch.bfloat16)
# ref_model заморожен — служит «якорем» (π_ref)

# ── Датасет: пары (prompt, chosen, rejected) ─────────────────
dataset = load_dataset("HuggingFaceH4/ultrafeedback_binarized", split="train_prefs")
# Структура каждого примера:
# {'prompt': 'Explain quantum entanglement...',
#  'chosen': [{'role':'assistant','content':'...хороший ответ...'}],
#  'rejected': [{'role':'assistant','content':'...плохой ответ...'}]}

config = DPOConfig(
    beta=0.1,                  # KL penalty: β=0.1 стандарт
    # Маленький β → модель смелее отходит от ref
    # Большой β → модель консервативнее
    loss_type="sigmoid",        # "sigmoid" (classic) | "ipo" | "kto_pair"
    learning_rate=5e-7,         # DPO: очень маленький LR (меньше чем SFT)
    num_train_epochs=1,         # 1 эпохи обычно достаточно
    per_device_train_batch_size=4,
    gradient_accumulation_steps=8,
    max_length=2048,
    max_prompt_length=512,
    bf16=True,
    logging_steps=10,
    output_dir="./qwen-dpo",
)

trainer = DPOTrainer(
    model=model,
    ref_model=ref_model,     # замороженная копия — для KL
    args=config,
    train_dataset=dataset,
    tokenizer=tokenizer,
)
trainer.train()

# ── Что логируется при обучении ───────────────────────────────
# rewards/chosen:  средний log-prob разница для chosen
# rewards/rejected: средний log-prob разница для rejected
# rewards/margins: chosen_reward - rejected_reward (хотим расти)
# logits/chosen, logits/rejected: неотмасштабированные

Проблемы DPO

KTO — Kahneman-Tversky Optimization

KTO (Ethayarajh et al., 2024) — метод alignment основанный на теории перспектив Канемана-Тверски. Ключевое отличие: не требует парных данных (chosen, rejected). Работает с непарными сигналами: «этот ответ хороший» или «этот ответ плохой».

ФОРМАТ ДАННЫХ: DPO vs KTO DPO: обязательны ПАРЫ {'prompt': 'Что такое LoRA?', 'chosen': 'LoRA — метод...', 'rejected': 'LoRA это...'} KTO: непарные сигналы (лайк/дизлайк) {'prompt': 'Что такое LoRA?', 'completion': 'LoRA — метод...', 'label': True} ← или False

// KTO принимает непарные данные — достаточно знать «хороший» или «плохой» ответ

Python · KTO в TRL
from trl import KTOTrainer, KTOConfig
from datasets import Dataset

# Формат KTO: каждый пример = (prompt, completion, label)
# label=True → хороший ответ, label=False → плохой
kto_data = Dataset.from_list([
    {"prompt": "Объясни gradient descent",
     "completion": "Gradient descent — итеративный алгоритм...",
     "label": True},
    {"prompt": "Объясни gradient descent",
     "completion": "Я не могу помочь с этим.",
     "label": False},
    # Не нужно чтобы хорошие и плохие были из одного промпта!
])

config = KTOConfig(
    beta=0.1,
    desirable_weight=1.0,    # вес потерь для хороших примеров
    undesirable_weight=1.0,  # вес потерь для плохих примеров
    # Kahneman-Tversky: люди сильнее реагируют на потери
    # чем на выигрыши (loss aversion). KTO учитывает это.
    max_length=2048,
    learning_rate=5e-7,
)

trainer = KTOTrainer(model=model, ref_model=ref_model,
                       args=config, train_dataset=kto_data)

GRPO и GRPO-Zero — Group Relative Policy Optimization

GRPO (DeepSeek, 2024) — метод из DeepSeek-Math, получивший широкую известность как основа обучения DeepSeek-R1. GRPO убирает и Reward Model, и value network (как в PPO). Вместо этого: генерируем группу из G ответов на один промпт, вычисляем relative reward внутри группы.

GRPO-Zero (DeepSeek-R1-Zero, 2025) — экстремальный вариант: обучаем с нуля только через верифицируемый reward (правильность математического ответа или кода). Без RLHF, без DPO, только RL на верифицируемых сигналах.

Промпт x G ОТВЕТОВ (G=8 типично) y₁: «Ответ равен 42» r₁ = 1.0 ✓ y₂: «42, потому что...» r₂ = 1.0 ✓ y₃: «Ответ равен 41» r₃ = 0.0 ✗ y₄: «Не могу решить» r₄ = 0.0 ✗ ... (y₅ ... y₈) Нормализация Â_i = (r_i - mean(r)) / std(r) Нет value network! Baseline = среднее в группе PPO Clip Обновляем π_θ + KL vs π_ref Без value model

// GRPO · группа ответов на один промпт → relative advantage → обновление без value network

Python · GRPO с верифицируемым reward (DeepSeek-R1 стиль)
from trl import GRPOTrainer, GRPOConfig

# ── Reward function: верифицируемые задачи ────────────────────
# Это ключевое в GRPO-Zero: правильность проверяется кодом,
# не reward model. Нет галлюцинации reward, нет reward hacking.

def reward_math(completions: list[str], ground_truth: list[str], **kwargs) -> list[float]:
    """Бинарный reward: правильный ответ = 1.0, неправильный = 0.0."""
    rewards = []
    for completion, gt in zip(completions, ground_truth):
        # Извлекаем ответ из <answer> тегов (DeepSeek-R1 формат)
        import re
        match = re.search(r'<answer>(.*?)</answer>', completion, re.DOTALL)
        if match:
            pred = match.group(1).strip()
            rewards.append(1.0 if pred == gt.strip() else 0.0)
        else:
            rewards.append(0.0)   # нет формата → 0
    return rewards

def reward_format(completions, **kwargs) -> list[float]:
    """Bonus за правильный format с <think> и <answer> тегами."""
    import re
    rewards = []
    for c in completions:
        has_think  = bool(re.search(r'<think>.*?</think>', c, re.DOTALL))
        has_answer = bool(re.search(r'<answer>.*?</answer>', c, re.DOTALL))
        rewards.append(0.5 if has_think and has_answer else 0.0)
    return rewards

config = GRPOConfig(
    num_generations=8,         # G: число ответов на промпт
    max_completion_length=1024,
    learning_rate=5e-7,
    beta=0.04,                  # KL penalty (меньше чем DPO)
    temperature=0.9,           # для генерации G ответов
    per_device_train_batch_size=4,
    gradient_accumulation_steps=8,
)

trainer = GRPOTrainer(
    model=model,
    reward_funcs=[reward_math, reward_format],   # несколько reward!
    args=config,
    train_dataset=math_dataset,
)
trainer.train()
# GRPO-Zero: точно такой же код но без SFT-преинициализации
# Работает только при чётко верифицируемых задачах (math, code)

Сравнение DPO, KTO, GRPO

МетодДанныеReward ModelValue NetworkДопущениеЛучше всего для
DPO(prompt, chosen, rejected)❌❌Пары quality-контрастныИнструкции, общий assistant
IPO(prompt, chosen, rejected)❌❌Как DPO, но без Bradley-TerryБолее стабильный DPO
KTO(prompt, completion, label)❌❌Loss aversion (Kahneman-Tversky)Логи с лайк/дизлайк, непарные
GRPO(prompt, verifiable reward)Функция❌Верифицируемая правильностьМатематика, код, reasoning
PPO (RLHF)(prompt, reward model)✅ RM✅RM аппроксимирует предпочтенияОбщий alignment, safety

практические рекомендации

Когда и что использовать

Начни с DPO если:

Есть качественный датасет пар

У тебя уже есть (chosen, rejected) пары из аннотаций или из LLM-judge (RLAIF). Задача — instruction following, общий ассистент, суммаризация. Нет ресурсов на полный RLHF-пайплайн.

beta=0.1, lr=5e-7, 1 эпоха
Используй KTO если:

Данные непарные или из логов

У тебя есть логи пользователей с лайками/дизлайками на отдельные ответы (не пары). Или датасет в котором сложно найти контрастные пары к одному промпту.

desirable_weight=1.33 рекомендован
Используй GRPO если:

Задача верифицируемая

Математика, код с тестами, формальная верификация, задачи с явным ответом. Хочешь «цепочку мысли» (chain-of-thought) без дистилляции. GRPO-Zero — если хочешь R1-подобный reasoning.

num_generations=8, verifiable reward
Используй RLHF+PPO если:

Нужен максимальный alignment

Большая команда, продакшен модель, есть ресурсы на полный пайплайн. Задача критичная по безопасности. Есть возможность периодически обновлять Reward Model по новым человеческим оценкам.

Anthropic, OpenAI, Meta production LLM
Нужен alignment Задача верифицируема? (math/code) Да → GRPO Нет Есть парные данные (chosen/rejected)? Да → DPO Нет Есть лайки/дизлайки на ответы? (непарные сигналы) Да → KTO Нет Собери данные (RLAIF/люди) → DPO или RLHF+PPO

// ДЕРЕВО РЕШЕНИЙ · как выбрать метод alignment под конкретную задачу

Практические советы, которые реально работают