LLMの温度とは?
LLMは1トークンずつテキストを生成します。トークンには単語全体または単語の一部が含まれることがあり、句読点にもトークンが使われます。各ステップで、モデルはプロンプトとそれまでに生成したテキストを使って、次のトークンになり得る各候補にスコアを割り当てます。その後、サンプラーがスコアを確率に変換し、次のトークンを選択します。
温度は、サンプラーが選択を行う前に、それらの確率を変化させます。値を低くすると、サンプラーはスコアの高いトークンにより多くの確率を集中させます。値を高くすると、もともとの確率が低いトークンが選ばれる可能性が高まります。生成の序盤で別のトークンが選ばれると、次のステップへの入力が変わるため、その後の回答も変わる可能性があります。
モデルの重みと知識は変わりません。温度を高くすると、サンプリングされた続きによって、有用な別案が生成されることも、誤った回答が生成されることもあります。
計算の仕組み
モデルのスコアはロジットと呼ばれます。温度が正の値の場合、サンプラーは各ロジットを温度で割り、その後softmaxを適用します。
P(token i) = exp(logit i / T) / sum(exp(logit j / T))
分母では、すべての候補トークンの値を合計します。温度が1の場合、ロジットは変化しません。
温度1で、4つの候補の確率が60%、25%、10%、5%だとします。この例では、計算を説明するために架空の確率を使っています。
| 候補 | 温度0.5 | 温度1 | 温度2 |
|---|---|---|---|
| A | 82.76% | 60.00% | 42.69% |
| B | 14.37% | 25.00% | 27.56% |
| C | 2.30% | 10.00% | 17.43% |
| D | 0.57% | 5.00% | 12.32% |
ほかの列を計算するには、元の各確率を1/T乗し、それらの合計で割ります。温度0.5では、候補Aの確率は0.6² / (0.6² + 0.25² + 0.1² + 0.05²)、つまり82.76%になります。温度2では平方根を使います。
温度を変えても候補の順位は保たれます。変わるのは、候補間の確率の差です。モデルはトークンを生成するたびに新しい分布を計算するため、これらの数値が示すのは、回答内の1回の選択です。
温度0では何が起こる?
温度0では数式でゼロ除算が発生するため、温度0に対応するエンジンは、各ステップで最もスコアの高いトークンを選ぶ貪欲デコーディング用の別処理を使います。Hugging Face Transformersでは、do_sample=Falseとnum_beams=1を併用して貪欲デコーディングを指定します。
モデルが誤った続きに最高スコアを割り当てると、貪欲デコーディングは同じ誤りを繰り返します。今回のテストでは、あるモデルが温度0での10回すべての試行で、指定された単語数の上限を超えました。
同じプロンプトを異なる温度で実行
生成前にこのプロンプトとシード101を選び、温度0、0.7、1.5でQwen3.8 27Bに同じ入力を与えました。
明日からのメッセージを受け取る灯台について、短編小説の書き出しを1文で書いてください。8〜16語にしてください。lighthouseという単語をそのまま含めてください。末尾はピリオドにしてください。その1文だけを返してください。
モデルにはAD-Q4_K_Mの重みを使い、思考をオフにして、出力上限を64トークンに設定しました。また、温度だけが有効なサンプラーとなるように、追加のサンプリングフィルターを無効にしました。完全な設定は、後述のテストのセクションに記載しています。
温度0
The lighthouse keeper read the message from tomorrow, ending with a period.
温度0.7
The old lighthouse flickered, receiving a distress call sent from tomorrow.
温度1.5(64トークンの上限で停止)
The knitting saiu' nearest vs-direct tim Dresses często_g המ lighthouse piano Nguyenวันนี้ Musa dumpstersศิลปิน cereal ngày.Payment 항상 "/" downwardsizacao Dmit Mash 근지지 whole "-"年检推荐信品类 혁신 countot toilfe museo.Word Михай '\חה alej Esk blinked varios résultỪAE agenti compromise slowاري孟."&}\\ şeyटaside
温度0では、Qwenは書式に関する指示を物語に含めていますが、回答が単語数と句読点の要件を満たしているため、自動の書式チェックでは合格となります。温度1.5では、Qwenは複数の言語を混在させ、使える文を完成させる前にトークン上限に達します。
温度による生成アニメーションの変化を見る
Gemma 4 26B A4B ITに、アニメーションで動く異星の生態系を考案し、単体で動作するHTMLファイルとして作成するよう依頼しました。生物の外見と動作はGemmaが選べるようにしました。温度0、0.7、1.5で同じプロンプトを与え、各設定で3つの生成シードを使いました。
Snakeと六角形の結果を確認した後に、この探索的なプロンプトを選び、9件の回答を生成する前に、主な比較用のシードを101に固定しました。動画では、シード101、202、303をこの順に、各ラウンド8秒ずつ表示しています。温度0では、Gemmaは3回すべての試行で同一のソースコードを返しました。温度0.7では試行ごとに異なるコードを生成し、温度1.5でも同様でした。9件すべての出力を開き、ソースを確認できます。
生成されたコードは編集せずに実行しました。温度1.5の最後の回答にはHTMLの後に説明文が含まれており、回答形式のルールに違反しました。その失敗を記録した後、ラベル付きのプレビュー用に完全なHTMLブロックを抽出しました。元の回答と失敗の記録は、創作テストのバンドルに残しています。
この9回の実行では、GemmaのQ4_K_Mファイルを使い、思考をオフにして、出力上限を6,144トークンに設定し、追加のサンプリングフィルターを無効にしました。また、プロンプト内で固定のシミュレーションシードを指定しました。生成シードはモデルによるトークンの選択を制御し、シミュレーションシードはプログラム内の乱数を制御します。動画は生成後のブラウザーでの実行を記録したものであり、生成速度を測定することはできません。
900件の回答で測定した内容
Vast.aiでレンタルした1台のRTX 3090上で、次の固定したGGUFファイルを使い、3つのモデルを実行しました。
| モデル | 量子化 |
|---|---|
| Qwen3.8 27B | AD-Q4_K_M |
| Ornith 1.5 9B | Q8_0 |
| Gemma 4 26B A4B IT | Q4_K_M |
各モデルに、温度0、0.3、0.7、1、1.5で6つのプロンプトを与えました。各組み合わせを10個の固定シードで繰り返し、合計900件のリクエストを実行しました。3つのプロンプトでは、短編小説の書き出しを求めました。残る3つでは、注意をそらす情報や不完全な情報を含み、前に述べた詳細への訂正もあるテキストから、JSON形式で情報を抽出するよう求めました。
モデルと温度の組み合わせごとに、抽出の回答30件と文章作成の回答30件を採点しました。すべてのリクエストが初回の試行で完了しました。出力上限に達した回答は失敗として数えました。
| モデル | 温度 | JSONとして解析可能 | JSONオブジェクトの完全一致 | 文章の書式チェックに合格 |
|---|---|---|---|---|
| Qwen3.8 27B | 0 | 30/30 | 30/30 | 30/30 |
| Qwen3.8 27B | 0.3 | 30/30 | 30/30 | 30/30 |
| Qwen3.8 27B | 0.7 | 30/30 | 30/30 | 30/30 |
| Qwen3.8 27B | 1 | 30/30 | 30/30 | 28/30 |
| Qwen3.8 27B | 1.5 | 17/30 | 15/30 | 5/30 |
| Ornith 1.5 9B | 0 | 30/30 | 30/30 | 20/30 |
| Ornith 1.5 9B | 0.3 | 30/30 | 30/30 | 26/30 |
| Ornith 1.5 9B | 0.7 | 30/30 | 30/30 | 27/30 |
| Ornith 1.5 9B | 1 | 29/30 | 28/30 | 22/30 |
| Ornith 1.5 9B | 1.5 | 2/30 | 1/30 | 2/30 |
| Gemma 4 26B A4B | 0 | 30/30 | 30/30 | 30/30 |
| Gemma 4 26B A4B | 0.3 | 30/30 | 30/30 | 30/30 |
| Gemma 4 26B A4B | 0.7 | 30/30 | 30/30 | 30/30 |
| Gemma 4 26B A4B | 1 | 30/30 | 30/30 | 30/30 |
| Gemma 4 26B A4B | 1.5 | 30/30 | 30/30 | 30/30 |
チェックの合格条件
抽出では、回答全体をJSONとして解析できるかを確認した後、フィールドの型と値が、大文字と小文字の区別も含めて完全に一致するかを確認しました。温度1.5でのQwenのある回答は、Design clinicではなくDesign Clinicを返したため、同じイベントを特定していたにもかかわらず不合格となりました。別の回答では、入力に含まれていた名前とメールアドレスに対してnullを返しました。どちらの回答もJSON構文のチェックには合格しました。
文章作成では、空白で区切られた8〜16語で構成し、プロンプトで指定された単語をそのまま含め、回答全体を1行に収めることを条件としました。末尾は1つのピリオドとし、それ以外に.、!、?を含めず、先頭にリストマーカーを付けないことも条件でした。このチェックは、これらのルールへの準拠を測定します。物語の書き出しの質は判断できず、略語を含む正しい文を不合格にする場合もあります。
灯台のプロンプトに対するOrnithの貪欲デコーディングの出力は17語で、10回すべての試行で同じ回答を繰り返しました。これが、温度0で文章作成が10回失敗した理由です。温度を上げると、一部の試行で上限内の回答を生成できました。
Gemmaは、テストしたすべての温度で書式チェックに合格し、表現には違いが見られました。灯台のプロンプトを10回試行したところ、異なる出力の数は温度0で1種類、0.3で4種類、0.7で10種類でした。失敗した回答も含め、テキストを小文字に変換し、連続する空白を1つにまとめてから、異なるテキストの数を数えました。
温度1.5では、Qwenは文章作成の12回と抽出の11回でトークン上限に達しました。Ornithは文章作成の27回と抽出の25回で上限に達しました。Gemmaはすべての実行で上限内に完了しました。これらの失敗も、表の分母に含めています。
Atomic ChatでLLMの温度を変更する
デスクトップアプリでは、スライダーを使うか正確な値を入力して、ローカルモデルの回答を調整できます。マウスクリックで生成設定を開き、同じプロンプトを異なる設定で比較できます。
- ローカルモデルとのチャットを開きます。デスクトップ版2.0.35では、右上のスライダーアイコンをクリックしてRun settingsを開きます。
- Assistantを選び、Samplingを展開します。Temperatureのスライダーをドラッグするか、数値をクリックして希望の値を入力します。
- 同じパネルでTop P、Top K、Min Pを設定します。Penaltiesでは、Repeat Penalty、Presence Penalty、Frequency Penaltyを調整できます。
- ほかの値を固定したまま、そのアシスタントを使って新しいチャットで同じプロンプトを送信します。別のパラメーターを変更する前に、回答を比較してください。
アプリは変更内容を選択中のアシスタントに保存し、以降の回答に適用します。モデルを再読み込みせずにサンプリングを調整できます。モデルを切り替える際は、同じ設定を再利用する前に、公開元の推奨値を確認してください。
テスト設定
llama.cppのビルド10868、コミット304665fe7を使い、コンテキスト長を4,096トークンに設定し、非思考モードのテンプレートを使用しました。有効なサンプラーは温度だけでした。
samplers: [temperature] top_p: 1 top_k: 0 min_p: 0 repeat_penalty: 1 presence_penalty: 0 frequency_penalty: 0 writing_output_tokens: 64 extraction_output_tokens: 128
抽出には通常のテキスト生成を使い、JSON文法による制約は設けませんでした。テストバンドルには、900件すべての回答と採点コードが含まれています。使用したプロンプトと実行時の設定がそのまま収録されており、テストを再現するためのモデルのハッシュ値も含まれています。
この実験ではタスクごとに3つのプロンプトを使用しているため、繰り返しの試行で測定しているのは、それらの入力に対する変動です。抽出精度についてより広く主張するには、さらに幅広い入力が必要です。モデルごとに異なる量子化を使用したため、この結果から元のモデル間の順位を確定することもできません。
どの温度を使うべき?
まずは、選択したモードに対してモデルの公開元が指定する設定を使ってください。以下の推奨設定には、サンプラーが選べる候補を制限するtop-pとtop-kも含まれています。
| モデルと公開元のモード | 温度 | Top-p | Top-k |
|---|---|---|---|
| Qwen3.8-27B、思考モード | 1.0 | 0.95 | 20 |
| Qwen3.8-27B、非思考モード | 0.7 | 0.80 | 20 |
| Ornith-1.5-9B、一般的なタスク | 1.0 | 0.95 | 20 |
| Ornith-1.5-9B、精密なコーディング | 0.6 | 0.95 | 20 |
| Gemma 4 26B A4B、標準の推奨設定 | 1.0 | 0.95 | 64 |
Qwenは、非思考モードでは存在ペナルティを1.5、思考モードでは0にすることを推奨しています。Ornithは、一般的なタスクでは1.5、精密なコーディングでは0を指定しています。両者ともmin-pを0、繰り返しペナルティを1に指定しています。GoogleによるGemma 4のサンプリング推奨設定には、これらの追加の値は記載されていません。
今回の実験では温度の影響を切り分けるために任意のフィルターを無効にしたので、その結果は、上記の設定をすべて適用した場合を測定したものではありません。
自分のタスクに合わせて調整するには、プロンプトとほかの設定を固定してください。要件を満たす回答が同じ表現を繰り返し、別案が必要な場合は、温度を上げて試してください。変更によって誤りが増えた場合は、前の値に戻してください。正解が既知のタスクでは、モデルが対応していれば貪欲デコーディングも試してください。
生成された関数はユニットテストで確認し、要約は元の文書と照合してください。
温度、top-p、top-k
Top-kは候補トークンの数を制限します。top_k = 2では、サンプラーはスコアが最も高い2つの候補を残します。
Top-pは、確率の高い順にトークンを集め、その合計確率がしきい値に達する最小の集合を残すため、トークン数は生成ステップごとに変わる可能性があります。Transformersの生成リファレンスでは、両方の設定について説明しています。
前述の数値例では、温度1でAとBの確率の合計が0.85になるため、top-p 0.8はAとBを残します。この例ではtop-k 2も同じ候補を残しますが、ほかの分布ではtop-p 0.8が残す候補が2つより多くなる場合も、少なくなる場合もあります。
サンプラーの適用順序は計算に影響します。top-pより前に温度を適用すると、しきい値に達するまでに必要な候補数が変わる可能性があります。top-pより後に適用すると、残された候補間の確率が変わります。llama.cppは順序付きリストからサンプラーチェーンを構築するため、エンジンを比較する際はその順序を記録してください。
出力の違いを生んだ原因を特定するため、設定は1つずつ変更してください。フィルターによって候補が1つだけになると、温度を上げてもランダムな選択は行われなくなります。
比較を再現する
Qwen3.8のローカル実行ガイドとOrnith 1.5のローカル実行ガイドでは、Atomic Chatまたはllama.cppでこれらのモデルを読み込む方法を説明しています。900件の回答を収録したバンドルには、固定されたCUDAビルドとPython 3.12を使って、テストしたすべての組み合わせを再実行するためのコマンドが含まれています。モデルの重み用に約43.4 GBと、別途作業用の空き容量を確保してください。
各試行はチャット履歴が空の状態で開始し、思考モードを固定してください。そのうえで、要求したタスクに失敗した場合も出力全体を保存してください。生成設定と併せて、モデルファイルとソフトウェアのバージョンを記録してください。数値計算の変化は、どのトークンが最高スコアになるかに影響する可能性があります。PyTorchは、同じシードでも異なるプラットフォームやリリース間での再現性を保証していません。
Snakeと回転する六角形について、より厳密なプロンプトを使ったコード生成も18回試行しました。そのうち3回が4,096トークンの上限に達しました。別途用意したコードテストのバンドルには、それらの回答とブラウザーでの確認結果が含まれており、比較プレーヤーでは、元の出力と編集済みのSnakeのプレビューを分けて表示しています。これらの補足テストの件数は独立して数えており、900件のテキスト回答と9件の生態系の回答には含まれていません。
よくある質問
温度0は決定論的ですか?
今回の固定した環境では、モデルとプロンプトの18通りの組み合わせのそれぞれで、貪欲デコーディングによる10回すべての試行が同一のテキストを返しました。ただし、ハードウェアやソフトウェアが変わると、どのトークンが最高スコアになるかに影響する可能性があります。貪欲デコーディングだけでは、環境をまたいだ再現性は保証されません。
LLMの温度は1より高く設定できますか?
はい、アプリやAPIがその値を受け付ける場合は設定できます。1を超える値は、候補間の確率を近づけます。計算上、共通の上限はありませんが、ツールによって対応する範囲が制限されることがあります。
温度を高くするとハルシネーションが起こりますか?
値を高くすると、もともとの確率が低い続きが選ばれる確率が上がり、その中には誤った主張が含まれる可能性もあります。自分のタスクへの影響を確認するには、試行を繰り返し、正解データと照合して事実に関する誤りを測定してください。今回の書式チェックは、一般的な事実の正確性を測定するものではありません。
温度を変えても何も変わらないのはなぜですか?
アプリが設定値を送信していることと、サンプリングが有効になっていることを確認してください。Transformersは貪欲デコーディング中に温度を無視します。フィルターによって選択可能な候補が1つだけになる場合があり、最初から大きく優勢なトークンは、温度をいくつか変えても最も選ばれやすい候補のままである可能性があります。
プロンプトで温度を設定できますか?
アプリの生成設定かAPIリクエストで設定してください。チャットメッセージにtemperature = 0と書いても、プロンプトにテキストが追加されるだけで、サンプラーの設定は変わりません。

