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

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

JSON モードのサポート

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

サポートされているモデル

  • gpt-35-turbo (1106)
  • gpt-35-turbo (0125)
  • gpt-4 (1106-Preview)
  • gpt-4 (0125-Preview)

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="gpt-4-0125-Preview", # Model = should match the deployment name you chose for your 0125-Preview 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 が生成され、エラーなしで解析されます。 ただし、プロンプトで要求された場合でも、出力が特定のスキーマと一致する保証はありません。