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

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

Remote Config テンプレートから派生したクライアント固有の構成をフェッチする Firebase クライアント SDK とは異なり、サーバー側の 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 Admin Node.js SDK をサーバーに追加します。

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

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

import { initializeApp } from "firebase-admin/app";
import { getRemoteConfig } from "firebase-admin/remote-config";

// Initialize Firebase
const firebaseApp = initializeApp();

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

Remote Config で動的に更新するアプリ内の変数を特定します。次に、アプリケーションでデフォルトで設定する必要がある変数と、そのデフォルト値について説明します。これにより、Remote Config バックエンド サーバーへの接続が中断しても、アプリケーションを正常に実行できます。

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

パラメータ名 説明 タイプ デフォルト値
model_name モデル API 名 文字列 gemini-1.5-pro
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 テンプレートをフェッチして、その値を使用するようにアプリケーションを構成します。次の手順では、Node.js アプリケーションを構成する方法について説明します。

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

    // Initialize server-side Remote Config
    const rc = getRemoteConfig(firebaseApp);
    const template = rc.initServerTemplate();
    
    // Load Remote Config
    await template.load();
    

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

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

    const template = rc.initServerTemplate({
      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
    await template.load();
    
  3. テンプレートが読み込まれたら、template.evaluate() を使用してテンプレートからパラメータと値をインポートします。

    // Add template parameters to config
    const config = template.evaluate();
    
  4. Remote Config テンプレートでパーセント条件を設定する場合は、template.evaluate() 関数内で条件の評価に使用する randomizationId を定義して指定します。

    たとえば、Firebase インストール IDrandomizationId またはユーザー ID として設定すると、サーバーに接続する各ユーザーが適切なランダム化グループに追加されます。次の例は基本的な例ですが、クライアント リクエストごとに異なる randomizationIds を生成するようにサーバーを構成して、パーセント条件グループのメンバーシップに基づいて、Remote Config から一貫した値がユーザーに提供されるようにすることもできます。

    割合条件の詳細については、ユーザー(ランダム %)をご覧ください。

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

    • ブール値: getBoolean
    • オブジェクト: getValue
    • 番号: getNumber
    • 文字列: getString

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

    // Replace defaults with values from Remote Config.
    const generationConfig =
      JSON.parse(
        config.getString('generation_config'));
    
    const is_ai_enabled = config.getBool('is_ai_enabled');
    
    const model = config.getString('model_name');
    
    // Generates a prompt comprised of the Remote Config
    // parameter and prepends it to the user prompt
    const prompt = `${config.getString('preamble_prompt')} ${req.query.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 としてデプロイすることを検討してください。たとえば、Google AI や Vertex AI などの生成 AI API を活用したキャラクターの会話を含むアプリがあるとします。この場合、アプリがオンデマンドで呼び出す Cloud Functions の関数で LLM サービング ロジックをホストできます。アプリを Cloud Functions の関数としてデプロイする方法については、スタートガイド: 最初の関数の作成、テスト、デプロイをご覧ください。

アプリケーション(アセットを使用するウェブアプリなど)を長時間実行する場合は、Cloud Run を検討してください。Cloud Run を使用してサーバーアプリをデプロイするには、クイックスタート: Cloud Run に Node.js サービスをデプロイするのガイドをご覧ください。

Cloud Run と Cloud Functions の最適なユースケースの詳細については、Cloud Functions と Cloud Run: どちらか一方を使用する場合をご覧ください。