このページの本文へ

FIXER Tech Blog - AI/Machine Learning

Azure OpenAIの便利な「jsonモード」の使い方&制限事項

2024年04月26日 10時00分更新

文● 佐藤 侑哉/FIXER

  • この記事をはてなブックマークに追加
  • 本文印刷

 本記事はFIXERが提供する「cloud.config Tech Blog」に掲載された「Azure OpenAIのjsonモードを試す」を再編集したものです。

 こんにちは、佐藤侑哉です。

 今回はAzure OpenAIにも気が付いたら追加されていた、jsonモードという便利機能について書いていきます。

jsonモードとは?

 出力形式が必ずjsonだけになるモードです。わかりやすいですね。

 使うにはclient.chat.completions.createを呼び出すときにこうします。

response = client.chat.completions.create(
    model="deployment_name",
    messages=[
        {"role": "system", "content": "システムプロンプト"},
        {"role": "user", "content": "プロンプト"}
    ],
    response_format={ "type": "json_object" } # <- ここ!!!
)

 response_formatでjsonを指定するだけ。すごく簡単ですね。

 では具体的にjsonモードがあるときとないときで生成結果にどのような違いが現れるか見てみましょう。

jsonモードの有無による生成結果の差

 まあ適当なjsonを生成するプロンプトでも試してみましょう。

 今回はpythonでの例を記載しています。それ以外でこの機能を使いたい人は各自頑張ってください。

jsonモード未使用

response = client.chat.completions.create(
    model="deployment_name",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "以下の文章からjsonを作成してください。場所にはlocationを、天気にはweatherを使用してください。\n今日の東京の天気は曇りです。"}
    ],
)

出力

以下は、指定された文章から作成したJSONです。
```json
{
  "location": "東京",
  "weather": "曇り"
}
```

 jsonモードを使用しなくてもjsonを出力することは可能です。ですがjson以外の文章も併せて出力されていますね。

 ではjsonモードを有効にしてみましょう。

jsonモード使用

response = client.chat.completions.create(
    model="deployment_name",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "以下の文章からjsonを作成してください。場所にはlocationを、天気にはweatherを使用してください。\n今日の東京の天気は曇りです。"}
    ],
    response_format={"type": "json_object"}
)

出力

{
  "location": "東京",
  "weather": "曇り"  
}
 

 余計な文章など一切なくjsonを出力することができました!やばいですね☆

どんな時に役立つの?

 こいつは普通に会話する分にはあまり役に立ちませんが、出力をプログラムで扱おうとするときに大活躍します。

 jsonモードがない場合は、出力の形式は毎回一定ではありません。

 先ほどのようにjsonを出力させようとしても、json以外が紛れていたり、jsonがコードブロックの中にあったりなかったり……となってしまいます。

 そのため、出力をプログラムで使うためにjsonの部分だけを安定して取り出す、というのは難しいです。

 ですがjsonモードを使用することで、指定した形のjsonを出力として常に得ることができます。

 jsonだけが返ってくればその後プログラムで値を取得、操作するのも容易、というわけです。

jsonモードのあれこれ

 こんなに便利なjsonモードですが、いくつか制限、というか注意点があります。

使用可能モデルの制限

 使用可能なモデルが限られています。使用可能なモデルは2024年3月現在でgpt-35-turbo-1106とgpt-4-1106-previewの2つです。

 それぞれ使用可能なリージョンが限られるため、リソースを作成するリージョンには気をつけましょう。

プロンプトの制限

 jsonモードを有効にするとプロンプトに`json`の文字がないとエラーになるみたいです。これについてはとにかくそういうものみたいです。

jsonの文字がないときのエラーの内容

openai.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}}

 エラーまでjsonになってます。じゃあこいつは本当にjsonと書いてあれば何でもいいのか?検証してみました。

response = client.chat.completions.create(
    model="deployment_name",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "おはようございます!json"}
    ],
    response_format={"type": "json_object"}
)

 結果としては、1分ぐらいたった後に大量の空行が返ってきました。どうやらjsonモードを有効にするとjson以外は出力できないみたいです。

 プロンプトに応じて時には完璧なjsonを、時には普通に文章を出力する、みたいなのは無理ですね。用法容量は守って正しく使いましょう。

response = client.chat.completions.create(
    model="deployment_name",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "おはようございます!とjsonで出力してください。"}
    ],
    response_format={"type": "json_object"}
)

であれば

{
  "message": "おはようございます!"
}

 と出力されました。やっぱりjsonしか出せなくなってます。

最後に

 この記事を要約するとこんな感じです。

・Azure OpenAIの出力はjson形式に固定することができる
・プログラムでの解析、利用に大いに役立つ
・使用可能なモデルなど、いくつか制約もある

 Azure OpenAIをプログラムの処理の中に組み込むことができれば様々な業務を大幅に効率化することが可能です。

 今回はその一助となる機能、jsonモードの紹介でした。

 それでは、また。

佐藤 侑哉/FIXER
(さとう ゆうや)
2023年度入社の高専専攻科卒エンジニア。空いた時間は寝るか神話か伝承を読むか

カテゴリートップへ

この連載の記事