PythonでGPT-4o-miniをサクッと使ってみた [Azure OpenAI]

個人開発でLLMを使うことになったので、すこし触ってみました。ハマりポイントがいくつかあったので、それも含めて使い方をまとめていきます。

Azure OpenAIやGPT-4o-miniに関する説明は、ここでは省略させていただきます。

## 1. リソースの作成

Azure Portalから「Azure OpenAI」を選択して新しいリソースを作ります。（このとき「Azure AI Service」という似た名前のサービスも表示されたり、別のページでは表記揺れ(?)で「Azure OpenAI Service」と呼ばれたりしていたので少しややこしかった）

![2024-10-21_11h34_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1272414/7f2f5cb6-6e5d-95f5-932c-d098844b08fe.png)

設定項目は

- インスタンスの詳細
    - リージョン：East US（リージョンによっては使えないモデルがあったりするので、[調べておいたほうが良い](https://azure.microsoft.com/ja-jp/pricing/details/cognitive-services/openai-service/)）
    - 名前：（好きな名前を）
    - 価格レベル：Standart S0（これしか無い）
- ネットワーク
    - 「インターネットを含むすべてのネットワークがこのリソースにアクセスできます。」を選択

## 2. モデルのデプロイと必要情報の収集

リソースの管理画面から「Azure OpenAI Studioに移動する」をクリックして、管理画面を開きます。続いて、

1. 「共有リソース」から「デプロイ」をクリック
1. 「モデルのデプロイ」→「基本モデルをデプロイする」をクリック
1. 使いたい言語モデル（今回はgpt-4o-mini）を選ぶ
1. デプロイ設定を入力する
    1. デプロイ名：今回は`gpt-4o-mini-test`とします。あとで必要なのでメモしておく。
    1. デプロイの種類：グローバル標準
    1. モデルバージョン：2024-07-18（既定）
    1. 1分あたりのトークン数レート制限：10K
    1. コンテンツフィルター：DefaultV2

![2024-10-21_13h36_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1272414/899174ff-23cf-6d38-06d7-27239887a817.png)

次に、Pythonからアクセスするために必要な情報を集めます。

- APIキー：`******************************`
    - 「エンドポイント」の「キー」を使います
- APIバージョン：`2024-08-01-preview`
    - 「エンドポイント」の「ターゲットURL」に含まれる`?api_version=`の部分を使います。モデルバージョンとは異なるようです
- Azureエンドポイント：`https://{リソース名}.openai.azure.com/`
    - 「エンドポイント」の「ターゲットURL」からドメイン名の部分を使います。それ以降のURLを含めると404エラーが出るようです
    - リソース名がエンドポイントURLに含まれるわけだから、この名前はランダムな文字列を含むほうが良かったりする…？
- デプロイ名：`gpt-4o-mini-test`
    - 「配置情報」の「名前」を使います

![2024-10-21_13h43_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1272414/39f501a6-c0b9-837c-2ba5-9d11208db6e2.png)

## 3. Pythonコードの作成

必要なライブラリをインストールして、

```sh
python -m pip install openai==1.52.0
```

最低限のコードを書きます。
APIキーなどを直書きするのは良くないので、そこは要修正です。

```py
from openai import AzureOpenAI

client = AzureOpenAI(
    api_version="APIバージョン",
    api_key="APIキー",
    azure_endpoint="https://{リソース名}.openai.azure.com/",
)

response = client.chat.completions.create(
    model="デプロイ名",
    messages=[
        {"role": "user", "content": "Microsoft Azureについて教えてください。"},
    ],
)

# レスポンス
print(response.choices[0].message.content)

print("---------------------------------------------------------")
print(f"処理時間: {time.time() - started_time:.2f} sec")

# 使用トークン数
print(f"プロンプトトークン数: {response.usage.prompt_tokens}")
print(f"完了トークン数: {response.usage.completion_tokens}")
print(f"合計トークン数: {response.usage.total_tokens}")

# 各応答に割り当てられる一意の識別子
print(f"ID: {response.id}")

# 使用されたGPTモデルの名称
print(f"モデル: {response.model}")

# 作成時刻（UNIXタイムスタンプ）
print(f"作成時刻: {response.created}")

# 応答生成が終了した理由（例：'stop'は正常終了）
print(f"終了理由: {response.choices[0].finish_reason}")

# コンテンツフィルター結果（hate, self_harm, sexual, violence）
for category, result in response.choices[0].content_filter_results.items():
    print(f"コンテンツフィルター {category}： {result}")

# プロンプトフィルター結果（hate, self_harm, sexual, violence）
for result in response.prompt_filter_results:
    print(f"プロンプトフィルター結果: {result}")

```

## 4. 実行結果

しばらく待つと、以下のテキストが生成されました。

- 実行時間：4.8秒ほど
- 入力文字数：27文字
- プロンプトトークン数：14
- 出力文字数：1,219文字
- 完了トークン数：705

ブラウザ版のChatGPT(無課金)が32秒、Claude 3 Haiku(課金)が6秒ほどで回答してくれたので、それなりに早いと判断できるのかなと思います。

生成されたテキスト ↓
```md
Microsoft Azure（アジュール）は、Microsoftが提供するクラウドコンピューティングプラットフォームで、さまざまなクラウドサービス
を提供しています。企業や開発者がアプリケーションを構築、デプロイ、管理するための環境を提供し、オンプレミスのインフラストラク
チャに依存せずにスケーラブルで柔軟なリソースを利用できます。

### 主な機能とサービス

1. **コンピューティングサービス**:
   - **Azure Virtual Machines**: 任意のOS上でサーバーを仮想的に展開。
   - **Azure App Service**: WebアプリケーションやRESTful APIのホスティング。

2. **ストレージ**:
   - **Azure Blob Storage**: オブジェクトストレージサービス。
   - **Azure File Storage**: ファイル共有用のクラウドストレージ。

3. **データベース**:
   - **Azure SQL Database**: 完全マネージド型のデータベースサービス。
   - **Cosmos DB**: グローバル分散型のマルチモデルデータベース。

4. **ネットワーク**:
   - **Azure Virtual Network**: プライベートネットワークを構築。
   - **Azure CDN（Content Delivery Network）**: コンテンツ配信の最適化。

5. **AIと機械学習**:
   - **Azure Machine Learning**: 機械学習モデルの構築とデプロイをサポート。
   - **Cognitive Services**: 会話、視覚、感情分析などのAI機能を提供。

6. **IoT（モノのインターネット）**:
   - **Azure IoT Hub**: IoTデバイスの管理とデータ収集。

7. **セキュリティとアイデンティティ管理**:
   - **Azure Active Directory**: シングルサインオンおよび多要素認証を提供。
   - **Azure Security Center**: セキュリティの評価と改善を支援。

### 利点

- **スケーラビリティ**: ビジネスの成長に合わせてリソースを拡張可能。
- **コスト効率**: 使用したリソースに応じて料金が発生する従量課金制。
- **信頼性**: 多くのデータセンターが世界中にあり、高い可用性を提供。
- **柔軟性**: 多様なプログラミング言語やフレームワークに対応。

### 用途

- アプリケーション開発とホスティング
- データ分析
- 時間のかかるバッチ処理
- ゲーム開発
- 存在するインフラの拡張や移行

このように、Azureは多くのサービスと機能を提供しており、企業や個人が迅速にMTT (Minimum Time to Market) を達成できる環境を整え 
ています。
```

見慣れたマークダウン記法で生成してくれました。

## まとめ

Azure OpenAIのGPT-4o-miniを使ってみました。Pythonから呼び出せるのは便利でいいですね。GPT-4o-miniがずば抜けて安いので、とりあえずこれを選んでおけば良さそう。

今回は特にやりませんでしたが、運用段階ではAPIキーを環境変数に保存するなどの対策が必要になります。ネットワークのアクセス制限やトークンのレート制限もやっておきたいところ。また、レスポンスから消費トークン数が分かるので、アプリケーション側で上手く把握すれば使いすぎを抑えられそうです。

### 追記

実行用のコードは「プレイグラウンド」の「チャット」から「コードの表示」をクリックすると最低限のものを用意してくれています。わざわざ書かなくても良かったっぽい。

### 参考にした記事など

[“Azure OpenAI”で始めるPythonプログラミング【LLMことはじめ Vol.1】](https://www.chowagiken.co.jp/blog/llm-python-programming)

[Azure OpenAI Service の価格｜Microsoft Azure](https://azure.microsoft.com/ja-jp/pricing/details/cognitive-services/openai-service/)