Содержание
Неделю крутят низкоранговую адаптацию (LoRA, Low-Rank Adaptation) на локальном чекпоинте. «Датасет» — шестьсот диалогов из чата: разные системные подсказки, ответы без единого шаблона, ни одного явного отказа, ни среза «устаревший регламент». На отложенной выборке из того же чата метрика растёт. На пилоте юрист ловит уверенный ответ по отменённой версии, оператор — тон, которого в проде быть не должно.
Провал почти никогда не в оптимизаторе. Это как учить ребёнка по стопке случайных листочков вместо прописей: где-то образец «так пиши», где-то чужой почерк, а контрольную потом списывают с той же тетради. Корпус для дообучения с учителем (SFT, Supervised Fine-Tuning) собирали как папку примеров, а не как книгу упражнений с контрактом, покрытием и барьером перед уроком.
Ниже — как спроектировать SFT-корпус: что класть в пару «инструкция → ответ», откуда брать примеры, как не смешать домашнюю работу с экзаменом и когда синтетика помогает, а когда вредит. Материал продолжает обзор инженерии датасетов (там — калибр и приёмка) и дополняет когда действительно нужно дообучение, не дублируя кейс классификации на Qwen и общий контур обучения LLM.
Ключевые выводы
SFT учит поведение на парах «вход → желаемый выход». Это не претрейн на сыром вебе и не «ответ A лучше B». Путать семейства — получать красивый лосс и странный прод.
Сначала контракт пары, потом объём. Формат ответа, язык, когда отказ, когда эскалация — до разметки и до синтетики.
Покрытие важнее размера. Тысяча одинаковых «коротких вежливых» строк хуже трёхсот стратифицированных упражнений с отказами и реальными формулировками.
Синтетика — ксерокс черновика, не подпись учителя. Финальный стиль и факты домена утверждает человек с рубрикой.
Перед обучением — статический барьер: схема, дедупликация, запрет пересечения с оценкой, доля отказов, шаблон диалога как в проде.
Оценка не живёт в той же тетради, что упражнения. Иначе вы подгоняете ответы под отчёт. Рамка оценки — в материале про оценку LLM перед запуском.
Это прописи, а не четыре чужие тетради
В проекте часто лежат четыре семейства. Для SFT важно не спутать, чем вы учите, а чем мерите — иначе калибр из опорного обзора снова смешают с партией.
| Семейство | Учит / измеряет | Типичная единица | Ошибка смешения |
|---|---|---|---|
| SFT-корпус | Как отвечать (формат, тон, паттерн) | инструкция → ответ | Обучение на эталоне оценки без аудита |
| Данные предпочтений | Что выбрать из двух правдоподобных | chosen / rejected | Стиль без фактов; «нравится» вместо «верно» |
| Эталонный набор | Измерить поведение | вход + критерий приёмки | Подгонка подсказки под видимые кейсы |
| Буфер сбора | Сырые провалы из эксплуатации | трасса без финальной метки | Оценка по неразмеченным кейсам |
SFT — это прописи: при таком входе желаем один выход (или отказ). Предпочтения — два сочинения, какое лучше. Эталон для непрерывной интеграции (CI, Continuous Integration) — контрольная с ключом. Буфер — черновики с парты, ещё без оценки.
Корпус может быть шире и шумнее эталона: цель — выучить паттерн, не зафиксировать регрессионный барьер. Если запись нельзя описать как «при таком входе желаем такой выход», это ещё не упражнение для SFT — заметка или кандидат в буфер.
Сначала правила строки, потом стопка листов
До разметки контракт пары кладут в одно место (meta.yaml или короткий RFC) — как образец буквы в начале прописей:
| Элемент | Вопрос | Пример для ассистента по регламентам |
|---|---|---|
| Вход | Что видит модель? | Вопрос пользователя; опционально найденные фрагменты |
| Выход | Формат? | Короткий ответ + ссылка на пункт; или JSON |
| Отказ | Когда не отвечать? | Нет источника; вне списка контроля доступа (ACL, Access Control List); устаревшая версия |
| Эскалация | Когда к человеку? | Класс риска «высокий»; конфликт двух документов |
| Язык | ru / en / mixed? | Ответ на языке вопроса |
| Тон | Формальный / операторский? | Без сленга; без «уверенности» без источника |
| Источник истины | Что факт? | Актуальная версия в СЭД, не чат |
Без этого два эксперта напишут два «правильных» ответа разной длины, и модель выучит среднее из шума. Если контракт закрывается поиском и жёстким шаблоном, сначала проверьте когда дообучение оправдано. SFT нужен, когда устойчивое поведение (формат, отказ, тон, жаргон) не удерживается подсказкой и поиском.
Одна клетка — одни поля
Минимальная запись для настройки инструкций — не «простыня текста», а поля, которые переживают смену чекпоинта и библиотеки:
{
"id": "sft-reg-0142",
"messages": [
{"role": "system", "content": "…одна версия системной инструкции…"},
{"role": "user", "content": "Можно ли хранить СИЗ без журнала выдачи?"},
{"role": "assistant", "content": "По регламенту v3.2, п. 4.1 — нет. …"}
],
"meta": {
"domain": "ot_pb",
"intent": "policy_qa",
"doc_version": "3.2",
"language": "ru",
"refusal": false,
"source": "editor",
"difficulty": "medium"
}
}
Четыре правила экономят недели:
- Одна версия системной подсказки на манифест (или явное
system_version). Пять разных system в одном JSONL — учить конфликт политик. idстабилен между версиями: правка ответа не должна плодить «новый» кейс без следа.- Метаданные для срезов: домен, намерение, версия документа, язык, отказ, источник. Без них не ответить, на каком срезе упали.
- Шаблон чата как в проде. Если в проде нет
system, не учите на длинном system, которого не будет при вызове.
Для классификации структура может быть проще (input / label), принцип тот же: схема + метаданные + версия манифеста.
Откуда брать строки в тетрадь
Четыре источника — у каждого свой риск.
| Источник | Плюс | Риск | Как использовать |
|---|---|---|---|
| Редакторы эталонов | Факты и тон домена | Дорого, медленно | Ядро покрытия и все отказы высокого риска |
| Логи эксплуатации | Реальные формулировки | Персональные данные, ACL, шум | После фильтра и ревью; не копировать ответ модели как истину |
| Синтетика (LLM) | Объём и вариации | Галлюцинации, однообразие | Черновик → обязательное ревью; квота «синтетика ≤ N%» |
| Перепись / транскрипция | Эталонный тон организации | Узкое покрытие | Хорошо для формата; плохо как единственный источник намерений |
Рабочая смесь в пилотах: ядро 30–40% пишет или утверждает эксперт; периферия растёт синтетикой по шаблонам намерений; хвост — из буфера провалов после ревью. Ксерокс без квоты и рубрики быстро заполняет тетрадь «уверенным средним» — модель становится вежливой и пустой.
«Модель сгенерировала пару» ≠ «пара проверена». В доменах с ценой ошибки финальный статус — только после человека. Синтетика не подписывает манифест.
Не число строк, а карта упражнений
«Сколько примеров?» без карты покрытия — вопрос в пустоту. Ориентиры (не догма):
| Тип задачи | Рабочий старт корпуса | На что смотреть раньше объёма |
|---|---|---|
| Классификация / маршрутизация | 1k–20k меток | Баланс классов, путаемые классы |
| Instruction / диалог SFT | 500–5k пар | Намерения, отказы, длина, язык |
| Структурированный вывод (JSON) | 300–3k | Соблюдение схемы, редкие поля |
| Код / SQL под домен | 500–8k | Диалекты, схемы БД, опасные запросы |
«Больше» помогает, только если растёт покрытие намерений и условий, а не число перефразов одной строки. Карта — намерения × условия (есть источник / нет; актуальная / устаревшая версия; один документ / конфликт). Пустая клетка важнее ста похожих «успешных» ответов.
Если все реплики пользователя написал один редактор «литературно», модель плохо переносит разговорный прод. Смешивайте обрывки, опечатки (если они в потоке) и формальные письма — в долях потока, не вкуса разметчика.
Для узкой классификации на маленькой модели иногда хватает сотен примеров — как в кейсе Qwen 0.6B. Для открытого диалога по регламентам без отказов даже десять тысяч пар не спасут пилот.
Упражнения, где правильный ответ — «не писать»
Корпус без отказов учит модель всегда отвечать. В корпоративном ассистенте это прямой путь к выдуманным пунктам.
Минимальный набор «негативных» навыков в прописях:
- Отказ без источника — «в переданных фрагментах нет ответа; не выдумываю».
- Отказ по ACL — нет прав; не пересказывать «из общих знаний».
- Отказ по устаревшей версии — документ снят с действия.
- Эскалация — конфликт двух норм; передать специалисту по шаблону.
- Форматный отказ — запрос вне области, если продукт это запрещает.
Доля таких кейсов часто 15–30% на старте — иначе позитивный класс задавит поведение. Важнее не процент, а наличие всех типов отказа из контракта.
«Похожие, но неверные» ответы обычно не кладут как assistant — это территория предпочтений / DPO. Для SFT полезнее жёстко правильный выход или запись, где правильный выход — отказ. Если нужно выбирать между двумя формулировками — отдельное семейство, иначе одна тетрадь тянет модель в разные стороны.
Не открывайте урок, пока тетрадь не прошла проверку
Обучение не стартует с «папки на диске». Сначала барьер — как проверка прописей перед контрольной:
flowchart TB
sources[Источники: редактор / прод / синтетика] --> normalize[Нормализация схемы и шаблона]
normalize --> lint[Статические проверки]
lint --> split[Train / dev / holdout]
split --> trainJob[Задача SFT]
split --> evalGate[Оценка на эталоне]
evalGate --> release{Регрессионный барьер}
release -->|pass| ship[Релиз адаптера]
release -->|fail| buffer[Буфер правок корпуса]
buffer --> sources
Что ловит беду до GPU:
- схема: обязательные поля, типы, допустимые
role; - один system на манифест (или явные версии);
- дедупликация по тексту и почти-дубликатам;
- ноль пересечений с эталоном оценки;
- доля отказов в коридоре;
- длина, пустые
content, гигантские вставки логов; - персональные данные и секреты по политике;
- метка языка совпадает с текстом на выборке аудита.
Итог барьера — манифест: версия, хэш, срезы, кто утвердил, ссылка на рубрику. Без него сравнивать «модель A vs B» бессмысленно: сравниваете ещё и разные тетради.
Домашняя работа не должна совпадать с контрольной
Типичная ловушка: взять 10% «с конца файла» в тест. Если файл сортирован по времени или автору, тест не отражает прод. Хуже — править ответы в train, подглядывая в те же формулировки, что в отчёте заказчику.
Практические правила:
- Скрытая выборка (holdout) — десятки–сотни кейсов, которые не открывают при итерациях. Отчёт «готовы к пилоту» — по ней или по отдельному эталону.
- Видимая dev — для отладки; её метрики не продавать бизнесу как финальные.
- Эталон оценки версионируется отдельно от train-манифеста. Можно ссылаться («train v0.4 на gold v0.3»), но не хранить эталон внутри train JSONL «для удобства».
- Парафраз — тоже утечка. «Можно ли хранить СИЗ без журнала?» и «Обязателен ли журнал выдачи СИЗ?» не должны разъехаться по train и holdout без политики. Ищите почти-дубликаты.
Для RAG-оценки эталон строится иначе — золотые наборы для RAG. RAG проверяет поиск и опору на фрагменты; SFT учит формулировку и политику. Общие вопросы между контурами — кандидат на утечку.
Корпоративный пример: ассистент по регламентам
Внутренний ассистент отвечает по актуальным регламентам. Поиск уже отдаёт фрагменты; ответы всё равно «плывут» по формату и дописывают пункты, которых нет во фрагментах.
Контракт: ответ только по переданным фрагментам; обязательно doc_id и версия; при отсутствии — отказ; тон формальный.
Корпус v0.2 (пример распределения):
| Срез | Доля | Кто утверждает |
|---|---|---|
| Успешный ответ с цитатой | 55% | Редактор + выборочный аудит |
| Отказ: нет во фрагментах | 15% | Редактор |
| Отказ: устаревший документ | 10% | Редактор |
| Конфликт двух норм → эскалация | 10% | Юрист / соответствие |
| Вне области продукта | 5% | Редактор |
| Короткий разговорный запрос | 5% | Из логов после фильтра |
Синтетика — только перефразы успешных и «нет во фрагментах», квота 25%, обязательное ревью. После пилота провалы «уверенный ответ при пустой выдаче» добавили как отказы в v0.3, а не как новые «успешные» фантазии.
Метрика релиза адаптера: не средний «похоже на эталон», а доля нарушений контракта на holdout ниже порога.
Промышленный пример: операторские инструкции
Киоск или планшет в цехе: модель помогает найти шаг инструкции и допустимые отклонения. Ошибка дороже офисного чата.
Отличия прописей: короткие реплики, шум распознавания речи, смешанный язык (русский + коды оборудования); жёсткий отказ на «как обойти блокировку» и запросы вне допуска; метаданные — линия, станок, версия техкарты, уровень допуска.
Здесь 800–1500 утверждённых пар с полным покрытием отказов и линий важнее пяти тысяч синтетических «вежливых» диалогов. Та же логика, что в разборе OCR рукописных цифр: сначала похожесть на эксплуатацию, потом масштаб.
Соседние материалы: что читать рядом
Узкий эксперимент «классификация → метка» показывает: маленькая модель + чистые метки бьют большой чекпоинт с грязным набором. Не переносите это один в один на открытый диалог: там единица — политика ответа, и цена «почти правильного» текста выше.
| Вопрос | Материал |
|---|---|
| Нужен ли fine-tuning? | Когда нужно дообучение |
| Как устроены семейства данных? | Инженерия датасетов |
| Как мерить до прода? | Оценка LLM перед запуском |
| Эталон только для RAG | Эталонный набор для RAG |
| Кейс классификации | Fine-tuning Qwen 0.6B |
Этот текст закрывает: как спроектировать корпус, если решение «дообучаем» уже принято.
Где портят прописи
Папка из чата без схемы. Разные system, нет id — воспроизводимость нулевая.
Ноль отказов. Модель учится быть полезной всегда; в проде — галлюцинации уверенным тоном.
Синтетика на 90% без ревью. Красивый лосс, пустой пилот.
Обучение на эталоне оценки. Метрики радуют до первого чужого запроса.
Один автор всех user-реплик. Разрыв с языком сотрудников или операторов.
SFT и предпочтения в одном файле. Модель не понимает: учить единственный ответ или «что чаще нравится».
Нет манифеста. Нельзя откатить корпус и объяснить регрессию.
Игнор ACL и персональных данных в логах. Юридический долг и долг по безопасности в том же JSONL.
Что сделать сегодня
- Запишите контракт пары на одну страницу: вход, выход, отказ, эскалация, тон.
- Выпишите карту покрытия намерений × условий и отметьте пустые клетки — это очередь разметки, не «ещё LoRA».
- Добавьте не меньше пяти отказов каждого типа из контракта.
- Прогоните статический барьер до первого запуска обучения.
- Назначьте владельца манифеста — без чьей подписи файл не попадает в задачу обучения.
Сначала допишите прописи — потом снова крутите адаптер. Иначе следующий «рост метрики» снова окажется списанным с той же тетради.
Часто задаваемые вопросы (FAQ)
Сколько примеров нужно для SFT?
Столько, чтобы закрыть карту покрытия и коридор отказов, а не «как у всех». Для узкой классификации часто хватает сотен–пары тысяч меток; для диалога по политикам — сотни–несколько тысяч стратифицированных пар. Лучше 700 утверждённых, чем 7 000 синтетических без редактора.
Можно ли строить весь корпус синтетикой?
Как черновик и для перефразов — да, с квотой и ревью. Как единственный источник истины при высокой цене ошибки — нет. Синтетика ускоряет, эксперт подписывает.
Нужна ли системная инструкция в каждой записи?
Нужна согласованность с продом. Если system в проде фиксирован — одна версия на манифест. Пять конфликтующих system — способ научить модель игнорировать политику.
Чем SFT-корпус отличается от эталона для CI?
Эталон для CI маленький, стабильный, с жёсткой рубрикой — им измеряют. SFT-корпус учит и может быть шире. Оценивать релиз только на подвыборке train — ошибка методологии.
Когда переходить от SFT к данным предпочтений?
Когда формат и факты держатся, но нужно стабильно выбирать между двумя допустимыми ответами. Это отдельное семейство; не смешивайте chosen/rejected с единственным assistant без политики.
Как не утянуть персональные данные из логов?
Фильтр до разметки, маскирование, запрет сырых трасс в git без сканера, выборочный аудит. Запись из прода без ревью — не «быстрый SFT», а утечка в обучающую выборку.
Дальше в серии
- Инженерия датасетов: обзор — рамка семейств и жизненного цикла.
- JSONL, шарды и путь к GPU — физическое устройство корпуса.
- Редакторы эталонов — рубрика и согласование (
golden-editors-annotation-workflow-2026). - Обучение / оценка / скрытая выборка и утечки (
dataset-splits-leakage-2026). - Данные предпочтений: DPO и пары (
preference-dataset-rlhf-2026). - Синтетика и гибридный конвейер (
synthetic-human-dataset-pipeline-2026).



Комментарии