Menu

Температура LLM: что это и как её настроить

Температура управляет тем, сколько случайности языковая модель использует при выборе каждого следующего слова. Как она меняет шансы слов, когда ставить её низкой или высокой и чем она отличается от top_p.

Каждый промпт на этой странице можно изменить и открыть в ChatGPT, Claude или другом ИИ-приложении.

Температура: это число, которое управляет тем, сколько случайности языковая модель использует при выборе следующего слова. При низкой температуре модель почти каждый раз берёт самое вероятное слово, и ответы получаются сфокусированными и повторяемыми. При высокой температуре шансы распределяются шире, ответы сильнее различаются и иногда уходят в сторону. Температура меняет то, как модель выбирает среди слов, которые она и так рассматривает; то, что модель знает, она не меняет.

Как модель выбирает следующее слово

Модель пишет по одному токену за раз, а токен: это слово или часть слова (см. токены и контекстное окно). На каждом шаге она выставляет оценку каждому токену своего словаря, эта оценка называется логитом. Функция 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 этих оценок при выбранной вами температуре, а кнопка сэмплирования вытягивает из них десять слов.

Мой любимый язык программирования это …
Next word probabilities
Python46%
JavaScript28%
Rust14%
C7.6%
Haskell3.4%
COBOL0.8%
Samples
Press Sample to let the model pick a word ten times.

При 1.0 Python получает около 46%, а COBOL меньше 1%. Сдвиньте до 0.5, и Python поднимется примерно до 67%, а COBOL почти исчезнет. Сдвиньте до 2.0, и Python упадёт примерно до 32%, а COBOL поднимется примерно до 4%, так что примерно в одной серии из трёх по десять сэмплов он появится хотя бы раз. Обратите внимание, чего не происходит никогда: порядок слов остаётся тем же при любой настройке. Температура не может сделать COBOL вероятнее Python; она только расширяет или сужает разрывы.

Настоящий ответ: это сотни таких выборов подряд, и каждый выбор становится частью контекста для следующего. Одно необычное слово в начале меняет всё, что идёт после, поэтому ответ при высокой температуре уходит гораздо дальше, чем подсказывает одно слово в этом демо.

Когда ставить низкую или высокую температуру

ЗадачаС чего начатьПочему
Код, исправление багов, SQLНизкая, от 0 до 0.3Обычно есть одно лучшее продолжение, и нужен одинаковый результат при каждом запуске
Извлечение данных, классификация, JSON0Любые вариации: это шум, а вывод должна читать программа
Объяснения, повседневные вопросыЗначение провайдера по умолчаниюЗначения по умолчанию подобраны для общего использования
Мозговой штурм, названия, идеи для историйПо умолчанию или немного вышеНужны варианты, которые отличаются друг от друга

Две оговорки. Во-первых, низкая температура не делает ответ верным. Если самый вероятный ответ модели неверен, температура 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 сами выбирают настройки сэмплирования и не показывают ползунок. Так приложения остаются простыми, а для большинства запросов переформулировка промпта меняет ответ куда сильнее, чем изменила бы настройка сэмплирования.

Поэтому в чат-приложении ваш регулятор: это промпт. Просьба об одном ответе даёт что-то близкое к первому выбору модели. Просьба о многих непохожих друг на друга ответах даёт разнообразие при любой температуре, потому что у модели появляется причина уйти от первого выбора. Переключайте вкладки и меняйте продукт, чтобы увидеть разницу.

Fill in
Предложи название для приложения для отслеживания привычек.
Try it
Example replyReplies vary between models and runs.

Цепочка. Коротко, легко запомнить и отсылает к ежедневным сериям, ради которых люди возвращаются в приложение.

Кнопка повторной генерации в чат-приложении сэмплирует новый ответ на тот же промпт, и это быстрый способ увидеть, насколько различаются ответы. Если они различаются сильнее, чем нужно, обычно помогает более конкретный промпт: точная задача сужает круг хороших ответов, и запуски становятся более похожими. Что добавить, рассказано в руководстве по написанию промптов.

Часто задаваемые вопросы

Что такое температура в 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. В чат-приложении просите разнообразия или единообразия прямо в промпте.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ