На прошлой неделе коллега спросил: "Зачем вообще файнтюнить модель, если можно нормальный промпт написать?" Я задумался. Потом посмотрел на свои эксперименты за последние полгода — где-то файнтюнил, где-то обходился промптами, где-то сначала делал одно, а потом переделывал в другое. И понял, что у меня уже сложилась какая-то интуиция, когда что работает.
Делюсь наблюдениями. Без "революционных подходов", просто истории из практики.
Промпты: быстро, гибко, но упираешься в потолок
Промпт-инжиниринг — это когда ты объясняешь модели что делать прямо в запросе. Добавляешь примеры, уточняешь формат, пишешь пошаговые инструкции. Я начинаю с этого почти всегда, потому что это быстро.
Месяц назад делал бота для саппорта. Нужно было отвечать на вопросы клиентов про продукт. Написал промпт на страницу: описание продукта, примеры хороших ответов, тон общения, что делать если не знаешь ответа. Заработало за час. Потом неделю дорабатывал промпт — добавлял edge cases, уточнял формулировки, показывал примеры.
Промпты хорошо работают когда задача понятная, а примеры можно описать словами. "Отвечай вежливо", "используй эмодзи", "если вопрос про цены — направь к менеджеру". Модель это понимает.
Но есть проблема. Промпт съедает токены. Мой разросся до 2000 токенов — каждый запрос стоил денег, а ещё увеличивалась задержка. Пробовал сокращать, но качество падало. Плюс промпт всё равно оставался "общим" — модель понимала инструкции, но не схватывала тонкости стиля. Иногда отвечала слишком формально, иногда наоборот. Подкручивать каждую мелочь в промпте стало утомительно.
Fine-tuning: когда нужен свой стиль или специфика
Файнтюнинг — это дообучение модели на твоих данных. Ты показываешь ей примеры пар "запрос → ответ", и она учится отвечать похожим образом. Звучит сложно, на практике сейчас это проще чем кажется — особенно с GPT-3.5 или GPT-4, где есть API для файнтюнинга.
Я решил попробовать с тем же саппорт-ботом. Собрал 300 реальных диалогов с клиентами (где операторы отвечали хорошо), почистил, привёл в формат и запустил файнтюнинг. Заняло несколько часов и 20 долларов. Результат удивил: модель начала отвечать в стиле наших операторов, без длинного промпта. Я сократил системное сообщение до трёх строк — и качество не упало.
Дело в том что файнтюнинг хорош когда у тебя есть паттерн, который сложно описать словами. "Стиль" — это не просто "вежливо" или "кратко". Это структура предложений, выбор слов, способ перефразировать вопрос клиента в начале ответа. Модель это выучила из примеров, а не из инструкций.
Ещё один кейс: классификация текстов. Мне надо было определять категорию обращений клиентов — "баг", "запрос фичи", "вопрос по оплате" и ещё десяток. В промпте это превращалось в длинный список примеров для few-shot learning. Зафайнтюнил модель на 500 размеченных примерах — точность выросла с 82% до 94%, а токены на запрос упали в пять раз.
Когда точно промпт
Прототипирование и эксперименты. Когда я не знаю что именно хочу получить, промпты — единственный вариант. Меняешь пару строк, смотришь результат, итерируешься. С файнтюнингом такой скорости не будет.
Задачи которые часто меняются. Если каждую неделю добавляются новые требования или меняется формат вывода — промпт редактируется за минуту. Файнтюнинг потребует перезапуска обучения.
Мало данных. Если у тебя 20-30 примеров, лучше запихнуть их в промпт как few-shot examples. Файнтюнить на таком объёме бесполезно — модель ничему толком не научится.
Нужна гибкость внутри запроса. Промпт можно динамически менять в зависимости от контекста. Например, подставлять разные инструкции для разных типов пользователей. С файнтюнингом так не сделаешь.
Когда точно файнтюнинг
Стабильная задача с большим объёмом. Если ты обрабатываешь тысячи запросов в день по одному и тому же паттерну — файнтюнинг окупится. Дешевле по токенам, быстрее, стабильнее.
Специфический стиль или формат. Когда нужно чтобы модель писала "как ваша компания" или "как этот автор". Я видел кейс где зафайнтюнили модель на статьях CEO — она начала писать в его стиле, с его типичными оборотами. В промпте это не воспроизвести.
Сложная классификация или извлечение информации. Когда есть тонкие различия между классами или нужно выцеплять специфичные сущности. Промпт даёт общее понимание, файнтюнинг — точность.
Конфиденциальность. Если данные нельзя слать в публичное API вместе с промптом, можно зафайнтюнить модель один раз, а потом использовать короткие запросы без чувствительной информации в системном сообщении.
Гибридный подход: файнтюнинг + промпт
Забавно, но часто работает комбинация. Я файнтюню модель на стиль и базовое поведение, а промптом добавляю конкретные инструкции для конкретной сессии.
Пример: модель зафайнтюнена отвечать как техподдержка. Но в промпте я пишу: "Сегодня у нас акция на премиум-план, упоминай её если клиент спрашивает про возможности". Модель уже знает как отвечать (из файнтюнинга), я только направляю её внимание промптом.
Или другой случай: модель обучена писать краткие саммари статей. В промпте указываю: "Саммари для LinkedIn, до 100 слов". На следующий день: "Саммари для email-рассылки, три ключевых тезиса". Базовый навык — из файнтюнинга, детали — из промпта.
Что дешевле и быстрее
Чисто по деньгам: файнтюнинг GPT-3.5 стоит около 0.008 доллара за 1000 токенов обучения. Если у тебя 100 000 токенов датасета — это 80 центов за обучение. Потом каждый запрос к файнтюненной модели чуть дороже чем к базовой, но зато промпт короче. На дистанции экономия выходит если у тебя больше нескольких тысяч запросов.
По скорости: если промпт на 2000 токенов, а файнтюненная модель работает с промптом на 50 токенов — latency упадёт заметно. Это критично для интерактивных приложений.
Но есть нюанс времени на подготовку. Промпт я могу написать и протестировать за пару часов. Файнтюнинг требует собрать данные, разметить, почистить, запустить обучение, протестировать. Если качество не зашло — повторить. Это может занять дни.
Мои критерии выбора
Сейчас у меня простая эвристика. Начинаю с промпта всегда. Если через несколько итераций вижу что промпт разросся больше 1000 токенов, качество нестабильное (хотя инструкции вроде понятные), задача повторяется постоянно и не меняется, есть хотя бы 200-300 качественных примеров — тогда смотрю в сторону файнтюнинга. Собираю датасет, тестирую на маленькой выборке, если работает — масштабирую.
Если задача новая, меняется каждую неделю, или примеров мало — остаюсь на промптах. Даже если промпт получается длинный, это всё равно гибче чем постоянно перефайнтюнивать модель.
Что в итоге
Промпты и файнтюнинг — не конкуренты, а инструменты для разных ситуаций. Промпты для гибкости и экспериментов, файнтюнинг для стабильных задач где нужна точность и специфика. А чаще всего работает комбинация: файнтюнишь базовое поведение, промптом рулишь деталями.
У меня было несколько проектов где я сначала упёрся в потолок промптов, перешёл на файнтюнинг, и задача закрылась. Но было и наоборот — начал файнтюнить, потратил время, а потом понял что хватило бы хорошего промпта с few-shot примерами.
Главное не влюбляться в технологию. Файнтюнинг сейчас модный, но это не значит что его надо применять везде. Иногда три абзаца в промпте решают проблему лучше чем неделя возни с датасетом.
