T-CREATOR

gpt-oss 推論パラメータ早見表:temperature・top_p・repetition_penalty...その他まとめ

gpt-oss 推論パラメータ早見表:temperature・top_p・repetition_penalty...その他まとめ

大規模言語モデル(LLM)を扱っていると、生成される文章の品質や特性をコントロールしたいと感じることが多いのではないでしょうか。そんなとき重要になるのが「推論パラメータ」です。

本記事では、GPT-4 や Llama、Claude などのモデルを動かす際に使われる主要な推論パラメータを一覧にまとめ、それぞれの役割と使い分けを詳しく解説します。まずは早見表で全体像を把握し、その後に各パラメータの詳細を見ていきましょう。

推論パラメータ早見表

各パラメータの概要を表にまとめました。この表を参考に、目的に応じた設定を選んでください。

#パラメータ名推奨値範囲デフォルト値主な効果使用場面
1temperature0.0 〜 2.00.7 〜 1.0ランダム性・創造性の制御創作:高め / 事実回答:低め
2top_p0.0 〜 1.00.9 〜 1.0累積確率でトークンを絞るtemperature と併用
3top_k1 〜 100+40 〜 50候補トークン数を制限安定した出力が欲しいとき
4repetition_penalty1.0 〜 1.51.0 〜 1.1繰り返しを抑制同じ表現の連続を防ぐ
5frequency_penalty-2.0 〜 2.00.0頻度に応じてペナルティOpenAI API で頻出語を減らす
6presence_penalty-2.0 〜 2.00.0登場済みトークンにペナルティ多様な語彙を引き出す
7max_tokens1 〜 4096+モデル依存生成する最大トークン数出力の長さを制限
8min_p0.0 〜 1.00.0最小確率閾値でフィルタ低確率トークンを除外
9typical_p0.0 〜 1.01.0典型的なトークンを選択より自然な文章生成

この表を見れば、各パラメータがどんな役割を持ち、どの場面で調整すべきかが一目でわかります。続いて、なぜこれらのパラメータが必要なのか、背景から見ていきましょう。

背景

大規模言語モデルの推論とは

大規模言語モデル(LLM)は、入力されたテキストに対して「次に来る単語(トークン)」を確率的に予測し、文章を生成します。モデルは膨大なデータで学習しているため、多くの候補トークンに対してそれぞれ確率を持っています。

しかし、常に最も確率の高いトークンを選び続けると、出力が単調で予測可能なものになりがちです。そこで、確率分布を調整したり、サンプリング方法を変えたりすることで、生成される文章の「多様性」「創造性」「安定性」をコントロールするのが推論パラメータの役割です。

OSS 実装での推論パラメータ

GPT-4 や Claude などのクローズドモデルだけでなく、Llama、Mistral、GPT-J といったオープンソースモデルも広く利用されています。これらを動かす際には、以下のようなツールやフレームワークが使われます。

  • llama.cpp
  • text-generation-webui
  • vLLM
  • Hugging Face Transformers
  • LangChain

これらのツールはそれぞれ独自のパラメータ名や設定方法を持っていますが、基本的な概念は共通しています。本記事では、どのツールでも応用できる標準的なパラメータに焦点を当てて解説します。

以下の図は、LLM の推論プロセスと各パラメータがどの段階で影響するかを示しています。

mermaidflowchart TD
    input["入力テキスト"] --> model["LLM モデル"]
    model --> prob["確率分布の生成"]
    prob --> temp["temperature で<br/>確率を調整"]
    temp --> filter["top_p / top_k / min_p で<br/>候補を絞る"]
    filter --> sample["サンプリング"]
    sample --> penalty["repetition_penalty で<br/>繰り返しを抑制"]
    penalty --> output["出力トークン"]
    output --> check{"max_tokens に<br/>到達?"}
    check -->|いいえ| model
    check -->|はい| done["生成完了"]

この図からわかるように、推論パラメータは段階的に確率分布を調整し、最終的な出力トークンを決定しています。

課題

なぜパラメータ調整が必要なのか

LLM を使っていると、以下のような課題に直面することがあります。

課題 1:出力が単調で面白みがない

デフォルト設定では、モデルは最も「安全」で「一般的」な回答を選びがちです。創作や発想支援では、もっと意外性や多様性が欲しいところです。

課題 2:同じフレーズを繰り返してしまう

特に長文生成では、同じ単語や表現が何度も登場し、読みにくくなることがあります。これは「ループ」と呼ばれ、モデルが同じパターンに陥る現象です。

課題 3:不正確な情報が生成される

temperature を上げすぎると、創造性は増しますが、事実と異なる内容(ハルシネーション)が含まれるリスクも高まります。

課題 4:出力の長さが制御できない

質問への回答として簡潔な答えを期待しているのに、長々とした説明が返ってくることがあります。あるいは逆に、十分な情報が得られないこともあるでしょう。

課題 5:パラメータの相互作用が複雑

複数のパラメータを同時に調整すると、予期しない結果になることがあります。どのパラメータをどの順番で調整すべきか、迷ってしまいますね。

以下の図は、パラメータ設定による出力の違いを概念的に示しています。

mermaidflowchart LR
    subgraph low["低 temperature (0.3)"]
        direction TB
        lowOut["予測可能<br/>安定的<br/>事実重視"]
    end

    subgraph mid["中 temperature (0.7)"]
        direction TB
        midOut["バランス<br/>適度な多様性<br/>実用的"]
    end

    subgraph high["高 temperature (1.5)"]
        direction TB
        highOut["創造的<br/>多様性高い<br/>不安定"]
    end

    low --> mid
    mid --> high

このように、temperature ひとつをとっても、設定値によって出力の性質が大きく変わります。他のパラメータも組み合わせると、さらに複雑な調整が必要になるのです。

解決策

各パラメータの詳細と使い分け

ここからは、各推論パラメータの具体的な動作と、どのような場面で調整すべきかを解説します。

temperature(温度パラメータ)

概要

temperature は、確率分布の「鋭さ」を調整するパラメータです。0 に近いほど確率の高いトークンが選ばれやすくなり、高いほどランダム性が増します。

設定範囲

  • 0.0:完全に決定論的(常に最も確率の高いトークンを選択)
  • 0.3 〜 0.5:事実に基づく回答、コード生成、翻訳などに適している
  • 0.7 〜 1.0:バランスの取れた設定(デフォルト)
  • 1.2 〜 2.0:創作、ブレインストーミング、意外性を求める場面

使用例

typescript// OpenAI API での temperature 設定例
const response = await openai.chat.completions.create({
  model: 'gpt-4',
  messages: [
    { role: 'user', content: '物語のアイデアを5つ考えて' },
  ],
  temperature: 1.3, // 高めに設定して創造性を引き出す
});

この例では、創作タスクのため temperature を高めに設定しています。これにより、より多様で意外性のあるアイデアが生成されやすくなりますね。

typescript// 事実に基づく回答が必要な場合
const response = await openai.chat.completions.create({
  model: 'gpt-4',
  messages: [{ role: 'user', content: '東京の人口は?' }],
  temperature: 0.2, // 低めに設定して正確性を優先
});

事実確認のような質問では、temperature を低く設定することで、より正確で一貫性のある回答が得られます。

注意点

temperature を 0 に設定すると、同じ入力に対して常に同じ出力が返されます。これはテストや再現性が重要な場面では有用ですが、創造的なタスクには向きません。

top_p(Nucleus Sampling)

概要

top_p は、累積確率が指定した値に達するまでのトークン群からサンプリングする手法です。別名「Nucleus Sampling」と呼ばれます。

設定範囲

  • 0.0 〜 1.0:1.0 に近いほど多くのトークンが候補に含まれる
  • 0.9:推奨設定(上位 90% の確率を持つトークン群から選択)
  • 0.5:かなり絞り込まれた選択(安定性重視)

動作イメージ

mermaidflowchart TD
    tokens["全トークンの<br/>確率分布"] --> sort["確率の高い順に<br/>ソート"]
    sort --> cumsum["累積確率を計算"]
    cumsum --> filter["top_p 以下の<br/>トークンのみ残す"]
    filter --> sample["残ったトークンから<br/>サンプリング"]

この図が示すように、top_p は確率分布の「裾」をカットし、確率の高いトークン群に絞り込みます。

使用例

python# Hugging Face Transformers での設定例
from transformers import pipeline

generator = pipeline("text-generation", model="gpt2")

# top_p を使ったサンプリング
output = generator(
    "AIの未来について",
    max_length=100,
    do_sample=True,  # サンプリングを有効化
    top_p=0.92,      # 累積確率92%まで
    temperature=0.8,
)

この設定では、temperature と top_p を併用することで、多様性を保ちながらも極端に低確率なトークンを除外しています。

temperature との使い分け

一般的に、temperaturetop_p は併用されます。temperature で確率分布を平滑化し、top_p で候補を絞り込むことで、より細かい制御が可能になるのです。

top_k(Top-K Sampling)

概要

top_k は、確率の高い上位 K 個のトークンのみを候補として残すシンプルな手法です。

設定範囲

  • 1:常に最も確率の高いトークンを選択(temperature=0 と同等)
  • 10 〜 50:標準的な設定範囲
  • 100+:多様性重視

使用例

python# llama.cpp での設定例(Python バインディング)
from llama_cpp import Llama

llm = Llama(model_path="./models/llama-2-7b.gguf")

output = llm(
    "人工知能の倫理について説明してください",
    max_tokens=200,
    top_k=40,           # 上位40個のトークンから選択
    temperature=0.7,
)

top_k を設定することで、極端に低確率なトークンを排除し、出力の安定性を高めることができます。

top_p との違い

top_k は固定個数でカットするのに対し、top_p は累積確率でカットします。そのため、確率分布が偏っている場合(確信度が高い場合)、top_p の方が柔軟に対応できますね。

repetition_penalty(繰り返しペナルティ)

概要

repetition_penalty は、既に生成されたトークンに対してペナルティを与え、同じ表現の繰り返しを抑制します。

設定範囲

  • 1.0:ペナルティなし(デフォルト)
  • 1.05 〜 1.15:軽度の抑制(自然な文章向け)
  • 1.2 〜 1.5:強い抑制(ループ対策)
  • 1.5 以上:過度な抑制で不自然になる可能性あり

計算方法

既出トークンの確率を 1 ​/​ repetition_penalty 倍にすることで、選ばれにくくします。

javascript// 疑似コード:repetition_penalty の適用
function applyRepetitionPenalty(
  logits,
  generatedTokens,
  penalty
) {
  generatedTokens.forEach((token) => {
    // 既出トークンの対数確率を減らす
    logits[token] /= penalty;
  });
  return logits;
}

この処理により、既に使われた単語やフレーズが再度選ばれる確率が下がります。

使用例

python# text-generation-webui での設定例
parameters = {
    "max_new_tokens": 500,
    "temperature": 0.9,
    "top_p": 0.95,
    "repetition_penalty": 1.12,  # 繰り返しを軽く抑制
}

response = generate_text("長編小説の冒頭を書いて", **parameters)

長文生成では repetition_penalty を適切に設定することで、同じ表現の連続を防ぎ、読みやすい文章になります。

注意点

ペナルティを強くしすぎると、文脈上必要な繰り返し(主語の再登場など)まで抑制され、不自然な文章になる可能性があります。1.1 〜 1.2 程度から試すのがおすすめです。

frequency_penalty と presence_penalty

概要

これらは主に OpenAI API で使用されるパラメータで、トークンの出現頻度に基づいてペナルティを与えます。

  • frequency_penalty:トークンが出現した回数に比例してペナルティ
  • presence_penalty:トークンが一度でも出現したかどうかでペナルティ

設定範囲

どちらも -2.0 〜 2.0 の範囲で設定できます。

  • 負の値:繰り返しを促進(特殊な用途)
  • 0.0:ペナルティなし
  • 0.5 〜 1.0:適度な多様性を促す
  • 1.5 〜 2.0:強い多様性(話題が飛びやすい)

使用例

typescript// OpenAI API での設定例
const response = await openai.chat.completions.create({
  model: 'gpt-4',
  messages: [
    {
      role: 'user',
      content: '様々な角度から地球温暖化について論じて',
    },
  ],
  temperature: 0.8,
  frequency_penalty: 0.7, // 頻出語を抑制
  presence_penalty: 0.6, // 多様な語彙を促進
  max_tokens: 800,
});

この設定により、同じ単語や表現を繰り返さず、多角的な議論が展開されやすくなります。

違いの比較

#パラメータペナルティの基準効果
1frequency_penalty出現回数に比例何度も使われる語を抑制
2presence_penalty出現の有無一度使った語を避ける

presence_penalty は「新しい語彙を使う」ことを促し、frequency_penalty は「特定の語の多用を防ぐ」という違いがありますね。

max_tokens(最大トークン数)

概要

max_tokens は、生成するトークン数の上限を設定します。コスト管理や出力の長さ制御に不可欠です。

設定の考え方

  • 短い回答(50 〜 200 トークン):質問応答、要約
  • 中程度(200 〜 500 トークン):説明文、ブログ記事の一部
  • 長文(500 〜 2000+ トークン):長編記事、コード生成

使用例

typescript// 簡潔な回答を求める場合
const response = await openai.chat.completions.create({
  model: 'gpt-4',
  messages: [
    { role: 'user', content: 'Reactとは何ですか?' },
  ],
  max_tokens: 150, // 短めに制限
  temperature: 0.3,
});

max_tokens を設定することで、冗長な説明を防ぎ、簡潔な回答が得られます。

トークンとは

トークンは単語や文字の断片で、英語では 1 単語が約 1 トークン、日本語では 1 文字が 1 〜 2 トークン程度に相当します。正確なトークン数を知るには、各モデルのトークナイザーを使うとよいでしょう。

python# OpenAI のトークナイザーを使った例
import tiktoken

encoding = tiktoken.encoding_for_model("gpt-4")
text = "推論パラメータの設定方法について"
tokens = encoding.encode(text)
print(f"トークン数: {len(tokens)}")  # 出力例: トークン数: 12

min_p(最小確率閾値)

概要

min_p は、最も確率の高いトークンの確率に対する相対的な閾値で、低確率のトークンをフィルタリングします。比較的新しいパラメータです。

設定範囲

  • 0.0:フィルタリングなし(デフォルト)
  • 0.05 〜 0.1:低確率トークンを除外

動作

max_prob を最大確率とすると、prob >= max_prob * min_p を満たすトークンのみが候補に残ります。

javascript// 疑似コード:min_p のフィルタリング
function filterByMinP(probs, minP) {
  const maxProb = Math.max(...probs);
  const threshold = maxProb * minP;

  return probs.map((p) => (p >= threshold ? p : 0));
}

この処理により、相対的に確率の低いトークンが除外されます。

使用場面

top_p や top_k と併用し、さらに細かい制御を行いたい場合に有効です。ただし、すべての推論エンジンでサポートされているわけではありません。

typical_p(典型的サンプリング)

概要

typical_p は、「典型的」なトークン、つまりモデルが予測する情報量に近いトークンを優先的に選ぶ手法です。

設定範囲

  • 1.0:無効(デフォルト)
  • 0.9 〜 0.95:自然な文章生成

使用例

python# llama.cpp での設定例
output = llm(
    "自然な対話文を生成してください",
    max_tokens=300,
    typical_p=0.92,     # 典型的なトークンを優先
    temperature=0.8,
)

typical_p を使うと、極端に予測しやすいトークンも予測しにくいトークンも避け、「ちょうど良い」自然さの文章が生成されやすくなります。

具体例

ユースケース別の設定例

ここからは、実際の利用場面に応じた推論パラメータの設定例を紹介します。

ユースケース 1:事実に基づく質問応答

目的

正確で一貫性のある回答を得る。

推奨設定

typescriptconst factualQASettings = {
  temperature: 0.2, // 低め:決定論的
  top_p: 0.9,
  top_k: 40,
  repetition_penalty: 1.05, // 軽度の抑制
  max_tokens: 200, // 簡潔に
  frequency_penalty: 0.0,
  presence_penalty: 0.0,
};

この設定では、temperature を低くすることで、最も確率の高い(=最も正確と思われる)回答が選ばれやすくなります。

実装例

typescriptconst response = await openai.chat.completions.create({
  model: 'gpt-4',
  messages: [
    {
      role: 'system',
      content:
        'あなたは正確な情報を提供するアシスタントです。',
    },
    {
      role: 'user',
      content: 'JavaScriptのクロージャとは何ですか?',
    },
  ],
  ...factualQASettings,
});

console.log(response.choices[0].message.content);

ユースケース 2:創作・ストーリー生成

目的

多様で創造的な文章を生成する。

推奨設定

pythoncreative_writing_settings = {
    "temperature": 1.2,          # 高め:創造性重視
    "top_p": 0.95,
    "top_k": 50,
    "repetition_penalty": 1.15,  # 繰り返しをやや強めに抑制
    "max_tokens": 1000,          # 長文生成
}

temperature を高めに設定することで、予想外の展開や独創的な表現が生まれやすくなります。

実装例

pythonfrom transformers import AutoModelForCausalLM, AutoTokenizer

model_name = "rinna/japanese-gpt-neox-3.6b"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)

prompt = "昔々、ある村に不思議な猫が住んでいました。"

inputs = tokenizer(prompt, return_tensors="pt")

# creative_writing_settings を適用
outputs = model.generate(
    inputs["input_ids"],
    max_new_tokens=1000,
    temperature=1.2,
    top_p=0.95,
    top_k=50,
    repetition_penalty=1.15,
    do_sample=True,
)

story = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(story)

この設定により、物語は予測不可能な展開を見せ、読者を引き込む内容になるでしょう。

ユースケース 3:コード生成

目的

構文的に正しく、実用的なコードを生成する。

推奨設定

javascriptconst codeGenerationSettings = {
  temperature: 0.3, // 低め:正確性重視
  top_p: 0.9,
  repetition_penalty: 1.08, // 軽度の抑制
  max_tokens: 500,
  frequency_penalty: 0.2, // 同じコードパターンの繰り返しを抑制
  presence_penalty: 0.0,
};

コード生成では正確性が最優先のため、temperature を低く設定します。

実装例

typescriptconst response = await openai.chat.completions.create({
  model: 'gpt-4',
  messages: [
    {
      role: 'system',
      content:
        'あなたは経験豊富なソフトウェアエンジニアです。TypeScriptでコードを書いてください。',
    },
    {
      role: 'user',
      content: '配列の重複を削除する関数を書いて',
    },
  ],
  ...codeGenerationSettings,
});

console.log(response.choices[0].message.content);

この設定により、正確で実用的なコードが生成されやすくなります。

ユースケース 4:ブレインストーミング

目的

多様なアイデアを大量に生成する。

推奨設定

pythonbrainstorming_settings = {
    "temperature": 1.5,          # かなり高め:多様性最優先
    "top_p": 0.98,
    "repetition_penalty": 1.2,   # 繰り返しを強く抑制
    "max_tokens": 300,
    "frequency_penalty": 1.0,    # 同じ言葉の頻出を防ぐ
    "presence_penalty": 1.2,     # 多様な語彙を促進
}

この設定では、意外性と多様性を最大化し、発想の幅を広げます。

実装例

pythonimport openai

response = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[
        {"role": "user", "content": "未来の交通手段についてアイデアを10個考えて"},
    ],
    temperature=1.5,
    frequency_penalty=1.0,
    presence_penalty=1.2,
    max_tokens=300,
)

print(response.choices[0].message.content)

高い temperature と penalty の組み合わせにより、従来にない斬新なアイデアが生まれやすくなります。

ユースケース 5:対話型チャットボット

目的

自然で人間らしい対話を実現する。

推奨設定

typescriptconst chatbotSettings = {
  temperature: 0.8, // 中程度:バランス重視
  top_p: 0.92,
  repetition_penalty: 1.1, // 繰り返しを軽く抑制
  max_tokens: 150, // 適度な長さ
  frequency_penalty: 0.3,
  presence_penalty: 0.3,
};

対話では、自然さと多様性のバランスが重要です。

実装例

typescriptconst conversationHistory = [
  {
    role: 'system',
    content: 'あなたは親しみやすいチャットボットです。',
  },
  { role: 'user', content: '最近疲れてるんだよね' },
];

const response = await openai.chat.completions.create({
  model: 'gpt-4',
  messages: conversationHistory,
  ...chatbotSettings,
});

conversationHistory.push({
  role: 'assistant',
  content: response.choices[0].message.content,
});

console.log(response.choices[0].message.content);
// 「それは大変ですね。何か特別なことがあったんですか?」など

この設定により、ユーザーに寄り添った自然な会話が実現できます。

パラメータ調整のフローチャート

どのパラメータから調整すべきか迷ったときは、以下のフローを参考にしてください。

mermaidflowchart TD
    start["タスクを定義"] --> check_accuracy{"正確性が<br/>最重要?"}
    check_accuracy -->|はい| low_temp["temperature: 0.2-0.5<br/>top_p: 0.9<br/>repetition_penalty: 1.05"]
    check_accuracy -->|いいえ| check_creative{"創造性が<br/>重要?"}

    check_creative -->|はい| high_temp["temperature: 1.2-1.5<br/>top_p: 0.95<br/>repetition_penalty: 1.15"]
    check_creative -->|いいえ| balanced["temperature: 0.7-0.9<br/>top_p: 0.92<br/>repetition_penalty: 1.1"]

    low_temp --> check_loop{"繰り返しが<br/>発生?"}
    high_temp --> check_loop
    balanced --> check_loop

    check_loop -->|はい| increase_penalty["repetition_penalty を<br/>0.05 ずつ上げる"]
    check_loop -->|いいえ| check_length{"出力の長さは<br/>適切?"}

    increase_penalty --> check_length

    check_length -->|はい| done["完了"]
    check_length -->|いいえ| adjust_tokens["max_tokens を調整"]
    adjust_tokens --> done

この図に従って段階的に調整することで、目的に合った設定を効率的に見つけられます。

まとめ

本記事では、gpt-oss や各種 LLM で使用される主要な推論パラメータについて解説しました。最後に重要なポイントをまとめます。

各パラメータの役割

  • temperature:ランダム性・創造性をコントロール。低いほど決定論的、高いほど多様
  • top_p:累積確率で候補を絞り込み、極端なトークンを除外
  • top_k:固定個数で候補を制限し、安定した出力を実現
  • repetition_penalty:繰り返しを抑制し、読みやすい文章を生成
  • frequency_penalty / presence_penalty:語彙の多様性を促進
  • max_tokens:出力の長さを制御し、コストを管理
  • min_p / typical_p:より自然で適切なトークン選択を実現

推奨される調整手順

  1. まず temperature でベースとなる多様性を設定
  2. top_ptop_k で候補を絞り込む
  3. 長文生成では repetition_penalty を調整
  4. 必要に応じて frequency_penaltypresence_penalty を追加
  5. max_tokens で出力の長さを最終調整

タスク別クイック設定

  • 事実回答temperature: 0.2, top_p: 0.9, max_tokens: 200
  • 創作temperature: 1.2, top_p: 0.95, repetition_penalty: 1.15
  • コードtemperature: 0.3, top_p: 0.9, max_tokens: 500
  • 対話temperature: 0.8, top_p: 0.92, max_tokens: 150

注意すべきポイント

パラメータは相互に影響し合います。一度に複数のパラメータを大きく変えるのではなく、ひとつずつ調整して効果を確認するのがおすすめです。

また、モデルによって最適な設定は異なります。GPT-4、Llama、Claude などでは、同じパラメータでも出力の傾向が変わることがあるため、実際に試しながら調整しましょう。

推論パラメータを理解し適切に調整することで、LLM の能力を最大限に引き出すことができます。本記事の早見表と設定例を参考に、ぜひ様々なパラメータを試してみてください。

関連リンク

推論パラメータについてさらに深く学びたい方は、以下のリソースをご参照ください。