Как добиться точности форматирования от LLM через System → User → Assistant

Просишь ChatGPT классифицировать отзыв одним словом — "позитив", "негатив" или "нейтрал". Получаешь абзац рассуждений: "Этот отзыв скорее можно отнести к негативным, потому что автор упоминает проблемы с доставкой, хотя есть и позитивные моменты...". Знакомо?

Как добиться точности форматирования от LLM через System → User → Assistant

Проблема не в том, что модель "глупая". Проблема в том, что ты свалил всё в одно сообщение — инструкции, примеры, запрос. Модель не видит границ. Она не знает где кончается пример и начинается твой реальный запрос.

Исследование 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 через System → User → Assistant

Это работает потому что LLM натренированы на диалогах с чёткой ролевой структурой (по данным Anthropic, именно так обучают модели семейства Claude). Когда ты используешь System/User/Assistant, модель включает "правильные" паттерны. Без этого она видит поток текста — и начинает импровизировать.

Пример: классификация отзывов на Wildberries

Задача: автоматом сортировать отзывы. Формат — строго одно слово: "позитив", "негатив", "нейтрал". Без объяснений.

[SYSTEM] Ты классификатор отзывов. Определи тональность. Ответ — ТОЛЬКО одно слово: "позитив", "негатив" или "нейтрал". Без кавычек, без пояснений. [USER] Доставили быстро, качество отличное, буду заказывать ещё! [ASSISTANT] позитив [USER] Размер не подошёл, пришлось возвращать. Деньги вернули через неделю. [ASSISTANT] нейтрал [USER] Полный брак, швы разошлись после первой стирки. Не рекомендую. [ASSISTANT] негатив [USER] Заказывала подарок маме на юбилей. Упаковка помятая, сам товар нормальный.

Модель выдаст одно слово — "нейтрал". Без рассуждений. Структура FewSUA показала паттерн: User → короткий Assistant. Модель копирует.

Почему "в лоб" не работает

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

FewSUA разделяет зоны ответственности. System — что делать. User/Assistant — как делать (примеры). Последний User — триггер генерации в том же формате.

Это как объяснять на примерах вместо часовой лекции. Показал 2-3 раза — и человек схватил. С моделью так же.

Рычаги управления

Количество примеров: 3 оптимально. Больше не даёт прироста (проверяли на датасетах от sentiment analysis до математики из MATH dataset).

Формат примеров: Чем короче выходы в примерах, тем точнее модель копирует. Если Assistant в примерах выдаёт абзацы — модель будет выдавать абзацы.

System-инструкция: Сюда всё что не меняется между запросами. Формат, правила, ограничения.

Шаблон для быстрого старта

[SYSTEM] {общая_инструкция} Формат ответа: {требуемый_формат} [USER] {пример_вход_1} [ASSISTANT] {пример_выход_1} [USER] {пример_вход_2} [ASSISTANT] {пример_выход_2} [USER] {пример_вход_3} [ASSISTANT] {пример_выход_3} [USER] {твой_запрос}

В ChatGPT/Claude роли задаются интерфейсом (System Prompt в настройках). В обычном чате можно использовать маркеры [SYSTEM], [USER], [ASSISTANT] — модель распознаёт паттерн.

Для сложных задач: Reasoning-First

Когда задача требует рассуждений (математика, анализ, принятие решений), лучше обратный порядок — сначала модель думает вслух, потом даёт ответ:

[SYSTEM] {описание_задачи} Сначала объясни рассуждение шаг за шагом. Затем дай финальный ответ в формате: {требуемый_формат} [USER] {пример_вопрос_1} [ASSISTANT] {рассуждение_1} Ответ: {ответ_1} [USER] {пример_вопрос_2} [ASSISTANT] {рассуждение_2} Ответ: {ответ_2} [USER] {твой_вопрос}

Этот формат поднял 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 репозиторий с полными экспериментами

Быстрый старт

Вставь в чат:

Вот шаблон Role Design. Адаптируй под мою задачу: [твоя задача]. Задавай вопросы, чтобы заполнить поля. [вставить шаблон FewSUA выше]

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

Вывод

Простой принцип: разделяй роли в промпте. System — правила. User/Assistant — примеры формата. Последний User — запрос. Работает в ChatGPT, Claude, любом API.

Особенно ценно когда нужен строгий формат — классификация, извлечение данных, JSON для автоматизации. Reasoning-First для сложных задач — отдельный бонус.

Больше практических техник промптинга разбираю в своём Telegram — там без воды, только рабочие приёмы. А какие техники структурирования промптов используешь ты? Делитесь в комментах — интересно сравнить подходы.

Как добиться точности форматирования от LLM через System → User → Assistant

Попробуйте сами — вот как выглядит ответ ChatGPT с этим методом:

Как добиться точности форматирования от LLM через System → User → Assistant
1
1 комментарий