サイオステクノロジーのひろです。アドベントカレンダー16日目です。
この記事ではAzure OpenAI入門と題して、まずAzure OpenAIモデルのデプロイ方法、Pythonを使ってAPIを叩くまでの手順をまとめていきたいと思います。
まず、Azureポータルにログインし、リソース作成画面へ移動します。
検索窓でAzure OpanAIと検索し、表示されたAzure OpenAIリソースを選択して「作成」を押下しましょう。

作成を押下すると、リソース作成画面へ移動します。ここで必須項目を入力します。
・サブスクリプション:お使いのサブスクリプションを選択
・リソースグループ:任意のリソースグループを選択
・リージョン:利用したいリージョン(例:East US 2等)
・名前:リソース名を入力
・価格レベル:Standard S0を選択

必要な項目を入力したら、「作成」ボタンを押下します。
しばらく待つとリソース作成完了です。
リソース作成が完了したら、作成したリソース画面へ遷移します。
検索欄の右横にある「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エラーが返されます。
動的クォータがオンであれば、一時的に上限が増え、レスポンスが返る可能性があります。
上限を超えた追加のクォータ分は課金対象なので注意が必要です。

必要な項目をすべて選択して右下の青い「デプロイ」ボタンを押下するとモデルデプロイ完了です。
作成後、チャットプレイグラウンドへ移動し、チャットを送信して回答が返ってくることを確認してみましょう。

「こんにちは」と入力すると自然な文章を返してくれることが確認できました。
プログラムからこのモデルを利用してみましょう。
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

