AI-инжиниринг

Fine-tuning: последнее средство, не первое - дообучение модели на своих данных

Цели урока

  • Определять, когда fine-tuning оправдан, а когда достаточно prompt engineering или RAG
  • Подготавливать и валидировать training data в JSONL формате
  • Запускать fine-tuning через OpenAI API (`8/1M` токенов для gpt-4o-mini) и мониторить процесс
  • Оценивать качество fine-tuned модели через automated metrics и LLM-as-Judge
  • Понимать LoRA (Hu et al. 2022) и QLoRA (Dettmers 2023) - эффективный fine-tuning open-source моделей на consumer GPU

Fine-tuning - последнее средство, не первое. RAG дешевле, prompt engineering быстрее. Fine-tuning нужен когда нужен специфический стиль, формат или поведение, которое нельзя получить через промпт. И стоит это от USD 50 (LoRA на llama-3-8b за 2 часа на RTX 4090) до USD 100K+ (полный fine-tune GPT-4). Разрыв в 2000 раз. Один стартап сократил расходы с USD 47,000 до USD 6,000 в месяц - просто переключившись на fine-tuned mini-модель вместо gpt-4o.

  • Bloomberg fine-tuned LLM на 50 годах финансовых данных - BloombergGPT превосходит GPT-4 на финансовых задачах при меньшем размере
  • Stripe fine-tuned модель для fraud detection - 30% улучшение precision при том же recall, без увеличения latency
  • LoRA (Hu et al. 2022) позволяет fine-tune 70B модель на одном A100 - то, что раньше требовало кластер из 8 машин
  • OpenAI сообщает: 40% enterprise клиентов используют fine-tuning gpt-4o-mini для снижения costs при сохранении качества

LoRA и революция в fine-tuning

**2022**: Edward Hu et al. публикуют LoRA: Low-Rank Adaptation of Large Language Models. Ключевая идея - weight matrix не нужно обновлять полностью, достаточно добавить две низкоранговые матрицы через rank decomposition. Trainable параметров становится 0.5% от модели. Fine-tuning 7B модели на одной GPU из недостижимой мечты превращается в рутину. **2023**: Dettmers et al. публикуют QLoRA - та же идея плюс 4-bit квантизация базовой модели. 70B модель помещается в 48 GB VRAM. Llama 3.1 8B - в одну RTX 4090 за `800.` Весь open-source экосистема перестраивается вокруг PEFT: Unsloth, Axolotl, LLaMA-Factory. Fine-tuning перестаёт быть прерогативой BigTech.

Предварительные знания

  • How LLMs Work: Tokens, Embeddings, Attention
  • Evaluation: How to Know Your LLM Didn't Break After Deploy

Когда fine-tuning оправдан: decision framework

Fine-tuning - это последнее средство, не первое. RAG дешевле. Prompt engineering быстрее. Few-shot работает в 80% случаев. Но есть задачи, где промпт физически не справится: строгий JSON-формат в 100% ответов, корпоративный tone of voice на масштабе, классификация в 47 категорий с примерами которые не влезают в контекст. Вот тогда и нужен fine-tuning.

Стоимость вопроса: LoRA на llama-3-8b - около USD 50 и 2 часа на RTX 4090. Полный fine-tuning GPT-4 - USD 100K+. Разрыв в 2000 раз. Поэтому перед тем как запустить job, стоит убедиться, что проблема не решается уровнем ниже.

**Fine-tuning решает три категории задач**, которые prompt engineering не покрывает:

  1. **Стиль и формат** - модель должна генерировать ответы в строго определённом формате (JSON-schema, tone of voice, корпоративный стиль). Few-shot работает, но нестабильно при сложных форматах: один раз добавит лишнее поле, второй - забудет обязательное.
  2. **Специализированные знания** - медицинская терминология, юридический язык, внутренний жаргон компании. RAG подтягивает факты, но модель не «понимает» предметную область - она не знает, что «форс-мажор» в договоре означает конкретную правовую конструкцию.
  3. **Latency и cost** - fine-tuned GPT-4o-mini может заменить GPT-4o с few-shot, давая сопоставимое качество при 10-20x снижении стоимости. При 100K запросах в день это тысячи долларов разницы.
СценарийПодходПочему
Ответ на FAQ по документацииRAGНужны актуальные факты, а не переобучение модели
Модель всегда отвечает JSON с точной schemaFine-tuningФормат закрепляется в весах, 100% compliance
Классификация тикетов в 47 категорийFine-tuningFew-shot не поместит 47 примеров в prompt
Чатбот знает про продуктRAG + few-shotДанные о продукте меняются, fine-tuning устареет
Модель пишет как юристFine-tuningСтиль и терминология - это pattern в весах
Суммаризация в 2 предложенияFew-shotДостаточно 2-3 примеров в prompt

**Anti-pattern: fine-tuning для фактов.** Если модель должна «знать» актуальную информацию (цены, наличие, расписание) - это RAG, не fine-tuning. Fine-tuned модель не обновляется при изменении данных, а переобучение стоит денег и времени.

Fine-tuning - это обучение модели с нуля на своих данных

Fine-tuning - это адаптация уже предобученных весов. Модель не учится заново, она точечно корректирует существующие паттерны

Подготовка данных: JSONL формат и best practices

Качество fine-tuning на 80% определяется качеством данных. Не количеством - качеством. Модель выучит ровно то, что в training set: включая ошибки, inconsistencies и плохие паттерны. Мусор на входе - мусор в весах.

OpenAI, Anthropic и другие провайдеры используют **JSONL формат** (JSON Lines) - каждая строка файла это один training example в формате chat completion:

**Скрипт подготовки данных** - автоматизация конвертации и валидации:

**Рекомендации по объёму данных** зависят от задачи:

ЗадачаМинимум примеровРекомендуетсяПримечание
Классификация (2-5 классов)50200-500Баланс классов критичен
Классификация (10+ классов)200500-2000Минимум 20 примеров на класс
Генерация в формате100500-1000Разнообразие входных данных
Tone of voice / стиль2001000+Чем тоньше стиль, тем больше примеров
Суммаризация50300-500Длинные примеры дороже по токенам

**Правило 10x:** если после 10-кратного увеличения датасета метрики не улучшаются - проблема не в количестве данных. Скорее всего нужно улучшить качество примеров, добавить разнообразие или пересмотреть задачу.

**Типичные ошибки при подготовке данных:**

  • **Однообразные примеры** - 500 примеров одного паттерна хуже, чем 100 разнообразных. Модель переобучится на один шаблон и сломается на любом отклонении.
  • **Inconsistent labels** - если в одних примерах email classified как «spam», а похожий email как «marketing» - модель не выучит правило, она запомнит шум.
  • **Утечка test set** - если validation examples попали в training set, метрики будут завышены, а модель не обобщит. Это классическая ловушка, которую легко пропустить при автоматической генерации датасета.
  • **Слишком длинный system prompt** - system message дублируется в каждом примере и оплачивается при training. Короткий system prompt экономит деньги.

В JSONL файле для fine-tuning 200 примеров классификации email. 190 из них - категория 'general', 5 - 'urgent', 5 - 'spam'. Что произойдёт?

OpenAI Fine-tuning API: практический pipeline

OpenAI предоставляет managed fine-tuning service: никаких GPU, никакой инфраструктуры, никакого CUDA. Загружается JSONL-файл, запускается job, через 30-60 минут готова fine-tuned модель с собственным ID. Inference - через тот же Chat Completions API.

Стоимость training для gpt-4o-mini - USD 3 за миллион токенов. 500 примеров по 500 токенов, 3 эпохи - около USD 2.25 за весь job. Это меньше чашки кофе за модель, которую потом можно гонять по USD 0.30/USD 1.20 за inference вместо USD 2.50/USD 10.00 у базового gpt-4o.

**Полный pipeline fine-tuning** через OpenAI API:

**Стоимость fine-tuning** зависит от модели и объёма данных:

МодельTraining (за 1M токенов)Inference InputInference OutputПример: 500 примеров по 500 токенов, 3 epochs
gpt-4o-mini3.000.301.20~2.25
gpt-4o25.003.7515.00~18.75
gpt-3.5-turbo8.003.006.00~6.00

**Экономика fine-tuning:** fine-tuned gpt-4o-mini стоит USD 0.30/USD 1.20 за inference (input/output за 1M токенов). Обычный gpt-4o стоит USD 2.50/USD 10.00. Если fine-tuned mini даёт сопоставимое качество - экономия **8x на input и 8x на output** при каждом вызове. При 100K запросов в день это тысячи долларов в месяц.

**Rate limits для fine-tuned моделей** отличаются от базовых. Новая fine-tuned модель начинает с низких лимитов (около 100 RPM). Для production нагрузки нужно запросить увеличение через OpenAI dashboard.

Fine-tuned модель gpt-4o-mini обучена на 500 примерах юридической классификации. Как использовать её в production?

Evaluation после fine-tuning: как понять, что модель стала лучше

Training loss падает - это не значит, что модель стала лучше. Training loss - это мера того, насколько хорошо модель запомнила обучающую выборку. Но задача не в запоминании, а в обобщении.

Evaluation pipeline нужно настроить **до** начала fine-tuning. Не после - тогда будет не с чем сравнивать. Три уровня, от быстрого к точному:

**Практическая evaluation pipeline** - автоматизация Level 1 и Level 2:

**Ключевые метрики для мониторинга:**

  • **Training loss vs Validation loss** - если training loss падает, а validation растёт - модель переобучается. Лучший checkpoint - конец первой эпохи, где validation loss минимален.
  • **Format compliance rate** - какой % ответов fine-tuned модели соответствует ожидаемому формату. Цель: >98%.
  • **Regression на базовых задачах** - fine-tuning может ухудшить general capabilities. Тестировать не только target task, но и общие способности.
  • **Latency** - fine-tuned модели обычно имеют ту же latency, но проверять стоит, особенно при высокой нагрузке.

**Catastrophic forgetting** - явление из PEFT-литературы: fine-tuning на узкой задаче может ухудшить модель в других областях. Если fine-tuned gpt-4o-mini перестала считать математику - это оно. Решение: добавить в training set примеры general tasks (10-20% от объёма).

Training loss fine-tuning job стабильно снижается от 0.5 до 0.05 за 3 эпохи. Validation loss снизился до 0.15 на первой эпохе, а затем начал расти до 0.3. Что это означает?

LoRA и QLoRA: эффективный fine-tuning без полного переобучения

Полный fine-tuning обновляет **все** веса модели. Для Llama 3.1 70B - 70 миллиардов параметров, 8 штук A100 80GB, недели обучения. Но в 2022 году Edward Hu et al. опубликовали LoRA - и правила игры поменялись.

**LoRA (Low-Rank Adaptation, Hu et al. 2022)** - метод PEFT (Parameter-Efficient Fine-Tuning), который обучает только маленькие «адаптеры», прикреплённые к замороженным весам модели. Вместо обновления матрицы 4096x4096 (16M параметров) LoRA обучает две маленькие матрицы 4096x16 и 16x4096 (131K параметров) через rank decomposition. В **125 раз меньше** параметров - и 95-99% качества полного fine-tuning.

В 2023 году Dettmers et al. пошли дальше: **QLoRA** = LoRA + 4-bit квантизация базовой модели. Llama 3.1 8B в 4-bit занимает 3.5 GB вместо 28 GB. Плюс LoRA-адаптеры в float16 - ещё 80 MB. Итого fine-tuning 8B модели помещается в одну RTX 4090 за 2 часа.

**LoRA параметры** и их влияние на результат:

ПараметрОписаниеТипичное значениеВлияние
rank (r)Размер адаптера (rank decomposition)8-64Больше r → больше capacity, но медленнее
alphaScaling factor16-128 (обычно 2×r)Контролирует силу адаптации
target_modulesКакие слои адаптироватьq_proj, v_projБольше слоёв → лучше quality, больше VRAM
dropoutRegularization0.05-0.1Защита от overfitting

**Практический пример: LoRA fine-tuning с Hugging Face PEFT** (фреймворк от Unsloth/Axolotl упрощает это ещё сильнее, но PEFT - основа):

**Сравнение подходов к fine-tuning:**

МетодVRAM (7B модель)Trainable paramsСкоростьКачество
Full fine-tuning~60 GB100%МедленноЛучшее
LoRA (r=16)~18 GB0.5%3-5x быстрее95-99% от full
QLoRA (r=16, 4bit)~6 GB0.5%2-3x быстрее93-97% от full
OpenAI API fine-tuning0 (managed)Неизвестно30-60 мин

Fine-tuning = обучение с нуля - нужно много данных и GPU

Fine-tuning адаптирует уже предобученные веса; LoRA/QLoRA делает это за сотни примеров на одной GPU

Pre-trained модель уже содержит знания о языке, логике, форматах - это результат миллиардов токенов pre-training. Fine-tuning лишь сдвигает веса в нужную сторону. С LoRA обновляется 0.5% параметров; с QLoRA вся базовая модель сжимается до 4-bit - и остаётся места для адаптеров. Поэтому не нужны тысячи примеров: 200-500 разнообразных часто достаточно.

Fine-tuning заменяет RAG - дообученная модель знает всё нужное

Fine-tuning и RAG решают принципиально разные задачи и хорошо комбинируются

Fine-tuning меняет поведение модели: как она отвечает, в каком формате, с каким стилем. RAG меняет что она знает: подтягивает актуальные факты из источника в контекст. Если обучить модель на прайс-листе - через месяц цены устареют. RAG всегда берёт свежее. Оптимальная архитектура: RAG для фактов + fine-tuning для стиля обработки этих фактов.

Итоги

  • Fine-tuning - последнее средство: сначала zero-shot, few-shot, RAG. Fine-tuning только когда стиль/формат/поведение нельзя получить промптом
  • Данные важнее количества: 200 разнообразных примеров лучше 2000 однотипных. Мусор на входе - мусор в весах
  • OpenAI fine-tuning API: JSONL → upload → job → 30-60 мин → модель с тем же API. 3/1M токенов для gpt-4o-mini
  • Evaluation обязательна до старта: training loss != quality. Validation loss, format compliance, LLM-as-Judge
  • LoRA (Hu et al. 2022) обучает 0.5% параметров; QLoRA (Dettmers 2023) добавляет 4-bit - fine-tuning 8B на RTX 4090 за 50
  • Fine-tuning != RAG: один меняет поведение, второй - знания. Лучшие системы комбинируют оба подхода

Что дальше

Fine-tuning - один из инструментов кастомизации. Следующие шаги: open-source модели для полного контроля, distillation для экстремальной оптимизации, local deployment через Ollama/vLLM.

  • Open Source модели — LoRA/QLoRA применяется к open-source моделям - Llama, Mistral, Qwen
  • Model Distillation — Distillation + fine-tuning = маленькая модель с качеством большой
  • Local LLM — Fine-tuned open-source модель можно запустить локально через Ollama/vLLM

Связанные уроки

  • aie-03-llm-fundamentals — Fine-tuning опирается на основы архитектуры модели
  • aie-31-evaluation — Eval доказывает, что fine-tuning поднял качество
  • aie-37-open-source-models — Открытые веса нужны для полного fine-tuning
  • aie-38-distillation — Дистилляция - более дешёвый альтернативный путь
  • ml-41-transfer-learning — Адаптация предобученной модели под новую задачу
  • ml-07
Fine-tuning: последнее средство, не первое - дообучение модели на своих данных

0

1

Войти

Pre-trained модель уже «знает» язык, логику, форматы. Fine-tuning лишь сдвигает веса в нужную сторону - как настройка уже собранного инструмента, а не изготовление нового. Поэтому хватает сотен примеров, а не миллиардов токенов.

Компания хочет, чтобы LLM всегда отвечала в JSON определённой schema и использовала корпоративный tone of voice. Какой подход оптимален?

Зависит от данных

**Merge & Deploy:** после обучения LoRA-адаптер можно «слить» (merge) с базовой моделью через `model.merge_and_unload()`, получив обычную модель без overhead на inference. Или держать адаптер отдельно и грузить динамически - удобно для A/B testing разных адаптеров на одной базовой модели через vLLM.

Fine-tuning заменяет RAG - дообученная модель «знает» всё из обучающих данных

Fine-tuning и RAG решают разные задачи. Fine-tuning - про стиль, формат, поведение. RAG - про актуальные факты

Fine-tuned модель не «помнит» документы как базу данных - она усваивает паттерны генерации. Если продукт обновил цены или расписание, fine-tuned модель выдаст устаревшее. RAG всегда берёт из актуального источника. Лучшие системы комбинируют оба подхода: RAG подтягивает факты, а fine-tuning задаёт стиль обработки.

Задача: fine-tune Llama 3.1 8B на одной NVIDIA RTX 4090 (24 GB VRAM). Полный fine-tuning требует ~60 GB VRAM. Какой подход позволит обучить модель?