Как дообучить LLM [и когда вместо этого использовать RAG или промптинг]

В этом руководстве пошагово объясняется, как дообучить LLM, сравнивается полное дообучение с LoRA и QLoRA, а также показано, когда промптинг или RAG лучше подходят для улучшения ответов модели.

Diagram comparing pre-training and fine-tuning: pre-training turns a vast general text corpus (trillions of tokens, large labs, huge compute) into a base model, while fine-tuning combines a base model with a small task-specific dataset (a few hundred to a few thousand examples, one GPU, hours) to produce a specialized model.

Дообучение (fine-tuning) большой языковой модели (LLM) — это доработка предварительно обученной LLM на небольшом наборе данных под конкретную задачу, чтобы она выдавала результаты, которых невозможно добиться одними лишь промптами.

Дообучение включает сбор примеров пар «вход/выход», демонстрирующих нужное поведение, циклы обучения, которые смещают веса модели в их сторону, и сравнение результата с выводом исходной модели. Параметрически эффективные методы, такие как LoRA, делают этот процесс настолько дешёвым, что его можно запустить на одном GPU.

Если результаты LLM вас не устраивают, сначала доработайте промпты и генерацию, дополненную поиском (RAG). Дообучение меняет то, как ведёт себя LLM. Если же нужно, чтобы модель использовала свежую или закрытую информацию, промпты и RAG обычно подходят лучше.

Ниже — пошаговое руководство по дообучению LLM, основные методы дообучения (LoRA и QLoRA), а также трудности и ошибки, способные сорвать процесс.

Что такое дообучение LLM и чем оно отличается от предварительного обучения LLM

Предварительное обучение LLM с нуля формирует общие языковые способности модели на огромном корпусе текстов, а дообучение LLM настраивает уже обученную модель на небольшом наборе данных для одной задачи.

Предварительное обучение LLM — ресурсоёмкий этап, в результате которого получается базовая модель. Она учится на обширном корпусе текстов, что даёт ей общее знание грамматики и фактов и способность рассуждать, но не специализацию под вашу задачу.

Дообучение LLM продолжает обучение базовой модели на небольшом тщательно отобранном наборе данных, чтобы она выдавала нужные результаты для конкретной задачи или сценария использования. Например, это может быть единообразный формат, голос бренда или тон, закономерности конкретной предметной области или надёжные вызовы инструментов и функций.

Когда дообучать LLM, а когда лучше обойтись промптами или RAG

Чтобы повысить качество работы LLM, поднимайтесь по ступеням: промпты -> RAG -> дообучение.

Дорабатывайте промпты, добавляя более подробные инструкции, и используйте RAG, чтобы предоставить модели актуальную информацию. Прибегайте к дообучению, только если улучшение промптов и поиска не даёт результата.

Подход

Что меняет

Когда использовать

Главное ограничение

Промпт-инжиниринг

Отправляемый запрос

Поведение близко к нужному, и вам важны скорость и обратимость

Ограничен имеющимися возможностями базовой модели

RAG

То, что модель видит во время инференса

Факты часто меняются, и LLM нужен доступ к актуальной информации

Добавляет задержку на поиск и требует инфраструктуры; не меняет поведение

Дообучение LLM

Веса модели (её внутренние параметры)

Нужно единообразное поведение, формат или тон в больших масштабах либо более короткие промпты при каждом вызове

Начальные затраты; знания, заложенные в веса, устаревают; риск забывания навыков, усвоенных при предварительном обучении

Когда улучшенные промпты эффективнее дообучения, а когда их недостаточно

Промпты — самый быстрый и дешёвый рычаг. Во многих случаях более точные и подробные промпты позволяют добиться нужных изменений в поведении.

Однако длинные промпты замедляют работу и делают её дороже, а преодолеть существующие ограничения модели не могут.

Признаки того, что возможности промптов, вероятно, исчерпаны:

  • Новые пограничные случаи раз за разом ломают вывод: например, модель возвращает обычный текст, когда нужен JSON, или сбивается с тона, и вам приходится латать промпт под каждый новый случай.
  • Системный промпт постоянно растёт: он занимает сотни или тысячи строк, и управлять им сложно.
  • Вы платите за это при каждом вызове: промпт заново отправляется и обрабатывается при каждом запросе, поэтому растут затраты на токены и задержка.
  • Изменения перестают давать эффект: новые инструкции не улучшают результаты.

Даже в этом случае сначала попробуйте более дешёвые решения на уровне промптов. Используйте few-shot-примеры, чтобы показать модели шаблон (пары «вход/выход»), цепочки промптов, чтобы разбить сложные задачи на более мелкие шаги, или хуки вызова функций, чтобы передать точный поиск данных или вычисления внешним инструментам.

Когда RAG разумнее, чем дообучение модели

RAG меняет то, что LLM знает, а дообучение LLM — то, как она себя ведёт. Если пробел в знаниях, особенно в тех, что часто меняются или хранятся в ваших собственных документах, решение — RAG. Если пробел в поведении, используйте дообучение.

Дообучение тоже влияет на знания модели, но любые усвоенные ею факты фиксируются на момент обучения и в быстро развивающихся областях быстро теряют актуальность. Кроме того, информация зашивается в веса модели, поэтому сведений о её источнике не сохраняется.

Обновлять исходные документы, которые использует слой поиска, быстрее и дешевле, а сам слой может ссылаться на конкретные использованные источники. Поэтому RAG лучше подходит, когда нужна обоснованная и актуальная информация.

Минус RAG? Это дополнительный слой, который нужно создать и поддерживать, и он увеличивает задержку.

На практике часто требуется и то и другое. В рабочих системах дообученные модели сочетают с RAG: первые обеспечивают единообразное поведение, второй — актуальные факты.

Типичные подводные камни, риски и трудности дообучения

Даже когда дообучение — подходящий инструмент, оно сопряжено с затратами и рисками:

  • Затраты и время: сбор чистых репрезентативных обучающих данных и вычисления для обучения обходятся дорого.
  • Катастрофическое забывание: после обучения на узком наборе данных модель может утратить общие навыки и приобрести новые типы сбоев, допуская ошибки, которых не делала базовая модель.
  • Переобучение: если данных слишком мало или они слишком однообразны, модель запоминает обучающие примеры вместо того, чтобы усваивать закономерности, поэтому хорошо справляется с обучающей выборкой, но плохо — с реальными входными данными.
  • Устаревание знаний: знания, заложенные в веса, быстро устаревают, поэтому модель приходится заново обучать на новых данных.
  • Моральное устаревание: когда выходит более сильная модель, она часто превосходит вашу дообученную модель «из коробки», и работу приходится повторять.
  • Сложности оценки и воспроизводимости: доказать, что дообученная модель превосходит базовую, непросто. Кроме того, два запуска обучения на GPU с одинаковыми настройками могут дать немного разные модели.
  • Управление данными: обучение на проприетарных или конфиденциальных данных порождает вопросы приватности и лицензирования; впоследствии модель может воспроизводить фрагменты данных, на которых обучалась.

Основные методы дообучения

Основные типы дообучения LLM различаются тем, какую часть модели они меняют: полное дообучение заново обучает всю модель, тогда как методы параметрически эффективного дообучения (PEFT), такие как LoRA и QLoRA, обновляют лишь часть весов. Методы PEFT требуют лишь малую долю памяти, необходимой для полного дообучения, и при правильных настройках способны показать сопоставимые результаты.

Полное дообучение обновляет все веса модели. Это самый дорогой вариант с наибольшим риском катастрофического забывания. Используйте его для серьёзных изменений поведения, когда у вас достаточно данных и вычислительных ресурсов.

Альтернатива — параметрически эффективное дообучение, или PEFT. Это общее название методов, которые замораживают большую часть модели и обучают лишь небольшой набор параметров. Они требуют гораздо меньше памяти и менее подвержены забыванию, поскольку базовая модель остаётся нетронутой.

При низких рангах PEFT усваивает меньше, чем полное дообучение, но повышение ранга и подбор скорости обучения устраняют большую часть разрыва в задачах обучения следованию инструкциям (instruction tuning).

К методам PEFT относятся:

  • LoRA (Low-Rank Adaptation, низкоранговая адаптация): обычная отправная точка. Метод замораживает исходные веса и обучает небольшой набор добавленных параметров адаптера — часто менее 1% от общего числа, — поэтому работает на одном потребительском GPU.
  • QLoRA (Quantized Low-Rank Adaptation, квантованная низкоранговая адаптация): метод сжимает базовую модель до 4-битной точности перед применением LoRA, что позволяет дообучить большую модель на одном GPU.

Метод

Что обновляет

Требования к оборудованию

Когда использовать

Полное дообучение

Все веса модели

Узел с несколькими GPU для моделей класса 7B, для более крупных — значительно больше

Нужны глубокие изменения поведения, и есть данные и вычислительные ресурсы

LoRA (PEFT)

Небольшой набор добавленных весов адаптера

Один потребительский GPU

Отправная точка по умолчанию

QLoRA (PEFT)

Адаптеры LoRA поверх базовой модели, сжатой до 4 бит

Очень большие модели на одном GPU

Памяти мало, но нужна большая базовая модель

Помимо этого, мы используем методы обучения следованию инструкциям и настройки на предпочтения — от RLHF (Reinforcement Learning from Human Feedback, обучение с подкреплением на основе отзывов людей) до более лёгких альтернатив, таких как Direct Preference Optimization (DPO) и Odds Ratio Preference Optimization (ORPO), — чтобы формировать то, как модель следует инструкциям и насколько её ответы соответствуют предпочтениям людей.

Как дообучить LLM: пошаговое руководство

Если вы решили, что дообучение LLM — верное решение, вот как выглядит рабочий процесс.

Шаг 1. Определите задачу и то, как вы будете измерять успех

Решите, какого поведения вы ждёте от LLM и как поймёте, что добились его.

Сформулируйте конкретную задачу, которую должна выполнять дообученная модель: например, классифицировать обращения в поддержку, кратко излагать договоры в фиксированном формате или генерировать код в принятом у вас стиле.

Затем определите, что считать успехом. Распространённые варианты:

  • Корректность вывода: например, разбирается ли результат как валидный JSON и соответствует ли он нужной структуре Markdown?
  • Автоматические оценки: используйте метрики вроде BLEU или ROUGE, которые сравнивают сгенерированный текст с эталонными ответами, или точность выполнения задачи на размеченной выборке.
  • Оценки людей: балльная шкала или критерии «прошёл/не прошёл» для качеств, которые плохо поддаются автоматической оценке, например тона или полезности.
  • Надёжность на сложных входных данных: справляется ли модель с нестандартными входными данными, на которых спотыкалась базовая модель?

Шаг 2. Подготовьте набор данных

От качества данных зависит успех дообучения, поэтому подойдите к сбору набора данных для дообучения со всей тщательностью.

Оформите данные в виде пар «инструкция/ответ» в формате JSONL, где каждая строка содержит входные данные (и любой контекст) и точный вывод, который вы хотите получить.

Например, обратите внимание на общедоступные наборы данных: универсальные инструктивные наборы Alpaca-cleaned и Dolly от Databricks или специализированный banking77, который содержит более 13 000 реальных запросов в службу поддержки, размеченных по 77 намерениям.

Для узкой задачи изменить поведение может набор от нескольких сотен до нескольких тысяч чистых и разнообразных примеров — при условии, что они отражают реальные входные данные из рабочей среды, включая пограничные случаи, и единообразно отформатированы.

Пар «вход/выход» ещё нет? Соберите набор из уже имеющихся данных, например обращений в поддержку и лучших ответов на них или документов и их кратких изложений.

Если у вас есть только выходные данные, сгенерируйте с помощью более сильной модели правдоподобный вход для каждого из них или вручную напишите небольшой начальный набор и расширьте его с помощью более крупной модели-«учителя», а затем оставьте лучшие пары.

В завершение разделите данные на обучающую, валидационную и тестовую выборки, чтобы проводить измерения на примерах, которых модель не видела.

Шаг 3. Выберите базовую модель и метод

Начните с небольшой модели с открытым исходным кодом на 3–7 миллиардов параметров и метода параметрически эффективного дообучения, например LoRA или QLoRA.

Открытые семейства моделей, такие как Llama, Mistral и Qwen, дают надёжную основу, которую можно разместить на собственной инфраструктуре, а методы PEFT снижают требования к оборудованию: QLoRA квантует базовую модель до 4 бит, поэтому для дообучения модели на 7B достаточно потребительской видеокарты с 16–24 ГБ памяти. Полное дообучение той же модели требует во много раз больше памяти.

Шаг 4. Задайте гиперпараметры обучения

Вот ключевые параметры дообучения LLM и рекомендуемые начальные диапазоны:

  • Скорость обучения определяет величину каждого обновления весов. Согласно исследованию Biderman et al. 2024 года, оптимальные значения скорости обучения для LoRA примерно в десять раз выше, чем для полного дообучения: обычно от 5e-5 до 5e-4 против 1e-5–5e-5. Авторы рекомендуют перебирать значения от 1e-5 до 5e-4 и выбирать наибольшее, при котором обучение остаётся стабильным.
  • Размер батча — это количество примеров, на которых модель обучается перед каждым обновлением весов. На одном GPU используйте небольшой батч на устройство (от 1 до 8) и накопление градиентов, чтобы получить эффективный батч примерно от 16 до 64.
  • Количество эпох — это число полных проходов модели по набору данных. При обучении модели выполнению конкретных задач хорошим ориентиром считается 1–3 эпохи, но при обучении LoRA их часто требуется больше.
  • Ранг LoRA (r) задаёт ёмкость адаптера, то есть объём того, что он способен усвоить. Для простых задач начните с 8–32 и повышайте ранг для более сложных: в упомянутом выше исследовании LoRA, проведённом Бидерманом и соавторами, при инструктивном дообучении 7B-модели на коде потребовался ранг 256, чтобы сравняться с полным дообучением, тогда как в задачах по математике близкого результата удалось добиться уже с рангом 64.
  • Максимальная длина последовательности — это предельная длина входных данных, обрабатываемых в ходе запуска. Задайте её так, чтобы она охватывала ваши самые длинные примеры, но не превышала контекстное окно модели: всё, что длиннее, обрезается.
  • Прогрев и расписание определяют, как скорость обучения нарастает и меняется в ходе запуска. Обычно по умолчанию используют короткий прогрев и косинусное затухание. Однако в исследовании небольших моделей, проведённом Пареха и соавторами, было установлено, что отказ от прогрева не ухудшает итоговые результаты.

Считайте эти значения отправной точкой для перебора параметров, а не фиксированными настройками.

Шаг 5: обучите модель и отслеживайте потери

Во время обучения следите за кривыми потерь на обучающей и валидационной выборках, чтобы понять, идёт ли обучение как надо.

Потери показывают, насколько выходные данные модели расходятся с вашими примерами, и по ходу запуска они должны плавно снижаться. Потери на обучении рассчитываются по данным, на которых модель учится. Потери на валидации — по отложенным примерам.

Если потери на обучении и на валидации снижаются одновременно, модель учится обобщать. Если потери на обучении продолжают падать, а потери на валидации выходят на плато или растут, модель запоминает обучающую выборку вместо того, чтобы усваивать закономерность (переобучение).

Шаг 6: оцените модель, затем разверните её

Низкие потери на обучении не гарантируют правильных ответов, поэтому оцените дообученную модель по критериям, которые вы задали на шаге 1.

Если модель проходит проверку, развернуть её можно двумя способами:

  • Разверните адаптер поверх базовой модели и загружайте оба компонента во время выполнения — так адаптер можно легко заменить.
  • Объедините адаптер с базовыми весами, чтобы получить единую автономную модель, которую проще разместить на сервере.

Используйте Perplexity, чтобы предоставить вашей LLM доступ к актуальной информации

Дообучение — правильный выбор, когда нужно адаптировать поведение модели к вашим потребностям.

Если вашей модели нужна актуальная информация, особенно быстро меняющаяся, вам потребуется RAG или надёжный сторонний инструмент поиска.

Собственная система поиска лучше всего подходит для проприетарных наборов данных, таких как внутренняя вики, история обращений в службу поддержки, договоры или документация по продуктам.

Если нужные вам знания общедоступны, создавать собственный слой поиска не требуется. Perplexity — это система поиска ответов, которая выдаёт ответы со встроенными кликабельными ссылками на источники из постоянно обновляемого веб-индекса. Её Agent API за один вызов возвращает такие ответы, основанные на данных из интернета и подкреплённые ссылками, поэтому ваше приложение может опираться на актуальные источники.

Часто задаваемые вопросы о дообучении LLM

Можно ли дообучить LLM бесплатно?

Да, небольшую открытую LLM можно дообучить бесплатно. Например, бесплатный тариф Google Colab даёт достаточно ресурсов GPU, чтобы запустить QLoRA для модели размером от 3B до 8B, а этого вполне хватает для узкой задачи. Платить придётся, когда понадобится больше памяти, более длительные запуски или более крупная базовая модель, чем позволяет бесплатный тариф.

Нужен ли собственный GPU, или дообучение можно провести в облаке?

Чтобы дообучать LLM, не обязательно иметь собственный GPU. Управляемые сервисы и облачные GPU-провайдеры сдают оборудование в аренду с почасовой оплатой, так что для запуска QLoRA на небольшой модели хватит одного арендованного GPU. Покупка GPU окупается, только если вы часто дообучаете модели или должны хранить все данные на собственных машинах.

Сколько времени занимает дообучение LLM?

Для небольшой LLM запуск может занять от нескольких минут до нескольких часов в зависимости от размера набора данных и оборудования. Например, Oumi выполнила полное дообучение модели с 0,8 млрд параметров чуть более чем за час на своей хостинговой платформе.

Для более крупных моделей или десятков тысяч примеров это время растягивается до суток и более: запуски LoRA в компании Emburse на 7B-модели заняли 8 часов для 5000 примеров и около 30 часов для 50 000 на одном GPU с 40 ГБ памяти.

Можно ли регулярно обновлять дообученную модель по мере изменения данных?

Модель можно повторно дообучить на свежих данных, но каждый раунд требует вычислительных ресурсов и сопряжён с риском катастрофического забывания. Для часто меняющихся знаний RAG обычно оказывается лучшим решением, поскольку вы обновляете исходные документы, а не переобучаете модель.