はじめに
GPT-4系のAPIを使っているアプリケーションをGPT-5に移行しようとして、こんな経験はありませんか?
- 「急に
status: "incomplete"が返ってくるようになった」 - 「
temperature=0.3を設定したらエラーになった」 - 「以前と同じパラメータなのに動かない」
実は、GPT-5への移行は単なる「モデル名の変更」では済みません。従来のGPT-4系モデルで利用できていた多くのパラメータが、GPT-5(特にreasoningモデル)では非推奨・無効化されているのです。
本記事では、GPT-5へ移行するために必要なパラメータ変更点を網羅し、具体的なコード例と共に解説します。
目次
- GPT-5移行時の重要チェックポイント
- パラメータ比較表:旧モデル vs GPT-5
- 各パラメータの詳細解説とコード例
incompleteレスポンスへの対処法- 実践:安全な移行手順
- 移行チェックリスト
1. GPT-5移行時の重要チェックポイント
まず、GPT-5への移行で最も注意すべきパラメータをリストアップします。
❌ GPT-5で使えなくなった(または制限された)パラメータ
| パラメータ名 | 状況 | 影響度 |
|---|---|---|
temperature |
1のみサポート(0〜1の任意値は不可) | ⚠️ 非常に高い |
top_p |
非推奨または無効 | ⚠️ 高い |
presence_penalty |
非対応 | ⚠️ 高い |
frequency_penalty |
非対応 | ⚠️ 高い |
logprobs / top_logprobs
|
非対応 | △ 中程度 |
logit_bias |
非対応の可能性 | △ 低〜中程度 |
max_tokens |
非推奨(代わりに max_output_tokens を使用) |
⚠️ 非常に高い |
✅ GPT-5で新たに追加されたパラメータ
| パラメータ名 | 用途 | 重要度 |
|---|---|---|
max_output_tokens |
出力トークン数の上限設定 | ⚠️ 必須 |
reasoning_effort |
推論の深度を制御(minimal/low/medium/high) | ⭐ 推奨 |
verbosity |
説明の詳細度を制御(low/medium/high) | ⭐ 推奨 |
なぜこれらの変更が行われたのか?
GPT-5、特にreasoningモデルは、従来のモデルとは根本的に異なる「推論プロセス」を持っています。そのため、従来の生成制御パラメータ(temperatureやpenalty系)が意味をなさなくなったのです。
2. パラメータ比較表:旧モデル vs GPT-5
実務で使いやすいように、詳細な比較表を用意しました。
| パラメータ名 | 旧モデル(GPT-4.1系) | GPT-5の挙動 | 具体的な対応 |
|---|---|---|---|
| temperature | 0〜1の任意値(例: 0.3, 0.7)が指定可能 | 1のみ。それ以外はエラー | パラメータを削除、または 1 に固定 |
| top_p | nucleus samplingで生成制御 | 非対応または効果なし | パラメータを削除 |
| presence_penalty | 新規語彙を増やす補正 | 非対応(エラーの可能性) | パラメータを削除 |
| frequency_penalty | 繰り返し防止 | 非対応(エラーの可能性) | パラメータを削除 |
| logprobs / top_logprobs | トークン確率の取得 | 非対応 | デバッグ用途は別手段を検討 |
| logit_bias | 特定トークンの出現確率調整 | 非対応の可能性 | パラメータを削除 |
| max_tokens | 出力量の上限 | 非推奨。incomplete応答の原因に |
max_output_tokens に置き換え |
| max_output_tokens | (新パラメータ) | GPT-5で正式サポート | 必須パラメータとして設定 |
| reasoning_effort | (存在しない) | 推論の深度を制御 | minimal/low/medium/highから選択 |
| verbosity | (存在しない) | 説明の詳細度を制御 | low/medium/highから選択 |
3. 各パラメータの詳細解説とコード例
3-1. temperature(最重要⚠️)
GPT-4系での使い方(旧)
# GPT-4系では、temperatureで生成のランダム性を調整できた
response = openai.ChatCompletion.create(
model="gpt-4-turbo",
messages=[{"role": "user", "content": "Pythonで素数判定"}],
temperature=0.3 # 低い値で安定した出力
)
GPT-5での正しい使い方(新)
# GPT-5では temperature=1 のみサポート
response = openai.ChatCompletion.create(
model="gpt-5", # 実在するモデル名: gpt-5, gpt-5-mini, gpt-5-nano
messages=[{"role": "user", "content": "Pythonで素数判定"}],
# temperature パラメータは指定しない(デフォルト=1)
# または明示的に temperature=1
)
❌ やってはいけないこと
# これはエラーになる!
response = openai.ChatCompletion.create(
model="gpt-5",
messages=[...],
temperature=0.3 # ❌ GPT-5では1以外はエラー
)
移行のポイント
- RAGシステムやエージェントで
temperature=0.1〜0.3を使っていた場合は、全て削除する - 出力の安定性が必要な場合は、プロンプトで制御する(例:「簡潔に答えてください」)
- または
reasoning_effortパラメータで推論の質を調整する
3-2. max_tokens → max_output_tokens(必須変更⚠️)
問題:max_tokens を使うと何が起きるか
GPT-5で max_tokens をそのまま使うと、以下のような問題が発生します:
# ❌ 旧パラメータを使うと...
response = openai.ChatCompletion.create(
model="gpt-5",
messages=[...],
max_tokens=1000 # ❌ 非推奨
)
# 結果: status="incomplete" で途中終了する可能性が高い
print(response.choices[0].finish_reason) # "incomplete"
✅ 正しい方法
# ✅ GPT-5では max_output_tokens を使う
response = openai.ChatCompletion.create(
model="gpt-5",
messages=[...],
max_output_tokens=1000 # ✅ 正式対応パラメータ
)
コード移行の自動化
大量のコードベースで置換が必要な場合:
# sedコマンドで一括置換(バックアップ推奨)
find . -name "*.py" -exec sed -i '' 's/max_tokens=/max_output_tokens=/g' {} +
3-3. penalty系パラメータ(削除推奨)
GPT-4系での使い方(旧)
# GPT-4系では、繰り返しや新規語彙を制御できた
response = openai.ChatCompletion.create(
model="gpt-4-turbo",
messages=[...],
presence_penalty=0.6, # 新しいトピックを促す
frequency_penalty=0.5 # 繰り返しを抑制
)
GPT-5での対応(新)
# ✅ パラメータは削除し、プロンプトで制御
response = openai.ChatCompletion.create(
model="gpt-5",
messages=[
{"role": "system", "content": "多様な表現を使い、同じフレーズの繰り返しを避けてください"},
{"role": "user", "content": "..."}
]
# presence_penalty, frequency_penalty は指定しない
)
プロンプトでの代替例
| 旧パラメータ | 目的 | プロンプトでの代替例 |
|---|---|---|
presence_penalty=0.6 |
新しいトピックを促す | 「多様なトピックについて述べてください」 |
frequency_penalty=0.5 |
繰り返し抑制 | 「同じ表現の繰り返しを避け、バリエーションを持たせてください」 |
3-4. GPT-5の新パラメータ:reasoning_effort
reasoning_effortとは?
GPT-5の「思考の深さ」を制御する新パラメータです。
| 値 | 特徴 | 推奨用途 | コスト | 速度 |
|---|---|---|---|---|
minimal |
最小限の推論 | 簡単な質問応答、チャット | 低 | 高速 |
low |
軽い推論 | 一般的なタスク | 中 | 普通 |
medium |
標準的な推論 | 複雑な文章生成 | 中〜高 | やや遅い |
high |
深い推論 | コード解析、数学問題、論理的推論 | 高 | 遅い |
実装例
# 簡単な質問応答:minimal
response = openai.ChatCompletion.create(
model="gpt-5",
messages=[{"role": "user", "content": "Pythonのバージョン確認コマンドは?"}],
reasoning_effort="minimal" # 高速・低コスト
)
# 複雑なコード設計レビュー:high
response = openai.ChatCompletion.create(
model="gpt-5",
messages=[{"role": "user", "content": "このアーキテクチャの問題点を指摘してください"}],
reasoning_effort="high" # 深い推論
)
使い分けのベストプラクティス
def get_reasoning_effort(task_type):
"""タスクタイプに応じた推論レベルを返す"""
mapping = {
"chat": "minimal",
"translation": "low",
"article_generation": "medium",
"code_review": "high",
"math_problem": "high",
"security_audit": "high"
}
return mapping.get(task_type, "medium")
# 使用例
task = "code_review"
response = openai.ChatCompletion.create(
model="gpt-5",
messages=[...],
reasoning_effort=get_reasoning_effort(task)
)
3-5. GPT-5の新パラメータ:verbosity
verbosityとは?
出力の「詳細度」を制御するパラメータです。
| 値 | 特徴 | 推奨用途 |
|---|---|---|
low |
簡潔な出力 | CLI出力、通知メッセージ、要約 |
medium |
標準的な説明 | 一般的な文章生成 |
high |
詳細で丁寧な説明 | チュートリアル、技術文書、レポート |
実装例
# 簡潔な要約が欲しい場合
response = openai.ChatCompletion.create(
model="gpt-5",
messages=[{"role": "user", "content": "機械学習とは?"}],
verbosity="low" # 簡潔な回答
)
# 詳細なチュートリアルが欲しい場合
response = openai.ChatCompletion.create(
model="gpt-5",
messages=[{"role": "user", "content": "Dockerの使い方を教えて"}],
verbosity="high" # 詳細で丁寧な説明
)
実際の出力比較例
プロンプト:「Gitのブランチとは?」
# verbosity="low"
# 出力: 「Gitのブランチは、開発ラインを分岐させる機能です。」
# verbosity="medium"
# 出力: 「Gitのブランチは、独立した開発ラインを作成する機能です。
# mainブランチから分岐して新機能を開発し、完成後にマージします。」
# verbosity="high"
# 出力: 「Gitのブランチは、バージョン管理において独立した開発ラインを作成するための機能です。
# たとえば、mainブランチで安定版を管理しながら、feature/新機能という
# ブランチで新しい機能を開発できます。開発が完了したら、プルリクエストを
# 作成してmainにマージします。これにより...(以下詳細な説明が続く)」
4. incomplete レスポンスへの対処法
問題:status: "incomplete" とは?
GPT-5では、出力が途中で止まった際に以下のようなレスポンスが返ってきます:
response = openai.ChatCompletion.create(
model="gpt-5",
messages=[...],
max_output_tokens=100 # 少なめの設定
)
print(response.choices[0].message)
# {
# "content": "プログラムの設計において重要なのは...",
# "status": "incomplete" # ← 途中で止まった!
# }
incomplete が発生しやすい状況
- max_output_tokens が少なすぎる
- reasoning_effort="high" で推論コストが高い
- バッチ処理で大量生成している
- 長文の続きを生成しようとしている
解決策1:再実行ロジックの実装
def generate_with_retry(messages, max_retries=3):
"""incomplete対応の生成関数"""
full_content = ""
current_messages = messages.copy()
for attempt in range(max_retries):
response = openai.ChatCompletion.create(
model="gpt-5",
messages=current_messages,
max_output_tokens=2000
)
content = response.choices[0].message.content
full_content += content
# 完了したら返す
if response.choices[0].message.get("status") != "incomplete":
return full_content
# incomplete の場合、続きを生成
current_messages.append({"role": "assistant", "content": content})
current_messages.append({"role": "user", "content": "続きをお願いします"})
return full_content
# 使用例
result = generate_with_retry([
{"role": "user", "content": "AIの歴史について3000字で"}
])
解決策2:max_output_tokensの適切な設定
# ❌ 小さすぎる設定
max_output_tokens=100 # 途中で止まりやすい
# ✅ 余裕を持った設定
max_output_tokens=4000 # 長文生成でも安心
# ✅ タスクに応じた動的設定
def calculate_max_tokens(task_type):
"""タスクに応じた適切なトークン数を返す"""
mapping = {
"summary": 500,
"chat": 1000,
"article": 3000,
"report": 5000,
"code_generation": 2000
}
return mapping.get(task_type, 2000)
解決策3:タスク分割
def generate_long_article(topic, sections):
"""長文記事を sections に分けて生成"""
results = []
for section in sections:
response = openai.ChatCompletion.create(
model="gpt-5",
messages=[
{"role": "user", "content": f"{topic}について、{section}のセクションを書いてください"}
],
max_output_tokens=1500 # セクションごとに適切な長さ
)
results.append(response.choices[0].message.content)
return "\n\n".join(results)
# 使用例
article = generate_long_article(
"機械学習入門",
["概要", "基本的なアルゴリズム", "実装例", "まとめ"]
)
5. 実践:安全な移行手順
ステップ1:既存コードの洗い出し
まず、GPT-5で問題となるパラメータを使っている箇所を特定します。
# temperature の使用箇所を検索
grep -rn "temperature" . --include="*.py"
# max_tokens の使用箇所を検索
grep -rn "max_tokens" . --include="*.py"
# penalty系の使用箇所を検索
grep -rn "presence_penalty\|frequency_penalty" . --include="*.py"
ステップ2:移行対応表の作成
| ファイル名 | 行番号 | 旧パラメータ | 新パラメータ | 対応状況 |
|---|---|---|---|---|
chat.py |
45 | temperature=0.3 |
削除 | ✅ |
generate.py |
78 | max_tokens=1000 |
max_output_tokens=1000 |
✅ |
agent.py |
120 | frequency_penalty=0.5 |
削除(プロンプト修正) | ✅ |
ステップ3:サンプルコードでの移行例
Before(GPT-4系)
def generate_response(user_message):
response = openai.ChatCompletion.create(
model="gpt-4-turbo",
messages=[
{"role": "system", "content": "あなたは親切なアシスタントです"},
{"role": "user", "content": user_message}
],
temperature=0.3,
max_tokens=1000,
presence_penalty=0.6,
frequency_penalty=0.5,
top_p=0.9
)
return response.choices[0].message.content
After(GPT-5)
def generate_response(user_message, task_type="chat"):
# reasoning_effortを動的に設定
effort = {
"chat": "minimal",
"analysis": "medium",
"coding": "high"
}.get(task_type, "medium")
response = openai.ChatCompletion.create(
model="gpt-5",
messages=[
{
"role": "system",
"content": "あなたは親切なアシスタントです。多様な表現を使い、繰り返しを避けてください"
},
{"role": "user", "content": user_message}
],
# temperature, top_p, penalty系は削除
max_output_tokens=1500, # max_tokensから変更
reasoning_effort=effort, # 新パラメータ
verbosity="medium" # 新パラメータ
)
# incomplete 対応
if response.choices[0].message.get("status") == "incomplete":
# 再実行ロジック(省略)
pass
return response.choices[0].message.content
ステップ4:段階的なロールアウト
# 環境変数でモデルを切り替えられるようにする
import os
MODEL_NAME = os.getenv("OPENAI_MODEL", "gpt-4-turbo")
def get_completion_params(model_name, user_message):
"""モデルに応じたパラメータを返す"""
base_params = {
"messages": [
{"role": "user", "content": user_message}
]
}
if model_name.startswith("gpt-5"):
# GPT-5用のパラメータ
return {
base_params,
"model": model_name,
"max_output_tokens": 2000,
"reasoning_effort": "medium",
"verbosity": "medium"
}
else:
# GPT-4系のパラメータ
return {
base_params,
"model": model_name,
"temperature": 0.7,
"max_tokens": 2000
}
# 使用例
params = get_completion_params(MODEL_NAME, "Pythonで素数判定")
response = openai.ChatCompletion.create(params)
ステップ5:本番環境での監視
import logging
from datetime import datetime
def generate_with_monitoring(messages, kwargs):
"""監視ログ付きの生成関数"""
start_time = datetime.now()
try:
response = openai.ChatCompletion.create(
messages=messages,
kwargs
)
# メトリクス記録
duration = (datetime.now() - start_time).total_seconds()
status = response.choices[0].message.get("status", "complete")
logging.info({
"duration": duration,
"status": status,
"model": kwargs.get("model"),
"reasoning_effort": kwargs.get("reasoning_effort"),
"tokens_used": response.usage.total_tokens
})
return response
except Exception as e:
logging.error(f"API Error: {e}")
raise
6. 移行チェックリスト
実際の移行作業で使えるチェックリストです。
📋 移行前の確認
- 既存コードで使用しているパラメータをリストアップした
-
temperature,top_p,penalty系,max_tokensの使用箇所を特定した - 移行対象のAPIエンドポイントを洗い出した
- テスト環境でGPT-5 APIにアクセスできることを確認した
📋 コード修正
-
temperatureパラメータを削除(または1に固定)した -
max_tokensをmax_output_tokensに置き換えた -
presence_penalty,frequency_penaltyを削除した -
top_pを削除した -
logprobs,logit_biasを削除した -
reasoning_effortを適切に設定した -
verbosityを適切に設定した
📋 エラーハンドリング
-
status: "incomplete"の検知ロジックを実装した - 再実行(retry)ロジックを実装した
- タイムアウト処理を見直した
- エラーログを適切に記録するようにした
📋 テスト
- 単体テストを実行し、全てパスした
- 統合テストを実行し、全てパスした
- 実際のユースケースで動作確認した
- 出力品質が許容範囲内であることを確認した
- レスポンス時間が許容範囲内であることを確認した
📋 本番移行
- カナリアリリース(一部ユーザーのみ)でテストした
- モニタリングダッシュボードを設定した
- コストとレイテンシの監視を開始した
- ロールバック手順を確認した
- 全ユーザーへロールアウトした
📋 移行後の最適化
-
reasoning_effortの最適値を調整した -
verbosityの最適値を調整した -
max_output_tokensの最適値を調整した - コストとパフォーマンスのバランスを確認した
- ユーザーフィードバックを収集・反映した
まとめ:GPT-5移行の3つの重要ポイント
GPT-5への移行は「単なるモデル変更」ではなく、APIパラメータ仕様の大幅な刷新です。
✅ 移行で絶対に押さえるべき3つのポイント
-
temperatureは1のみ。旧来の0〜1の任意値は全て削除- RAGやエージェントで
temperature=0.3を使っていた場合は要注意 - 出力の安定性はプロンプト設計で担保する
- RAGやエージェントで
-
max_tokensは非推奨。必ずmax_output_tokensに移行- そのままだと
status: "incomplete"が頻発する - 再実行ロジックの実装も検討する
- そのままだと
-
GPT-5の新パラメータ(
reasoning_effort/verbosity)を活用- タスクに応じて推論の深さと出力の詳細度を調整
- コスト・速度・品質のバランスを最適化できる