本記事は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に感謝を伝えると回答精度が向上する? GaiXerで検証した -
TECH
生成AIアシスタントのAmazon QにS3のデータソースを連携する方法 -
TECH
LLMをローカルPCで動かし“話し相手”を作ってみた結果…… -
TECH
インスタグラムのエフェクトを「Meta Spark Studio」で自作してみた -
TECH
インスタエフェクト自作第二弾!“小顔デカ目効果”を作る -
TECH
RAGの基礎知識を得て“ゼロ円RAGシステム”を構築してみた -
TECH
Microsoft Fabricを触ってデータサイエンスに超入門してみた! -
TECH
LLM活用はチャットだけじゃない、自由記述文を共通フォーマットに落とし込む方法を学んだ -
TECH
Gemini 1.5 Proの特徴とは? Gemini API経由で試す -
TECH
生成AIのClaude 3に本格的なコーディングをさせるプロンプトを作った - この連載の一覧へ