Вы наняли подрядчика по AI. Он говорит: «Нам нужно дообучить модель, это будет стоить 10 тысяч». А вы подозреваете, что можно просто написать инструкцию в промпте и сэкономить. И скорее всего, вы правы.
Fine-tuning (дообучение модели на ваших данных) - самый переоценённый инструмент в работе с AI. Команды кидаются дообучать там, где хватило бы нормального системного промпта с пятью примерами. И наоборот: часть задач промптом не закрыть в принципе, и тогда дообучение незаменимо.
Разобраться помогает простое дерево решений. Эта статья даст вам именно его. И покажет на пальцах, когда дообучение окупается, а когда выкидывает деньги в трубу.
Зачем это бизнесу
Цена ошибки тут несимметричная. Сделать дообучение там, где хватило бы промпта - это потратить от 2 до 50 тысяч долларов на проект, который не нужен. Не сделать дообучение там, где оно нужно - это годами платить за лишние токены в каждом запросе и терпеть медленные ответы.
Как владелец бизнеса, вы должны уметь различать эти два сценария. Не для того, чтобы кодить самому. А чтобы понимать, когда команда инженеров приходит с предложением «давайте дообучим модель» - это разумно или это карго-культ.
Дерево решений: промпт -> few-shot -> RAG -> дообучение
Правило простое: сначала пробуем дешёвое, потом дорогое. Порядок такой.
1. Zero-shot работа через промпт. Просто пишем модели задачу системным промптом. Без примеров. Большинство задач закрываются хорошо составленным системным промптом с чёткими инструкциями и ограничениями. Стоимость - ноль дополнительных токенов. Время - от часа до четырёх.
2. Few-shot примеры. Добавляем 3-10 примеров вход/выход прямо в промпт. Модель калибруется под нужный формат и стиль без изменения весов модели. Стоимость - плюс 100-500 токенов на каждый запрос. Хорошо работает для форматирования, тона голоса, специфического стиля ответа.
3. RAG. Когда задача требует знаний, которых у модели нет: документы компании, актуальные данные, своя база знаний. Стоимость - примерно 0,002-0,01 доллара за запрос на поиск.
4. Дообучение. Когда три предыдущих шага не дают нужного результата. Критерии перехода - ниже в статье.
5. Полное обучение с нуля. Только если нужны знания специфического языка или домена, которых нет вообще нигде. Стоит миллионы долларов. Для 99% продуктов не актуально.
Короткое дерево решений в виде вопросов:
Задача - это формат, стиль, тон? -> Few-shot, не дообучение
Задача требует актуальных или закрытых данных? -> RAG, не дообучение
Few-shot с 10 примерами уже работает? -> Дообучение не нужно
Есть больше 500 качественных примеров? -> Дообучение имеет смысл
Нужна задержка меньше 500 мс при длинном контексте? -> Дообучение (сжимаем промпт)
Когда дообучение оправдано
Разберём на примере стройфирмы. У вас есть прайс на работы и типовой договор подряда. Вы хотите, чтобы AI-помощник отвечал клиентам в вашем стиле - строго, по делу, с отсылками к конкретным пунктам договора. Few-shot не тянет тысячи пограничных случаев. Дообучение запекает поведение в веса модели.
Специфичный стиль или формат. Если нужен очень характерный голос, юридический язык конкретной организации или точный формат вывода, который сложно описать правилами. Few-shot не тянет тысячи пограничных случаев. Дообучение запекает поведение в веса модели.
Уменьшение размера контекста. Длинный системный промпт с 20 примерами добавляет около 2000 токенов в каждый запрос. При миллионе запросов в месяц это шесть тысяч долларов в месяц только на системный промпт по тарифам Sonnet. Дообученной модели эти примеры не нужны, поведение уже в весах. Экономия на запусках окупает обучение за 2-3 месяца.
Требования к задержке. Дообучение на меньшей модели плюс короткий промпт быстрее, чем большая модель плюс длинный промпт. Дообученный GPT-4o-mini может приближаться по качеству к базовому GPT-4o на специфической задаче. При этом задержка в два раза меньше.
Закрытые знания без RAG. Если данные слишком чувствительны для хранилища поиска. Или если доступ к ним нужен без задержки на шаг поиска. Дообучение позволяет вшить знания прямо в модель.
Когда дообучение провалится
Мало данных. Меньше 500 примеров для обучения - высокий риск переобучения. Модель запоминает конкретные примеры и не обобщает. Признак - отличные показатели на обучающих данных, плохие на отложенной выборке.
Задача требует свежих знаний. Дообученная модель знает то, что было в обучающих данных на момент обучения. Свежие цены, текущие события, меняющиеся документы - это RAG, не дообучение.
Нет способа оценить результат. Без чётких метрик невозможно понять, стало ли лучше после дообучения. «Мне кажется лучше» - недостаточно для решения о запуске в боевую среду.
Задача широкая, а не узкая. Дообучение улучшает специфическое поведение за счёт общего. Если нужна хорошая модель для всего - базовая модель плюс хороший промпт работает лучше.
Подготовка набора данных для SFT
SFT (supervised fine-tuning, контролируемое дообучение) - это самый простой и распространённый способ дообучения. Модели показывают пары вопрос-ответ, она запоминает паттерн.
OpenAI использует формат JSONL с полем messages в стандартной структуре ChatML.
Этот код берёт ваши примеры в виде словарей и собирает из них корректный обучающий файл. Каждая строка - один пример с системным сообщением, вопросом и идеальным ответом.
import json
def prepare_training_file(examples: list[dict], output_path: str):
"""Конвертация примеров в OpenAI JSONL формат."""
with open(output_path, 'w', encoding='utf-8') as f:
for ex in examples:
record = {
"messages": [
{
"role": "system",
"content": "Ты помощник службы поддержки. Отвечай кратко и по существу."
},
{
"role": "user",
"content": ex["user_message"]
},
{
"role": "assistant",
"content": ex["ideal_response"]
}
]
}
f.write(json.dumps(record, ensure_ascii=False) + '\n')
prepare_training_file(training_data, "train.jsonl")
Дальше файл нужно проверить через OpenAI. Этот код загружает обучающий файл и показывает его статус. Статус processed означает, что файл валиден и можно запускать обучение.
from openai import OpenAI
import json
client = OpenAI()
file_response = client.files.create(
file=open("train.jsonl", "rb"),
purpose="fine-tune"
)
print(f"File ID: {file_response.id}")
print(f"Status: {file_response.status}")
Типичные ошибки валидации: превышение лимита токенов на примере (больше 4096), отсутствие обязательных полей, неверная роль. Проверить до загрузки можно скриптом из OpenAI cookbook.
Качество данных важнее количества. 200 идеальных примеров лучше 2000 средних. Рабочий процесс такой: эксперт размечает 100-200 примеров руками. Ещё 300-500 генерируются синтетически с ручной проверкой. 20% от общего объёма откладывается в отложенную выборку для оценки.
OpenAI Fine-tuning API
Запуск дообучения через OpenAI требует трёх вещей: загруженного обучающего файла, валидационного файла и выбора базовой модели.
Этот код стартует задачу дообучения. Параметр n_epochs определяет, сколько раз модель пройдёт по всему набору данных. Три эпохи - стандартный выбор для большинства задач.
from openai import OpenAI
client = OpenAI()
job = client.fine_tuning.jobs.create(
training_file="file-xxxxxxxxxxxx",
validation_file="file-yyyyyyyyyyyy",
model="gpt-4o-mini-2024-07-18",
hyperparameters={
"n_epochs": 3,
"batch_size": "auto",
"learning_rate_multiplier": 1.8
},
suffix="support-v1"
)
print(f"Job ID: {job.id}")
import time
while True:
job = client.fine_tuning.jobs.retrieve(job.id)
print(f"Status: {job.status}, trained_tokens: {job.trained_tokens}")
if job.status in ("succeeded", "failed"):
break
time.sleep(60)
if job.status == "succeeded":
response = client.chat.completions.create(
model=job.fine_tuned_model,
messages=[{"role": "user", "content": "Как сбросить пароль?"}]
)
Этот код получает список событий обучения. Главное, на что смотрим - training_loss и valid_loss. Если valid_loss растёт при падении training_loss - это переобучение, нужно меньше эпох.
events = client.fine_tuning.jobs.list_events(fine_tuning_job_id=job.id)
for event in events.data:
print(f"{event.created_at}: {event.message}")
Стоимость OpenAI FT на 2026 год:
- Обучение GPT-4o-mini: 3 доллара за миллион обучающих токенов
- Запуск дообученной модели: 0,60 доллара за миллион входных токенов (против 0,15 у базовой) плюс 2,40 за миллион выходных (против 0,60)
- Хранение своей модели: 3 доллара в месяц
Anthropic Model Customization
Anthropic Model Customization доступен в 2026 году через API в статусе публичной беты для одобренных пользователей. Формат данных такой же, как у OpenAI - JSONL с messages.
Ключевые отличия от OpenAI:
- Минимум 1000 примеров (у OpenAI - 10)
- Обязательная валидационная выборка (10% от обучающей)
- Обучение только на Claude Haiku 3 (не на Sonnet или Opus)
- Стоимость обучения: 5 долларов за миллион токенов
Этот код создаёт задачу дообучения через Anthropic SDK. Логика та же, что у OpenAI, отличаются только параметры и доступные модели.
import anthropic
client = anthropic.Anthropic()
job = client.fine_tuning.jobs.create(
training_file="file-xxxx",
validation_file="file-yyyy",
model="claude-haiku-3-20240307",
hyperparameters={"n_epochs": 3}
)
Enterprise-доступ даёт больше возможностей: дообучение Sonnet, выделенные точки запуска, гарантии по времени обучения.
Окупаемость: дообучение против длинного промпта
Когда дообучение окупается по деньгам, считаем напрямую.
Этот код считает срок окупаемости дообучения. На вход - количество запросов в месяц, экономия токенов на каждом запросе (за счёт убирания few-shot примеров), цена токена и стоимость обучения. На выход - месяцы до окупаемости и годовая экономия.
def ft_roi(monthly_requests: int, tokens_saved_per_request: int,
input_price_per_1m: float, ft_cost: float) -> dict:
"""Расчёт точки окупаемости FT."""
monthly_savings = monthly_requests * tokens_saved_per_request * input_price_per_1m / 1_000_000
months_to_roi = ft_cost / monthly_savings if monthly_savings > 0 else float('inf')
return {
"monthly_savings_usd": round(monthly_savings, 2),
"months_to_roi": round(months_to_roi, 1),
"annual_savings_usd": round(monthly_savings * 12, 2)
}
result = ft_roi(
monthly_requests=500_000,
tokens_saved_per_request=1500,
input_price_per_1m=0.60,
ft_cost=2000
)
print(result)
При 500 тысяч запросов в месяц дообучение окупается за 4-5 месяцев. При 50 тысячах - за 44 месяца. Это явно невыгодно.
Оценка после дообучения
Отложенная выборка. 15-20% данных, которые не участвовали в обучении. Сравниваем базовую модель с few-shot и дообученную модель по главной метрике задачи.
Регрессионный тест. Дообучение улучшает специфическое поведение. Но может ухудшить общие способности модели: следование инструкциям, рассуждения. Обязательно тестировать на задачах вне обучающей выборки.
Этот код задаёт две метрики оценки. Первая проверяет, что модель хорошо решает специфическую задачу. Вторая проверяет, что общие способности не деградировали. Дообучение должно улучшить первую и не ухудшить вторую.
from deepeval.metrics import GEval
from deepeval import evaluate
specialized_metric = GEval(
name="Domain Accuracy",
criteria="Ответ корректен для задачи службы поддержки, кратко и по делу",
threshold=0.85
)
general_metric = GEval(
name="General Capability",
criteria="Ответ логичен, грамматически корректен и содержательен",
threshold=0.75
)
Частые вопросы
У нас 200 примеров - стоит ли делать дообучение?
При 200 примерах риск переобучения высокий. Сначала попробуйте few-shot: 5-15 примеров в промпт. Если few-shot даёт 80% нужного поведения - дообучение не нужно. Если всё равно хочется - соберите ещё 300-400 примеров через синтетику и ручную разметку до старта обучения.
Как совместить RAG и дообучение?
Это не конкуренты. Типичная связка такая: дообучение отвечает за стиль ответа, формат и доменное поведение. RAG обеспечивает свежими данными. Модель, обученная на примерах ответов с контекстом, лучше использует найденные куски, чем базовая модель.
Дообученные модели OpenAI устаревают - как планировать миграцию?
OpenAI выводит дообученные модели из строя вместе с базовыми. Обычно даётся 3-6 месяцев после объявления. Плановая миграция выглядит так: каждый квартал проверяем календарь устаревания. Храним обучающие данные для быстрого переобучения на новой базе. Само переобучение занимает 1-3 дня.
Anthropic Model Customization доступен всем?
Пока публичная бета с ограниченным доступом. Заявка подаётся через console.anthropic.com. Одобрение занимает от нескольких дней до нескольких недель. Enterprise-клиенты получают доступ автоматически.
Как защитить закрытые данные при облачном дообучении?
OpenAI и Anthropic заявляют, что не используют ваши данные для обучения базовых моделей. Для максимальной защиты - самостоятельное дообучение на открытых моделях (Llama 3, Mistral) через LoRA или QLoRA на своём железе. LoRA (Low-Rank Adaptation) - метод дообучения, который меняет не всю модель, а небольшие добавки к её весам. QLoRA - его экономная версия с квантизацией.
Что дальше
Если нужно дообучение открытых моделей на своём железе с полным контролем данных - смотрите статью про LoRA и QLoRA. А для начала просто проверьте своё дерево решений: хватит ли промпта?
AI Компас (t.me/kosmoslab_ai) - канал для предпринимателей в РФ и СНГ, которые применяют AI в своём бизнесе без программиста. Разбираем инструменты и схемы - без курсов и теории.