Урок по треку LLM-инженерия 6 мин

Промптинг и структурированный вывод

Системный промпт, few-shot, рассуждение по шагам, JSON-схемы и constrained decoding, шаблоны и версии промптов.

Промпт это интерфейс к модели. В проде он живёт как код: под версионированием, с тестами и метриками. На собесе проверяют не «волшебные фразы», а умение сделать поведение модели предсказуемым.

Роли сообщений

Чат-API принимает список сообщений с ролями:

  • system (у некоторых провайдеров developer): правила, роль, формат, ограничения. Самый приоритетный слой инструкций.
  • user: запрос пользователя.
  • assistant: прошлые ответы модели; можно подложить свой текст как пример или начало ответа.
  • tool: результат вызова инструмента.

Модель не исполняет системный промпт как программу: это просто текст в начале контекста, которому она обучена доверять больше. Поэтому системный промпт не защищает от утечки и инъекций сам по себе.

Что делает промпт хорошим

  1. Конкретная задача и критерии. «Сократи до 3 пунктов по 15 слов, без вводных фраз» лучше, чем «сделай короче».
  2. Контекст и аудитория. Для кого ответ, что уже известно, чего избегать.
  3. Чёткие границы данных. Документы и ввод пользователя оборачивают в разделители или теги, чтобы модель отличала инструкции от данных:
Ответь на вопрос только по тексту внутри <doc>. Если ответа нет, напиши "нет данных".
<doc>
...
</doc>
Вопрос: ...
  1. Примеры (few-shot). 2-5 примеров «вход и выход» сильнее любого описания формата. Примеры должны быть разнообразными: если все примеры положительные, модель начнёт всем отвечать положительно.
  2. Что делать при неопределённости. Явно разрешите отвечать «не знаю», иначе модель будет угадывать.

Рассуждение перед ответом

Для задач с несколькими шагами (математика, логика, сложная классификация) помогает попросить модель сначала рассуждать, а потом дать ответ: chain-of-thought. Современные reasoning-модели делают это сами, им отдельная просьба не нужна, а иногда мешает.

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

Другие приёмы:

  • Декомпозиция: вместо одного огромного промпта цепочка из нескольких простых шагов. Каждый шаг легче тестировать.
  • Self-consistency: несколько ответов с ненулевой температурой и голосование. Дорого, но повышает точность на задачах с одним правильным ответом.

Структурированный вывод

Если ответ читает программа, просите JSON и проверяйте его. Уровни надёжности, от слабого к сильному:

  1. Просьба в промпте «ответь в JSON» и пример. Иногда получаем текст вокруг JSON или пропущенные поля.
  2. JSON mode: провайдер гарантирует синтаксически валидный JSON, но не схему.
  3. Structured outputs / constrained decoding: генерация ограничена JSON-схемой или грамматикой. На каждом шаге запрещены токены, которые нарушат схему. Ответ гарантированно соответствует схеме (насколько провайдер поддерживает конструкции схемы).

Даже при гарантии схемы проверяйте смысл: валидный JSON может содержать выдуманные значения. Типичная обвязка: парсинг, валидация (Pydantic, JSON Schema, Zod), при ошибке повтор с текстом ошибки или фолбэк.

Советы по схемам:

  • Перечисления (enum) вместо свободного текста для категорий.
  • Поле для «не определено» (null или "unknown"), иначе модель выдумает значение.
  • Порядок полей важен: если нужно рассуждение, ставьте поле reasoning перед answer, потому что модель генерирует слева направо.

Промпт как код

  • Шаблоны с подстановкой переменных, без склейки строк по всему коду.
  • Версии промптов и запись версии в логи каждого вызова.
  • Регрессионный набор примеров: перед выкаткой новой версии прогон и сравнение метрик.
  • Смена модели = новая версия: промпт, отлаженный под одну модель, может хуже работать на другой.

Частые ошибки

  • Писать «никогда не делай X» и считать это защитой. Модель может нарушить правило, особенно под давлением инъекции.
  • Давать пример, который случайно задаёт лишний паттерн (всегда одна длина, один класс).
  • Парсить ответ регуляркой без валидации и повторов.
  • Менять промпт в проде без прогона по тестовому набору.

Что спросят на собесе

  • Роли system, user, assistant и почему системный промпт не граница безопасности.
  • Zero-shot, few-shot и chain-of-thought: когда что.
  • Как гарантировать JSON по схеме: JSON mode против constrained decoding, валидация и повтор.
  • Как вы версионируете и тестируете промпты.

Закрепите за 5 минут

После урока в тренажёре 3-5 проверочных вопросов, дальше модуль уходит в повторения.