Причина в том, как модель собирает ответ: она не пишет текст целиком, а выбирает каждое следующее слово случайно, с учётом рассчитанных вероятностей. На эти вероятности влияют два параметра. Temperature меняет соотношение оценок вариантов, а seed задаёт начальное состояние генератора псевдослучайных чисел, который и разыгрывает выбор.
Даже когда модель почти уверена в следующем токене, у остальных вариантов остаются ненулевые шансы. В эксперименте один и тот же промпт-завязку прогнали через Qwen2.5-1.5B-Instruct и Qwen3-0.6B при temperature 0,2 / 0,7 / 1,2 и восьми seed, получив 48 ответов. Уже при 0,2 сюжеты расходились. Автор разбора описывает это как нормальное следствие механики генерации, а не как сбой модели.
Ниже механика по шагам: откуда берутся оценки вариантов, как temperature превращает их в вероятности, почему seed ломает воспроизводимость и какие значения имеет смысл пробовать под конкретную задачу.
Как модель выбирает следующее слово: логиты и вероятности
Генерация идёт по шагам. Модель выбирает очередной токен (слово, его часть или знак препинания), добавляет его к ответу и рассчитывает продолжение уже с учётом написанного. Каждое новое слово меняет условия для следующего, поэтому ответ разворачивается как цепочка, а не как один готовый блок текста.
Что такое логиты простыми словами
Логиты это числовые оценки, которые модель присваивает вариантам продолжения. Высокий логит означает, что вариант лучше вписывается в контекст с точки зрения усвоенных при обучении связей. На оценки влияют три вещи: текст запроса, уже написанное начало и закономерности, выученные моделью на обучающих данных.
Логиты ещё не вероятности. Это произвольные числа, которые могут быть отрицательными и не складываются в 100%. Чтобы получить вероятности, их приводят к общему виду: сумма шансов всех вариантов внизу должна дать 100%.
Как temperature пересчитывает вероятности
Temperature вклинивается между логитами и вероятностями: сначала меняет соотношение оценок, а уже потом они превращаются в шансы. Если при temperature=1 двум продолжениям достались 60% и 40%, то при 0,2 их шансы становятся примерно 88% и 12%. Это расчётный пример для двух вымышленных вариантов, а не замер вероятностей Qwen в эксперименте.
Логика такая: низкая температура растягивает разрыв между вероятными и маловероятными токенами, высокая его сглаживает. При 0,1-0,3 модель почти всегда берёт самый вероятный вариант, при 1,0 и выше редкие токены получают заметный шанс, а распределение выравнивается. Сумма вероятностей при этом всегда 100%, меняется только распределение.
Роль seed: почему даже при низкой температуре ответы расходятся
Чтобы выбрать токен с рассчитанными шансами, программа использует псевдослучайные числа. Seed задаёт начальное состояние их генератора: одинаковый seed при тех же параметрах даёт одинаковую последовательность чисел, а значит, и одинаковый выбор токенов на каждом шаге.
Что такое seed и как он работает
В скрипте автора эксперимента seed устанавливался перед каждым ответом вызовом set_seed(seed). Пока два ответа написаны одинаково, модель видит один и тот же текст и рассчитывает одинаковые шансы следующего токена. При разных seed выбор может разойтись, и дальше это расхождение уже не остановить: после первого несовпадения у модели оказываются два разных начала.
Дальше следующий расчёт учитывает то, что выпало каждому ответу. Разница может остаться в формулировке, а может привести к разным авторам записки и разным причинам запрета на зал номер семь.
Почему при temperature=0,2 сюжеты всё равно разные
Низкая температура повышает шанс самого вероятного токена, но не до 100%. У остальных вариантов остаются ненулевые проценты, поэтому менее вероятный токен иногда выпадает. Один такой выбор на раннем шаге меняет весь дальнейший расчёт.
В эксперименте при 0,2 у Qwen2.5-1.5B-Instruct автором записки становились разные персонажи: сестра дежурного, призрак погибшего куратора, правнук основателя музея, пытавшийся сохранить артефакты. Разница была не в формулировке, а в самой завязке сюжета.
Отдельная оговорка про Qwen3-0.6B: в описании эксперимента отмечено, что эта модель держалась примерно одного типа персонажа. В цитируемом фрагменте источника это прямым текстом не зафиксировано, поэтому наблюдение стоит считать предварительным и проверять на своей задаче.
Эксперимент: 48 ответов Qwen2.5-1.5B-Instruct и Qwen3-0.6B при трёх температурах
Как устроен эксперимент: промпт, модели, параметры
Завязка: ночной дежурный музея находит адресованную ему записку «Не открывай зал номер семь». Модель должна написать рассказ из пяти предложений и в конце объяснить, кто оставил записку и зачем.
Условия: две небольшие открытые модели Qwen2.5-1.5B-Instruct и Qwen3-0.6B, три значения temperature (0,2; 0,7; 1,2), восемь seed, всего 48 ответов. Seed устанавливался перед каждым ответом. В скрипте использовалась GenerationConfig с do_sample=temperature is not None и temperature=temperature if temperature is not None else 1.0. Во всех 48 основных ответах temperature была числом, поэтому do_sample=True и следующий токен выбирался случайно с рассчитанными шансами. Подробности скрипта автор приводит вместе с результатами.
Что показали температуры 0,2; 0,7 и 1,2
При 0,2 сюжеты расходились по автору записки, причём это касалось Qwen2.5-1.5B-Instruct. При 1,2 в рассказ полезли обрывки кода. Подробной разборки значения 0,7 во фрагменте источника нет, поэтому промежуточное поведение можно описать только как ожидаемую середину между двумя крайностями, без конкретных наблюдений.
По описанию эксперимента, при 1,2 дело не ограничилось кодом: в текст попадали фрагменты разных языков, а часть ответов обрывалась по лимиту токенов. Эти детали прямым текстом источника не подтверждены, так что воспринимайте их как наблюдение автора, требующее проверки на своей модели.
Ещё одна граница: это результаты двух моделей с 0,6 и 1,5 млрд параметров и одного конкретного промпта. Переносить их на модели на десятки миллиардов параметров напрямую нельзя. Как одна и та же настройка сэмплинга ведёт себя на крупной модели, разобрано в материале про настройки сэмплинга Qwen 3.8-27B в локальном запуске.
Практический вывод из 48 ответов: температура не переключает модель между «правильным» и «неправильным» режимом. Она управляет только степенью вариативности, а стабильность сюжета зависит ещё и от размера модели и формулировки завязки.
Как подобрать температуру для генерации текста: практические рекомендации
Единой «лучшей» температуры нет. Значение зависит от модели, задачи и того, сколько вариативности вы готовы терпеть. Ориентиры ниже это стартовые точки, а не правила: модели разного размера и архитектуры ведут себя по-разному даже при одинаковых параметрах.
С чего начать: базовые диапазоны для разных задач
- Фактические ответы, извлечение данных, код, маршрутизация запросов: 0,1-0,3. Нужна предсказуемость, творческая вариативность здесь только мешает.
- Связный текст, объяснения, деловая переписка: 0,5-0,7. Баланс между живостью формулировок и следованием фактам.
- Творческие задачи, мозговой штурм, генерация сюжетов и названий: 0,7-1,0. Разброс вариантов здесь как раз то, за чем вы пришли.
- Выше 1,0: только если нужен управляемый хаос и вы готовы фильтровать результат руками. На этом уровне растёт риск смены языка, мусорных вставок и обрывов.
Логика простая: чем выше требования к точности, тем ниже температура. Если при 1,2 в текст пошли обрывки кода, разумный шаг не подкрутить промпт, а снизить значение до 0,8-1,0 и посмотреть, исчезнет ли проблема.
Как менять параметры и не запутаться
Меняйте один параметр за раз: либо temperature, либо seed, либо промпт. Если крутить всё сразу, вы не поймёте, что именно дало эффект.
Делайте несколько запусков при разных seed. Один удачный ответ ещё не значит, что настройка хороша, а один плохой не значит, что она плоха. Разброс по восьми запускам показывает реальную картину.
Повышайте температуру постепенно: с 0,2 до 0,7, потом до 1,0. Так видно, на каком шаге начинается деградация текста.
Если нашли удачный сюжет или формулировку, перенесите её в промпт. Зафиксированное в тексте запроса меньше зависит от случайности, чем то, что модель додумывает сама. Как формулировки меняют поведение модели, разобрано в материале про слова и формулировки, которые реально меняют поведение LLM. Порядок частей промпта тоже влияет на результат: в отдельном разборе перестановка вопроса с фиксированными вариантами ответа перед контекстом подняла точность локального Qwen с 89% до 100% и снизила медианную задержку с 400 до 80 мс, о чём рассказано в материале про порядок частей промпта в запросах к Qwen.
Типичные ошибки при настройке temperature и seed
- Ждать полной детерминированности от temperature=0. Нулевая температура делает выбор почти детерминированным, но другие источники случайности в пайплайне остаются, и на поведение всё равно влияет seed.
- Ставить 1,2 и выше для структурированного текста. Тогда в ответ попадают обрывки кода и посторонние вставки, а часть генераций обрывается по лимиту токенов.
- Менять несколько параметров сразу. Причина изменения остаётся неизвестной, а настройку нельзя воспроизвести.
- Ожидать, что одно значение температуры одинаково сработает на разных моделях. Qwen2.5-1.5B-Instruct и Qwen3-0.6B в одном эксперименте повели себя неодинаково.
- Не фиксировать удачные находки в промпте. Хороший результат, оставшийся только в истории чата, не воспроизведётся при следующем запуске.
Итог: как управлять вариативностью ответов LLM
Temperature управляет случайностью через пересчёт логитов в вероятности, seed задаёт начальное состояние генератора псевдослучайных чисел. Единой лучшей температуры нет: одно значение даёт стабильный текст на одной модели и мусор на другой.
Чек-лист для своего пайплайна:
- Определите цель: факты, творчество или код.
- Начните с низкой температуры и повышайте постепенно.
- Сделайте несколько запусков при разных seed, чтобы увидеть разброс.
- Меняйте один параметр за раз.
- Зафиксируйте удачный замысел прямо в промпте.
Эксперимент проводился на Qwen2.5-1.5B-Instruct и Qwen3-0.6B, но механика выбора токенов одинакова для любой авторегрессионной модели. Конкретные диапазоны всё равно придётся проверять на своей модели и своём промпте: возьмите восемь запусков, прогоните один и тот же запрос на трёх температурах и сравните, где вариативность ещё помогает, а где уже ломает результат.