Azure OpenAIのjsonモードを試す
2024-03-29
azblob://2024/03/29/eyecatch/2024-03-29-openai-json-mode-000_0.jpg
こんにちは。気が付いたら新卒1年目最後の労働日になってしまった佐藤侑哉です。
今回はAzure OpenAIにも気が付いたら追加されていた、jsonモードという便利機能について書いていきます。

jsonモードとは?

出力形式が必ずjsonだけになるモードです。わかりやすいですね。
使うにはclient.chat.completions.createを呼び出すときにこうします。
 
Pythonresponse = 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モード未使用
Pythonresponse = 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モード使用
Pythonresponse = 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と書いてあれば何でもいいのか?検証してみました。
Pythonresponse = 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を、時には普通に文章を出力する、みたいなのは無理ですね。
用法容量は守って正しく使いましょう。
Pythonresponse = 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モードの紹介でした。
それでは、また。