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
Промпт-инжиниринг - не искусство. Это интерфейс к вероятностному вычислению. У него есть строгие правила: структура, которую видела модель на обучении, примеры, которые смещают распределение, и фразы, которые активируют нужные «цепочки» в весах. Разница между наивным и инженерным промптом - до 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-файлы. Когда промпт выглядит как структурированный документ, он попадает в статистическую «зону знакомого» - и следование инструкциям резко улучшается. Это не магия - это статистика.
- **Роль** - кто модель, в каком контексте работает
- **Правила** - что можно и нельзя (constraints)
- **Тон** - стиль коммуникации
- **Формат** - как должен выглядеть ответ
- **Примеры** (опционально) - 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 | Валидный JSON | OpenAI | Простые 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