Глава 6: Типы промптов
Принцип
Разные задачи требуют разных техник промптинга. Выбор техники определяется сложностью задачи и требованиями к результату.
Классификация
| Техника | Сложность задачи | Примеры | Стоимость токенов |
|---|---|---|---|
| Zero-shot | Простая, типовая | Генерация кода, форматирование | Низкая |
| Few-shot | Нестандартный формат | Классификация, преобразование | Средняя |
| Chain-of-Thought | Требует рассуждений | Дебаг, математика, анализ | Высокая |
| Self-consistency | Неоднозначная | Архитектура, code review | Очень высокая |
Zero-shot
Задача без примеров. Работает для типовых, хорошо определённых задач.
Когда использовать
-
Стандартные операции (сортировка, фильтрация, форматирование)
-
Типовые паттерны (CRUD, валидация)
-
Чёткие спецификации
Примеры
Пример 1: Генерация кода
"Напиши Python функцию, которая принимает список чисел
и возвращает список без дубликатов, сохраняя порядок."
Пример 2: Форматирование
"Конвертируй dict в JSON с отступом 2 пробела:
\{'name': 'test', 'values': $1, 2, 3$\}"
Пример 3: Рефакторинг
"Замени цикл for на list comprehension:
result = $$
for x in items:
if x \> 0:
result.append(x \* 2)"
Шаблон
ЗАДАЧА: $глагол$ $объект$
ВВОД: $данные$
ВЫВОД: $формат$
Few-shot
Задача с примерами. Модель обучается паттерну из примеров.
Когда использовать
-
Нестандартный формат вывода
-
Специфичная логика преобразования
-
Классификация по кастомным категориям
-
Модель "не понимает" zero-shot
Оптимальное число примеров
2, 5$$
-
1 пример: часто недостаточно
-
2-3 примера: оптимально для большинства задач
-
4-5 примеров: для сложных паттернов
- 5 примеров: убывающая отдача
Структура примеров
От простого к сложному:
Пример 1: Классификация
"Классифицируй commit message.
Примеры:
'fix typo in readme' → docs
'add user authentication' → feat
'resolve memory leak in parser' → fix
'update dependencies' → chore
'improve query performance' → perf
Задача:
'refactor database connection pool' →"
Пример 2: Преобразование
"Конвертируй snake\_case в camelCase.
input\_value → inputValue
user\_first\_name → userFirstName
get\_user\_by\_id → getUserById
http\_response\_code →"
Пример 3: Генерация с паттерном
"Генерируй doctest из сигнатуры.
def add(a: int, b: int) -\> int:
'''
\>\>\> add(2, 3)
5
\>\>\> add(-1, 1)
0
'''
def multiply(a: int, b: int) -\> int:
'''
\>\>\> multiply(3, 4)
12
\>\>\> multiply(0, 5)
0
'''
def divide(a: int, b: int) -\> float:"
Разнообразие примеров
Примеры должны покрывать разные случаи:
Плохо (однотипные):
'fix bug' → fix
'fix error' → fix
'fix issue' → fix
'add feature' → \# модель видела только fix
Хорошо (разнообразные):
'fix bug' → fix
'add login' → feat
'update docs' → docs
'remove unused code' → \# модель видела разные категории
Chain-of-Thought (CoT)
Пошаговое рассуждение. Модель показывает ход мыслей перед ответом.
Когда использовать
-
Математические/логические задачи
-
Многошаговые вычисления
-
Дебаггинг
-
Анализ с выводами
Эффект
Улучшение на задачах с рассуждениями:
-
Математика: +20-40% точности
-
Логика: +15-30% точности
-
Код: +10-20% точности (на сложных задачах)
Способы активации
Способ 1: Явная инструкция
"Рассуждай пошагово."
Способ 2: Структура
"Шаг 1: ...
Шаг 2: ...
Шаг 3: ..."
Способ 3: Триггер
"Думай вслух."
"Let's think step by step."
Примеры
Пример 1: Отладка
"Найди баг в коде. Рассуждай пошагово.
\`\`\`python
def binary\_search(arr, target):
left, right = 0, len(arr)
while left \< right:
mid = (left + right) // 2
if arr$mid$ == target:
return mid
elif arr$mid$ \< target:
left = mid
else:
right = mid
return -1
Шаг 1: Определи, что должна делать функция Шаг 2: Проверь граничные условия Шаг 3: Пройди по циклу вручную для примера Шаг 4: Найди проблему Шаг 5: Предложи исправление"
Пример 2: Оптимизация "Оптимизируй запрос. Анализ по шагам:
-
Текущая сложность
-
Bottleneck
-
Варианты оптимизации
-
Выбор лучшего
-
Реализация
Запрос:
result = $$
for user in users:
for order in orders:
if order$'user\_id'$ == user$'id'$:
result.append((user, order))
\`\`\`"
Пример 3: Статистика
"Выбери статистический тест. Рассуждение:
Данные:
- Группа A: n=25, выборка из популяции
- Группа B: n=30, другая популяция
- Задача: сравнить средние
Шаги:
1. Проверить независимость выборок
2. Проверить нормальность (Shapiro-Wilk)
3. Проверить равенство дисперсий (Levene)
4. Выбрать тест
5. Интерпретировать"
Структурированный CoT
"Анализ проблемы:
\#\# Понимание
$что дано, что требуется$
\#\# Декомпозиция
$разбиение на подзадачи$
\#\# Решение
$пошаговое решение каждой подзадачи$
\#\# Проверка
$верификация результата$
\#\# Ответ
$финальный результат$"
Self-consistency
Множественная генерация с агрегацией. Повышает надёжность для неоднозначных задач.
Когда использовать
-
Несколько валидных подходов
-
Высокая цена ошибки
-
Нужна уверенность в ответе
Механизм
-
Сгенерировать N ответов (с T > 0)
-
Агрегировать (голосование, пересечение, объединение)
Примеры
Пример 1: Code review
"Проанализируй код 3 раза с разных точек зрения:
1. Как security engineer
2. Как performance engineer
3. Как maintainability engineer
Формат каждого анализа:
- Роль: $роль$
- Проблемы: $список$
Итог: проблемы, найденные минимум 2 раза.
Код:
$код$"
Пример 2: Архитектура
"Предложи 3 независимых решения задачи.
Для каждого:
- Подход
- Плюсы
- Минусы
- Риски
Затем: рекомендация с обоснованием.
Задача: $описание$"
Пример 3: Дебаг
"Сформулируй 3 гипотезы о причине бага.
Для каждой:
- Гипотеза
- Вероятность (0-1)
- Как проверить
Начни с наиболее вероятной.
Баг: $описание$
Логи: $логи$"
Агрегация
\# Пример агрегации для code review
def aggregate\_reviews(reviews: list$list\[str$\]) -\> list$str$:
"""Оставить проблемы, найденные минимум в 2 обзорах."""
from collections import Counter
all\_issues = $issue for review in reviews for issue in review$
counts = Counter(all\_issues)
return $issue for issue, count in counts.items() if count \>= 2$
Выбор техники
┌─────────────────┐
│ Задача типовая? │
└────────┬────────┘
│
┌──────────────┴──────────────┐
│ Да │ Нет
▼ ▼
┌───────────┐ ┌─────────────────┐
│ Zero-shot │ │ Нужен формат? │
└───────────┘ └────────┬────────┘
│
┌──────────────────┴──────────────┐
│ Да │ Нет
▼ ▼
┌───────────┐ ┌─────────────────────┐
│ Few-shot │ │ Нужны рассуждения? │
└───────────┘ └──────────┬──────────┘
│
┌──────────────────┴───────────────┐
│ Да │ Нет
▼ ▼
┌─────────────────┐ ┌───────────────────┐
│ Chain-of-Thought│ │ Высокая надёжность?│
└─────────────────┘ └─────────┬─────────┘
│
┌──────────────┴───────────┐
│ Да │ Нет
▼ ▼
┌─────────────────┐ ┌───────────┐
│ Self-consistency│ │ Zero-shot │
└─────────────────┘ └───────────┘