Температура: это число, которое управляет тем, сколько случайности языковая модель использует при выборе следующего слова. При низкой температуре модель почти каждый раз берёт самое вероятное слово, и ответы получаются сфокусированными и повторяемыми. При высокой температуре шансы распределяются шире, ответы сильнее различаются и иногда уходят в сторону. Температура меняет то, как модель выбирает среди слов, которые она и так рассматривает; то, что модель знает, она не меняет.
Как модель выбирает следующее слово
Модель пишет по одному токену за раз, а токен: это слово или часть слова (см. токены и контекстное окно). На каждом шаге она выставляет оценку каждому токену своего словаря, эта оценка называется логитом. Функция softmax превращает оценки в вероятности: каждая оценка возводится в экспоненту и делится на сумму всех экспонент, так что более высокие оценки получают большие доли, а все доли в сумме дают 1. Затем модель случайно выбирает один токен в соответствии с этими долями.
Температура вступает в дело прямо перед softmax. Каждая оценка делится на температуру T:
probability(word) = exp(score / T) / sum of exp(score / T) over all candidates
При T меньше 1 разрывы между оценками растут, и лидер уходит дальше вперёд. При T больше 1 разрывы сокращаются, и аутсайдеры догоняют. При T = 1 получаются собственные вероятности модели. При T = 0 деление не определено, поэтому API трактуют это как «всегда брать лучший токен», это называется жадным декодированием (greedy decoding).
Попробуйте: ползунок температуры
Демо ниже продолжает фразу «Мой любимый язык программирования это» шестью словами-кандидатами. Оценки условные, подобраны для этого демо; реальная модель оценивает словарь из десятков тысяч токенов и больше, а название языка может делиться на несколько токенов. Математика настоящая: столбики показывают softmax этих оценок при выбранной вами температуре, а кнопка сэмплирования вытягивает из них десять слов.
При 1.0 Python получает около 46%, а COBOL меньше 1%. Сдвиньте до 0.5, и Python поднимется примерно до 67%, а COBOL почти исчезнет. Сдвиньте до 2.0, и Python упадёт примерно до 32%, а COBOL поднимется примерно до 4%, так что примерно в одной серии из трёх по десять сэмплов он появится хотя бы раз. Обратите внимание, чего не происходит никогда: порядок слов остаётся тем же при любой настройке. Температура не может сделать COBOL вероятнее Python; она только расширяет или сужает разрывы.
Настоящий ответ: это сотни таких выборов подряд, и каждый выбор становится частью контекста для следующего. Одно необычное слово в начале меняет всё, что идёт после, поэтому ответ при высокой температуре уходит гораздо дальше, чем подсказывает одно слово в этом демо.
Когда ставить низкую или высокую температуру
| Задача | С чего начать | Почему |
|---|---|---|
| Код, исправление багов, SQL | Низкая, от 0 до 0.3 | Обычно есть одно лучшее продолжение, и нужен одинаковый результат при каждом запуске |
| Извлечение данных, классификация, JSON | 0 | Любые вариации: это шум, а вывод должна читать программа |
| Объяснения, повседневные вопросы | Значение провайдера по умолчанию | Значения по умолчанию подобраны для общего использования |
| Мозговой штурм, названия, идеи для историй | По умолчанию или немного выше | Нужны варианты, которые отличаются друг от друга |
Две оговорки. Во-первых, низкая температура не делает ответ верным. Если самый вероятный ответ модели неверен, температура 0 будет давать этот неверный ответ каждый раз, просто стабильно; см. галлюцинации ИИ. Во-вторых, очень высокие значения (заметно выше 1 в API, где шкала идёт до 2) часто дают текст, который теряет нить или перестаёт иметь смысл, потому что маловероятные токены выбираются всё чаще.
Иногда случайность и есть цель. Self-consistency промптинг намеренно запускает один и тот же вопрос на рассуждение несколько раз при ненулевой температуре, а затем берёт ответ, с которым согласно большинство запусков.
Температура, top_p и top_k
Сэмплированием управляют ещё две настройки, и API часто показывают их рядом с температурой.
top_p (nucleus sampling) оставляет только самые вероятные токены, чьи вероятности в сумме дают p, и выбирает среди них. На числах из демо при температуре 1: Python, JavaScript и Rust в сумме дают около 88%, а с C получается больше 90%. Значит, при top_p = 0.9 модель выбирает только среди этих четырёх; Haskell и COBOL не появятся никогда. В отличие от температуры, top_p подстраивается: когда модель уверена, проходят немногие токены, а когда не уверена, проходят многие.
top_k оставляет фиксированное число самых вероятных токенов, например 40 лучших. Одни API его предлагают, другие нет.
Провайдеры обычно советуют менять либо температуру, либо top_p, но не оба сразу, потому что их эффекты складываются трудно предсказуемым образом.
Как задать температуру в API
Чат-приложения прячут эту настройку, а API принимают её как параметр. Диапазон зависит от провайдера: Chat Completions API от OpenAI принимает значения от 0 до 2, а Messages API от Anthropic от 0 до 1. Некоторые рассуждающие модели принимают только значение по умолчанию.
from openai import OpenAI
client = OpenAI()
MODEL = "your-model-id" # e.g. from your provider's model list
response = client.chat.completions.create(
model=MODEL,
messages=[{"role": "user", "content": "Write a SQL query that counts orders per customer."}],
temperature=0.2,
)
print(response.choices[0].message.content)
import anthropic
client = anthropic.Anthropic()
MODEL = "your-model-id" # e.g. from your provider's model list
message = client.messages.create(
model=MODEL,
max_tokens=500,
temperature=0.2,
messages=[{"role": "user", "content": "Write a SQL query that counts orders per customer."}],
)
print(message.content[0].text)
Почему чат-приложения её прячут и что делать вместо этого
Приложения ChatGPT, Claude и Gemini сами выбирают настройки сэмплирования и не показывают ползунок. Так приложения остаются простыми, а для большинства запросов переформулировка промпта меняет ответ куда сильнее, чем изменила бы настройка сэмплирования.
Поэтому в чат-приложении ваш регулятор: это промпт. Просьба об одном ответе даёт что-то близкое к первому выбору модели. Просьба о многих непохожих друг на друга ответах даёт разнообразие при любой температуре, потому что у модели появляется причина уйти от первого выбора. Переключайте вкладки и меняйте продукт, чтобы увидеть разницу.
Цепочка. Коротко, легко запомнить и отсылает к ежедневным сериям, ради которых люди возвращаются в приложение.
Кнопка повторной генерации в чат-приложении сэмплирует новый ответ на тот же промпт, и это быстрый способ увидеть, насколько различаются ответы. Если они различаются сильнее, чем нужно, обычно помогает более конкретный промпт: точная задача сужает круг хороших ответов, и запуски становятся более похожими. Что добавить, рассказано в руководстве по написанию промптов.
Часто задаваемые вопросы
Что такое температура в LLM?
Температура: это настройка сэмплирования, которая управляет тем, насколько случаен выбор каждого следующего токена. Модель выставляет оценку каждому возможному следующему токену, и перед превращением в вероятности оценки делятся на температуру. При низких значениях доминирует лучший вариант; при высоких шансы выравниваются, и менее вероятные токены выбираются чаще.
Какую температуру ставить для программирования?
Низкое значение, где-то от 0 до 0.3, частая отправная точка для кода, извлечения данных и любой задачи с одним правильным ответом: вам нужно самое вероятное продолжение и воспроизводимые результаты. Повышайте её, когда нужно разнообразие, например при мозговом штурме названий или альтернативных вариантов архитектуры. Некоторые рассуждающие модели принимают только значение по умолчанию, так что сверьтесь с документацией провайдера.
Чем температура отличается от top_p?
Температура меняет форму всего распределения вероятностей. top_p, его ещё называют nucleus sampling, обрезает его: модель выбирает только из наименьшей группы токенов, чьи вероятности в сумме дают p, так что top_p = 0.9 отбрасывает длинный хвост маловероятных токенов. Провайдеры обычно советуют менять один из двух параметров, а второй оставлять по умолчанию.
Делает ли температура 0 вывод детерминированным?
Почти, но не полностью. При 0 модель на каждом шаге берёт самый вероятный токен, поэтому повторные запуски обычно совпадают или очень близки. Мелкие вычислительные различия на серверах провайдера всё же иногда меняют какой-то токен, а как только один токен отличается, остаток ответа может пойти по другому пути.
Можно ли изменить температуру в ChatGPT или Claude?
В чат-приложениях нет: они сами выбирают настройки сэмплирования и не показывают регулятор температуры. Задать её можно через API и в инструментах для разработчиков, таких как Playground от OpenAI, Anthropic Console и Google AI Studio. В чат-приложении просите разнообразия или единообразия прямо в промпте.