AI-инжиниринг

Паттерны промптов для production: system/user/assistant, few-shot, chain-of-thought

Цели урока

  • Писать structured system prompts - с секциями, правилами и форматом
  • Использовать few-shot примеры для стабильного вывода
  • Применять Chain-of-Thought для задач требующих логики
  • Выбирать стратегию форматирования вывода: JSON mode, Zod, XML-теги
  • Строить промпт-шаблоны для production - переиспользуемые и тестируемые

Предварительные знания

  • Интеграция с LLM API
  • API Integration

Промпт-инжиниринг - не искусство. Это интерфейс к вероятностному вычислению. У него есть строгие правила: структура, которую видела модель на обучении, примеры, которые смещают распределение, и фразы, которые активируют нужные «цепочки» в весах. Разница между наивным и инженерным промптом - до 40% качества. Та же модель, те же деньги - другой результат.

  • Notion AI - 50+ промпт-шаблонов для разных задач (summary, translate, brainstorm), все A/B тестируются как код
  • Cursor - chain-of-thought в промптах повысил точность автокомплита кода на 30% без изменения модели
  • Stripe - few-shot примеры для классификации тикетов дали 95% accuracy без fine-tuning (Brown et al. 2020 на практике)
  • GitHub Copilot - structured system prompt на 2000+ токенов задаёт контекст репозитория; это не "подсказка", это спецификация

Пять слов, которые изменили ML

2022 год. Jason Wei (Google Brain) публикует "Chain-of-Thought Prompting Elicits Reasoning in Large Language Models": покажи модели несколько worked examples с расписанными шагами рассуждения - и точность на математике резко растёт. Через несколько месяцев Kojima et al. 2022 обнаружили, что примеры вообще не нужны: достаточно добавить «Let's think step by step» - и точность на MultiArith скакнула примерно с 18% до 79%. Модель не менялась. Только промпт. До этого считалось: хочешь лучше - бери модель побольше или дообучай. Chain-of-Thought показал третий путь: **правильно спроси**. А ещё раньше Brown et al. 2020 (GPT-3) обнаружили few-shot learning - модель учится по примерам в контексте без единого gradient step. Оба открытия лежат в основе каждого production-промпта сегодня.

System prompt: архитектура, а не подсказка

Один разработчик пишет system prompt в одну строку: "Be a helpful assistant". Другой структурирует его как **спецификацию** - с секциями, ограничениями и форматом. Качество ответов у второго лучше - не потому что модель другая, а потому что он понимает, на чём она обучена.

Почему это работает? Модель обучена на миллиардах документов - и большинство из них структурированы: README, спеки, API-документация, markdown-файлы. Когда промпт выглядит как структурированный документ, он попадает в статистическую «зону знакомого» - и следование инструкциям резко улучшается. Это не магия - это статистика.

  1. **Роль** - кто модель, в каком контексте работает
  2. **Правила** - что можно и нельзя (constraints)
  3. **Тон** - стиль коммуникации
  4. **Формат** - как должен выглядеть ответ
  5. **Примеры** (опционально) - 1-2 примера ideal response

**System prompt НЕ гарантирует поведение.** Пользователь может "уговорить" модель нарушить правила (prompt injection). Не полагайся на system prompt как на security boundary - валидируй output на бекенде.

Почему structured system prompt (с секциями ## Роль, ## Правила) работает лучше одной строки?

Few-shot: учим модель на примерах

Brown et al. 2020 - статья о GPT-3 - открыла явление, которое назвали **few-shot learning**: модель видит 2-5 примеров «вход → выход» прямо в промпте и моментально понимает паттерн. Без обучения. Без gradient update. Просто по контексту. Это перевернуло представление о том, что такое «обучение» для LLM.

**Правило: 3 примера - золотая середина.** 1 пример - модель может не уловить паттерн. 5+ примеров - тратишь токены без значимого улучшения. 3 примера покрывают positive, negative и edge case.

**Когда few-shot критически важен:**

  • Нестандартный формат вывода (специфический JSON-schema, CSV, XML)
  • Классификация с кастомными категориями (не general purpose)
  • Стилистические задачи - модель должна копировать стиль примеров
  • Extraction из неструктурированного текста в конкретную структуру

**Храни few-shot примеры в базе**, а не в коде. Это позволяет A/B-тестировать разные наборы примеров и обновлять их без деплоя.

При построении API классификации тикетов поддержки по 12 кастомным категориям. Какой подход надёжнее?

Chain-of-Thought: заставь модель думать вслух

2022 год. Jason Wei из Google Brain показал, что worked examples с рассуждением запускают пошаговое мышление - это Chain-of-Thought prompting. Затем Kojima et al. обнаружили, что хватает одной фразы: **"Let's think step by step"**. Точность на математических задачах выросла с 18% до 79%. Не новая архитектура, не больше данных, не fine-tuning - пять слов. Это стало одним из самых цитируемых ML-открытий года.

Почему работает - не интуиция, а механика. LLM генерирует по одному токену. Когда модель «думает вслух», промежуточные токены рассуждения становятся **контекстом** для следующих токенов. Scratch pad прямо в контексте. Модель буквально использует собственный текст как рабочую память - у неё нет другой.

ЗадачаБез CoTС CoTУлучшение
Математика (GSM8K)~57%~93%+36%
Логические задачи~45%~85%+40%
Многошаговый анализ~60%~90%+30%
Простая классификация~95%~95%0% (не нужен)

**CoT тратит больше output-токенов** - рассуждения занимают место. Не используй CoT для простых задач (классификация, extraction) - это пустая трата денег.

Для какой задачи Chain-of-Thought даст наибольшее улучшение?

Форматирование вывода: JSON, XML-теги, structured output

В production нужен не «текст», а **structured data** - JSON, который можно распарсить и положить в базу. Есть несколько стратегий добиться стабильного вывода - выбор зависит от провайдера и требований к строгости.

**Стратегия 1: JSON mode** (OpenAI) - гарантирует валидный JSON:

**Стратегия 2: Structured Outputs** (OpenAI) - ещё строже, с Zod-схемой:

**Стратегия 3: XML-теги** - работает с любым провайдером (Claude, open-source):

МетодГарантия форматаПровайдерКогда использовать
JSON modeВалидный JSONOpenAIПростые JSON-ответы
Structured Outputs + ZodТочное соответствие схемеOpenAIКогда нужна строгая типизация
XML-тегиНет гарантии (нужна валидация)ЛюбойМультипровайдерность, сложные ответы с CoT + данными
Plaintext + regexНет гарантииЛюбойПростые ответы (да/нет, число)

**Best practice:** для OpenAI используй Structured Outputs + Zod. Для Anthropic и open-source - XML-теги + валидацию на бекенде. В любом случае - всегда оборачивай парсинг в try/catch.

При построении production API, которое извлекает structured data и должно работать с OpenAI и Anthropic. Какой подход выбрать?

Композиция промптов: template engine для AI

В production промпт - не захардкоженная строка. Это **шаблон**, в который подставляются данные из запроса, базы, конфига. Промпт собирается динамически - как SQL-запрос или HTML-шаблон. Разница: у промпта нет компилятора, который поймает ошибку. Поэтому архитектура важна ещё больше.

**Продвинутый паттерн: промпты в файлах** - хранить шаблоны отдельно от кода:

**Зачем выносить промпты?** Product manager может редактировать промпты через CMS/admin panel без участия разработчика. A/B тесты разных промптов - без деплоя. Версионирование промптов - откат к предыдущей версии при ухудшении качества.

Главная причина использовать prompt templates вместо строковых литералов в коде:

Чем длиннее и подробнее промпт - тем лучше результат

Лишние инструкции шумят: модель теряет фокус, "внимание" размывается по нерелевантным частям контекста

Attention в трансформере - это буквально распределение весов по всем токенам контекста. Если в system prompt 50 правил, модель уделяет каждому меньше "внимания". Оптимальный system prompt - точный и минимальный: только то, что реально влияет на поведение. Всё лишнее - не помощь, а шум.

System prompt надёжно ограничивает поведение модели - это security boundary

System prompt - это сильное смещение вероятностного распределения, но не жёсткий constraint

Модель - вероятностная машина. Достаточно умелый user-промпт может сместить распределение обратно. Это называется prompt injection. Первые CVE уже зафиксированы. Единственный надёжный барьер - валидация output на бекенде, guardrails, и разделение привилегий.

Паттерны в одном взгляде

  • System prompt - спецификация, не подсказка. Структура (Роль → Правила → Формат) работает, потому что модель обучена на структурированных документах
  • Few-shot (3 примера, Brown et al. 2020) - смещает распределение вывода без дообучения; хранить примеры в базе, не в коде
  • Chain-of-Thought (Wei et al. 2022) - пять слов дают +40% на логике; промежуточные токены = scratch pad в контексте
  • Structured Outputs (Zod) для OpenAI, XML-теги + валидация для мультипровайдерности
  • Промпты в шаблонах отдельно от кода - A/B тесты и правки без деплоя
  • Длиннее промпт ≠ лучше: лишние инструкции шумят и размывают attention

Что дальше

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

  • Structured Output — Глубже про JSON Schema, function calling, tool use
  • Prompt Injection — Как защитить промпты от атак пользователей
  • Evaluation — Как измерять качество промптов и автоматизировать тестирование

Вопросы для размышления

  • Какой из паттернов (few-shot, CoT, structured output) дал бы наибольший эффект в последнем проекте с LLM? Почему именно он?
  • Если system prompt - не security boundary, что нужно добавить в бекенд-архитектуру для реальной защиты?
  • CoT увеличивает количество output-токенов. Как бы выглядел расчёт стоимости для 100K запросов в день с CoT и без?

Связанные уроки

  • aie-05-api-integration — Паттерны промптов работают поверх chat API
  • aie-07-structured-output — Паттерны ведут к выводу с ограничением по схеме
  • aie-34-prompt-injection-deep — Надёжные промпты должны противостоять инъекциям
  • aie-31-evaluation — Качество промптов требует систематического измерения
  • ml-37-bert-gpt — Few-shot промптинг использует in-context обучение GPT-моделей
  • alg-20-greedy
Паттерны промптов для production: system/user/assistant, few-shot, chain-of-thought

0

1

Войти