JSON モードを使用する方法について説明します

JSON モードでは、モデルの応答形式を設定して、チャット完了の一部として有効な JSON オブジェクトを返すことができます。 以前は有効な JSON を生成できましたが、応答の整合性に問題があり、無効な JSON オブジェクトが生成される可能性があります。

JSON モードでは有効な JSON 出力が保証されますが、出力が特定のスキーマと一致することは保証されません。 スキーマの保証が必要な場合は、構造化出力を使用します。

メモ

JSON モードは引き続きサポートされていますが、可能な場合は 構造化出力を使用することをお勧めします。 JSON モードの構造化出力と同様に、有効な JSON が生成されますが、特定の JSON スキーマを使用するようにモデルを制約できるという利点があります。

メモ

現在、構造化された出力は、 独自のデータの持ち込み シナリオではサポートされていません。

JSON モードのサポート

JSON モードは現在、次のモデルでのみサポートされています。

API のサポート

API バージョン 2023-12-01-preview で JSON モードのサポートが最初に追加されました

例を実行する前に、次の手順を実行します。

  • YOUR-RESOURCE-NAME を Azure OpenAI リソース名に置き換えます。
  • YOUR-MODEL_DEPLOYMENT_NAMEをモデル デプロイの名前に置き換えます。

次の例は、Python SDK と .NET SDK を使用した JSON モードと、REST の直接対話のための PowerShell を示しています。

import os
from openai import OpenAI

client = OpenAI(
  base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
  api_key=os.getenv("AZURE_OPENAI_API_KEY")
)

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 つの要件を満たす必要があります。

  • 応答形式を要求で json_object に設定します。 Pythonでは、.NETで response_format={ "type": "json_object" }; を渡し、PowerShell で ChatResponseFormat.CreateJsonObjectFormat(); を使用し、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}}

その他の考慮事項

応答を解析する前に、finish_reasonlength値を確認する必要があります。 モデルによって部分的な JSON が生成される場合があります。 つまり、モデルからの出力が、要求の一部として設定された使用可能なmax_tokensよりも大きかったか、会話自体がトークンの制限を超えています。

JSON モードでは、有効な JSON が生成され、エラーなしで解析されます。 ただし、プロンプトで要求された場合でも、出力が特定のスキーマと一致する保証はありません。

トラブルシューティング

  • finish_reasonlength場合は、max_tokens (またはプロンプトの長さを減らす) を増やして再試行します。 部分的な JSON は解析しないでください。
  • スキーマの保証が必要な場合は、 構造化出力に切り替えます。