本記事は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年度入社の高専専攻科卒エンジニア。空いた時間は寝るか神話か伝承を読むか


この連載の記事
-
TECH
仕訳を生成AIが自動で行うプロンプトを作ってみた -
TECH
学生向けの生成AI講義で人気があったプロンプト演習3つ(+α) -
TECH
ユースケースが見つけやすい! 便利な「Microsoft 365 Copilot 活用ベストプラクティス集」を入手しよう -
TECH
自治体業務でどう使う? 生成AIアイデアソンに自治体職員が挑戦 -
TECH
生成AIで360°パノラマ画像を作る! 最新研究でやってみた -
TECH
RAGの精度を改善する現実的な方法4つ、AWS Summitで学んだ -
TECH
過去問から例題をAIで生成、データベーススペシャリスト試験に再挑戦 -
TECH
ウェビナーの構成・タイトル・告知、すべて生成AIに手伝ってもらった -
TECH
6種類のLLMに「ワンナイト人狼」をやらせてみた結果… -
TECH
システムエンジニア目線で見たプロンプトエンジニアリングのコツ -
TECH
アプリ開発、TypeScriptやCSSのコード作成もすべてGaiXerにお任せしてみた - この連載の一覧へ

