すべてのプロダクト
Search
ドキュメントセンター

Container Compute Service:トークン数に基づく生成 AI リクエストのグローバルレート制限

最終更新日:Mar 26, 2026

Gateway with Inference Extension は、生成 AI リクエストに対する詳細なレート制限をサポートしています。各リクエストの入力と出力に含まれるトークン数をカウントし、事前定義されたレート制限ルールに基づいてリクエストを許可または拒否します。このトピックでは、Gateway with Inference Extension を使用して、トークン数に基づき生成 AI リクエストにグローバルレート制限を適用する方法について説明します。

重要

このトピックでは、Gateway with Inference Extensionバージョン 1.4.0 以降が必要です。

機能説明

トークンベースのグローバルレート制限は、Gateway with Inference Extension の 2 つのコア機能に基づいています:

  • グローバルレート制限: この機能は、トークンバケットアルゴリズムを使用します。デフォルトでは、各 HTTP リクエストは 1 つのトークンを消費します。各リクエストが消費するトークン数をカスタマイズすることもできます。

  • 生成 AI 可観測性アドオン: このアドオンは、生成 AI アプリケーションの応答からトークン数を読み取り、その値をレート制限に使用します。

トークンバケットアルゴリズム

システムは固定レートでトークンを生成し、バケットが容量に達するまでトークンバケットに追加します。サービス間のリクエストは、処理されるためにトークンを消費する必要があります。十分なトークンが利用可能な場合、リクエストはトークンを消費します。十分なトークンが利用できない場合、リクエストはキューに入れられるか、破棄されることがあります。このアルゴリズムにより、平均データ転送レートがトークン生成レートを超えないようにしつつ、一部のバーストトラフィックにも対応できます。

image

前提条件

レート制限ルールのデプロイ

この例では、mock-vllm アプリケーション のレート制限ルールを作成し、各ユーザーの 1 時間あたりのトークン数を 300 に制限する方法を示します。

  1. token-ratelimit-test.yaml ファイルを作成します。

    apiVersion: gateway.envoyproxy.io/v1alpha1
    kind: BackendTrafficPolicy 
    metadata:
      name: token-ratelimit-test
    spec:
      targetRefs:
      - group: gateway.networking.k8s.io
        kind: HTTPRoute
        name: mock-route
      rateLimit:
        type: Global
        global:
          rules:
          - clientSelectors:
            - headers:
              - name: x-user-id
                type: Distinct
            limit:
              requests: 300
              unit: Hour
            cost:
              response:
                from: Metadata
                metadata:
                # ACK Gateway の生成 AI 可観測性アドオンによって設定されるメトリクス
                  namespace: FILTER_STATE
                  key: wasm.gen_ai.completion.tokens
  2. レート制限ルールをデプロイします。

    kubectl apply -f token-ratelimit-test.yaml

テストの実行

  1. ゲートウェイの IP アドレスを取得します。

    export GATEWAY_ADDRESS=$(kubectl get gateway/mock-gateway -o jsonpath='{.status.addresses[0].value}')
    echo ${GATEWAY_ADDRESS}
  2. sleep アプリケーションから 5 つのテストリクエストを送信します。

    kubectl exec deployment/sleep -it -- curl -X POST ${GATEWAY_ADDRESS}/v1/chat/completions -H 'Content-Type: application/json' -H "host: example.com" -d '{
        "model": "mock",
        "max_completion_tokens": 100,
        "temperature": 0,
        "messages": [
          {
            "role": "user",
            "content": "introduce yourself"
          }
        ]
    }' -v -H "x-user-id: one" |grep "^< HTTP"

    期待される出力:

    < HTTP/1.1 200 OK
    < HTTP/1.1 200 OK
    < HTTP/1.1 200 OK
    < HTTP/1.1 200 OK
    < HTTP/1.1 429 Too Many Requests

    最初の 4 つのリクエストは 200 を返し、5 番目のリクエストは 429 を返します。

    これは、mock-vllm アプリケーションがリクエストごとに 76 トークンを含む固定長の応答を返すためです。3 回のリクエスト後、228 トークンが消費されますが、これはまだ 300 トークンの制限内です。したがって、4 番目のリクエストは成功します。4 番目のリクエスト後、304 トークンが消費され、制限を超えます。5 番目のリクエストは 429 Too Many Requests を返します。

参考文献

上記で示したユーザーごとのトークンレート制限に加えて、以下のトピックを読むことで、より高度なレート制限戦略を実装できます: