# Урок 8: Промпт-инженерство — как писать эффективные промпты для LLM

> [HTML-версия](https://learnvibecoding.ru/publiclessons/urok-8-prompt-inzhenerstvo-kak-pisat-effektivnye-prompty-dlya-llm) · [Индекс для LLM](https://learnvibecoding.ru/llms.txt) · [Политика использования материалов](https://learnvibecoding.ru/politika-materialov)
> Материалы защищены. Обучение LLM без согласия запрещено. При разрешённом использовании — обязательна прямая ссылка на страницу-источник.

**Курс:** Основы ИИ обновленный

# Урок 8: Промпт-инжениринг — как писать эффективные промпты для LLM

## Контекст

**Ты знаешь как LLM работают, что они могут и не могут, как выбирать между Augmentation/Automation/Agency. Но когда ты пишешь промпт, результат не всегда такой какой нужен. Иногда LLM понимает неправильно. Иногда даёт поверхностный ответ. Иногда галлюцинирует.**

Ты видишь что ChatGPT даёт хорошие ответы на хорошие вопросы, но плохие на плохие вопросы. И ты понимаешь: это не случайность. Это УМЕНИЕ. Умение писать промпт так чтобы LLM поняла тебя и дала нужный результат.

**Что будешь уметь:**
- Писать ясные промпты которые LLM понимает
- Использовать техники для улучшения качества (chain-of-thought, few-shot)
- Структурировать промпт для сложных задач
- Оптимизировать стоимость (меньше токенов = дешевле)
- Адаптировать промпт к контексту (код, текст, анализ)

**Главное:** Промпт-инженерство — это не магия и не черная искусство. Это наука о том как взаимодействовать с моделью на её языке. LLM видела триллионы примеров — научись использовать эти примеры в своих промптах.

---

## Блок 1: Как LLM понимает промпты?

### Фундаментальный принцип: LLM ищет паттерны

```
ВСПОМНИ ИЗ УРОКА 0.2:

LLM обучена на триллионах слов.
Она видела:
- Как люди пишут вопросы и как на них отвечают
- Как люди описывают задачи и какой результат получают
- Как структурируют код и как это работает

ТО ЕСТЬ:

Если ты пишешь промпт который ПОХОЖ на примеры из обучающих данных
→ LLM легко находит паттерн и отвечает хорошо

Если ты пишешь промпт который НЕПОХОЖ или СТРАННЫЙ
→ LLM может неправильно понять что ты хочешь
```

### Пример: LLM находит паттерн

```
ПРОМПТ 1 (классический паттерн):
"Напиши код на Python который сортирует список чисел"

LLM вспоминает:
"Я видела млн запросов вида 'Напиши код' 
→ ответ начинается с ```python
→ потом идёт функция
→ потом объяснение"

Результат: ✅ хороший

---

ПРОМПТ 2 (нестандартный):
"Нужно чтоб было 5 функций для сортирования и они все разные"

LLM вспоминает:
"Хм, это не совсем стандартный запрос.
Но я видела примеры когда просят "сравни варианты"
и примеры когда просят "несколько функций"
Я могу комбинировать эти паттерны"

Результат: ⚠️ может быть правильно, может быть неправильно

---

ПРОМПТ 3 (странный):
"Кодируй ме список нумеров по величин плз"

LLM вспоминает:
"Ошибки в написании... неграмотность...
Я видела такое в плохих примерах онлайна"

Результат: ❌ может быть совсем неправильно
```

### Поэтому первый принцип: Пиши как хорошие примеры

```
✅ ХОРОШИЙ ПРОМПТ:
Ясный, структурированный, правильная грамматика
LLM легко находит паттерн

❌ ПЛОХОЙ ПРОМПТ:
Путаный, неправильная грамматика, нечастые слова
LLM может неправильно понять
```

---

## Блок 2: Структура хорошего промпта

### Шаблон базового промпта

```
РОЛЬ/КОНТЕКСТ (опционально):
"Ты опытный программист" 
или
"Ты экономист с 20-летним стажем"

ЗАДАЧА:
"Напиши функцию которая..."

ДЕТАЛИ:
"Функция должна:
- Принимать параметры A, B
- Возвращать результат типа X
- Работать с пустыми входами"

ФОРМАТ ОТВЕТА:
"Ответ начни с объяснения почему так.
Потом приложи код в блоке ```python``` 
Потом объясни как использовать"

ПРИМЕРЫ (опционально):
"Пример входа: [1, 2, 3]
Пример выхода: [3, 2, 1]"
```

### Пример: Промпт до и после

**ДО (плохой промпт):**
```
"Напиши статью про фотосинтез"
```

Результат: Базовая статья, 500 слов, скучная.

---

**ПОСЛЕ (хороший промпт):**
```
РОЛЬ: Ты популяризатор науки с опытом писать для школьников

ЗАДАЧА: Напиши статью про фотосинтез для школьников 10-12 лет

ДЕТАЛИ:
- Длина: 1000-1200 слов
- Включи 3 реальных примера (растения, листья, фрукты)
- Объясни сложные слова (хлорофилл, молекула) простыми словами
- Включи одну аналогию со чем-то знакомым школьнику
- Структура: введение → объяснение → примеры → вывод

ФОРМАТ:
- Заголовки в ##
- Ключевые слова выделены **жирным**
- В конце вопрос для размышления

ТОН: Дружеский, увлекающий, но не покровительственный
```

Результат: 1150 слов, с примерами, с аналогией, с правильной структурой.

---

### Ключевые элементы промпта

| Элемент | Зачем | Пример | Обязателен? |
|---------|-------|--------|-----------|
| **Роль** | LLM знает какой "голос" использовать | "Ты опытный разработчик" | ⚠️ Для сложных задач |
| **Задача** | Ясно сказать что нужно | "Напиши код для..." | ✅ Всегда |
| **Детали** | Уточнить требования | "Функция должна принимать..." | ✅ Почти всегда |
| **Формат** | Как структурировать ответ | "Ответ в виде таблицы" | ⚠️ Для сложных |
| **Примеры** | Few-shot learning (показать примеры) | "Пример входа: X, выхода: Y" | ⚠️ Если результат странный |
| **Ограничения** | Что НЕЛЬЗЯ делать | "Без скучного текста" | ⚠️ Если есть проблема |

![Анатомия идеального промпта](https://nhvwqitwebmmswnjylop.supabase.co/storage/v1/object/public/Pictures%20for%20course/AI%20basics%20new%20course/21_Xray_Perfect_Prompt.png)

---

## Блок 3: Техники для улучшения качества

### Техника 1: Chain-of-Thought (думай пошагово)

**Идея:** Попроси LLM думать пошагово вместо прямого ответа.

```
ПРИМЕР 1: БЕЗ Chain-of-Thought

Вопрос: "У Маши 10 яблок. Она отдала половину Пете. 
Потом купила 5 новых. Сколько осталось?"

LLM может ответить: "15" (неправильно)
или
LLM может ответить: "Маша отдала половину, значит 5 осталось. 
Потом купила 5, значит 5+5=10" (правильно, но быстро)

---

ПРИМЕР 2: С Chain-of-Thought

Вопрос: "У Маши 10 яблок. Она отдала половину Пете. 
Потом купила 5 новых. Сколько осталось?

Решай пошагово:
Шаг 1: Сколько яблок отдала Маша?
Шаг 2: Сколько у неё осталось?
Шаг 3: Сколько она купила?
Шаг 4: Сколько осталось в конце?"

LLM обычно отвечает правильнее и показывает логику:
"Шаг 1: 10 / 2 = 5 яблок отдала
Шаг 2: 10 - 5 = 5 яблок осталось
Шаг 3: купила 5 яблок
Шаг 4: 5 + 5 = 10 яблок в конце"

РЕЗУЛЬТАТ: ✅ Правильный ответ и видно логику
```

**Когда использовать:** Логические задачи, математика, анализ.

---

### Техника 2: Few-shot learning (показать примеры)

**Идея:** Вместо объяснения, показать примеры что ты хочешь получить.

```
ПРИМЕР 1: БЕЗ Few-shot

Промпт: "Классифицируй эти твиты как позитивные или негативные"

Твиты:
1. "Люблю этот день!"
2. "Это ужас, я расстроена"
3. "Интересно что будет дальше"

LLM может понять неправильно:
1. Позитивный ✅
2. Негативный ✅
3. Позитивный ❌ (может счесть нейтральным)

---

ПРИМЕР 2: С Few-shot (показываем примеры)

Промпт: "Классифицируй эти твиты как позитивные или негативные.

ПРИМЕРЫ:
'Отличный день!' → позитивный
'Ненавижу это' → негативный
'Может быть хороший день' → позитивный (несмотря на 'может')

ТЕПЕРЬ КЛАССИФИЦИРУЙ:
'Люблю этот день!' → ?
'Это ужас, я расстроена' → ?
'Интересно что будет дальше' → ?"

РЕЗУЛЬТАТ: LLM видит примеры и классифицирует правильнее
1. Позитивный ✅
2. Негативный ✅
3. Позитивный ✅ (теперь правильно)
```

**Когда использовать:** Классификация, форматирование, специфичные задачи.

---

### Техника 3: Persona/Role (дай LLM роль)

**Идея:** Скажи какую "личность" должна играть LLM.

```
ПРИМЕР 1: БЕЗ Persona

Промпт: "Объясни как работает дефолтный аргумент в Python"

Результат: Техническое объяснение, может быть скучным.

---

ПРИМЕР 2: С Persona

Промпт: "Ты опытный преподаватель программирования 
который объясняет сложные концепты простыми словами.

Объясни как работает дефолтный аргумент в Python.
Используй аналогию из реальной жизни."

Результат: "Представь что ты идёшь в кафе.
Обычно ты берёшь кофе с молоком.
Обычный официант запомнил и дает молоко автоматически.

В Python это дефолтный аргумент..."

РЕЗУЛЬТАТ: ✅ Более понятно и интересно
```

**Когда использовать:** Объяснения, творческое письмо, специфичные стили.

---

### Техника 4: Negative prompting (скажи что НЕ нужно)

**Идея:** Вместо (или в дополнение) что НУЖНО, скажи что НЕЛЬЗЯ.

```
ПРИМЕР 1: Только положительное

Промпт: "Напиши статью про преимущества Python"

Результат: Может быть скучно и клише ("Python популярен")

---

ПРИМЕР 2: С negative prompting

Промпт: "Напиши статью про преимущества Python

ОБЯЗАТЕЛЬНО ВКЛЮЧИТЬ:
- Конкретные примеры кода
- Сравнение с другими языками
- Реальные case-studies компаний

ИЗБЕГАТЬ:
- Клише вроде 'Python популярен'
- Скучные примеры 'Hello World'
- Слишком много аббревиатур без объяснения"

РЕЗУЛЬТАТ: ✅ Статья более конкретная и интересная
```

**Когда использовать:** Когда LLM генерирует скучный или неправильный контент.

---

### Техника 5: Structured output (просить конкретный формат)

**Идея:** Вместо свободного ответа, просить JSON, таблицу, код, и т.д.

```
ПРИМЕР 1: БЕЗ структуры

Промпт: "Какие основные города в России?"

Результат: "В России много городов. 
Москва — столица. Санкт-Петербург... 
Новосибирск..."

Сложно парсить, неструктурировано.

---

ПРИМЕР 2: С структурой

Промпт: "Какие основные города в России?

Ответ в виде JSON:
{
  'город': 'Москва',
  'население': число,
  'основан': год,
  'регион': название
}

Список из 5 городов."

Результат:
[
  {'город': 'Москва', 'население': 12600000, 'основан': 1147, ...},
  ...
]

РЕЗУЛЬТАТ: ✅ Легко парсить в коде
```

**Когда использовать:** Когда нужно парсить результат в коде, интеграции.

![Техники и инструменты для улучшения качества промптов](https://nhvwqitwebmmswnjylop.supabase.co/storage/v1/object/public/Pictures%20for%20course/AI%20basics%20new%20course/22_Techniques_Boosters_Tools.png)

---

## Блок 4: Вредные ошибки при написании промптов

### Ошибка 1: Слишком много информации сразу

```
❌ ПЛОХОЙ ПРОМПТ (слишком много):

"Напиши функцию на Python которая:
1. Берет список чисел
2. Сортирует по возрастанию
3. Убирает дубликаты
4. Возвращает только чётные числа
5. Форматирует в JSON
6. Добавляет timestamp
7. Логирует результат
8. Обрабатывает исключения
9. Поддерживает параллельную обработку
10. Интегрируется с БД"

LLM растеряется (слишком много требований)
Результат может быть неправильный или неполный.

✅ ХОРОШИЙ ПРОМПТ (разделить):

Промпт 1: "Напиши функцию которая берет список чисел, 
сортирует и убирает дубликаты"

(потом когда работает)

Промпт 2: "Расширь функцию чтобы она возвращала только чётные числа"

(потом когда работает)

Промпт 3: "Добавь обработку исключений к функции"

РЕЗУЛЬТАТ: ✅ Каждый промпт чистый и понятный
```

**Правило:** Один промпт = одна основная задача.

---

### Ошибка 2: Неправильные ожидания

```
❌ ПЛОХОЕ ОЖИДАНИЕ:

"LLM напишет мне production-ready код который я просто скопирую"

РЕАЛЬНОСТЬ: LLM может написать хороший код, но нужна проверка.

✅ ПРАВИЛЬНОЕ ОЖИДАНИЕ:

"LLM напишет черновик кода. Я проверю логику и тестирование."

ПОЭТОМУ:
- Для Augmentation: всегда проверяй результат
- Для Automation: тестируй перед запуском
- Для Agency: контролируй критичные операции
```

---

### Ошибка 3: Не давать контекст

```
❌ БЕЗ КОНТЕКСТА:

"Какая должна быть скидка?"

LLM не знает:
- О чём речь? Интернет магазин? Ресторан?
- Какой продукт? Дорогой? Дешёвый?
- Кто клиент? Постоянный? Новый?
- Какая сезонность?

Результат: ❌ Случайный ответ

---

✅ С КОНТЕКСТОМ:

"Я владею интернет-магазином электроники.
Продаю ноутбуки стоимостью 50-150k.
У меня 30% забрасывания корзины.
Нужна скидка которая увеличит конверсию но не упадет прибыль.
Какую скидку ты рекомендуешь?"

Результат: ✅ Аргументированный ответ
```

**Правило:** Чем больше контекста, тем лучше результат.

---

### Ошибка 4: Не проверять результат

```
❌ ПЛОХОЙ ПРОЦЕСС:

1. Я пишу промпт
2. LLM отвечает
3. Я берусь за результат не проверяя

РЕЗУЛЬТАТ: ❌ Может быть галлюцинация, может быть ошибка

✅ ХОРОШИЙ ПРОЦЕСС:

1. Я пишу промпт
2. LLM отвечает
3. Я проверяю фактическую правильность (что могу)
4. Я тестирую результат (если код)
5. Потом берусь за результат

РЕЗУЛЬТАТ: ✅ Значительно более надёжно
```

---

## Блок 5: Оптимизация промптов

### Оптимизация 1: Меньше токенов = дешевле

```
ПРАВИЛО: Платишь за входные и выходные токены.

Вход длинный = дороже.
Выход длинный = дороже.

ПРИМЕР:

ВЕРСИЯ 1 (длинный входной промпт, 400 токенов):
"Объясни подробно как работает интернет.
Включи историю, протоколы, архитектуру,
примеры, диаграммы. Напиши 3000 слов..."

ВЕРСИЯ 2 (короткий входной промпт, 50 токенов):
"Объясни как работает интернет.
Структура: основы → технология → примеры.
Длина: ~500 слов."

ЭКОНОМИЯ: Версия 2 может быть дешевле в 8 раз.

⚠️ ПРАВИЛО: Не экономи на качестве информации в промпте.
Экономь на излишних словах.
```

### Оптимизация 2: Кэширование для повторяющихся промптов

```
ЕСЛИ ты часто используешь одинаковый контекст,
используй Prompt Caching (в Claude API):

```python
# Один раз загрузи систему инструкций (дорого)
system = [
    {
        "type": "text",
        "text": "Ты опытный разработчик..."
    },
    {
        "type": "document",  # ← документ кэшируется
        "source": {
            "type": "file",
            "url": "file:///large_codebase.txt"
        }
    }
]

# Потом каждый запрос платит за кэш дешево
```

РЕЗУЛЬТАТ: Для повторяющихся запросов экономится 90% стоимости.
```

---

## Блок 6: Промпты для разных задач

### Промпт для кода

```
ШАБЛОН:

Напиши [язык] функцию/класс которая [что делает].

ТРЕБОВАНИЯ:
- [Параметры входа и выхода]
- [Специальные условия]
- [Обработка ошибок нужна?]

ФОРМАТ:
```[язык]
[код]
```

[объяснение]

ПРИМЕР:

def [function_name]([params]):
    """Краткое описание"""
    # пример использования
    [пример входа]
    # пример выхода
    [пример выхода]

ТЕСТИРОВАНИЕ:
[как проверить что работает]
```

### Промпт для анализа

```
ШАБЛОН:

Проанализируй [данные/текст/проблему].

КОНТЕКСТ:
[Что это?]
[Зачем нужен анализ?]
[Какова цель?]

ВОПРОСЫ КОТОРЫЕ ИНТЕРЕСУЮТ:
1. [Вопрос 1]
2. [Вопрос 2]
3. [Вопрос 3]

ФОРМАТ ОТВЕТА:
Структура: [описать]
Включить: [что обязательно]
Исключить: [что не нужно]

ПРИМЕР:

Проанализируй эти данные продаж за Q1.

КОНТЕКСТ: Наш интернет магазин, 1000 заказов в месяц

ВОПРОСЫ:
1. Какой товар самый популярный?
2. Как меняются продажи день за днём?
3. Какой демографический профиль покупателя?

ФОРМАТ: Таблица + ключевые выводы (не более 100 слов)
```

### Промпт для текста

```
ШАБЛОН:

Напиши [тип текста] для [целевую аудиторию].

КОНТЕКСТ:
[О чём текст?]
[Какая цель?]

ТРЕБОВАНИЯ:
- Длина: [N слов или абзацев]
- Тон: [формальный, дружеский, и т.д.]
- Структура: [заголовки, примеры, и т.д.]
- Включить: [конкретные моменты]
- Исключить: [что-то что будет плохо]

ПРИМЕРЫ:
[пример хорошего текста в том же стиле]

ПРИМЕР:

Напиши статью про фотосинтез для школьников 10-12 лет.

КОНТЕКСТ: Образовательная статья для школьного сайта

ТРЕБОВАНИЯ:
- Длина: 800-1000 слов
- Тон: Увлекающий, но образовательный
- Структура: Введение → Процесс → Примеры → Заключение
- Включить: 2-3 реальных примера, 1 аналогия
- Исключить: Сложные химические формулы, скучный текст
```

---

## Блок 7: Отладка плохих результатов

### Если ответ неправильный

```
ДИАГНОСТИКА:

1. Промпт был ясный?
   → Если нет: переписать более ясно

2. LLM понимает задачу?
   → Если нет: добавить примеры (few-shot)

3. Ответ галлюцинация?
   → Если да: попросить источник или дать источник

4. Ответ слишком короткий?
   → Если да: "Развей этот ответ подробнее"

5. Ответ не в нужном формате?
   → Если да: явно просить формат (JSON, таблица, и т.д.)

ПРИМЕР ОТЛАДКИ:

Я: "Напиши код для проверки email"
LLM: [код который не работает]

Я: "Этот код не работает. Покажи с примерами входа и выхода"
LLM: [лучше]

Я: "Добавь обработку исключений"
LLM: [ещё лучше]

Я: "Сделай это функцией которую можно импортировать"
LLM: [отличный результат]
```

### Итеративное улучшение

```
ЦИКЛ ИТЕРАЦИЙ:

Версия 1: Простой промпт → результат
Версия 2: Добавить примеры → лучше результат
Версия 3: Добавить ограничения → ещё лучше
Версия 4: Добавить persona → идеальный результат

Каждая итерация уточняет что ты хочешь.
LLM адаптируется.
```

---

## Финальный чеклист: Хороший ли мой промпт?

- [ ] Ясно сказано что нужно (задача)
- [ ] Дан контекст (зачем это нужно)
- [ ] Уточнены требования (параметры, формат)
- [ ] Если нужно — показаны примеры (few-shot)
- [ ] Если нужно — описана роль/persona
- [ ] Есть ограничения (что НЕЛЬЗЯ делать)
- [ ] Результат в понятном формате (JSON, таблица, код)
- [ ] Промпт не слишком длинный (но содержит нужную информацию)
- [ ] Есть ясные критерии успеха (как понять что результат хороший)

**Если большинство чек-боксов отмечены → промпт хороший. Пусть работает.**

**Если нет → переписать промпт, проверить опять, и итерировать.**

[Все уроки](https://learnvibecoding.ru/publiclessons.md) · HTML: https://learnvibecoding.ru/publiclessons