ブログに戻る
コラム

LLMのtemperatureとtop_pとは?用途別の設定目安を解説

FastMetal

LLM APIには temperaturetop_p というパラメータがあります。どちらもモデルが次の単語(トークン)を選ぶときの「揺らぎ」の大きさを決めるもので、同じプロンプトでも出力の安定性や多様性が変わります。この記事では、仕組みと用途別の設定目安、そして「temperature を 0 にすれば正しい答えが出る」という誤解について解説します。OpenAI互換APIならどのモデルでも同じ書き方で指定できます。

サンプリングとは:モデルは「確率の分布」を出している

LLMは文章を一気に生成しているのではなく、次に来るトークンの候補それぞれに確率を割り当て、その中から一つを選ぶ、という処理を繰り返しています。たとえば「今日の天気は」の続きなら、「晴れ」が40%、「雨」が25%、「曇り」が20%……といった分布です。

この分布から実際にどのトークンを選ぶかを決める手続きがサンプリングで、temperaturetop_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毎回同じ形式・同じ判断がほしい
コード生成・SQL0〜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キーを取得して、同じプロンプトを設定違い・モデル違いで見比べるところから始めてみてください。

最新のAIモデルを今すぐ試す

最新のAIモデルはFastMetalのAPIキー1つで利用できます。ブラウザですぐに試す、またはOpenAI SDKからそのまま呼び出せます。