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

<Callout type="info" title="Черновик, а не финальная версия">
Думайте о своём первом промпте как о черновике. Даже опытные промпт-инженеры редко попадают в цель с первого раза.
</Callout>

## Цикл итерации

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

<IterativeRefinementDemo />

## Типичные паттерны доработки

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

### Проблема: слишком длинный ответ

Одна из самых частых проблем. Без явных ограничений модели склонны быть обстоятельными, а не краткими.

<DiffView 
  before="Explain how photosynthesis works."
  after={`Explain how photosynthesis works in 3-4 sentences suitable for a 10-year-old.`}
  beforeLabel="Оригинал"
  afterLabel="Доработанный"
/>

### Проблема: слишком расплывчатый ответ

Расплывчатые промпты дают расплывчатые ответы. Модель не может прочитать ваши мысли о том, что значит «лучше» или какие аспекты для вас важнее всего.

<DiffView 
  before="Give me tips for better presentations."
  after={`Give me 5 specific, actionable tips for improving technical presentations to non-technical stakeholders. For each tip, include a concrete example.`}
  beforeLabel="Оригинал"
  afterLabel="Доработанный"
/>

### Проблема: неправильный тон

Тон субъективен и зависит от контекста. То, что модель считает «профессиональным», может не соответствовать голосу вашей организации или характеру отношений с получателем.

<DiffView 
  before="Write an apology email for missing a deadline."
  after={`Write a professional but warm apology email for missing a project deadline. The tone should be accountable without being overly apologetic. Include a concrete plan to prevent future delays.`}
  beforeLabel="Оригинал"
  afterLabel="Доработанный"
/>

### Проблема: отсутствует ключевая информация

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

<DiffView 
  before="Review this code."
  after={`Review this Python code for:
1. Bugs and logical errors
2. Performance issues
3. Security vulnerabilities
4. Code style (PEP 8)

For each issue found, explain the problem and suggest a fix.

[code]`}
  beforeLabel="Оригинал"
  afterLabel="Доработанный"
/>

### Проблема: непоследовательный формат

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

<DiffView 
  before="Analyze these three products."
  after={`Analyze these three products using this exact format for each:

## [Product Name]
**Price:** $X
**Pros:** [bullet list]
**Cons:** [bullet list]
**Best For:** [one sentence]
**Rating:** X/10

[products]`}
  beforeLabel="Оригинал"
  afterLabel="Доработанный"
/>

## Систематический подход к доработке

Случайные изменения — пустая трата времени. Систематический подход помогает быстро выявлять проблемы и эффективно их исправлять.

### Шаг 1: Диагностика проблемы

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

<div className="my-4 grid gap-2">
  <div className="grid grid-cols-3 gap-2 p-3 bg-muted/50 rounded-lg text-sm">
    <span className="font-semibold">Симптом</span>
    <span className="font-semibold">Вероятная причина</span>
    <span className="font-semibold">Решение</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Слишком длинно</span>
    <span className="text-muted-foreground">Нет ограничения длины</span>
    <span className="text-green-600 dark:text-green-400">Добавить лимит слов/предложений</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Слишком коротко</span>
    <span className="text-muted-foreground">Нет запроса деталей</span>
    <span className="text-green-600 dark:text-green-400">Попросить раскрыть подробнее</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Не по теме</span>
    <span className="text-muted-foreground">Размытые инструкции</span>
    <span className="text-green-600 dark:text-green-400">Быть конкретнее</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Неправильный формат</span>
    <span className="text-muted-foreground">Формат не указан</span>
    <span className="text-green-600 dark:text-green-400">Определить точную структуру</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Неправильный тон</span>
    <span className="text-muted-foreground">Аудитория не определена</span>
    <span className="text-green-600 dark:text-green-400">Указать аудиторию/стиль</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Непоследовательно</span>
    <span className="text-muted-foreground">Примеры не предоставлены</span>
    <span className="text-green-600 dark:text-green-400">Добавить few-shot примеры</span>
  </div>
</div>

### Шаг 2: Вносите точечные изменения

Сопротивляйтесь желанию переписать всё заново. Изменение нескольких переменных одновременно делает невозможным понять, что помогло, а что навредило. Внесите одно изменение, протестируйте его, затем двигайтесь дальше:

```
Итерация 1: Добавить ограничение длины
Итерация 2: Указать формат
Итерация 3: Добавить пример
Итерация 4: Уточнить инструкции по тону
```

### Шаг 3: Документируйте, что работает

Знания о промпт-инженерии легко теряются. Ведите журнал того, что вы пробовали и почему. Это сэкономит время, когда вы вернётесь к промпту позже или столкнётесь с похожими задачами:

```markdown
## Промпт: Ответ клиенту по email

### Версия 1 (слишком формальная)
"Write a response to this customer complaint."

### Версия 2 (тон лучше, но нет структуры)
"Write a friendly but professional response to this complaint. 
Show empathy first."

### Версия 3 (финальная — хорошие результаты)
"Write a response to this customer complaint. Structure:
1. Acknowledge their frustration (1 sentence)
2. Apologize specifically (1 sentence)  
3. Explain solution (2-3 sentences)
4. Offer additional help (1 sentence)

Tone: Friendly, professional, empathetic but not groveling."
```

## Реальный пример итерации

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

### Задача: Генерация названий продуктов

<VersionDiff versions={[
  {
    label: "Версия 1",
    content: "Generate names for a new productivity app.",
    note: "Слишком общий, нет контекста"
  },
  {
    label: "Версия 2",
    content: `Generate names for a new productivity app. The app uses AI to automatically schedule your tasks based on energy levels and calendar availability.`,
    note: "Добавлен контекст, всё ещё общий"
  },
  {
    label: "Версия 3",
    content: `Generate 10 unique, memorable names for a productivity app with these characteristics:
- Uses AI to schedule tasks based on energy levels
- Target audience: busy professionals aged 25-40
- Brand tone: modern, smart, slightly playful
- Avoid: generic words like "pro", "smart", "AI", "task"

For each name, explain why it works.`,
    note: "Добавлены ограничения и обоснование"
  },
  {
    label: "Версия 4 (финальная)",
    content: `Generate 10 unique, memorable names for a productivity app.

Context:
- Uses AI to schedule tasks based on energy levels
- Target: busy professionals, 25-40
- Tone: modern, smart, slightly playful

Requirements:
- 2-3 syllables maximum
- Easy to spell and pronounce
- Available as .com domain (check if plausible)
- Avoid: generic words (pro, smart, AI, task, flow)

Format:
Name | Pronunciation | Why It Works | Domain Availability Guess`,
    note: "Структурированный формат, конкретные требования"
  }
]} />

## Стратегии доработки по типам задач

Разные задачи ломаются предсказуемым образом. Знание типичных режимов отказа помогает быстрее диагностировать и исправлять проблемы.

### Для генерации контента

Генерация контента часто даёт общие, не попадающие в цель или плохо отформатированные результаты. Исправление обычно включает более конкретные ограничения, предоставление конкретных примеров или явное определение голоса вашего бренда.

<InfoGrid items={[
  { icon: "target", title: "Слишком общий", description: "Добавьте конкретные ограничения и контекст", example: "\"Write about dogs\" → \"Write about golden retrievers for first-time owners, focusing on training and exercise needs\"" },
  { icon: "scissors", title: "Слишком длинный", description: "Установите лимиты слов/абзацев", example: "Добавьте: \"Keep response under 150 words\" или \"Maximum 3 paragraphs\"" },
  { icon: "palette", title: "Неправильный стиль", description: "Предоставьте примеры стиля", example: "\"Write in the style of this example: [paste sample text]\"" },
  { icon: "megaphone", title: "Не соответствует бренду", description: "Включите рекомендации по голосу бренда", example: "\"Use friendly, casual tone. Avoid jargon. Address reader as 'you'.\"" }
]} />

### Для генерации кода

Код может давать сбои технически (синтаксические ошибки, неправильные возможности языка) или архитектурно (плохие паттерны, пропущенные случаи). Технические проблемы требуют указания версии/окружения; архитектурные проблемы требуют руководства по проектированию.

<InfoGrid items={[
  { icon: "code", title: "Синтаксические ошибки", description: "Укажите версию языка", example: "\"Use Python 3.11+ syntax with type hints\" или \"ES2022 JavaScript\"" },
  { icon: "git-branch", title: "Неправильный подход", description: "Опишите предпочтительные паттерны", example: "\"Use functional approach, avoid classes\" или \"Follow repository pattern\"" },
  { icon: "shield", title: "Пропущены крайние случаи", description: "Перечислите сценарии для обработки", example: "\"Handle: empty input, null values, network timeouts, invalid formats\"" },
  { icon: "tag", title: "Плохие названия", description: "Включите соглашения об именовании", example: "\"Use camelCase for variables, PascalCase for classes, UPPER_SNAKE for constants\"" }
]} />

### Для анализа

Задачи анализа часто дают поверхностные или неструктурированные результаты. Направляйте модель с помощью конкретных фреймворков (SWOT, пять сил Портера), запрашивайте несколько точек зрения или предоставьте шаблон для структуры вывода.

<InfoGrid items={[
  { icon: "layers", title: "Слишком поверхностно", description: "Запросите конкретные фреймворки", example: "\"Analyze using SWOT framework\" или \"Apply Porter's Five Forces\"" },
  { icon: "scale", title: "Предвзятость", description: "Запросите несколько точек зрения", example: "\"Present arguments for and against\" или \"Include skeptic's viewpoint\"" },
  { icon: "database", title: "Недостаточно данных", description: "Укажите, что анализировать", example: "\"Focus on: market size, growth rate, key players, entry barriers\"" },
  { icon: "layout", title: "Нет структуры", description: "Предоставьте шаблон анализа", example: "\"Format as: Summary → Key Findings → Implications → Recommendations\"" }
]} />

### Для вопросов и ответов

Ответы на вопросы могут быть слишком краткими или слишком многословными, и могут не содержать индикаторов уверенности или источников. Укажите нужный уровень детализации и нужны ли вам цитаты или выражение неопределённости.

<InfoGrid items={[
  { icon: "plus", title: "Слишком коротко", description: "Попросите раскрыть тему", example: "\"Explain in detail with examples\" или \"Elaborate on each point\"" },
  { icon: "minus", title: "Слишком длинно", description: "Запросите краткий ответ", example: "\"Answer in 2-3 sentences\" или \"Give me the TL;DR\"" },
  { icon: "help-circle", title: "Неопределённость", description: "Попросите указать уровень уверенности", example: "\"Rate your confidence 1-10\" или \"Note any assumptions made\"" },
  { icon: "link", title: "Нет источников", description: "Запросите цитирование", example: "\"Cite sources for claims\" или \"Include references where possible\"" }
]} />

## Техника обратной связи

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

```
I used this prompt:
"[your prompt]"

And got this output:
"[model output]"

I wanted something more [describe gap]. How should I modify 
my prompt to get better results?
```

## A/B-тестирование промптов

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

```
Prompt A: "Summarize this article in 3 bullet points."
Prompt B: "Extract the 3 most important insights from this article."
Prompt C: "What are the key takeaways from this article? List 3."
```

Запустите каждый несколько раз, сравните:
- Стабильность вывода
- Качество информации
- Релевантность вашим потребностям

## Когда остановить итерации

Совершенство — враг достаточно хорошего. Знайте, когда ваш промпт готов к использованию и когда вы просто полируете его с убывающей отдачей.

<div className="my-6 grid md:grid-cols-2 gap-4">
  <div className="border rounded-lg bg-green-50/50 dark:bg-green-950/20 border-green-200 dark:border-green-900">
    <p className="text-sm font-semibold text-green-700 dark:text-green-400 px-4 pt-3 flex items-center gap-2 m-0!"><IconCheck className="h-4 w-4" /> Готово к запуску</p>
    <div className="text-sm p-4 pt-2 space-y-1">
      <p className="m-0!">Вывод стабильно соответствует требованиям</p>
      <p className="m-0!">Крайние случаи обрабатываются корректно</p>
      <p className="m-0!">Формат надёжен и поддаётся парсингу</p>
      <p className="m-0!">Дальнейшие улучшения дают убывающую отдачу</p>
    </div>
  </div>
  <div className="border rounded-lg bg-red-50/50 dark:bg-red-950/20 border-red-200 dark:border-red-900">
    <p className="text-sm font-semibold text-red-700 dark:text-red-400 px-4 pt-3 flex items-center gap-2 m-0!"><IconX className="h-4 w-4" /> Продолжайте итерации</p>
    <div className="text-sm p-4 pt-2 space-y-1">
      <p className="m-0!">Вывод нестабилен при разных запусках</p>
      <p className="m-0!">Крайние случаи вызывают сбои</p>
      <p className="m-0!">Критические требования не выполняются</p>
      <p className="m-0!">Вы не протестировали достаточно вариаций</p>
    </div>
  </div>
</div>

## Контроль версий для промптов

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

<Callout type="tip" title="Встроенное версионирование">
prompts.chat включает автоматическую историю версий для ваших промптов. Каждое редактирование сохраняется, так что вы можете сравнивать версии и восстанавливать предыдущие итерации одним кликом.
</Callout>

Для самостоятельно управляемых промптов используйте структуру папок:

```
prompts/
├── customer-response/
│   ├── v1.0.txt    # Initial version
│   ├── v1.1.txt    # Fixed tone issue
│   ├── v2.0.txt    # Major restructure
│   └── current.txt # Symlink to active version
└── changelog.md    # Document changes
```

## Резюме

<Callout type="tip" title="Ключевые выводы">
Начинайте просто, внимательно наблюдайте, меняйте по одной вещи за раз, документируйте, что работает, и знайте, когда остановиться. Лучшие промпты не пишутся — они открываются через систематические итерации.
</Callout>

<Quiz 
  question="Какой лучший подход при доработке промпта, который даёт неправильные результаты?"
  options={[
    "Переписать весь промпт с нуля",
    "Добавлять примеры, пока не заработает",
    "Менять по одной вещи за раз и тестировать каждое изменение",
    "Сделать промпт как можно длиннее"
  ]}
  correctIndex={2}
  explanation="Изменение по одной вещи за раз позволяет определить, что работает, а что нет. Если вы меняете несколько вещей одновременно, вы не узнаете, какое изменение исправило проблему, а какое её усугубило."
/>

## Практика: Улучшите этот промпт

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

<BeforeAfterEditor
  title="Доработайте этот промпт для email"
  badPrompt="Write an email."
  idealPrompt={`You are a professional business writer.

Task: Write a follow-up email to a potential client after a sales meeting.

Context:
- Met with Sarah Chen, VP of Marketing at TechCorp
- Discussed our analytics platform
- She expressed interest in the reporting features
- Meeting was yesterday

Requirements:
- Professional but warm tone
- Reference specific points from our meeting
- Include a clear next step (schedule a demo)
- Keep under 150 words

Format: Subject line + email body`}
  task="Превратите этот расплывчатый промпт для email в нечто, что даст профессиональный, эффективный результат."
/>

В следующей главе мы рассмотрим промптинг с JSON и YAML для приложений со структурированными данными.
