Как работает temperature sampling и как он влияет на качество при разных значениях?
Краткий тезис
Temperature sampling — это техника управления случайностью при генерации текста языковой моделью. Она модифицирует распределение вероятностей следующего токена, «сглаживая» или «заостряя» его. Значение temperature = 0 приводит к жадному (greedy) декодированию — модель всегда выбирает самый вероятный токен, что даёт детерминированные, но часто шаблонные ответы. Значения около 0.5–0.8 считаются сбалансированными и используются по умолчанию, а 1.0 и выше усиливают хаотичность, полезную для креативных задач. В контексте Agentic RAG temperature влияет на поведение агента: низкая — для точного извлечения фактов, высокая — для генерации вариантов действий.
1. Термин: Temperature sampling
Temperature sampling — это метод выборки следующего токена из распределения вероятностей, которое предсказывает модель. Вместо того чтобы брать токен с максимальной вероятностью (argmax), мы «пересчитываем» вероятности с помощью параметра temperature (T).
Формула преобразования логитов (logits) в вероятности:
P_i = exp(logit_i / T) / Σ_j exp(logit_j / T)
Где:
logit_i— сырой выход модели для i-го токена (до softmax),T— температура (положительное число),P_i— итоговая вероятность токена.
Ключевой эффект: при T → 0 распределение становится «острым» — самый вероятный токен получает почти 100% шанс. При T → ∞ распределение становится равномерным — все токены равновероятны.
2. Как работает temperature на практике
2.1. Математическая интуиция
Рассмотрим пример: модель предсказывает три токена с логитами [2.0, 1.0, 0.5].
- T = 1.0 (стандартный softmax): вероятности [0.59, 0.22, 0.19] — первый токен доминирует, но остальные тоже возможны.
- T = 0.5: делим логиты на 0.5 → [4.0, 2.0, 1.0] → вероятности [0.84, 0.11, 0.05] — первый почти гарантирован.
- T = 2.0: делим на 2 → [1.0, 0.5, 0.25] → вероятности [0.41, 0.31, 0.28] — распределение сглажено, все три токена имеют сравнимые шансы.
2.2. Реализация в коде (Python)
import numpy as np
def temperature_sampling(logits, temperature=1.0):
# Применяем температуру
scaled_logits = logits / temperature
# Softmax
exp_logits = np.exp(scaled_logits - np.max(scaled_logits)) # для численной стабильности
probs = exp_logits / np.sum(exp_logits)
# Выборка из распределения
return np.random.choice(len(probs), p=probs)
3. Влияние разных значений temperature на качество
| Значение T | Характер генерации | Когда использовать | Риски |
|---|---|---|---|
| 0 (greedy) | Детерминированный, повторяющийся, «сухой» | Фактологические ответы, извлечение точной информации, код | Отсутствие разнообразия, зацикливание (repetition) |
| 0.1 – 0.4 | Почти детерминированный, но с редкими отклонениями | Задачи, где важна точность, но допустима небольшая вариативность (например, перевод) | Может быть слишком консервативным |
| 0.5 – 0.8 | Сбалансированный, «творческий, но в рамках» | Диалоговые системы, суммаризация, ответы на вопросы (дефолт для многих LLM) | Хороший компромисс |
| 1.0 | «Чистое» распределение модели, максимальная энтропия | Креативное письмо, генерация идей, брейнсторминг | Возможны нелогичные или бессвязные ответы |
| > 1.0 (1.2 – 2.0) | Хаотичный, почти случайный | Эксперименты, генерация множества вариантов, «out-of-the-box» идеи | Высокая вероятность галлюцинаций и бессмыслицы |
Важно: temperature не единственный параметр. Обычно его комбинируют с top-k (ограничение по числу токенов) и top-p (sampling|nucleus sampling) для более стабильной генерации.
4. Temperature в контексте Agentic RAG
В Agentic RAG агент может использовать LLM для нескольких целей:
- Извлечение фактов (retrieval-augmented generation) — здесь нужна низкая температура (0–0.3), чтобы ответ строго опирался на документы.
- Планирование действий (reasoning, tool selection) — средняя температура (0.5–0.7) для баланса между точностью и гибкостью.
- Генерация креативных вариантов (например, написание email, предложение стратегии) — высокая температура (0.8–1.2).
Пример: Агент, который ищет информацию в базе знаний и затем пишет отчёт. На этапе поиска — T=0.2, на этапе написания — T=0.7.
5. Связь с другими параметрами декодирования
| Параметр | Описание | Взаимодействие с temperature |
|---|---|---|
| Top-k | Выборка только из k самых вероятных токенов | Уменьшает «хвост» распределения; при низком k и высокой T всё равно будет случайность, но в узком окне |
| Top-p (nucleus) | Выборка из минимального набора токенов, сумма вероятностей которых ≥ p | Более адаптивный, чем top-k; при высокой T top-p может включать много токенов |
| Repetition penalty | Штраф за повторение уже сгенерированных токенов | Работает независимо; при низкой T repetition penalty может быть полезен для избегания зацикливания |
| Beam search | Поиск по нескольким гипотезам | Не использует temperature напрямую; альтернатива для задач, где нужен лучший по вероятности путь (например, перевод) |
6. Практические рекомендации
- Для фактологических RAG-систем: T = 0.1–0.3. Если нужна строгая детерминированность — T = 0 (greedy).
- Для чат-ботов общего назначения: T = 0.6–0.8.
- Для креативных задач (сторителлинг, генерация идей): T = 0.9–1.2.
- Для агентов, принимающих решения: динамическая температура — низкая для извлечения, высокая для генерации.
- Всегда тестируйте на своей задаче: оптимальное значение зависит от модели, домена и ожидаемого стиля.
7. Ограничения и подводные камни
- T = 0 не гарантирует уникальность: при одинаковом контексте модель всегда выдаст один и тот же ответ, что может быть проблемой для диалогов.
- Высокая T увеличивает галлюцинации: модель может генерировать правдоподобные, но ложные факты.
- Temperature не влияет на «уверенность» модели: это просто параметр выборки, а не показатель качества предсказания.
- Современные модели (GPT-4, Claude) уже обучены с учётом температуры: для них диапазон 0–1 работает предсказуемо, но значения >1 могут давать нестабильные результаты.
8. Пет-проект для закрепления
Задача: Создать простой эксперимент, демонстрирующий влияние temperature на генерацию текста.
Инструменты: Python, библиотека transformers (Hugging Face), любая небольшая модель (например, distilgpt2).
Шаги:
- Загрузите модель и токенизатор.
- Зафиксируйте промпт (например, «The future of AI is»).
- Сгенерируйте 5 вариантов продолжения для каждого значения T: 0.0, 0.3, 0.7, 1.0, 1.5.
- Для T=0 используйте do_sample=False, для остальных — do_sample=True и temperature.
- Визуализируйте распределение вероятностей первого токена после промпта для разных T (используя model.generate с output_scores=True).
- Сравните разнообразие и качество текстов.
Ожидаемый результат: Вы увидите, что при T=0 все сгенерированные тексты идентичны, при T=0.3 — почти одинаковы, при T=0.7 — разумные вариации, при T=1.5 — возможны бессвязные фразы.
9. Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 290 | Как работает top-p (nucleus) sampling? |
| 291 | Что такое beam search и когда его использовать? |
| 293 | Как параметры декодирования влияют на галлюцинации? |
| 294 | Как настроить repetition penalty? |
| 295 | Как выбрать стратегию декодирования для RAG? |
| 296 | Что такое contrastive search? |
10. Навигация
- Предыдущий: 291
- Следующий: 293
- Индекс: 00. Индекс разборов
Навигация
- Предыдущий: 291
- Следующий: 293
- Индекс: 00. Индекс разборов