Azure Container Apps で RAG を使用して Azure OpenAI for JavaScript チャットをスケーリングする

アプリに負荷分散を追加して、Azure OpenAIトークンとモデルのクォータ制限を超えてチャットアプリを拡張する方法について説明します。 このアプローチでは、Azure Container Apps を使用して、3 つの Azure OpenAI エンドポイントと、受信トラフィックを3つのエンドポイントのいずれかに転送するプライマリ コンテナーを作成します。

この記事では、2 つの個別のサンプルをデプロイする必要があります。

  • チャット アプリ

    • チャットアプリをまだデプロイしていない場合は、ロードバランサーサンプルがデプロイされるまで待ちます。

    • チャットアプリを既に1回デプロイしている場合は、ロードバランサーのカスタムエンドポイントをサポートするように環境変数を変更し、再度デプロイします。

    • チャット アプリはこれらの言語で利用できます。

  • ロードバランサーアプリ

Note

この記事では、記事内の例とガイダンスの土台として、1 つ以上の AI アプリ テンプレートを使用しています。 AI アプリ テンプレートは、適切にメンテナンスされ、デプロイが容易なリファレンス実装を提供します。これは、高品質な AI アプリの作成を開始するために役立ちます。

Azure OpenAI と Azure Container Apps の負荷分散のアーキテクチャ

Azure OpenAIリソースには特定のトークンとモデルのクォータ制限があるため、単一のAzure OpenAIリソースを使用するチャットアプリでは、これらの制限が原因で会話が失敗する傾向があります。

Azure OpenAI リソースが強調表示されたチャット アプリのアーキテクチャを示す図。

これらの制限に達することなくチャットアプリを使用するには、Azure Container Appsで負荷分散ソリューションを使用します。 このソリューションでは、Azure Container Appsからチャットアプリサーバーに単一のエンドポイントがシームレスに公開されます。

3 つの Azure OpenAI リソースの前にある Azure Container Apps を使用したチャット アプリのアーキテクチャを示す図。

Azure Containerアプリは、一連のAzure OpenAIリソースの前に配置されます。 Container Apps は、通常と調整の 2 つのシナリオを解決します。 トークンとモデルのクォータが使用可能な 通常のシナリオ では、Azure OpenAIリソースは、コンテナーアプリとアプリサーバーを介して200を返します。

通常のシナリオを表示する図。通常のシナリオでは、3 つの Azure OpenAI エンドポイント グループが示されていて、2 つのエンドポイントの最初のグループのトラフィックが成功しています。

リソースがクォータ制限などによる 調整シナリオ にある場合、Azure Containerアプリは、元のチャットアプリの要求を満たすために、別のAzure OpenAIリソースをすぐに再試行できます。

429 エラー応答コードと、クライアントが再試行を待機する必要がある秒数の応答ヘッダーを含む調整シナリオを示す図。

前提条件

  • Azure のサブスクリプション。 無料で作成できます

  • 目的の Azure サブスクリプション内の Azure OpenAI に付与されたアクセス権。

    現時点では、このサービスへのアクセスは申請によってのみ許可されます。 Azure OpenAI へのアクセスを申請するには、 https://aka.ms/oai/accessのフォームに入力してください。

  • Dev コンテナーは両方のサンプルで使用でき、この記事を完了するために必要なすべての依存関係が含まれています。 開発コンテナーは、GitHub Codespaces (ブラウザー) または Visual Studio Code を使用してローカルで実行できます。

    • GitHub アカウント

Open Container Apps ローカル バランサーのサンプル アプリ

GitHub Codespaces は、 Visual Studio Code for the Web をユーザー インターフェイスとして使用して、GitHub によって管理される開発コンテナーを実行します。 最も簡単な開発環境では、GitHub Codespaces を使用して、この記事を完了するために正しい開発者ツールと依存関係がプレインストールされるようにします。

GitHub Codespaces でこのプロジェクトを開く

重要

すべての GitHub アカウントでは、2 つのコア インスタンスで毎月最大 60 時間無料で Codespaces を使用できます。 詳細については、「 GitHub Codespaces に月単位で含まれるストレージとコア時間」を参照してください。

Azure Container Appsロードバランサーをデプロイします

  1. Azure Developer CLI にサインインして、プロビジョニングとデプロイの手順に対する認証を指定します。

    azd auth login --use-device-code
    
  2. プロビジョニング後の手順で Azure CLI 認証を使用するように環境変数を設定します。

    azd config set auth.useAzCliAuth "true"
    
  3. ロード バランサー アプリをデプロイします。

    azd up
    

    デプロイのサブスクリプションとリージョンを選択する必要があります。 これらは、チャット アプリと同じサブスクリプションとリージョンである必要はありません。

  4. デプロイが完了するまで待ってから次に進みます。

デプロイ エンドポイントを取得する

  1. 次のコマンドを使用して、Azure Container アプリのデプロイされたエンドポイントを表示します。

    azd env get-values
    
  2. CONTAINER_APP_URL 値をコピーします。 これは、次のセクションで使用します。

ロード バランサー エンドポイントを使用してチャット アプリを再デプロイします

これらは、チャット アプリ サンプルで完了します。

  1. 次のいずれかを選択して、チャットアプリサンプルの開発コンテナーを開きます。

    Language Codespaces Visual Studio Code
    .NET GitHub codespaces で開く Dev Containers で開く
    JavaScript GitHub codespaces で開く Dev Containers で開く
    Python GitHub codespaces で開く Dev Containers で開く
  2. Azure Developer CLI (AZD) にサインインします。

    azd auth login
    

    サインインの手順を完了します。

  3. chat-appなどの名前でAZD環境を作成します。

    azd env new <name>
    
  4. 次の環境変数を追加して、チャット アプリのバックエンドに、OpenAI リクエストにカスタム URL を使用するよう指示します。

    azd env set OPENAI_HOST azure_custom
    
  5. 次の環境変数を追加して、前のセクションの URL を <CONTAINER_APP_URL> に置き換えます。 このアクションは、チャット アプリのバックエンドに、OpenAI リクエストのカスタム URL の値を伝えます。

    azd env set AZURE_OPENAI_CUSTOM_URL <CONTAINER_APP_URL>
    
  6. チャットアプリをデプロイします。

    azd up
    

これで、クォータを使い果たすことなく、多数のユーザーにスケーリングするように構築されているという確信を持ってチャット アプリを使用できるようになりました。

ログをストリーミングしてロード バランサーの結果を表示します

  1. Azure portal で、リソース グループを検索します。

  2. グループ内のリソースの一覧から、Container Apps リソースを選択します。

  3. [監視] - >[ログ配信] を選択してログを表示します。

  4. ログでトラフィックを生成するには、チャット アプリを使用します。

  5. Azure OpenAI リソースを参照するログを探します。 3つの各リソースの数値IDは、 Proxying to https://openai3で始まるログコメントにあります。 3 は3番目のAzure OpenAIリソースを示します。

    ログ コメントを示す 2 つのログ行が強調表示された Azure Container App ストリーミング ログを示すスクリーンショット。

  6. チャットアプリを使用すると、要求がクォータを超えたという状態をロードバランサーが受け取ると、ロードバランサーは自動的に別のリソースにローテーションされます。

分あたりのトークンのクォータ (TPM) を構成します

既定では、ロードバランサー内の各OpenAIインスタンスは、3万TPM (分あたりのトークン) 容量でデプロイされます。 クォータを使い果たすことなく、多数のユーザーにスケーリングするように構築されているという確信を持ってチャット アプリを使用できます。 次の場合は、この値を変更します。

  • デプロイ容量エラーが発生した場合:値を小さくします。
  • より高い容量を計画する場合は、値を大きくします。
  1. 次のコマンドを使用して、値を変更します。

    azd env set OPENAI_CAPACITY 50
    
  2. ロード バランサーを再デプロイします。

    azd up
    

リソースをクリーンアップする

チャット アプリとロード バランサーの両方を完了したら、リソースをクリーンアップします。 この記事で作成した Azure リソースは、Azure サブスクリプションに課金されます。 今後これらのリソースが必要になるとは思わない場合は、削除して、より多くの料金が発生しないようにします。

チャット アプリのリソースをクリーンアップします

チャット アプリの記事に戻り、それらのリソースをクリーンアップします。

アップロード バランサーのリソースをクリーンアップします

次の Azure Developer CLI コマンドを実行して、Azure リソースを削除し、ソース コードを削除します:

azd down --purge --force

スイッチには次の機能が備わっています。

  • purge: 削除されたリソースがすぐに消去されます。 これにより、Azure OpenAI TPM を再利用することができます。
  • force: 削除はサイレント モードで行われ、ユーザーの同意は必要ありません。

GitHub Codespaces をクリーンアップする

GitHub Codespaces 環境を削除すると、アカウントに対して取得するコアごとの無料時間エンタイトルメントの量を最大化できることが保証されます。

重要

GitHub アカウントのエンタイトルメントの詳細については、「 GitHub Codespaces に月単位で含まれるストレージとコア時間」を参照してください。

  1. GitHub Codespaces ダッシュボード (https://github.com/codespaces) にサインインします。

  2. azure-samples/openai-aca-lb GitHub リポジトリをソースとして現在実行中の Codespaces を見つけます。

    状態とテンプレートを含むすべての実行中の Codespaces のスクリーンショット。

  3. codespace のコンテキスト メニューを開いた後に、 [削除]を選択します。

    削除オプションがハイライトされた 1 つの codespace のコンテキスト メニューのスクリーンショット。

ヘルプを参照する

Azure API Management ロード バランサーのデプロイで問題が発生した場合は、リポジトリの Issues に問題を記録します。

サンプル コード

この記事で使用されるサンプルには次のものが含まれます。

次のステップ