Как работает 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).

Шаги:

  1. Загрузите модель и токенизатор.
  2. Зафиксируйте промпт (например, «The future of AI is»).
  3. Сгенерируйте 5 вариантов продолжения для каждого значения T: 0.0, 0.3, 0.7, 1.0, 1.5.
  4. Для T=0 используйте do_sample=False, для остальных — do_sample=True и temperature.
  5. Визуализируйте распределение вероятностей первого токена после промпта для разных T (используя model.generate с output_scores=True).
  6. Сравните разнообразие и качество текстов.

Ожидаемый результат: Вы увидите, что при 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. Навигация


Навигация