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

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

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

  • チャット アプリ

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

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

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

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

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リソースの前に配置されます。 コンテナーアプリは、通常と調整の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にデプロイするには、Azure開発者CLI (AZD) にサインインします。

    azd auth login
    
  2. サインインの手順を完了します。

  3. ロードバランサーアプリをデプロイします。

    azd up
    

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

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

  5. Endpoint という名前のデプロイの最後にある URL を取得します。 これは次のセクションで使用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. グループ内のリソースの一覧から、コンテナーアプリリソースを選択します。

  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 に問題を記録します。

サンプル コード

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

次のステップ