Дообчання LLM методом ORPO

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Дообчання LLM методом ORPO
Складний
від 1 тижня до 3 місяців
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

Дофіно-tuning LLM методом ORPO

ORPO (Odds Ratio Preference Optimization) — метод дофіно-tuning з перевагами, запропонований Hong et al. (2024). Ключевою відмінністю від DPO: ORPO об'єднує SFT та preference optimization в один крок, не потребує окремої reference model та використовує odds ratio замість log-ймовірностей для штрафування небажаних відповідей.

ORPO vs DPO: технічні відмінності

DPO:

  • Потребує SFT-дофіно-tuned reference model
  • Тримає дві моделі в пам'яті (trained + reference) або використовує PEFT-трюки
  • Оптимізує: log-відношення ймовірностей
  • Гіперпараметр β визначає силу KL-штрафу

ORPO:

  • Reference model не потрібна
  • Одна модель у пам'яті
  • Оптимізує SFT loss + OR-weighted rejection loss одночасно
  • Гіперпараметр λ (lambda) — вага odds ratio loss
L_ORPO = L_SFT + λ * L_OR

L_SFT = -log P(y_w | x)  # звичайний SFT loss на chosen відповідях

L_OR = -log(sigmoid(log(odds_ratio(y_w, x) / odds_ratio(y_l, x))))
де odds_ratio(y, x) = P(y|x) / (1 - P(y|x))

Реалізація ORPO через TRL

from trl import ORPOTrainer, ORPOConfig
from peft import LoraConfig
from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Meta-Llama-3.1-8B-Instruct",
    torch_dtype=torch.bfloat16,
    device_map="auto"
)

orpo_config = ORPOConfig(
    output_dir="./orpo-model",
    num_train_epochs=3,
    per_device_train_batch_size=2,
    gradient_accumulation_steps=8,
    learning_rate=8e-6,           # ORPO зазвичай потребує нижчий lr, ніж SFT
    lr_scheduler_type="linear",
    warmup_ratio=0.1,
    beta=0.1,                     # λ в ORPO — вага OR loss (у TRL називається beta)
    max_length=2048,
    max_prompt_length=512,
    bf16=True,
    remove_unused_columns=False,
    logging_steps=10,
)

trainer = ORPOTrainer(
    model=model,
    args=orpo_config,
    train_dataset=train_dataset,  # Формат: prompt, chosen, rejected
    eval_dataset=eval_dataset,
    peft_config=LoraConfig(
        r=16,
        lora_alpha=32,
        target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
        task_type="CAUSAL_LM",
    ),
)

trainer.train()

Формат датасету для ORPO

Ідентичний DPO — пари переваг:

dataset = {
    "prompt": "Як правильно написати технічне завдання?",
    "chosen": "Технічне завдання включає декілька обов'язкових розділів: мета проекту, функціональні вимоги (з пріоритетами за MoSCoW), нефункціональні вимоги (продуктивність, безпека), обмеження, критерії прийняття...",
    "rejected": "Пиши що ти хочеш, щоб розробники зрозуміли завдання"
}

Порівняння ефективності: ORPO vs DPO vs SimPO на практиці

Незалежні бенчмарки на AlpacaEval 2.0 (Win Rate vs GPT-4 Turbo):

Метод Win Rate Пам'ять (7B) Час навчання
SFT only ~5%
DPO ~15–20% 2× (ref model) 1.3×
ORPO ~18–22%
SimPO ~20–25%

ORPO перевищує DPO за ефективністю пам'яті при порівнянній якості. SimPO (Simple Preference Optimization) — свіжіший метод, який часто показує дещо кращі результати.

Практичний case study: вирівнювання коду під стандарти команди

Завдання: дофіно-tune модель для code review під конкретні стандарти коду компанії — правила найменування, обов'язкові паттерни безпеки, заборонені практики.

Проблема з чистим SFT: модель добре відтворює «правильні» ревю, але не штрафує за ігнорування нарушень. Потрібна штрафна складова.

ORPO-датасет: 1800 пар. Chosen — ревю, що виявляє всі нарушення стандартів. Rejected — ревю, яке пропустило критичні нарушення або генерувало хибні зауваження.

Базова модель: Qwen2.5-Coder-7B-Instruct.

Конфігурація: ORPO, β=0.1, lr=5e-6, 2 епохи.

Результати:

  • Recall нарушень стандартів: 0.67 → 0.91
  • Precision зауважень (без хибних позитивів): 0.71 → 0.88
  • False negative rate (пропуск критичних нарушень): 28% → 7%
  • Час навчання: 3.5ч на 1×A100 40GB (без overhead reference model)

ORPO vs DPO: коли вибирати

Вибирайте ORPO:

  • Обмежені GPU-ресурси (одна модель замість двох)
  • Немає хорошої SFT-дофіно-tuned reference model
  • Завдання середньої складності alignment

Вибирайте DPO:

  • Вже є високоякісна SFT reference model
  • Потрібна точна настройка KL-дивергенції
  • Накопиче досвід роботи з DPO пайплайном

Вибирайте SimPO:

  • Потрібен максимальний win rate на бенчмарках
  • Є ресурси на підбір γ та β параметрів

Часові рамки

  • Збір датасету переваг: 3–5 тижнів
  • ORPO навчання (7B, LoRA, A100): 3–8 годин
  • λ/β ітерації: 3–5 днів
  • Оцінка (LLM-as-judge + людина): 1 тиждень
  • Всього: 5–8 тижнів