個人開発でLLMを使うことになったので、すこし触ってみました。ハマりポイントがいくつかあったので、それも含めて使い方をまとめていきます。
Azure OpenAIやGPT-4o-miniに関する説明は、ここでは省略させていただきます。
1. リソースの作成
Azure Portalから「Azure OpenAI」を選択して新しいリソースを作ります。(このとき「Azure AI Service」という似た名前のサービスも表示されたり、別のページでは表記揺れ(?)で「Azure OpenAI Service」と呼ばれたりしていたので少しややこしかった)
設定項目は
- インスタンスの詳細
- リージョン:East US(リージョンによっては使えないモデルがあったりするので、調べておいたほうが良い)
- 名前:(好きな名前を)
- 価格レベル:Standart S0(これしか無い)
- ネットワーク
- 「インターネットを含むすべてのネットワークがこのリソースにアクセスできます。」を選択
2. モデルのデプロイと必要情報の収集
リソースの管理画面から「Azure OpenAI Studioに移動する」をクリックして、管理画面を開きます。続いて、
- 「共有リソース」から「デプロイ」をクリック
- 「モデルのデプロイ」→「基本モデルをデプロイする」をクリック
- 使いたい言語モデル(今回はgpt-4o-mini)を選ぶ
- デプロイ設定を入力する
- デプロイ名:今回は
gpt-4o-mini-test
とします。あとで必要なのでメモしておく。 - デプロイの種類:グローバル標準
- モデルバージョン:2024-07-18(既定)
- 1分あたりのトークン数レート制限:10K
- コンテンツフィルター:DefaultV2
- デプロイ名:今回は
次に、Pythonからアクセスするために必要な情報を集めます。
- APIキー:
******************************
- 「エンドポイント」の「キー」を使います
- APIバージョン:
2024-08-01-preview
- 「エンドポイント」の「ターゲットURL」に含まれる
?api_version=
の部分を使います。モデルバージョンとは異なるようです
- 「エンドポイント」の「ターゲットURL」に含まれる
- Azureエンドポイント:
https://{リソース名}.openai.azure.com/
- 「エンドポイント」の「ターゲットURL」からドメイン名の部分を使います。それ以降のURLを含めると404エラーが出るようです
- リソース名がエンドポイントURLに含まれるわけだから、この名前はランダムな文字列を含むほうが良かったりする…?
- デプロイ名:
gpt-4o-mini-test
- 「配置情報」の「名前」を使います
3. Pythonコードの作成
必要なライブラリをインストールして、
python -m pip install openai==1.52.0
最低限のコードを書きます。
APIキーなどを直書きするのは良くないので、そこは要修正です。
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秒ほどで回答してくれたので、それなりに早いと判断できるのかなと思います。
生成されたテキスト ↓
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キーを環境変数に保存するなどの対策が必要になります。ネットワークのアクセス制限やトークンのレート制限もやっておきたいところ。また、レスポンスから消費トークン数が分かるので、アプリケーション側で上手く把握すれば使いすぎを抑えられそうです。
追記
実行用のコードは「プレイグラウンド」の「チャット」から「コードの表示」をクリックすると最低限のものを用意してくれています。わざわざ書かなくても良かったっぽい。