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

<Callout type="tip" title="Строительные блоки">
Думайте об этих компонентах как о кубиках LEGO. Вам не нужны все они для каждого промпта, но знание доступных вариантов помогает создавать именно то, что вам нужно.
</Callout>

## Основные компоненты

Эффективный промпт обычно включает некоторые или все из этих элементов:

<PromptBreakdown parts={[
  { label: "Роль", text: "Вы — старший инженер-программист" },
  { label: "Контекст", text: "работающий над приложением на React." },
  { label: "Задача", text: "Проверьте этот код на наличие ошибок" },
  { label: "Ограничения", text: "и сосредоточьтесь только на проблемах безопасности." },
  { label: "Формат", text: "Верните результаты в виде нумерованного списка." },
  { label: "Пример", text: "Например: 1. Риск SQL-инъекции в строке 42" }
]} />

Давайте рассмотрим каждый компонент подробно.

## 1. Роль / Персона

Установка роли фокусирует ответы модели через призму конкретной экспертизы или точки зрения.

<Compare 
  before={{ label: "Без роли", content: "Объясните квантовые вычисления." }}
  after={{ label: "С ролью", content: "Вы — профессор физики, который специализируется на том, чтобы делать сложные темы доступными для начинающих. Объясните квантовые вычисления." }}
/>

Роль настраивает модель на:
- Использование подходящей лексики
- Применение соответствующей экспертизы
- Поддержание последовательной точки зрения
- Учёт аудитории соответствующим образом

### Эффективные шаблоны ролей

```
"Вы — [профессия] с [X лет] опыта в [специализация]"
"Действуйте как [роль], который является [характеристика]"
"Вы — эксперт в [область], помогающий [тип аудитории]"
```

## 2. Контекст / Предыстория

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

<Compare 
  before={{ label: "Слабый контекст", content: "Исправьте эту ошибку в моём коде." }}
  after={{ label: "Сильный контекст", content: "Я создаю REST API на Node.js с использованием Express.js. API обрабатывает аутентификацию пользователей с помощью JWT-токенов. Когда пользователь пытается получить доступ к защищённому маршруту, он получает ошибку 403, даже с действительным токеном. Вот соответствующий код: [код]" }}
/>

### Что включать в контекст

- **Детали проекта** — Технологический стек, архитектура, ограничения
- **Текущее состояние** — Что вы пробовали, что работает, что нет
- **Цели** — Чего вы в конечном итоге пытаетесь достичь
- **Ограничения** — Временные рамки, технические требования, стайлгайды

## 3. Задача / Инструкция

Задача — это сердце вашего промпта — то, что вы хотите, чтобы модель сделала. Будьте конкретны и однозначны.

### Спектр конкретности

<SpecificitySpectrum levels={[
  { level: "Размыто", text: "Помогите мне с этим эссе" },
  { level: "Лучше", text: "Отредактируйте это эссе" },
  { level: "Хорошо", text: "Отредактируйте это эссе на предмет грамматики и ясности" },
  { level: "Лучше всего", text: "Отредактируйте это эссе на предмет грамматики и ясности, сохраняя оригинальный тон, но сокращая многословность на 20%" }
]} />

### Глаголы действия, которые работают хорошо

<div className="my-4 grid gap-2">
  <div className="flex gap-2 p-3 bg-muted/50 rounded-lg">
    <span className="font-semibold min-w-32">Создание</span>
    <span className="text-muted-foreground">Напишите, Создайте, Сгенерируйте, Составьте, Спроектируйте</span>
  </div>
  <div className="flex gap-2 p-3 bg-muted/50 rounded-lg">
    <span className="font-semibold min-w-32">Анализ</span>
    <span className="text-muted-foreground">Проанализируйте, Оцените, Сравните, Оцените, Проверьте</span>
  </div>
  <div className="flex gap-2 p-3 bg-muted/50 rounded-lg">
    <span className="font-semibold min-w-32">Преобразование</span>
    <span className="text-muted-foreground">Конвертируйте, Переведите, Переформатируйте, Резюмируйте, Расширьте</span>
  </div>
  <div className="flex gap-2 p-3 bg-muted/50 rounded-lg">
    <span className="font-semibold min-w-32">Объяснение</span>
    <span className="text-muted-foreground">Объясните, Опишите, Уточните, Определите, Проиллюстрируйте</span>
  </div>
  <div className="flex gap-2 p-3 bg-muted/50 rounded-lg">
    <span className="font-semibold min-w-32">Решение проблем</span>
    <span className="text-muted-foreground">Решите, Отладьте, Исправьте, Оптимизируйте, Улучшите</span>
  </div>
</div>

## 4. Ограничения / Правила

Ограничения определяют границы выходных данных модели. Они предотвращают распространённые проблемы и обеспечивают релевантность.

### Типы ограничений

**Ограничения по длине:**
```
"Ответ должен быть не более 200 слов"
"Предоставьте ровно 5 предложений"
"Напишите 3-4 абзаца"
```

**Ограничения по содержанию:**
```
"Не включайте примеры кода"
"Сосредоточьтесь только на технических аспектах"
"Избегайте маркетингового языка"
```

**Ограничения по стилю:**
```
"Используйте формальный, академический тон"
"Пишите так, как будто говорите с 10-летним ребёнком"
"Будьте прямолинейны и избегайте уклончивых формулировок"
```

**Ограничения по охвату:**
```
"Рассматривайте только варианты, доступные в Python 3.10+"
"Ограничьте предложения бесплатными инструментами"
"Сосредоточьтесь на решениях, не требующих дополнительных зависимостей"
```

## 5. Формат вывода

Указание формата вывода гарантирует получение ответов в удобной структуре.

### Распространённые форматы

**Списки:**
```
"Верните в виде маркированного списка"
"Предоставьте нумерованный список шагов"
```

**Структурированные данные:**
```
"Верните в формате JSON с ключами: title, description, priority"
"Оформите как таблицу markdown со столбцами: Функция, Плюсы, Минусы"
```

**Конкретные структуры:**
```
"Структурируйте ваш ответ следующим образом:
 ## Резюме
 ## Ключевые моменты
 ## Рекомендации"
```

### Пример вывода в JSON

```
Проанализируйте этот отзыв клиента и верните JSON:
{
  "sentiment": "positive" | "negative" | "neutral",
  "topics": ["массив основных тем"],
  "rating_prediction": 1-5,
  "key_phrases": ["примечательные фразы"]
}

Отзыв: "Товар пришёл быстро и отлично работает, но 
инструкции были запутанными."
```

## 6. Примеры (Few-Shot Learning)

Примеры — это самый мощный способ показать модели, что именно вы хотите.

### Пример One-Shot

```
Преобразуйте эти предложения в прошедшее время.

Пример:
Вход: "Она идёт в магазин"
Выход: "Она пошла в магазин"

Теперь преобразуйте:
Вход: "Они бегают каждое утро"
```

### Пример Few-Shot

```
Классифицируйте эти обращения в поддержку по срочности.

Примеры:
"Мой аккаунт взломали" → Критический
"Как мне сменить пароль?" → Низкий
"Платёж не прошёл, но деньги списали" → Высокий

Классифицируйте: "Приложение падает, когда я открываю настройки"
```

## Собираем всё вместе

Вот полный промпт, использующий все компоненты:

<TryIt 
  title="Полный пример промпта"
  description="Этот промпт демонстрирует все шесть компонентов, работающих вместе. Попробуйте его, чтобы увидеть, как структурированные промпты дают профессиональные результаты."
  prompt={`# Роль
Вы — старший технический писатель с 10-летним опытом создания документации для разработчиков.

# Контекст
Я документирую REST API для сервиса обработки платежей. Аудитория — разработчики, интегрирующие наш API в свои приложения. У них средний уровень знаний в программировании, но они могут быть новичками в концепциях обработки платежей.

# Задача
Напишите документацию для следующего API-эндпоинта, который создаёт новый платёжный intent.

# Ограничения
- Используйте ясный, лаконичный язык
- Включите распространённые сценарии ошибок
- Не включайте детали реализации нашего бэкенда
- Предполагайте, что читатели понимают основы HTTP и JSON

# Формат вывода
Структурируйте документацию следующим образом:
1. Обзор эндпоинта (2-3 предложения)
2. Запрос (метод, URL, заголовки, тело с примером)
3. Ответ (примеры успешного и ошибочного ответов)
4. Пример кода (на JavaScript/Node.js)

# Детали эндпоинта
POST /v1/payments/intents
Body: { "amount": 1000, "currency": "usd", "description": "Order #1234" }`}
/>

## Минимальный эффективный промпт

Не каждый промпт нуждается во всех компонентах. Для простых задач может быть достаточно чёткой инструкции:

```
Переведите "Hello, how are you?" на испанский.
```

Используйте дополнительные компоненты, когда:
- Задача сложная или неоднозначная
- Вам нужно специфическое форматирование
- Результаты не соответствуют ожиданиям
- Важна согласованность между несколькими запросами

## Распространённые шаблоны промптов

Эти фреймворки дают вам простой чек-лист для составления промптов. Нажмите на каждый шаг, чтобы увидеть пример.

<CRISPEFramework />

<RTFFramework />

## Резюме

Эффективные промпты конструируются, а не обнаруживаются. Понимая и применяя эти структурные компоненты, вы можете:

- Получать лучшие результаты с первой попытки
- Отлаживать промпты, которые не работают
- Создавать переиспользуемые шаблоны промптов
- Чётко доносить свои намерения

<Quiz 
  question="Какой компонент оказывает наибольшее влияние на качество ответа?"
  options={[
    "Всегда роль/персона",
    "Всегда формат вывода",
    "Зависит от задачи",
    "Длина промпта"
  ]}
  correctIndex={2}
  explanation="Разные задачи выигрывают от разных компонентов. Простой перевод требует минимальной структуры, тогда как сложный анализ выигрывает от детальной роли, контекста и спецификации формата."
/>

<TryIt 
  prompt={`Вы — старший продукт-менеджер с 10-летним опытом работы с SaaS-продуктами.

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

Задача: Предложите 3 функции, которые мы должны приоритизировать для нашего MVP.

Ограничения:
- Функции должны быть реализуемы командой из 2 разработчиков за 4 недели
- Сосредоточьтесь на том, что отличает нас от Trello и Asana

Формат: Для каждой функции укажите:
1. Название функции
2. Описание в одном предложении
3. Почему это важно для удалённых команд`}
  description="Этот промпт использует все шесть компонентов. Попробуйте его и посмотрите, как структурированный подход даёт сфокусированные, практичные результаты."
/>

## Создайте свой собственный промпт

Теперь ваша очередь! Используйте этот интерактивный конструктор промптов для создания собственного промпта с использованием изученных компонентов:

<PromptBuilder 
  title="Интерактивный конструктор промптов"
  description="Заполните каждый раздел, чтобы создать полный, хорошо структурированный промпт"
/>

<PromptChallenge
  title="Задание главы: Создайте промпт для код-ревью"
  task="Напишите промпт, который просит ИИ проверить код на уязвимости безопасности. Ваш промпт должен быть достаточно конкретным, чтобы получить практичную обратную связь."
  criteria={[
    "Включает чёткую роль или уровень экспертизы",
    "Указывает тип код-ревью (фокус на безопасности)",
    "Определяет ожидаемый формат вывода",
    "Устанавливает соответствующие ограничения или охват"
  ]}
  hints={[
    "Подумайте, какой экспертизой должен обладать ревьюер кода",
    "Будьте конкретны относительно того, какие проблемы безопасности искать",
    "Рассмотрите возможность запросить структурированный формат ответа"
  ]}
  exampleSolution={`Вы — старший инженер по безопасности с экспертизой в безопасности веб-приложений и уязвимостях OWASP Top 10.

Задача: Проверьте следующий код на уязвимости безопасности.

Сосредоточьтесь на:
- Рисках SQL-инъекций
- XSS-уязвимостях
- Проблемах аутентификации/авторизации
- Пробелах в валидации входных данных

Формат вывода:
Для каждой найденной проблемы:
1. Номер(а) строки
2. Тип уязвимости
3. Уровень риска (Высокий/Средний/Низкий)
4. Рекомендуемое исправление

[КОД ДЛЯ ПРОВЕРКИ]`}
  difficulty="intermediate"
/>

В следующей главе мы рассмотрим основные принципы, которые направляют решения при конструировании промптов.
