temperature とは、言語モデルが次の単語を選ぶときにどれだけランダムさを使うかを決める数値です。temperature が低いと、モデルはほぼ毎回いちばん可能性の高い単語を選ぶので、答えは的を絞った再現性のあるものになります。temperature が高いと確率がばらけるので、答えのばらつきが大きくなり、ときには話がそれていきます。temperature が変えるのは、モデルがすでに候補にしている単語の中からの選び方であり、モデルが知っていることは変わりません。
モデルが次の単語を選ぶ仕組み
モデルは1トークンずつ書いていきます。トークンとは単語や単語の一部のことです(トークンとコンテキストウィンドウを参照)。各ステップで、モデルは語彙の中のすべてのトークンにスコア(ロジットと呼ぶ)を付けます。softmax という関数がそのスコアを確率に変えます。各スコアの指数をとり、それを全体の合計で割るので、スコアが高いほど取り分が大きくなり、取り分の合計は 1 になります。そしてモデルは、その取り分に従ってトークンを1つランダムに引きます。
temperature が関わるのは softmax の直前です。すべてのスコアが temperature 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)と呼びます。
試してみよう:temperature スライダー
下のデモは、「私がいちばん好きなプログラミング言語は」という文の続きを、6つの候補の単語で予測します。スコアはこのデモのために選んだ説明用の値です。実際のモデルは数万以上のトークンからなる語彙にスコアを付け、言語名が複数のトークンに分かれることもあります。計算は本物です。棒グラフは選んだ temperature でのこれらのスコアの softmax で、サンプルボタンはそこから10個の単語を引きます。
1.0 では Python が約46%、COBOL は1%未満です。0.5 まで下げると Python は約67%に上がり、COBOL はほぼ消えます。2.0 まで上げると Python は約32%に下がり、COBOL は約4%に上がるので、10回のサンプルを3回行えば、そのうち1回くらいは COBOL が少なくとも1度は出てきます。決して起きないことにも注目してください。単語の順位はどの設定でも変わりません。temperature で COBOL を Python より選ばれやすくすることはできず、差を広げたり縮めたりするだけです。
実際の返答は、こうした選択が何百回も続いたものです。そして各選択が、次の選択のためのコンテキストの一部になります。最初のほうで1つ珍しい単語が選ばれると、そのあとのすべてが変わります。temperature の高い返答が、このデモの1単語から想像するよりはるかに大きくそれていくのはこのためです。
temperature を低くするとき、高くするとき
| タスク | 出発点 | 理由 |
|---|---|---|
| コード、バグ修正、SQL | 低め、0〜0.3 | たいてい最良の続きが1つあり、毎回同じ結果が欲しい |
| 抽出、分類、JSON | 0 | どんなばらつきもノイズで、出力をプログラムが読む |
| 説明、日常的な質問 | 提供元のデフォルト | デフォルトは汎用的な用途向けに選ばれている |
| ブレインストーミング、名前、物語のアイデア | デフォルトかやや高め | 互いに違う選択肢が欲しい |
注意点が2つあります。1つ目に、temperature を低くしても答えが正しくなるわけではありません。モデルのいちばんありそうな答えが間違っていれば、temperature 0 は毎回その間違った答えを、ただ一貫して返すだけです。AI のハルシネーションを参照してください。2つ目に、とても高い値(範囲が 2 までの API で 1 を大きく超える値)では、可能性の低いトークンがどんどん選ばれるようになるため、話の筋を見失ったり意味をなさなくなったりする文章がよく出てきます。
ランダムさそのものが目的になることもあります。Self-Consistency プロンプティングは、同じ推論の質問をあえて 0 でない temperature で何度も実行し、多くの実行が一致した答えを採用します。
temperature、top_p、top_k
サンプリングを制御する設定はほかに2つあり、API では temperature と並んで公開されていることがよくあります。
top_p(nucleus sampling)は、確率の合計が p になるまで可能性の高いトークンだけを残し、その中からサンプリングします。デモの数値で temperature 1 の場合、Python、JavaScript、Rust の合計が約88%で、C を加えると90%を超えます。つまり top_p = 0.9 なら、モデルはこの4つの中からだけサンプリングし、Haskell と COBOL は決して出てきません。temperature と違って top_p は状況に応じて変わります。モデルに自信があれば候補に残るトークンは少なく、自信がなければ多くなります。
top_k は、上位40個のように、可能性の高いトークンを決まった数だけ残します。提供している API もあれば、ない API もあります。
提供元はふつう、temperature と top_p のどちらか一方だけを変え、両方は変えないようすすめています。効果が予測しにくい形で重なるからです。
API で temperature を設定する
チャットアプリはこの設定を隠していますが、API ではパラメータとして受け付けます。範囲は提供元によって異なり、OpenAI の Chat Completions API は 0〜2、Anthropic の Messages API は 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)
チャットアプリが temperature を隠す理由と、代わりにできること
ChatGPT、Claude、Gemini のアプリはサンプリングの設定をアプリ側で決めていて、スライダーはありません。そのほうがアプリはシンプルになりますし、たいていの依頼では、プロンプトの言い回しを変えるほうがサンプリングの設定よりはるかに大きく答えを変えます。
つまりチャットアプリでは、プロンプトがあなたの操作手段です。答えを1つ頼めば、モデルの第一候補に近いものが返ってきます。互いに違う答えをたくさん頼めば、どの temperature でもバリエーションが得られます。モデルに第一候補を避ける理由ができるからです。タブを切り替えて製品を変え、違いを確かめてください。
つづけログ。短くて覚えやすく、毎日の連続記録を残して続けたくなる、というアプリの狙いが伝わります。
チャットアプリの再生成ボタンは、同じプロンプトから新しい返答をサンプリングするので、答えがどれくらいばらつくかを手早く確かめられます。思ったよりばらつくなら、たいていはプロンプトをもっと具体的にすれば直ります。正確なタスクは良い答えの幅を狭め、実行ごとの差を小さくします。何を書き足せばよいかはプロンプトの書き方ガイドで扱っています。
よくある質問
LLM の temperature とは何ですか?
temperature は、次のトークンの選び方をどれだけランダムにするかを決めるサンプリングの設定です。モデルは次に来うるすべてのトークンにスコアを付け、そのスコアを temperature で割ってから確率に変えます。値が低いといちばん上の候補が圧倒し、値が高いと確率が平らになって、可能性の低いトークンが選ばれる回数が増えます。
コーディングにはどの temperature を使えばいいですか?
コード、データ抽出など正解が1つのタスクでは、0〜0.3 くらいの低い値から始めるのが一般的です。いちばんありそうな続きと、再現できる結果が欲しいからです。名前のブレインストーミングや別案の設計など、バリエーションが欲しいときは上げます。推論モデルの中にはデフォルト値しか受け付けないものもあるので、提供元のドキュメントを確認してください。
temperature と top_p の違いは何ですか?
temperature は確率分布全体の形を変えます。top_p(nucleus sampling とも呼ぶ)は分布を切り取ります。確率の合計が p になる最小のトークン群の中からだけサンプリングするので、top_p = 0.9 なら可能性の低いトークンの長い裾が落とされます。提供元はふつう、どちらか一方だけを調整し、もう一方はデフォルトのままにすることをすすめています。
temperature を 0 にすると出力は決定的になりますか?
ほぼなりますが、完全ではありません。0 ではモデルが毎ステップでいちばん可能性の高いトークンを選ぶので、繰り返し実行してもたいてい同一か、ごく近い結果になります。それでも提供元のサーバー上の小さな数値誤差でときどきトークンが変わることがあり、1つのトークンが違えば、返答の残りは別の道をたどることがあります。
ChatGPT や Claude で temperature を変えられますか?
チャットアプリではできません。サンプリングの設定はアプリが決めていて、temperature の操作項目はありません。API や、OpenAI の Playground、Anthropic Console、Google AI Studio などの開発者向けツールでは設定できます。チャットアプリでは、バリエーションが欲しいか一貫性が欲しいかをプロンプトそのもので伝えてください。