LLMにおけるTemperatureとは
Temperatureは創造性を制御します。0は決定論的、2はカオス的で、その間の値も設定できます。
「LLMにおけるTemperatureとは」はCoddyKit上の無料AI Prompt Engineeringレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Prompt Engineering学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Prompt Engineeringコースには全4レッスンが含まれています。
LLMが次のトークンを選ぶ仕組み
各ステップで、LLMは語彙に含まれるすべてのトークン(GPTでは約50,000トークン)に対する確率分布を出力します。モデルは各トークンにロジットと呼ばれるスコア、つまり生の正規化されていない数値を割り当てます。ロジットが高いほど、そのトークンが選ばれる可能性は高くなります。
温度は、サンプリングの前にこの生のロジットを確率へ変換する方法を制御するパラメータです。
Softmax関数
ロジットはsoftmax関数を使って確率に変換されます。Softmaxはロジットのベクトルを受け取り、合計が1になる確率分布を出力します。
4つのトークンからなる小さな語彙を例に見てみましょう。
import numpy as np
# Raw logits from the model
logits = np.array([2.0, 1.0, 0.5, -1.0]) # scores for 4 tokens
# Standard softmax (temperature = 1)
def softmax(logits, temperature=1.0):
scaled = logits / temperature
exp_scaled = np.exp(scaled - np.max(scaled)) # subtract max for numerical stability
return exp_scaled / exp_scaled.sum()
probs = softmax(logits, temperature=1.0)
print('Probabilities:', np.round(probs, 3))
# [0.567, 0.208, 0.129, 0.095]
# Token 0 is most likely at 56.7%温度 = 0:貪欲デコーディング
温度が0に近づくと、softmaxの確率分布は収束します。最も高いロジットを持つトークンの確率が約1.0になり、それ以外は0に近づきます。モデルは常に、最も確率の高い単一のトークンを選択します。
これを貪欲デコーディングと呼びます。決定的な動作であり、同じプロンプトからは常に同じ出力が生成されます。ランダム性も創造性もありません。
# Temperature = 0 (greedy)
probs_temp0 = softmax(logits, temperature=0.01) # near-zero
print('Probs at T=0.01:', np.round(probs_temp0, 4))
# [~1.0, ~0.0, ~0.0, ~0.0]
# In practice, temperature=0 is implemented as argmax:
def greedy_sample(logits):
return np.argmax(logits) # always returns the index of the highest logit
token_idx = greedy_sample(logits)
print(f'Selected token index: {token_idx}') # always 0温度 = 1:標準サンプリング
温度 = 1ではスケーリングなしでsoftmaxを適用するため、確率分布はモデル本来の確信度を反映します。モデルはこの確率に従ってサンプリングします。可能性の高いトークンは頻繁に現れ、可能性の低いトークンもまれに現れます。
これは、ほとんどの会話用途でのデフォルト設定です。まとまりを保ちながら、変化に富んだ自然な出力を生成します。
# Temperature = 1 (standard)
probs_temp1 = softmax(logits, temperature=1.0)
print('Probs at T=1.0:', np.round(probs_temp1, 3))
# [0.567, 0.208, 0.129, 0.095]
# Sampling from this distribution:
def sample_token(probs):
vocab = ['the', 'a', 'an', 'is']
return np.random.choice(vocab, p=probs)
# Run 10 times to see variation
for _ in range(10):
print(sample_token(probs_temp1), end=' ')
# Output varies each time, but 'the' appears most often温度 = 2:無秩序なサンプリング
高い温度(> 1)では、確率分布が平坦になり、すべてのトークンがより均等に選ばれやすくなります。モデルは予測しにくくなり、まとまりを欠くことも多くなります。
実際には、温度 > 1.5が使われることはほとんどありません。創造的で予想外の出力が得られる場合もありますが、通常は意味のない出力になります。
# Temperature = 2 (chaotic)
probs_temp2 = softmax(logits, temperature=2.0)
print('Probs at T=2.0:', np.round(probs_temp2, 3))
# [0.385, 0.261, 0.211, 0.143]
# Much flatter — the 4th token (logit=-1.0) now has 14.3% chance
# (vs 9.5% at T=1.0)
# Visualization: compare distributions
for temp in [0.1, 0.5, 1.0, 1.5, 2.0]:
probs = softmax(logits, temperature=temp)
print(f'T={temp}: {np.round(probs, 3)}')分布の鋭さを制御する温度
概念的には、温度は確率分布の鋭さを制御します。
- 低温(0.1~0.4):鋭いピーク。モデルの確信度が高く、安全または一般的なトークンを選びます
- 中温(0.6~1.0):自然な形。創造性と一貫性のバランスが取れます
- 高温(1.2~2.0):平坦な分布。モデルは可能性の低いトークンも自由に探索します
創造性の調整つまみだと考えてください。低いほど正確になり、高いほど大胆になります。
import matplotlib
# Conceptual: what distribution shape looks like at different temps
temps = {'T=0.2 (sharp)': 0.2, 'T=1.0 (normal)': 1.0, 'T=2.0 (flat)': 2.0}
for label, temp in temps.items():
probs = softmax(logits, temp)
bar = '#' * int(probs[0] * 40)
print(f'{label}: top token = {probs[0]:.1%} |{bar}|')
# T=0.2: top token = 97.2% |########################################|
# T=1.0: top token = 56.7% |######################|
# T=2.0: top token = 38.5% |###############|Temperatureと決定性
重要な点として、temperature = 0 にするとサンプリングは決定的になります。temperature > 0 の場合、サンプリングはランダムな処理であるため、実行するたびに異なる出力が生成されます。確率分布は固定されていますが、サンプルは変化します。
テストで再現可能な出力を得るには、必ず temperature = 0 に設定してください。意図的に変化を持たせる本番環境では、APIが対応している場合は seed を使用してください。
import openai
client = openai.OpenAI(api_key='sk-...')
# Deterministic: temperature=0
resp1 = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': 'What is the capital of France?'}],
temperature=0
)
resp2 = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': 'What is the capital of France?'}],
temperature=0
)
print(resp1.choices[0].message.content == resp2.choices[0].message.content) # True (usually)TemperatureとTop-pの相互作用
Temperatureとtop-p(nucleus sampling)は、どちらもサンプリング分布を形作りますが、適用される段階が異なります。
- Temperature: softmaxの前にlogitをスケーリングする — 分布全体の形状を変化させる
- Top-p: softmaxの後に分布を上位pの確率質量まで切り詰める — 最も確率の高いトークン集合からのみサンプリングする
両方を使用すると、きめ細かな制御が可能になります。一般的には、一度に片方だけを調整することが推奨されます。両方を同時に変更すると、効果を予測しにくくなります。
# Using temperature with top_p in OpenAI API
resp = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': 'Write a one-line haiku about code.'}],
temperature=0.9, # moderately diverse distribution
top_p=0.95 # sample from top 95% of probability mass
)タスク別の実用的なTemperature値
一般的なタスク種別の簡単な目安:
- 事実に関するQ&A: 0 — 正確さが必須で、変化は不要
- コード生成: 0–0.2 — 構文が正しくなければならない
- 要約: 0.3–0.5 — ある程度の変化は許容される
- チャット/会話: 0.7–0.9 — 自然で変化に富んだ応答
- クリエイティブ・ライティング: 0.9–1.2 — 多様性が求められる
- ブレインストーミング/アイデア出し: 1.0–1.5 — 予想外の選択肢を探る
TEMPERATURE_PRESETS = {
'factual_qa': 0.0,
'code_generation': 0.1,
'summarization': 0.4,
'chat': 0.8,
'creative_writing': 1.1,
'brainstorming': 1.3
}
def call_with_preset(task_type, prompt):
temp = TEMPERATURE_PRESETS.get(task_type, 0.7)
return client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': prompt}],
temperature=temp
)APIでのTemperature
Temperatureは、主要なLLM APIで利用できます。有効範囲はOpenAIでは0–2、Anthropic Claudeでは0–1です。最大値を超えるとエラーが発生します。
# OpenAI: temperature 0 to 2
client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': prompt}],
temperature=1.2 # Valid for OpenAI
)
# Anthropic Claude: temperature 0 to 1
import anthropic
claude = anthropic.Anthropic(api_key='sk-ant-...')
claude.messages.create(
model='claude-opus-4-5',
max_tokens=1024,
temperature=0.8, # Max is 1.0 for Claude
messages=[{'role': 'user', 'content': prompt}]
)Temperatureだけでは不十分な場合
Temperatureだけでは、必要な多様性や精度が常に得られるとは限りません。temperature=0でも出力に変化が生じる場合(浮動小数点の非決定性により、一部のモデルで発生することがあります)は、真に再現可能な出力を得るために seed を使用してください。高いtemperatureで意味のない出力が生成される場合は、temperatureをさらに上げるのではなく、top-pまたはtop-kで語彙を制限してください。
# Seed for reproducibility (OpenAI API)
resp = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': prompt}],
temperature=0,
seed=42 # Guarantees same output across calls on same model version
)
# Note: same output only guaranteed with same model version
# A model update can change outputs even with the same seed理解度チェック
temperatureを非常に高い値(例:2.0)に設定すると、トークンの確率分布はどうなりますか?
復習:LLMのTemperature
Temperatureは、softmaxの前にlogitをスケーリングすることで、トークンのサンプリングにおけるランダム性を制御します。
- T=0: greedy(貪欲) — 最も確率の高いトークンを常に選択するため、決定的
- T=1: 標準 — 自然な確率分布に従ってサンプリングする
- T>1: 混沌 — 分布が平坦になり、ランダム性が増す一方で一貫性が低下する
事実に関するタスクやコードには低いtemperature、チャットには中程度、クリエイティブなタスクには高いtemperatureを使用してください。一度に調整するのはtemperatureまたはtop-pのどちらか一方にし、両方を同時に変更しないでください。次のレッスンではtop-p nucleus samplingを扱います。
よくある質問
「LLMにおけるTemperatureとは」レッスンは無料ですか?
はい。「LLMにおけるTemperatureとは」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Prompt Engineeringコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Prompt Engineeringコースには全4レッスンが含まれています。
「LLMにおけるTemperatureとは」で何を学びますか?
Temperatureは創造性を制御します。0は決定論的、2はカオス的で、その間の値も設定できます。 ブラウザで直接実行するハンズオンコードでAI Prompt Engineeringを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Prompt Engineeringを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Prompt Engineeringは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「LLMにおけるTemperatureとは」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Prompt Engineeringレッスンでコードを書いて実行できますか?
はい。すべてのAI Prompt Engineeringレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- LLMにおけるTemperatureとは
- Top-p(Nucleus)サンプリング
- Top-kサンプリング
- ユースケースに合わせたパラメータ選択