Azure OpenAI入門:モデルのデプロイとpythonからAPIを実行

はじめに

サイオステクノロジーのひろです。アドベントカレンダー16日目です。
この記事ではAzure OpenAI入門と題して、まずAzure OpenAIモデルのデプロイ方法、Pythonを使ってAPIを叩くまでの手順をまとめていきたいと思います。

この記事のゴール

Azure OpenAIモデルのデプロイ + pythonでAPIを叩く

Azure OpenAIリソースの作成

まず、Azureポータルにログインし、リソース作成画面へ移動します。

検索窓でAzure OpanAIと検索し、表示されたAzure OpenAIリソースを選択して「作成」を押下しましょう。

作成を押下すると、リソース作成画面へ移動します。ここで必須項目を入力します。

・サブスクリプション:お使いのサブスクリプションを選択
・リソースグループ:任意のリソースグループを選択
・リージョン:利用したいリージョン(例:East US 2等)
・名前:リソース名を入力
・価格レベル:Standard S0を選択

名前の入力

名前はテナント内だけでなく、Azure全体で一意である必要があります。
他のユーザがすでに使用している場合その名前は使用できないので注意が必要です。

必要な項目を入力したら、「作成」ボタンを押下します。
しばらく待つとリソース作成完了です。

Azure OpenAIモデルのデプロイ

リソース作成が完了したら、作成したリソース画面へ遷移します。

検索欄の右横にある「Go to Foundry portal」を押下してMicrosoft Foundry portalへ移動します。

Microsoft Foundry portal(旧Azure AI Foundry portal)が開いたら、左メニューの「デプロイ」を選択し、「モデルデプロイ」を選択します。

今回私は「基本モデルのデプロイ」を選択し、gpt-4o-miniを選択しました。

モデル毎に金額は異なりますので注意しましょう。
参考:https://azure.microsoft.com/ja-jp/pricing/details/cognitive-services/openai-service/


各項目について解説していきます。

1.デプロイの種別

デプロイの種別は「データ処理の地理的範囲」と「データ処理手法」の組み合わせで定義されています。

地理的範囲には、以下の3つの種類があります。

地理的範囲説明
グローバルAzureのグローバルインフラを活用し、ユーザのリクエストを世界中のデータセンターから最適な場所へルーティングし、データ処理。
データゾーンリージョンより広域な指定されたデータゾーンでデータ処理。グローバルとリージョンの中間の選択肢。
リージョンリソースを作成したリージョンでデータ処理。

地理的範囲は可用性と応答性に関わります。地理的範囲をグローバルにしておけば、特定のリージョンに不具合が起きてもそのほかのリージョンでデータが処理されるため、可用性が向上します。リージョンにすると、特定のリージョン内のみでデータが処理されるため、データの移動が制限される場合などに適しています。

データ処理手法には、標準(standard)、バッチ、プロビジョニング済みスループットの3つ種類があります。

データ処理手法説明
標準(standard)従量課金制。リクエスト毎にトークン単位で課金されます。
リアルタイムでデータ処理を行う。
バッチ非同期でデータを処理する割引モデル。
受け付けたデータを24時間以内に処理。
プロビジョニング済みスループット事前に支払いを行い、リソースを事前に確保できる。
スループット(処理能力)が保証される。

バッチではStandardより50%低コストで使用できるため、リアルタイム性が重視されない場合に使用したいですね。

今回は地理的範囲がリージョンのStandardを選択しました。

編集不能な項目

デプロイ名とデプロイの種類は後から編集することができないため慎重に設定しましょう。

2.1分あたりのトークン数レート制限

この項目ではAPI利用量の上限を定めることができます。

TPM (Tokens Per Minute)1分あたりに処理できるトークン数の上限
RPM (Requests Per Minute)1分あたりに送信できるリクエスト数の上限

トークンとは生成AIモデルがテキストを処理する最小単位で、プロンプトや回答の文字数等によって消費量が変動します。

モデルによっても異なりますが、日本語だと1文字1~2トークン程と言われています。

3.コンテンツフィルター

コンテンツフィルターは有害なコンテンツ(暴力、嫌悪、性的、自傷行為の4つのカテゴリに属するもの)を検出及びフィルタリングする機能です。デフォルトの設定を使用します。

4.動的クォータ

クォータとは割り当てという意味があり、今回の場合は先ほど設定したTPMの上限値のことです。

有効にすると、azure側に余剰リソースがある場合、設定したTPM上限を超えてリクエストを処理できるようになります。

TPM上限以上のトークン数を消費する場面で、動的クォータがオフであれば429エラーが返されます。
動的クォータがオンであれば、一時的に上限が増え、レスポンスが返る可能性があります。

上限を超えた追加のクォータ分は課金対象なので注意が必要です。

必要な項目をすべて選択して右下の青い「デプロイ」ボタンを押下するとモデルデプロイ完了です。

作成後、チャットプレイグラウンドへ移動し、チャットを送信して回答が返ってくることを確認してみましょう。

「こんにちは」と入力すると自然な文章を返してくれることが確認できました。

PythonでAPIを叩いてみよう

プログラムからこのモデルを利用してみましょう。

Microsoft Foundry portalのデプロイタブに移動すると、サンプルコードが用意されているので、今回はこちらを使用してAPIの呼び出しを行います。

言語はpython、Javascript、C#等が用意されています。今回はpythonを使用して実行します。デプロイ画面に記述されていますが、こちらにもサンプルコードを載せておきます。

まずOpenAIの公式ライブラリをインストールします。

pip install openai

以下がサンプルコードです。endpoint、model_name、deployment、apiキーといった項目はデプロイタブで確認できますのでご自身の環境に合わせて変更してください。

なお、api_versionについては、今回はサンプルコードに記載があった「2024-12-01-preview」をそのまま使用しています。

APIバージョンの選び方について

APIバージョンには安定版とPreviewが存在します。

安定版は文字通り安定したバージョンで、将来的な仕様の変更が起こらないため本番環境での使用が推奨されます。
Preview版は最新の機能を使うことができるため、新機能を試すのに最適です。

APIバージョンによっては、構造化出力等の新しい機能が使えない場合があるので、バージョン選択には注意が必要です。
構造化出力については次回以降解説します。

今回はサンプルコードを実行するだけなのでこのまま2024-12-01-previewを使用します。

安定版を使用したい場合、2024-10-21などに変更して実行してみてください。別のAPIバージョンを試したいという方は、以下のURL(Microsoft AzureのREST API仕様(GitHub))で確認できます。

参考:APIバージョン
プレビュー版の一覧(Microsoft AzureのREST API仕様)
安定版の一覧(Microsoft AzureのREST API仕様)

import os
from openai import AzureOpenAI

endpoint = "<your-endpoint>"
model_name = "<your-model_name>"
deployment = "<your-deployment>"

subscription_key = "<your-api-key>"
api_version = "2024-12-01-preview"

client = AzureOpenAI(
    api_version=api_version,
    azure_endpoint=endpoint,
    api_key=subscription_key,
)

response = client.chat.completions.create(
    messages=[
        {
            "role": "system",
            "content": "You are a helpful assistant.",
        },
        {
            "role": "user",
            "content": "I am going to Paris, what should I see?",
        }
    ],
    max_tokens=4096,
    temperature=1.0,
    top_p=1.0,
    model=deployment
)

print(response.choices[0].message.content)

コードを実行するとプロンプトとして送信されたメッセージの内容についてモデルから返答が行われます。

contentを日本語に翻訳して実行したところ以下のような回答が得られました。

まとめ

この記事ではAzure OpenAIモデルのデプロイ方法、Pythonを使ってAPIを叩くまでの手順をまとめました。
次回以降はAzure OpenAIを使用した構造化データ出力やfunctionCallingといった、より実践的な機能について解説していきます。

参考文献

https://learn.microsoft.com/en-us/azure/ai-foundry/openai/how-to/deployment-types#deployment-types

https://azure.microsoft.com/ja-jp/pricing/details/cognitive-services/openai-service/

https://learn.microsoft.com/ja-jp/azure/ai-foundry/what-is-azure-ai-foundry

https://learn.microsoft.com/ja-jp/azure/ai-foundry/openai/concepts/content-filter

https://learn.microsoft.com/ja-jp/azure/ai-foundry/openai/how-to/dynamic-quota?view=foundry-classic

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です