Даже опытные промпт-инженеры попадают в предсказуемые ловушки. Хорошая новость? Как только вы распознаете эти паттерны, их легко избежать. Эта глава рассматривает наиболее распространённые ошибки, объясняет, почему они происходят, и даёт вам конкретные стратегии для их предотвращения.

<Callout type="warning" title="Почему ошибки важны">
Одна ошибка может превратить мощный ИИ в разочаровывающий инструмент. Понимание этих паттернов часто является разницей между «ИИ не работает для меня» и «ИИ преобразил мой рабочий процесс».
</Callout>

## Ловушка расплывчатости

**Паттерн**: Вы знаете, чего хотите, поэтому предполагаете, что ИИ тоже это поймёт. Но расплывчатые промпты дают расплывчатые результаты.

<Compare 
  before={{ label: "Расплывчатый промпт", content: "Напиши что-нибудь о маркетинге." }}
  after={{ label: "Конкретный промпт", content: "Напиши пост для LinkedIn на 300 слов о важности консистентности бренда для B2B SaaS-компаний, ориентированный на маркетинг-менеджеров. Используй профессиональный, но доступный тон. Включи один конкретный пример." }}
/>

**Почему это происходит**: Мы естественно пропускаем детали, когда считаем их «очевидными». Но то, что очевидно для вас, не очевидно для модели, которая не имеет контекста о вашей ситуации, аудитории или целях.

<TryIt 
  title="Улучшение конкретности"
  description="Возьмите расплывчатый промпт и сделайте его конкретным. Обратите внимание, как добавление деталей преобразует качество результатов."
  prompt={`У меня есть расплывчатый промпт, который нужно улучшить.

Исходный расплывчатый промпт: "\${vaguePrompt}"

Сделайте этот промпт конкретным, добавив:
1. **Аудитория**: Кто будет это читать/использовать?
2. **Формат**: Какой структуры он должен быть?
3. **Длина**: Какой длины он должен быть?
4. **Тон**: Какой голос или стиль?
5. **Контекст**: Какова ситуация или цель?
6. **Ограничения**: Что обязательно должно быть или чего нужно избегать?

Перепишите промпт со всеми этими деталями.`}
/>

## Ловушка перегрузки

**Паттерн**: Вы пытаетесь получить всё в одном промпте — всеобъемлющий, смешной, профессиональный, понятный для новичков, продвинутый, SEO-оптимизированный и короткий. Результат? ИИ пропускает половину ваших требований или выдаёт запутанную мешанину.

<Compare 
  before={{ label: "Перегруженный промпт", content: "Напиши пост в блог об ИИ, который SEO-оптимизирован и включает примеры кода и смешной, но профессиональный и ориентирован на новичков, но также имеет продвинутые советы и должен быть 500 слов, но всеобъемлющий и упоминает наш продукт и имеет призыв к действию..." }}
  after={{ label: "Сфокусированный промпт", content: "Напиши пост в блог на 500 слов, знакомящий новичков с ИИ.\n\nТребования:\n1. Ясно объясни одну ключевую концепцию\n2. Включи один простой пример кода\n3. Заверши призывом к действию\n\nТон: Профессиональный, но доступный" }}
/>

**Почему это происходит**: Страх множественных взаимодействий или желание «выложить всё» за один раз. Но когнитивная перегрузка влияет на ИИ так же, как на людей — слишком много конкурирующих требований приводит к упущениям.

<InfoGrid items={[
  { label: "Ограничьте требования", description: "Придерживайтесь 3-5 ключевых требований на промпт", example: "Сосредоточьтесь на: аудитория, формат, длина, одно ключевое ограничение", exampleType: "text", color: "green" },
  { label: "Используйте нумерованные списки", description: "Структура делает приоритеты ясными", example: "1. Обязательно X, 2. Желательно Y, 3. Было бы неплохо Z", exampleType: "text", color: "green" },
  { label: "Цепочка промптов", description: "Разбивайте сложные задачи на шаги", example: "Сначала: план. Затем: черновик раздела 1. Затем: черновик раздела 2.", exampleType: "text", color: "green" },
  { label: "Безжалостно приоритизируйте", description: "Что существенно, а что желательно?", example: "Если бы я мог получить только ОДНО правильно, что бы это было?", color: "green" }
]} />

<Callout type="tip" title="Изучите цепочки промптов">
Когда один промпт становится перегруженным, [цепочка промптов](/book/11-prompt-chaining) часто является решением. Разбейте сложные задачи на последовательность сфокусированных промптов, где каждый шаг основывается на предыдущем.
</Callout>

## Ловушка предположений

**Паттерн**: Вы ссылаетесь на что-то «из ранее» или предполагаете, что ИИ знает ваш проект, вашу компанию или ваши предыдущие разговоры. Он не знает.

<Compare 
  before={{ label: "Предполагает контекст", content: "Обнови функцию, которую я показывал тебе ранее, добавив обработку ошибок." }}
  after={{ label: "Предоставляет контекст", content: "Обнови эту функцию, добавив обработку ошибок:\n\n```python\ndef calculate_total(items):\n    return sum(item.price for item in items)\n```\n\nДобавь try/except для пустых списков и невалидных элементов." }}
/>

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

<TryIt 
  title="Проверка полноты контекста"
  description="Используйте это для проверки того, что ваш промпт содержит весь необходимый контекст перед отправкой."
  prompt={`Проверьте этот промпт на отсутствующий контекст:

"\${promptToCheck}"

Проверьте на:
1. **Упомянуто, но не включено**: Упоминает ли он «код», «документ», «ранее» или «выше» без включения фактического содержимого?

2. **Предполагаемые знания**: Предполагает ли он знания о конкретном проекте, компании или ситуации?

3. **Неявные требования**: Есть ли невысказанные ожидания относительно формата, длины или стиля?

4. **Отсутствующий фон**: Поймёт ли умный незнакомец, о чём спрашивают?

Перечислите, что отсутствует, и предложите, как это добавить.`}
/>

## Ловушка наводящих вопросов

**Паттерн**: Вы формулируете вопрос таким образом, что встраиваете своё предположение, получая обратно подтверждение, а не понимание.

<Compare 
  before={{ label: "Наводящий вопрос", content: "Почему Python — лучший язык программирования для науки о данных?" }}
  after={{ label: "Нейтральный вопрос", content: "Сравни Python, R и Julia для работы с данными. Каковы сильные и слабые стороны каждого? Когда бы вы выбрали один из них вместо других?" }}
/>

**Почему это происходит**: Мы часто ищем подтверждение, а не информацию. Наша формулировка бессознательно подталкивает к ответу, который мы ожидаем или хотим.

<TryIt 
  title="Детектор предвзятости"
  description="Проверьте ваши промпты на скрытую предвзятость и наводящие формулировки."
  prompt={`Проанализируйте этот промпт на предвзятость и наводящие формулировки:

"\${promptToAnalyze}"

Проверьте на:
1. **Встроенные предположения**: Предполагает ли вопрос, что что-то истинно?
2. **Наводящие формулировки**: Предполагает ли «Почему X хороший?», что X хороший?
3. **Отсутствующие альтернативы**: Игнорирует ли он другие возможности?
4. **Поиск подтверждения**: Запрашивает ли он валидацию, а не анализ?

Перепишите промпт, чтобы он был нейтральным и открытым.`}
/>

## Ловушка слепого доверия

**Паттерн**: Ответы ИИ звучат уверенно и авторитетно, поэтому вы принимаете их без проверки. Но уверенность не равна точности.

<InfoGrid items={[
  { label: "Непроверенный контент", description: "Публикация текста, созданного ИИ, без проверки фактов", example: "Посты в блогах с выдуманной статистикой или фальшивыми цитатами", exampleType: "text", color: "red" },
  { label: "Непротестированный код", description: "Использование кода ИИ в продакшене без тестирования", example: "Уязвимости безопасности, сбои в граничных случаях, скрытые баги", exampleType: "text", color: "red" },
  { label: "Слепые решения", description: "Принятие важных решений исключительно на основе анализа ИИ", example: "Бизнес-стратегия на основе галлюцинированных рыночных данных", exampleType: "text", color: "red" }
]} />

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

<TryIt 
  title="Промпт для верификации"
  description="Используйте это, чтобы ИИ сам отмечал свои неуверенности и потенциальные ошибки."
  prompt={`Мне нужна информация о: \${topic}

ВАЖНО: После вашего ответа добавьте раздел «Примечания для верификации», который включает:

1. **Уровень уверенности**: Насколько вы уверены в этой информации? (Высокий/Средний/Низкий)

2. **Потенциальные ошибки**: Какие части этого ответа скорее всего неверны или устарели?

3. **Что проверить**: Какие конкретные утверждения пользователь должен проверить независимо?

4. **Источники для проверки**: Где пользователь может верифицировать эту информацию?

Будьте честны об ограничениях. Лучше отметить неуверенность, чем звучать уверенно о чём-то неправильном.`}
/>

## Ловушка одной попытки

**Паттерн**: Вы отправляете один промпт, получаете посредственный результат и делаете вывод, что ИИ «не работает» для вашего случая. Но отличные результаты почти всегда требуют итераций.

<Compare 
  before={{ label: "Мышление одной попытки", content: "Посредственный вывод → «ИИ не может это сделать» → Сдаться" }}
  after={{ label: "Итеративное мышление", content: "Посредственный вывод → Проанализировать, что не так → Уточнить промпт → Лучший вывод → Уточнить снова → Отличный вывод" }}
/>

**Почему это происходит**: Мы ожидаем, что ИИ прочитает наши мысли с первой попытки. Мы не ожидаем итераций с поиском в Google, но почему-то ожидаем совершенства от ИИ.

<TryIt 
  title="Помощник итерации"
  description="Когда ваш первый результат не тот, используйте это для систематического улучшения."
  prompt={`Мой исходный промпт был:
"\${originalPrompt}"

Вывод, который я получил:
"\${outputReceived}"

Что с ним не так:
"\${whatIsWrong}"

Помогите мне итерировать:

1. **Диагноз**: Почему исходный промпт дал такой результат?

2. **Отсутствующие элементы**: О чём я не был явным, но должен был быть?

3. **Пересмотренный промпт**: Перепишите мой промпт, чтобы решить эти проблемы.

4. **На что обратить внимание**: Что я должен проверить в новом выводе?`}
/>

## Ловушка игнорирования формата

**Паттерн**: Вы фокусируетесь на том, что вы хотите, чтобы ИИ сказал, но забываете указать, как это должно быть отформатировано. Затем вы получаете прозу, когда вам нужен JSON, или стену текста, когда вам нужны маркированные пункты.

<Compare 
  before={{ label: "Формат не указан", content: "Извлеки ключевые данные из этого текста." }}
  after={{ label: "Формат указан", content: "Извлеки ключевые данные из этого текста как JSON:\n\n{\n  \"name\": string,\n  \"date\": \"YYYY-MM-DD\",\n  \"amount\": number,\n  \"category\": string\n}\n\nВерни ТОЛЬКО JSON, без объяснений." }}
/>

**Почему это происходит**: Мы фокусируемся на содержании, а не на структуре. Но если вам нужно парсить вывод программно или вставить его куда-то конкретно, формат важен так же, как и содержание.

<TryIt 
  title="Конструктор спецификации формата"
  description="Сгенерируйте чёткие спецификации формата для любого типа вывода, который вам нужен."
  prompt={`Мне нужен вывод ИИ в определённом формате.

**Что я запрашиваю**: \${taskDescription}
**Как я буду использовать вывод**: \${intendedUse}
**Предпочтительный формат**: \${formatType} (JSON, Markdown, CSV, маркированные пункты и т.д.)

Сгенерируйте спецификацию формата, которую я могу добавить к своему промпту, включая:

1. **Точную структуру** с именами полей и типами
2. **Пример вывода**, показывающий формат
3. **Ограничения** (например, «Верни ТОЛЬКО JSON, без объяснений»)
4. **Граничные случаи** (что выводить, если данные отсутствуют)`}
/>

## Ловушка контекстного окна

**Паттерн**: Вы вставляете огромный документ и ожидаете всеобъемлющего анализа. Но модели имеют ограничения — они могут обрезать, потерять фокус или пропустить важные детали в длинных входных данных.

<InfoGrid items={[
  { label: "Знайте свои ограничения", description: "Разные модели имеют разные контекстные окна", example: "GPT-4: 128K токенов, Claude: 200K токенов, Gemini: 1M токенов", exampleType: "text", color: "blue" },
  { label: "Разбивайте большие входы", description: "Делите документы на управляемые разделы", example: "Анализируйте главы отдельно, затем синтезируйте", exampleType: "text", color: "blue" },
  { label: "Важное — в начало", description: "Размещайте критический контекст в начале промпта", example: "Ключевые требования первыми, фоновые детали позже", exampleType: "text", color: "blue" },
  { label: "Убирайте лишнее", description: "Удаляйте ненужный контекст", example: "Вам действительно нужен весь документ или только релевантные разделы?", exampleType: "text", color: "blue" }
]} />

<TryIt 
  title="Стратегия разбиения документа"
  description="Получите стратегию обработки документов, превышающих ограничения контекста."
  prompt={`У меня есть большой документ для анализа:

**Тип документа**: \${documentType}
**Приблизительная длина**: \${documentLength}
**Что мне нужно извлечь/проанализировать**: \${analysisGoal}
**Модель, которую я использую**: \${modelName}

Создайте стратегию разбиения:

1. **Как разделить**: Логические точки разрыва для этого типа документа
2. **Что включить в каждый фрагмент**: Контекст, необходимый для автономного анализа
3. **Как синтезировать**: Объединение результатов из нескольких фрагментов
4. **На что обратить внимание**: Информация, которая может охватывать фрагменты`}
/>

## Ловушка антропоморфизации

**Паттерн**: Вы относитесь к ИИ как к коллеге-человеку — ожидая, что ему «понравятся» задачи, что он вас запомнит или будет заботиться о результатах. Он не будет.

<Compare 
  before={{ label: "Антропоморфизированный", content: "Уверен, тебе понравится этот творческий проект! Я знаю, что ты любишь помогать людям, и это действительно важно для меня лично." }}
  after={{ label: "Ясный и прямой", content: "Напиши творческий короткий рассказ с этими спецификациями:\n- Жанр: Научная фантастика\n- Длина: 500 слов\n- Тон: Обнадёживающий\n- Обязательно включить: Неожиданную концовку" }}
/>

**Почему это происходит**: Ответы ИИ настолько человекоподобны, что мы естественно впадаем в социальные паттерны. Но эмоциональные призывы не заставляют ИИ стараться больше — ясные инструкции делают это.

<Callout type="info" title="Что действительно помогает">
Вместо эмоциональных призывов сосредоточьтесь на: ясных требованиях, хороших примерах, конкретных ограничениях и явных критериях успеха. Это улучшает выводы. «Пожалуйста, очень постарайся» — нет.
</Callout>

## Ловушка пренебрежения безопасностью

**Паттерн**: В спешке заставить всё работать вы включаете конфиденциальную информацию в промпты — API-ключи, пароли, персональные данные или проприетарную информацию.

<InfoGrid items={[
  { label: "Секреты в промптах", description: "API-ключи, пароли, токены, вставленные в промпты", example: "«Используй этот API-ключ: sk-abc123...»", color: "red" },
  { label: "Персональные данные", description: "Включение PII, которые отправляются на сторонние серверы", example: "Имена клиентов, email-адреса, физические адреса в промптах", exampleType: "text", color: "red" },
  { label: "Несанитизированный пользовательский ввод", description: "Передача пользовательского ввода напрямую в промпты", example: "Уязвимости prompt injection", exampleType: "text", color: "red" },
  { label: "Проприетарная информация", description: "Коммерческие секреты или конфиденциальные данные", example: "Внутренние стратегии, детали невыпущенных продуктов", exampleType: "text", color: "red" }
]} />

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

<TryIt 
  title="Проверка безопасности"
  description="Проверьте ваш промпт на проблемы безопасности перед отправкой."
  prompt={`Проверьте этот промпт на проблемы безопасности:

"\${promptToReview}"

Проверьте на:

1. **Раскрытые секреты**: API-ключи, пароли, токены, учётные данные
2. **Персональные данные**: Имена, email-адреса, физические адреса, номера телефонов, номера социального страхования
3. **Проприетарная информация**: Коммерческие секреты, внутренние стратегии, конфиденциальные данные
4. **Риски инъекций**: Пользовательский ввод, который может манипулировать промптом

Для каждой найденной проблемы:
- Объясните риск
- Предложите, как редактировать или защитить информацию
- Порекомендуйте более безопасные альтернативы`}
/>

## Ловушка игнорирования галлюцинаций

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

<Compare 
  before={{ label: "Слепое доверие", content: "Дай мне 5 статистик о продуктивности удалённой работы с источниками." }}
  after={{ label: "Признание ограничений", content: "Что мы знаем о продуктивности удалённой работы? Для любой статистики, которую ты упоминаешь, отметь, являются ли это устоявшимися выводами или более неопределёнными. Я проверю любые конкретные цифры независимо." }}
/>

**Почему это происходит**: ИИ генерирует текст, который звучит авторитетно. Он не «знает», когда выдумывает — он предсказывает вероятный текст, а не извлекает верифицированные факты.

<TryIt 
  title="Запрос, устойчивый к галлюцинациям"
  description="Структурируйте ваш промпт, чтобы минимизировать риск галлюцинаций и отмечать неуверенности."
  prompt={`Мне нужна информация о: \${topic}

Пожалуйста, следуйте этим рекомендациям для минимизации ошибок:

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

2. **Отмечайте неуверенность**. Если вы не уверены в чём-то, скажите «Я полагаю...» или «Это может потребовать верификации...»

3. **Не выдумывайте источники**. Не цитируйте конкретные статьи, книги или URL, если не уверены, что они существуют. Вместо этого опишите, где найти этот тип информации.

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

5. **Отделяйте факт от вывода**. Чётко различайте между «X истинно» и «На основе Y, X вероятно истинно».

Теперь, с учётом этих рекомендаций: \${actualQuestion}`}
/>

## Чеклист перед отправкой

Перед отправкой любого важного промпта пройдитесь по этому быстрому чеклисту:

<Checklist 
  title="Проверка качества промпта"
  items={[
    { text: "Достаточно ли он конкретен? (Не расплывчатый)" },
    { text: "Сфокусирован ли он? (Не перегружен требованиями)" },
    { text: "Включает ли он весь необходимый контекст?" },
    { text: "Нейтрален ли вопрос? (Не наводящий)" },
    { text: "Указал ли я формат вывода?" },
    { text: "Входные данные в пределах контекстного окна?" },
    { text: "Есть ли проблемы с безопасностью?" },
    { text: "Готов ли я проверить вывод?" },
    { text: "Готов ли я итерировать при необходимости?" }
  ]}
/>

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

## Анализируйте свои промпты

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

<PromptAnalyzer 
  title="Анализатор качества промптов"
  description="Получите обратную связь на основе ИИ о ясности, конкретности и предложения по улучшению"
  defaultPrompt="Помоги мне с моим кодом"
/>

## Отладка этого промпта

Можете ли вы определить, что не так с этим промптом?

<PromptDebugger
  title="Найдите ошибку"
  badPrompt="Напиши пост в блог о технологиях, который SEO-оптимизирован с ключевыми словами и также смешной, но профессиональный и включает примеры кода и ориентирован на новичков, но имеет продвинутые советы и упоминает наш продукт TechCo и имеет социальное доказательство и призыв к действию и составляет 500 слов, но всеобъемлющий."
  badOutput="Вот черновик поста в блог о технологиях...

[Общий, несфокусированный контент, который пытается сделать всё, но ничего не делает хорошо. Тон неловко переключается между разговорным и техническим. Половина требований отсутствует.]"
  options={[
    { id: "vague", label: "Промпт слишком расплывчатый", isCorrect: false, explanation: "На самом деле промпт имеет много конкретных требований. Проблема противоположная — слишком много требований, а не слишком мало." },
    { id: "overload", label: "Промпт перегружен слишком большим количеством конкурирующих требований", isCorrect: true, explanation: "Правильно! Этот промпт запрашивает SEO + смешной + профессиональный + код + новички + продвинутый + упоминание продукта + социальное доказательство + CTA + ограничение длины. Это более 10 конкурирующих требований! ИИ не может удовлетворить их все, поэтому делает посредственную работу по всему. Решение: разбейте на несколько сфокусированных промптов." },
    { id: "format", label: "Формат вывода не указан", isCorrect: false, explanation: "Хотя более конкретный формат помог бы, основная проблема — перегрузка требованиями. Вы не можете отформатировать выход из ситуации, когда запрашиваете слишком много." },
    { id: "context", label: "Недостаточно контекста", isCorrect: false, explanation: "У промпта на самом деле много контекста — возможно, слишком много! Проблема в том, что он пытается удовлетворить слишком много целей одновременно." }
  ]}
  hint="Посчитайте, сколько разных требований упаковано в этот один промпт."
/>
