0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AI GatewayでFoundryのモデルのトークン制限を適用

Posted at

Foundry Portal(New)からAI Gatewayとして、Token管理が非常にしやすくなり、調べてみました。

特に10万リクエストまで無料となったのは、検証時などにありがたいです。

Free for up to 100,000 requests when created as an AI Gateway in Azure AI Foundry.

設定

1. API Managementリソース作成

1.1. AI Gateway 作成

Foundry Portal(New)のメニュー Operate -> Admin で AI Gatewayタブを選択し、「Add AI Gatway」ボタンをクリック
image.png

画面項目を入力して「Add」
image.png

1.2. API Managementリソース確認

AI Gateway(API Management)ができました
image.png

API Management 画面でも確認
リソースグループなかったですが、勝手にFoundryと同じリソースグループに割りあたりました。
レベルは「Basic V2」で作成されました。
image.png

バックエンドにFoundryリソースが登録されていて、マネージドIDでの認可を使うようです。
image.png
image.png

製品もできています(他作業をやった後に確認したので、このタイミングでできていないかもしれません)。
image.png

そしてAPIもあります。
image.png

2. Token管理設定

2.1. (1分あたりの)Limits 設定

Foundry Portal(New)画面でLimitsタブから1分あたりのLimits 設定
image.png

2.2. (規定時間あたりの)Quotas設定

Foundry Portal(New)画面でLimitsタブから単位時間あたりのQuotas 設定。今回は300Token/時間。
image.png

2.3. 設定値を API Managementで確認

Azure Portalの製品のポリシーに設定値が反映されていることを確認
image.png

サンプルコード

環境

Ubuntu22.04(WSL)でPython3.11で動かしています。
以下のパッケージを使用

Package Version 備考
openai 2.11

Python Script

LLM呼出

プレイグラウンドで見えるコードを参考に作りました。
エンドポイントがAPIMのものに置き換わっています。意外と細かいことをしてくれている。Project API KeyがAPI Management の Subscription Keyにもなってくれています。
image.png

from openai import OpenAI

endpoint = "https://<foundry resource>.azure-api.net/<foundry resource>/openai/v1/"
deployment_name = "gpt-5-mini"
api_key = "<key>"


client = OpenAI(
    base_url=endpoint,
    api_key=api_key
)

def chat(number: str):
    completion = client.chat.completions.create(
        model=deployment_name,
        extra_headers={"api-key": api_key},
        messages=[
            {
                "role": "user",
                "content": f"{number}から連想する話をして?",
            }
        ],
    )
    return completion

completion = chat("42")
print(completion.choices[0].message)

for i in range(10):
    print(f"===== {i} =====")
    completion = chat(str(i))
    print(completion.choices[0].message)

エラー確認

先ほどのプログラムを実行。

(1分あたりの)Limits 設定超過エラー

1分あたりのLimits 設定エラー発生時のエラー。403で出ます。

PermissionDeniedError: Error code: 403 - 
{'statusCode': 403, 'message': 'Token quota is exceeded. Try again in 55 minutes and 58 seconds.'}

(規定時間あたりの)Quotas 設定超過エラー

1時間あたり300Tokenで設定したQuotasのエラーは429で出ます。

RateLimitError: Error code: 429 - 
{'statusCode': 429, 'message': 'Token limit is exceeded. Try again in 164 seconds.'}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?