LLMのtemperatureとtop_pとは?用途別の設定目安を解説
LLM APIには temperature と top_p というパラメータがあります。どちらもモデルが次の単語(トークン)を選ぶときの「揺らぎ」の大きさを決めるもので、同じプロンプトでも出力の安定性や多様性が変わります。この記事では、仕組みと用途別の設定目安、そして「temperature を 0 にすれば正しい答えが出る」という誤解について解説します。OpenAI互換APIならどのモデルでも同じ書き方で指定できます。
サンプリングとは:モデルは「確率の分布」を出している
LLMは文章を一気に生成しているのではなく、次に来るトークンの候補それぞれに確率を割り当て、その中から一つを選ぶ、という処理を繰り返しています。たとえば「今日の天気は」の続きなら、「晴れ」が40%、「雨」が25%、「曇り」が20%……といった分布です。
この分布から実際にどのトークンを選ぶかを決める手続きがサンプリングで、temperature と top_p はその選び方を調整するパラメータです。確率そのものを作るのはモデルの仕事、そこからどう選ぶかを決めるのがこの2つ、と分けて考えると整理しやすくなります。
temperature とは
temperature は確率分布の「尖り具合」を調整します。
- 0 に近い:もっとも確率の高いトークンがほぼ常に選ばれ、出力は毎回ほぼ同じになります。
- 1.0 前後:モデルが出した分布をそのまま使うイメージで、自然な揺らぎが出ます。
- 1.0 より大きい:分布が平らになり、確率の低い候補も選ばれやすくなります。多様になる一方、脱線や崩れも増えます。
OpenAI形式のAPIでは 0〜2 の範囲で指定するのが一般的で、省略時はモデル側の既定値が使われます。
top_p とは
top_p は「候補をどこまで見るか」を決めます。確率の高い候補から順に足していき、累積確率が top_p に達したところで候補を打ち切り、その中からだけ選びます(nucleus sampling と呼ばれます)。
top_p: 0.1 なら上位の一握りだけ、top_p: 1.0 ならすべての候補が対象です。temperature が「分布の形を変える」のに対し、top_p は「分布の裾を切り落とす」と考えると違いがつかめます。
両方いじらない:どちらか一方を動かす
2つは同じ「揺らぎ」に別の角度から作用するため、同時に動かすと効果が読みにくくなります。OpenAIのAPIリファレンスでも「どちらか一方を変えることを推奨」しています。実務では temperature を主に使い、top_p は既定値のままにするのが分かりやすい運用です。
用途別の設定目安
以下はあくまで出発点です。モデルやプロンプトによって最適値は変わるので、実際の出力で調整してください。
| 用途 | temperature の目安 | 理由 |
|---|---|---|
| 分類・抽出・構造化データの生成 | 0〜0.3 | 毎回同じ形式・同じ判断がほしい |
| コード生成・SQL | 0〜0.3 | 構文の崩れを避けたい |
| 要約・翻訳 | 0.3〜0.7 | 忠実さを保ちつつ、不自然な繰り返しを避ける |
| 会話・文章作成 | 0.7〜1.0 | 自然な言い回しの幅がほしい |
| ブレスト・コピー案・キャッチコピー | 0.8〜1.0 以上 | 多様な候補を出してから人が選ぶ |
「正解が一つに決まるタスクほど低く、候補を広げたいタスクほど高く」が基本の考え方です。
よくある誤解:temperature 0 なら正確になる?
ここは特に押さえておきたい点です。
- 0 でも完全に同じ出力にはなりません。 推論基盤の並列処理や数値計算の丸めにより、同じリクエストでも結果がわずかに変わることがあります。「ほぼ決定的」であって「完全に決定的」ではありません。
- 0 にしても「正しく」はなりません。 temperature は候補の選び方を決めるだけで、モデルが持つ知識や根拠を増やしはしません。自信満々に間違った内容を出すハルシネーションは別の問題で、対策はプロンプト設計や根拠の提示の方にあります。詳しくはLLMのハルシネーションを減らす方法を参照してください。
- すべてのモデルが同じように解釈するとは限りません。 パラメータの既定値や実際の効き方はプロバイダーやモデルで異なり、一部のモデル(特に推論を重視した設計のもの)では temperature の指定が無視されたり、指定できる値が制限されたりします。互換APIで書き方は揃っても、挙動まで同一ではないと覚えておくと安全です。
なお、出力の形式や役割の安定は temperature だけでなくシステムプロンプトの設計でも大きく変わります。
実際に使ってみる
Chat Completions APIのリクエストに、そのまま temperature を足すだけです。
curl https://api.fastmetal.ai/v1/chat/completions \
-H "Authorization: Bearer $FASTMETAL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic-claude-haiku-4-5",
"temperature": 0.2,
"messages": [
{"role": "user", "content": "次の文を「肯定」「否定」「中立」のいずれかに分類してください:配送は早かったが、箱が少し潰れていた。"}
]
}'
Python(OpenAI SDK)で top_p を使う場合はこちらです。temperature は省略し、top_p だけを指定しています。
from openai import OpenAI
client = OpenAI(
api_key="<FASTMETAL_API_KEY>",
base_url="https://api.fastmetal.ai/v1",
)
resp = client.chat.completions.create(
model="anthropic-claude-haiku-4-5",
top_p=0.9,
messages=[{"role": "user", "content": "新しいコーヒー豆のキャッチコピーを5案ください。"}],
)
print(resp.choices[0].message.content)
設定を決めるいちばん確実な方法は、同じプロンプトを2つの設定で投げて見比べることです。
for t in (0.0, 0.9):
resp = client.chat.completions.create(
model="anthropic-claude-haiku-4-5",
temperature=t,
messages=[{"role": "user", "content": "この製品の特徴を3行で要約してください:..."}],
)
print(f"--- temperature={t}")
print(resp.choices[0].message.content)
FastMetalでは一つのAPIキーで複数のモデルを呼べるので、model も一緒に入れ替えれば「モデル × 設定」の比較がそのまま行えます。こうした比較を体系的に行う方法はLLMの評価(Evals)入門にまとめています。
よくある質問
Q. temperature と top_p はどちらを使えばよいですか? まずは temperature だけを動かし、top_p は既定値のままにするのが分かりやすい運用です。両方を同時に変えると効果の切り分けが難しくなります。
Q. temperature を 0 にすれば毎回同じ答えになりますか? ほぼ同じになりますが、完全に同一とは限りません。推論基盤側の要因でわずかに揺れることがあります。厳密な再現性が必要なら、出力を検証するテストを別途用意してください。
Q. モデルを変えたら同じ temperature でも出力の傾向が変わりました。なぜですか? パラメータの解釈や既定値はモデルごとに異なるためです。互換APIで指定方法は共通でも、効き方まで同じとは限りません。モデルを切り替えたら設定も見直してください。
まとめ
temperature と top_p は「モデルが次のトークンをどう選ぶか」を決めるパラメータで、正解が一つに決まるタスクは低め、候補を広げたいタスクは高めが基本です。ただし 0 にしても正確さは上がらず、モデルによって効き方も違います。OpenAI互換APIなら書き方は共通なので、APIキーを取得して、同じプロンプトを設定違い・モデル違いで見比べるところから始めてみてください。