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.
Предварительные знания
Когда 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 не покрывает:
- **Стиль и формат** - модель должна генерировать ответы в строго определённом формате (JSON-schema, tone of voice, корпоративный стиль). Few-shot работает, но нестабильно при сложных форматах: один раз добавит лишнее поле, второй - забудет обязательное.
- **Специализированные знания** - медицинская терминология, юридический язык, внутренний жаргон компании. RAG подтягивает факты, но модель не «понимает» предметную область - она не знает, что «форс-мажор» в договоре означает конкретную правовую конструкцию.
- **Latency и cost** - fine-tuned GPT-4o-mini может заменить GPT-4o с few-shot, давая сопоставимое качество при 10-20x снижении стоимости. При 100K запросах в день это тысячи долларов разницы.
| Сценарий | Подход | Почему |
|---|---|---|
| Ответ на FAQ по документации | RAG | Нужны актуальные факты, а не переобучение модели |
| Модель всегда отвечает JSON с точной schema | Fine-tuning | Формат закрепляется в весах, 100% compliance |
| Классификация тикетов в 47 категорий | Fine-tuning | Few-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 классов) | 50 | 200-500 | Баланс классов критичен |
| Классификация (10+ классов) | 200 | 500-2000 | Минимум 20 примеров на класс |
| Генерация в формате | 100 | 500-1000 | Разнообразие входных данных |
| Tone of voice / стиль | 200 | 1000+ | Чем тоньше стиль, тем больше примеров |
| Суммаризация | 50 | 300-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 Input | Inference Output | Пример: 500 примеров по 500 токенов, 3 epochs |
|---|---|---|---|---|
| gpt-4o-mini | 3.00 | 0.30 | 1.20 | ~2.25 |
| gpt-4o | 25.00 | 3.75 | 15.00 | ~18.75 |
| gpt-3.5-turbo | 8.00 | 3.00 | 6.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, но медленнее |
| alpha | Scaling factor | 16-128 (обычно 2×r) | Контролирует силу адаптации |
| target_modules | Какие слои адаптировать | q_proj, v_proj | Больше слоёв → лучше quality, больше VRAM |
| dropout | Regularization | 0.05-0.1 | Защита от overfitting |
**Практический пример: LoRA fine-tuning с Hugging Face PEFT** (фреймворк от Unsloth/Axolotl упрощает это ещё сильнее, но PEFT - основа):
**Сравнение подходов к fine-tuning:**
| Метод | VRAM (7B модель) | Trainable params | Скорость | Качество |
|---|---|---|---|---|
| Full fine-tuning | ~60 GB | 100% | Медленно | Лучшее |
| LoRA (r=16) | ~18 GB | 0.5% | 3-5x быстрее | 95-99% от full |
| QLoRA (r=16, 4bit) | ~6 GB | 0.5% | 2-3x быстрее | 93-97% от full |
| OpenAI API fine-tuning | 0 (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