0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Azure OpenAI で JSON モードを試したメモ

Posted at

背景

OpenAI の JSON モードが Azure OpenAI でも利用できるので試してみる。
JSON モードは、チャットのレスポンスを JSON 形式で受け取れるようにするものでプログラムなどで扱いやすくなる

ドキュメント

以下公式ドキュメント
https://learn.microsoft.com/ja-jp/azure/ai-services/openai/how-to/json-mode?tabs=python

手順

  1. openai のライブラリをインストール
    • pip install openai
    • バージョンは 0.28.1 ではなく 1.x 以上
  2. sample.py など適当なファイルを作成してソースを貼り付ける(上記ドキュメントより)
    import os
    from openai import AzureOpenAI
    
    client = AzureOpenAI(
      azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), 
      api_key=os.getenv("AZURE_OPENAI_KEY"),  
      api_version="2023-12-01-preview"
    )
    
    response = client.chat.completions.create(
      model="gpt-4-1106-preview", # Model = should match the deployment name you chose for your 1106-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)
    
  3. エンドポイントや API キーを設定する。モデル名もはデプロイした名前に置き換える。
  4. プログラムを実行して結果を確認すると、JSON で応答されている
{
  "World_Series_Winner_2020": {
    "Team_Name": "Los Angeles Dodgers",
    "Victory_Over": "Tampa Bay Rays",
    "Series_Result": "Dodgers won 4-2"
  }
}

デフォルトのレスポンスフォーマット

response_format を指定せずシステムプロンプトの JSON 指定を外した場合、テキストで応答された

response = client.chat.completions.create(
    model="gpt-4-1106-preview",  # Model = should match the deployment name you chose for your 1106-preview model deployment
    messages=[
        {"role": "user", "content": "Who won the world series in 2020?"},
    ],
)
print(response.choices[0].message.content)
出力結果
The Los Angeles Dodgers won the World Series in 2020. They defeated the Tampa Bay Rays in six games to capture their first championship since 1988.

デフォルトのレスポンスフォーマットで、JSON で出力するよう指示

response = client.chat.completions.create(
    model="gpt-4-1106-preview",  # Model = should match the deployment name you chose for your 1106-preview model deployment
    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)

JSON で返されたが、Markdownで出力する形式で加工が難しくなる

出力結果
    ```json
    {
      "World_Series_Winner_2020": "Los Angeles Dodgers"
    }
    ```

JSON モードで指定するが、プロンプトで JSON に言及しない

response = client.chat.completions.create(
    model="gpt-4-1106-preview",  # Model = should match the deployment name you chose for your 1106-preview model deployment
    response_format={"type": "json_object"},
    messages=[
        {"role": "user", "content": "Who won the world series in 2020?"},
    ],
)
print(response.choices[0].message.content)

エラーとなる。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}}

まとめ

応答結果をプログラムで処理する際には便利そう
日本のリージョンではまだ利用できないので早く対応して欲しい

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?