Как добиться точности форматирования от LLM через System → User → Assistant
Просишь ChatGPT классифицировать отзыв одним словом — "позитив", "негатив" или "нейтрал". Получаешь абзац рассуждений: "Этот отзыв скорее можно отнести к негативным, потому что автор упоминает проблемы с доставкой, хотя есть и позитивные моменты...". Знакомо?
Проблема не в том, что модель "глупая". Проблема в том, что ты свалил всё в одно сообщение — инструкции, примеры, запрос. Модель не видит границ. Она не знает где кончается пример и начинается твой реальный запрос.
Исследование Ontario Tech University (2024) показало: LLM давала 0% структурной точности — модель не могла выдать одно слово вместо абзаца. После того как промпт разложили по ролям (System → User → Assistant) — точность подскочила до 67-99%. F1 вырос на 5-10 пунктов.
Решение называется FewSUA (Few-Shot with System, User, Assistant). Это когда ты не сваливаешь всё в кучу, а структурируешь промпт через роли. Как таблица в Excel — каждая ячейка для своих данных.
Как это работает: три роли вместо месива
System — общие правила игры. Что модель делает, какой формат ответа. Это как ТЗ для стажёра: "Ты классификатор отзывов. Отвечай только одним словом".
User и Assistant — примеры входов-выходов. Показываешь паттерн: "Вот отзыв → вот одно слово". Повторяешь 2-3 раза. Модель схватывает логику.
User (последний) — твой реальный запрос. Модель видит структуру, копирует формат из примеров.
Это работает потому что LLM натренированы на диалогах с чёткой ролевой структурой (по данным Anthropic, именно так обучают модели семейства Claude). Когда ты используешь System/User/Assistant, модель включает "правильные" паттерны. Без этого она видит поток текста — и начинает импровизировать.
Пример: классификация отзывов на Wildberries
Задача: автоматом сортировать отзывы. Формат — строго одно слово: "позитив", "негатив", "нейтрал". Без объяснений.
Модель выдаст одно слово — "нейтрал". Без рассуждений. Структура FewSUA показала паттерн: User → короткий Assistant. Модель копирует.
Почему "в лоб" не работает
Когда инструкции, примеры и запрос идут сплошным текстом, модель видит поток без границ. Маленькие модели особенно путаются — начинают "думать вслух", добавлять контекст, объяснять.
FewSUA разделяет зоны ответственности. System — что делать. User/Assistant — как делать (примеры). Последний User — триггер генерации в том же формате.
Это как объяснять на примерах вместо часовой лекции. Показал 2-3 раза — и человек схватил. С моделью так же.
Рычаги управления
Количество примеров: 3 оптимально. Больше не даёт прироста (проверяли на датасетах от sentiment analysis до математики из MATH dataset).
Формат примеров: Чем короче выходы в примерах, тем точнее модель копирует. Если Assistant в примерах выдаёт абзацы — модель будет выдавать абзацы.
System-инструкция: Сюда всё что не меняется между запросами. Формат, правила, ограничения.
Шаблон для быстрого старта
В ChatGPT/Claude роли задаются интерфейсом (System Prompt в настройках). В обычном чате можно использовать маркеры [SYSTEM], [USER], [ASSISTANT] — модель распознаёт паттерн.
Для сложных задач: Reasoning-First
Когда задача требует рассуждений (математика, анализ, принятие решений), лучше обратный порядок — сначала модель думает вслух, потом даёт ответ:
Этот формат поднял F1 с 0.26 до 0.58 для GPT-3.5 на математических задачах. Модель не "фиксируется" на неправильном ответе — она сначала продумывает логику.
OpenAI в своём гайде по промптингу (обновление 2023) рекомендует именно такой подход для задач, где важна цепочка рассуждений. Anthropic называет это "constitutional AI" (документация 2024) — когда модель сначала выстраивает логику, потом формулирует ответ.
Лайфхаки применения
Чат-боты с жёстким форматом: Если строишь бота который должен отвечать в JSON, покажи 2-3 примера User→Assistant с JSON-ответами. Модель будет держать формат.
Без примеров — ZeroSU: Если хороших примеров нет, используй минимальную версию — только System + User. Это всё равно лучше чем всё в одном сообщении. ZeroSU показал +12 пунктов F1 vs промпт "в лоб".
Синергия с Chain-of-Thought: Объедини FewSUA с CoT (это когда просишь модель решать вслух). В примерах покажи рассуждения. Для сложных задач рассуждения важнее структуры — даже если модель выдаёт "неструктурированный" ответ с объяснениями, он чаще правильный.
Ограничения
⚠ Не для творческих задач: Метод заточен под задачи с чётким форматом — классификация, QA, извлечение данных. Для креативного письма жёсткая структура может ограничивать.
⚠ Примеры должны покрывать разнообразие: Если твои 3 примера из одного "угла" задачи, модель будет промахиваться на других кейсах. Выбирай разные типы входов.
⚠ Маленькие модели всё равно хуже: FewSUA драматически улучшает Llama2-7b/13b, но они всё равно отстают от GPT-4 на 20-40 пунктов F1 на сложных задачах.
Что стоит за исследованием
Команда Ontario Tech University (Канада) взяла 4 модели (GPT-3.5, GPT-4o, Llama2-7b, Llama2-13b) и 5 датасетов. Сравнили 5 конфигураций промптов с разной степенью ролевого разделения.
Главное открытие — метрика структурной точности. Не только "правильный ли ответ", но и "в нужном ли формате". Llama2-7b в конфигурациях без явных ролей давала 0% — модель не могла выдать одно слово вместо абзаца.
Для математики протестировали 20 вариаций. Удивительный результат: объяснения улучшают точность, даже если ломают структуру. Когда модель рассуждает вслух, она реже ошибается. Порядок "сначала рассуждение, потом ответ" работает лучше.
Код: GitHub репозиторий с полными экспериментами
Быстрый старт
Вставь в чат:
LLM спросит какую задачу решаешь, какой формат нужен, попросит примеры. Заполнит шаблон под твой кейс.
Вывод
Простой принцип: разделяй роли в промпте. System — правила. User/Assistant — примеры формата. Последний User — запрос. Работает в ChatGPT, Claude, любом API.
Особенно ценно когда нужен строгий формат — классификация, извлечение данных, JSON для автоматизации. Reasoning-First для сложных задач — отдельный бонус.
Больше практических техник промптинга разбираю в своём Telegram — там без воды, только рабочие приёмы. А какие техники структурирования промптов используешь ты? Делитесь в комментах — интересно сравнить подходы.
Попробуйте сами — вот как выглядит ответ ChatGPT с этим методом: