Header image

クラッソーネの開発者がエンジニアリングに関することもそうでないことも綴っています!

Azure OpenAI Serviceを使う際にハマったこと

Azure OpenAI Serviceを使う際にハマったこと

こんにちは!
SREチームの宮原(@TakashiMiyahara)です🙋

クラッソーネでは、工事現場の安全をAI技術で支援しています。
本日は、開発・運用している工事現場の安全確認AIシステム(crassone vista)で利用している大規模言語モデル(LLM)について、最近行った技術プラットフォームの移行経験を共有したいと思います。具体的には、OpenAIのAPIから、Azure OpenAI ServiceのAPIへの乗り換えについてです。

乗り換えの経緯

OpenAIのAPIからAzure OpenAI ServiceのAPIへの移行を決定した最大の理由は、前者のレートリミットの厳しさにありました。
crassone vistaでは毎分カメラから画像を受け取り、AIによる判定を行っておりますが、gpt-4-vision-previewでは一日あたり500リクエストの制約があります。10現場で稼働すると、朝のうちにレートリミットに達してしまうため、乗り換えを決断しました。

Azure OpenAI Serviceへのアクセス申請

Azure OpenAI Serviceを利用するためには、アクセス申請が必要です。申請フォームには、AzureサブスクリプションID、メールアドレス、ユースケースなどを記入する必要があります。
https://customervoice.microsoft.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR7en2Ais5pxKtso_Pz4b1_xUNTZBNzRKNlVQSFhZMU9aV09EVzYxWFdORCQlQCN0PWcu

2024年2月に私が申請した際は翌日に許可されましたが、現在は審査に10営業日程度要することがありますので、辛抱強く待つ必要があります。

APIの使い方の違い

APIのエンドポイントをOpenAIからAzure OpenAIに切り替える必要があります。

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/how-to/switching-endpoints

OpenAIの場合

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.getenv("OPENAI_API_KEY")
)

Microsoft Azure OpenAIの場合

import os
from openai import AzureOpenAI
    
client = AzureOpenAI(
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
    api_version="2023-12-01-preview",
    azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT")
)

GPT-4 Turbo with Visionを使う際の実装例

Chat Completion APIを呼び出す際のコード例です。deployment_nameの設定が初めての挑戦だったため、理解するまでに時間がかかりましたが、以下のように実装しました。

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/how-to/gpt-with-vision?tabs=python%2Csystem-assigned%2Cresource

api_base = '<your_azure_openai_endpoint>' # APIキーと一緒に発行されたエンドポイント。 https://YOUR_RESOURCE_NAME.openai.azure.com/
api_key="<your_azure_openai_key>" # キーとエンドポイントで発行されたキー。
deployment_name = '<your_deployment_name>' # Azure OpenAI Studioのデプロイ名。
api_version = '2023-12-01-preview' # 2024年4月現在はこの値。将来は変わる可能性あり。

client = AzureOpenAI(
    api_key=api_key,  
    api_version=api_version,
    base_url=f"{api_base}openai/deployments/{deployment_name}/extensions",
)

response = client.chat.completions.create(
    model=deployment_name,
    messages=[
        { "role": "user", "content": [  
            { 
                "type": "text", 
                "text": "Describe this picture:" 
            },
            { 
                "type": "image_url",
                "image_url": {
                    "url": "<image URL>"
                }
            }
        ] } 
    ],
    max_tokens=300
)

レスポンスの取得方法

OpenAIのAPIを利用していたときは、以下のように結果を取得していました。

response.json()['choices'][0]['text']

下記のAPIレスポンスのように、messageのcontentに格納されているようです。この変更に気づかずエラーになり少々ハマりました。

response.choices[0].message.content

まとめ

いくつかハマったポイントはありましたが、なんとかAzure OpenAI Serviceへ移行することができました。
Microsoft Azureを業務で利用するのは初めてでしたが、OpenAIから触り始めることはAzureへ入門する良い入り口なのではと感じました。

おわりに

クラッソーネでは、引き続きプロダクトとチームの双方を改善していくために、共に働くエンジニアを募集しています。

https://www.crassone.co.jp/recruit/engineer/


RubyやTerraformが好きで、メンバーが楽になる仕組みを考えるのが好きなエンジニア