Глава 3: Температура и сэмплирование
Принцип
Температура контролирует "случайность" ответа. Низкая температура — детерминированный вывод, высокая — креативный.
Математика сэмплирования
После прохода через модель каждый токен получает логит (score). Температура влияет на преобразование логитов в вероятности:
где:
-
— логит токена
-
— температура
-
— вероятность выбора токена
Влияние температуры
При : распределение стремится к one-hot (выбирается токен с максимальным логитом)
При : распределение стремится к равномерному (все токены равновероятны)
Пример: логиты $2.0, 1.0, 0.5$ для токенов $A, B, C$
T = 0.1: P = $0.99, 0.01, 0.00$ → почти всегда A
T = 1.0: P = $0.59, 0.22, 0.13$ → обычно A, иногда B
T = 2.0: P = $0.42, 0.32, 0.26$ → более равномерно
Практические значения
| Температура | Поведение | Применение |
|---|---|---|
| 0.0 | Детерминированный | Код, факты, форматирование |
| 0.1-0.3 | Почти детерминированный | Точные задачи с минимальной вариативностью |
| 0.5-0.7 | Сбалансированный | Общие задачи, анализ |
| 0.8-1.0 | Креативный | Генерация идей, тексты |
| >1.0 | Хаотичный | Brainstorming (с осторожностью) |
Примеры по задачам
T = 0: Код и точные вычисления
Пример 1: Генерация кода
"Напиши функцию сортировки списка по убыванию.
Один вариант, оптимальный."
Результат стабилен между запусками.
Пример 2: Форматирование
"Конвертируй JSON в YAML:
\{'name': 'test', 'value': 42\}"
Пример 3: Извлечение данных
"Извлеки email из текста:
'Контакты: Иван Петров, ivan@example.com, тел. 123-456'"
T = 0.3-0.5: Анализ и объяснения
Пример 1: Code review
"Найди проблемы в коде:
$код$"
Небольшая вариативность в формулировках, но стабильный набор проблем.
Пример 2: Объяснение
"Объясни, почему этот алгоритм имеет сложность O(n log n)"
Пример 3: Отладка
"Почему код выбрасывает TypeError?
$код и traceback$"
T = 0.7-0.8: Генерация с вариативностью
Пример 1: Несколько решений
"Предложи 3 способа реализации кэша в Python.
Для каждого: плюсы, минусы."
Пример 2: Рефакторинг
"Предложи варианты улучшения архитектуры:
$описание системы$"
Пример 3: Нейминг
"Предложи 5 названий для функции, которая
фильтрует список по предикату и возвращает первый элемент."
T = 1.0: Креативные задачи
Пример 1: Brainstorming
"10 нестандартных способов оптимизировать этот запрос.
Включая экзотические."
Пример 2: Генерация тестов edge cases
"Придумай 10 неожиданных inputs, которые могут сломать функцию:
def process\_name(name: str) -\> str"
Пример 3: Альтернативные подходы
"Как бы эту задачу решили в функциональном стиле?
А в реактивном? А через акторы?"
Другие параметры сэмплирования
Top-p (nucleus sampling)
Выбор из топ токенов, суммарная вероятность которых ≥ p.
p = 0.9: выбор из токенов, покрывающих 90% вероятности
p = 0.5: более консервативный выбор
p = 1.0: все токены (эквивалент отключения)
Top-k
Выбор строго из k токенов с максимальной вероятностью.
k = 1: greedy decoding (только лучший токен)
k = 10: выбор из 10 лучших
k = 50: широкий выбор
Комбинирование
Рекомендации:
- Код: T=0, или T=0.2 + top\_p=0.95
- Анализ: T=0.5 + top\_p=0.9
- Креатив: T=0.8 + top\_p=0.95
Не рекомендуется:
- T\>1.0 + top\_p=1.0 (слишком хаотично)
- T=0 + top\_k=1 (избыточно, одинаковый эффект)
Промпты и температура
Компенсация высокой температуры
При высокой T можно "заземлить" вывод через промпт:
Пример: T=0.9, но нужна структура
"Сгенерируй креативные идеи для API.
ФОРМАТ (строго):
1. $название$: $описание в 1 предложение$
2. ...
Ровно 5 идей. Без вступления."
Компенсация низкой температуры
При низкой T можно добавить вариативность через промпт:
Пример: T=0.2, но нужны альтернативы
"Предложи 3 РАЗНЫХ подхода к решению.
Подходы должны принципиально отличаться:
1. Императивный
2. Функциональный
3. ООП
Для каждого — код."
Воспроизводимость
Seed (если поддерживается)
\# OpenAI API
response = client.chat.completions.create(
model="gpt-4",
messages=$\{"role": "user", "content": prompt\}$,
temperature=0,
seed=42 \# фиксированный seed
)
Детерминированность
Даже при T=0 и фиксированном seed возможны различия из-за:
-
Недетерминированности GPU вычислений
-
Изменений в модели (обновления)
-
Разного батчинга
Для критичных задач: запускать несколько раз и проверять консистентность.