サーバー環境で Remote Config を使用する


Firebase Remote Config は、Firebase Admin Python SDK v6.7.0 以降を使用したサーバーサイド構成をサポートしています。この機能により、Remote Config を使用してサーバーサイド アプリケーションの動作と構成を動的に管理できます。これには、Cloud Functions などのサーバーレス実装が含まれます。

Firebase クライアント SDK は Remote Config テンプレートから派生したクライアント固有の構成を取得しますが、サーバーサイドの Remote Config SDK は Firebase から完全な Remote Config テンプレートをダウンロードします。これにより、サーバーは各受信リクエストを使用してテンプレートを評価し、独自のロジックを使用して、カスタマイズされたレスポンスを超低レイテンシで配信します。条件を使用すると、カスタム シグナルで定義されたランダムな割合とクライアント属性に基づいてレスポンスを制御、カスタマイズできます。

サーバーサイドの Remote Config を使用すると、次のことができます。

  • サーバー上で実行されているアプリケーションやサーバー経由でアクセスされるアプリケーションの構成パラメータを定義し、AI モデルのパラメータ、プロンプト、その他のインテグレーションをリモートで構成するなどのユースケースを可能にして、API キーを安全に保護します。
  • 環境の変化やその他のアプリケーションの変更(LLM パラメータやモデル エンドポイントの更新など)に応じてパラメータを動的に調整します。
  • サーバーによって呼び出される API をリモートで更新して、費用を管理します。
  • サーバーにアクセスするクライアントのカスタム構成をオンザフライで生成します。
  • パラメータ値を受け取ったクライアントを記録し、利用資格確認システムの一部として Cloud Functions で使用します。

サーバーサイド Remote Config は、Cloud Run、Cloud Functions、または自己ホスト型のサーバー環境にデプロイできます。

始める前に

Firebase Admin SDK をサーバーに追加する手順に沿って、Firebase プロジェクトを作成し、サービス アカウントを設定し、Firebase Python SDK をサーバーに追加します。

ステップ 1: Firebase Admin Python SDK を初期化して API リクエストを承認する

パラメータを指定せずに Admin SDK を初期化すると、SDK は Google アプリケーションのデフォルト認証情報を使用し、GOOGLE_APPLICATION_CREDENTIALS 環境変数からオプションを読み取ります。SDK を初期化して Remote Config を追加するには、次のようにします。

import firebase_admin
import asyncio
import json

firebase_admin.initialize_app()

ステップ 2: サーバー アプリケーションのデフォルト パラメータ値を特定する

Remote Config で動的に更新するアプリ内の変数を特定します。次に、アプリケーションでデフォルトで設定する必要がある変数とデフォルト値を検討します。これにより、Remote Config バックエンド サーバーへの接続が中断した場合でも、アプリケーションは正常に動作します。

たとえば、生成型 AI 関数を管理するサーバー アプリケーションを作成する場合、デフォルトのモデル名、プロンプト プリアンブル、生成型 AI の構成を次のように設定できます。

パラメータ名 説明 デフォルト値
model_name モデル API 名 文字列 gemini-2.0-flash
preamble_prompt ユーザーのクエリの先頭に追加するためのプロンプト 文字列 I'm a developer who wants to learn about Firebase and you are a helpful assistant who knows everything there is to know about Firebase!
generation_config モデルに送信するパラメータ JSON {"stopSequences": ["I hope this helps"], "temperature": 0.7, "maxOutputTokens": 512, "topP": 0.1, "topK": 20}

ステップ 3: サーバー アプリケーションを構成する

Remote Config で使用するパラメータを決定したら、デフォルト値を設定し、サーバー固有の Remote Config テンプレートを取得して、その値を使用するようにアプリケーションを構成します。以下のステップでは、Python アプリケーションを構成する方法について説明します。

  1. テンプレートにアクセスして読み込みます。

    from firebase_admin import remote_config
    
    # Initialize server-side Remote Config
    template = remote_config.init_server_template()
    
    # Load the template from the backend
     asyncio.run(template.load())
    
    

    Cloud Functions で Python を使用している場合は、非同期の get_server_template を使用して、テンプレートを 1 ステップで取得して読み込むことができます。

    # Initialize server-side Remote Config
    template = remote_config.get_server_template()
    
  2. Remote Config バックエンド サーバーへの接続が中断された場合でもアプリケーションが正常に実行されるようにするには、各パラメータのデフォルト値をアプリに追加します。これを行うには、init_server_template または get_server_template テンプレート関数内に defaultConfig を追加します:

    template = remote_config.init_server_template({
      defaultConfig: {
        'model_name': "gemini-pro",
        'generation_config': '{"stopSequences": [], "temperature": 0.7, "maxOutputTokens": 512, "topP": 0.1, "topK": 20}',
        'preamble_prompt': "I'm a developer who wants to learn about Firebase and you are a helpful assistant who knows everything there is to know about Firebase!"
      },
    })
    
    # Load Remote Config
    asyncio.run(template.load())
    
    

    テンプレートを初期化する別の方法として、get_server_template 関数を使用して必要なサーバー テンプレートを取得することもできます。このテンプレートを JSON 形式に変換するには、template.to_json 関数を使用します。この JSON テンプレートはローカルに保存できます。その後、init_server_template 関数を使用してこの JSON テンプレートを初期化できます。

  3. テンプレートが読み込まれたら、template.evaluate() を使用してパラメータとテンプレートの値をインポートします:

    # Add template parameters to config
    config = template.evaluate()
    
  4. 必要に応じて、Remote Config テンプレートで条件を設定する場合は、必要な値を定義して指定します。

    • パーセンテージ条件を使用する場合は、template.evaluate() 関数内で条件を評価するために使用する randomizationId を追加します。
    • カスタム シグナルを使用する場合は、属性とその値を定義します。カスタム シグナルは、Firebase Admin Python SDK v6.7.0 以降で使用できます。

    たとえば、Firebase インストール IDrandomizationId またはユーザー ID として設定して、サーバーに接続する各ユーザーが適切なランダム グループに追加されるようにすることができます。version は特定のクライアント バージョンをターゲットとするカスタム シグナルとして、platform はクライアント プラットフォームをターゲットとするカスタム シグナルとして設定されます。

    条件の詳細については、条件ルールのタイプをご覧ください。

    # Add template parameters to `config`. Evaluates the
    # template and returns the parameter value assigned to
    # the group assigned to the {randomizationId} and version.
    config = template.evaluate({
      'randomizationId': "2ac93c28-c459-4760-963d-a3974ec26c04",
      'version': "1.0",
      'platform': "Android"
    })
    
    
  5. 次に、必要なパラメータ値を config 定数から抽出します。getters を使用して、Remote Config の値を想定される形式にキャストします。次の型がサポートされています。

    • ブール値: get_bool
    • オブジェクト: get_value
    • 番号: get_number
    • 文字列: get_string

    たとえば、サーバーに Vertex AI を実装している場合に、モデルとモデル パラメータを変更するには、model_namegeneration_config のパラメータを構成します。Remote Config の値にアクセスする方法の例を次に示します。

    # Replace defaults with values from Remote Config.
    generation_config = json.loads(config.get_string('generation_config'))
    is_ai_enabled = config.get_bool('is_ai_enabled')
    model = config.get_string('model_name')
    
    # Generates a prompt comprised of the Remote Config
    # parameter and prepends it to the user prompt.
    prompt = f"{config.get_string('preamble_prompt')}{req.args.get('prompt')}"
    
  6. サーバーレス環境ではなく長時間稼働するサーバーの場合、setInterval を使用してテンプレートを定期的に再読み込みし、最新のテンプレートを Remote Config サーバーから定期的にフェッチします。

ステップ 4: Remote Config にサーバー固有のパラメータ値を設定する

次に、サーバーの Remote Config テンプレートを作成し、アプリで使用するパラメータと値を構成します。

サーバー固有の Remote Config テンプレートを作成するには:

  1. Firebase コンソールの Remote Config パラメータのページを開き、[クライアント/サーバー] セレクタで [サーバー] を選択します。
  2. アプリで定義したパラメータと同じ名前とデータ型の Remote Config パラメータを定義し、値を指定します。これらの値は、テンプレートを取得して評価し、これらの値を変数に割り当てるときに、サーバー アプリケーションの構成で設定した defaultConfig を上書きします。
  3. 必要に応じて、定義したインスタンスまたはカスタム シグナルのランダムなサンプルに値を永続的に適用する条件を設定します。条件の詳細については、条件ルールのタイプをご覧ください。
  4. パラメータの追加が完了したら、[変更を公開] をクリックします。
  5. 変更内容を確認し、もう一度 [変更を公開] をクリックします。

ステップ 5: Cloud Functions または Cloud Run でデプロイする

サーバー アプリケーションが軽量でイベント駆動型の場合は、Cloud Functions を使用してコードをデプロイすることを検討してください。たとえば、生成 AI API(Google AIVertex AI など)を活用したキャラクターのセリフを含むアプリがあるとします。この場合、アプリがオンデマンドで呼び出す関数内で LLM 提供ロジックをホストできます。

アプリケーションが長時間実行されることを想定している場合(たとえば、アセットを含む Web アプリなど)、Cloud Run の使用を検討してください。Cloud Run を使用してサーバーアプリをデプロイするには、クイックスタート: Cloud Run に Python サービスをデプロイするのガイドに従います。

Cloud Run と Cloud Functions の最適なユースケースについて詳しくは、Cloud Functions と Cloud Run: それぞれの使いどころをご覧ください。