JSON モードを使用する方法について説明します
JSON モードでは、チャット入力候補の一部として有効な JSON オブジェクトを返すようにモデルの応答形式を設定できます。 以前から有効な JSON を生成できましたが、応答の整合性に問題があり、無効な JSON オブジェクトが生成される可能性がありました。
Note
JSON モードは引き続きサポートされていますが、可能な場合は、構造化出力を使用することをお勧めします。 JSON モードと同様に構造化出力は、有効な JSON が生成されますが、特定の JSON スキーマを使用するようにモデルを制限できるという利点が加わります。
Note
現在、構造化された出力は、独自のデータを使用する (bring your own data) シナリオではサポートされていません。
JSON モードのサポート
現在、JSON モードは次のモデルの場合にのみサポートされています。
サポートされているモデル
gpt-35-turbo
(1106)gpt-35-turbo
(0125)gpt-4
(1106-Preview)gpt-4
(0125-Preview)gpt-4o
gpt-4o-mini
API のサポート
JSON モードのサポートは、API バージョン 2023-12-01-preview
で最初に追加されました
例
import os
from openai import AzureOpenAI
client = AzureOpenAI(
azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"),
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
api_version="2024-03-01-preview"
)
response = client.chat.completions.create(
model="YOUR-MODEL_DEPLOYMENT_NAME", # Model = should match the deployment name you chose for your model deployment
response_format={ "type": "json_object" },
messages=[
{"role": "system", "content": "You are a helpful assistant designed to output JSON."},
{"role": "user", "content": "Who won the world series in 2020?"}
]
)
print(response.choices[0].message.content)
出力
{
"winner": "Los Angeles Dodgers",
"event": "World Series",
"year": 2020
}
JSON モードを正常に使用するには、次の 2 つの重要な要因が存在する必要があります:
response_format={ "type": "json_object" }
- システム メッセージの一部として JSON を出力するようにモデルに伝えました。
メッセージ会話の一部として JSON を生成する必要があるというガイダンスをモデルに含めることが必要です。 命令は、システム メッセージの一部として追加することをお勧めします。 OpenAI によると、この命令の追加の失敗により、モデルによって "空白の無制限のストリームが生成され、要求がトークンの制限に達するまで継続的に実行される" 可能性があります。
メッセージ内に "JSON" を含めないと、以下が返されます。
出力
BadRequestError: Error code: 400 - {'error': {'message': "'messages' must contain the word 'json' in some form, to use 'response_format' of type 'json_object'.", 'type': 'invalid_request_error', 'param': 'messages', 'code': None}}
その他の考慮事項
応答を解析する前に、値 length
があるか finish_reason
を確認する必要があります。 このモデルから部分的な JSON が生成されることがあります。 つまり、モデルからの出力が、要求の一部として設定された使用可能な max_tokens よりも大きかったか、会話自体がトークンの制限を超えています。
JSON モードにより、有効な JSON が生成され、エラーなしで解析されます。 ただし、プロンプトで要求された場合でも、出力が特定のスキーマと一致する保証はありません。