Firebase Remote Config を使用して Vertex AI in Firebase アプリを動的に更新する

Vertex AI in Firebase SDK を使用してアプリから Gemini API を呼び出すと、生成 AI のレスポンスを制御するパラメータがリクエストに含まれます。通常、これらにはモデル名、モデル生成構成(最大トークン数、温度など)、安全性設定、システム インストラクション、プロンプト データが含まれます。

ほとんどの場合、これらの値は、さまざまなシナリオでオンデマンドで、または必要に応じて変更する必要があります。

  • 新しいアプリをリリースせずに生成 AI モデルを更新できます。以前のバージョンが廃止される前に、新しい安定したモデル バージョンにアップグレードできます。また、ユーザーのニーズと属性に基づいて、低コストまたは高パフォーマンスのモデルに切り替えたり、最新のモデルを特定のユーザー セグメント(ベータ版テスターなど)に条件付きでデプロイしたりすることもできます。
  • モデルにアクセスするロケーションを、ユーザーに近い場所に設定します。
  • さまざまなシステム指示とプロンプトを A/B テストし、優れたテスト値をユーザーに段階的に展開します。
  • 特徴フラグを使用して、アプリで生成 AI 機能をすばやく公開または非表示にします。

Firebase Remote Config は、このすべてに加えて、アプリの新しいバージョンをリリースすることなく、Firebase コンソールで設定した特性に一致するアプリ インスタンスに対して、必要に応じてパラメータ値を条件付きで更新できます。

このソリューション ガイドでは、推奨される具体的なユースケースと、生成 AI アプリに Remote Config を追加する方法について説明します。

コードの実装にジャンプ

アプリで Firebase Remote Config を使用する理由

Firebase Remote Config を使用すると、アプリのアップデートを必要とせずにアプリの動作を動的に調整できます。これは、生成 AI を使用するアプリで特に強力です。この場合、迅速な反復処理と微調整が重要になります。

生成 AI アプリでの Remote Config の重要なユースケース

次の重要なユースケースでは、Remote ConfigVertex AI in Firebase を使用することをおすすめします。

  • アプリを更新せずに最新のモデル バージョンにアップグレードする: Remote Config パラメータを使用して必要に応じてモデル名を変更し、利用可能になり次第、優先する Gemini モデルの最新バージョンにアップグレードできるようにします。
  • アプリのアップデートなしでシステム指示と安全設定を更新する: システム指示と安全設定を Remote Config パラメータ内に保存し、デプロイ後に問題が見つかった場合にオンデマンドで変更できるようにします。
  • リスクを軽減し、AI の安全性を強化する: Remote Configロールアウトを使用して、生成 AI の変更を iOS ユーザーと Android ユーザーに安全かつ段階的にリリースします。

生成 AI アプリでの Remote Config の高度なユースケースと推奨されるユースケース

Remote ConfigGoogle Analytics でアプリを計測したら、高度なユースケースを検討できます。

  • クライアントの位置情報に基づいて位置情報を設定する: Remote Config 条件を使用して、クライアントの検出された位置情報に基づいてモデルの位置情報を設定します。
  • さまざまなモデルを試す: さまざまな生成 AI モデルをすばやくテストして切り替えたり、さまざまなモデルをさまざまなユーザー セグメントにデプロイしたりして、特定のユースケースに最適なモデルを見つけることができます。
  • モデルのパフォーマンスを最適化する: システム プロンプト、最大出力トークン、温度などのモデル パラメータを微調整します。
  • クライアント属性に基づいて異なるシステム指示、プロンプト、モデル構成を使用する: Remote ConfigGoogle Analytics を使用すると、クライアント属性またはカスタム オーディエンスに基づいて条件を作成し、これらの属性に基づいて異なるパラメータを設定できます。

    たとえば、生成 AI を使用してアプリでテクニカル サポートを提供している場合は、アプリ プラットフォームに固有のシステム手順を設定して、Android、iOS、ウェブ プラットフォームのユーザーに正確な手順を提供できます。

  • ユーザーごとにエクスペリエンスをパーソナライズする: Remote Config パーソナライズを使用して、各ユーザーに最適な生成 AI 設定を自動的に決定します。

  • 費用を管理する: 呼び出される生成 AI モデルとその使用頻度をリモートで調整し、ユーザー オーディエンスに基づいて出力トークンの最大値を動的に構成して、不要な費用を削減します。

  • アプリのエクスペリエンスと結果を最適化する: iOS、Android、Flutter アプリで A/B TestingRemote Config を使用して、さまざまなユーザー セグメントで生成 AI パラメータの変更をテストし、維持率や収益などの主要な指標に与える影響を把握します。

Firebase Remote Config で生成 AI アプリを計測することで、ユーザーに優れたエクスペリエンスを提供しながら、柔軟で安全、かつ費用対効果の高い AI 搭載アプリケーションを構築できます。

Firebase Remote Config をアプリに追加します。

このソリューション ガイドでは、Firebase Remote Config を使用して、Vertex AI in Firebase SDK を使用する Android アプリのパラメータを動的に更新します。ここでは以下について学びます。

  • モデル名やシステム手順などのパラメータを Firebase Remote Config から取得して有効にします。
  • 動的に取得されたパラメータを使用するように Gemini API 呼び出しを更新すると、アプリを更新しなくても、さまざまなモデルを切り替えたり、システム インストラクションを変更したりできます。
  • パラメータをリモートで制御し、必要に応じてモデルの動作と機能を調整します。

前提条件

このガイドは、Android Studio を使用して Android プラットフォーム向けのアプリを開発することに精通していることを前提としています。始める前に、以下の準備が整っていることを確認します。

  • Vertex AI in Firebase SDK のスタートガイドの手順を完了していること。以下の手順をすべて完了していることを確認します。

    1. Blaze お支払いプランの使用や必要な API の有効化など、新規または既存の Firebase プロジェクトを設定します。
    2. アプリを Firebase に接続します。アプリの登録や Firebase 構成のアプリへの追加などを行います。
    3. SDK を追加し、アプリで Vertex AI サービスと生成モデルを初期化します。
  • プロジェクトで Google Analytics を有効にして、その SDK をアプリに追加します(クライアント デバイスの位置情報に基づいてサービスとモデルのロケーションを設定するなど、条件付きターゲティングに必要)。

ステップ 1: Firebase コンソールでパラメータ値を設定する

クライアント Remote Config テンプレートを作成し、アプリでフェッチして使用するパラメータと値を構成します。

  1. Firebase コンソールで Firebase プロジェクトを開き、ナビゲーション メニューから [実行] を展開して、Remote Config を選択します。
  2. Remote Config ページの上部にある [クライアント/サーバー] セレクタで [クライアント] が選択されていることを確認します。
    • Remote Config クライアント テンプレートを初めて使用する場合は、[構成を作成] をクリックします。[最初のパラメータの作成] ペインが表示されます。
    • Remote Config テンプレートを初めて使用する場合は、[パラメータを追加] をクリックします。
  3. 次の Remote Config パラメータを定義します。

    パラメータ名 説明 デフォルト値
    model_name モデル名。コードで使用するモデル名の最新リストについては、使用可能なモデル名をご覧ください。 文字列 gemini-1.5-flash
    system_instructions システム指示は、特定のニーズやユースケースに基づいてモデルの動作に影響を与えるエンドユーザーからの詳細な手順を示すために追加する「前文」のようなものです。 文字列 You are a helpful assistant who knows everything there is to know about Firebase!
    prompt 生成 AI 機能で使用するデフォルトのプロンプト。 文字列 I am a developer who wants to know more about Firebase!
    vertex_location 必要に応じてロケーションを制御して、Vertex AI サービスを実行し、モデルにアクセスします。Google Analytics によって検出されたクライアントの位置情報に基づいて、このオプションを構成する条件を設定できます。 文字列 us-central1
  4. パラメータの追加が完了したら、[変更を公開] をクリックします。新しい Remote Config テンプレートでない場合は、変更内容を確認し、もう一度 [変更を公開] をクリックします。

ステップ 2: アプリに Remote Config SDK を追加して初期化する

Remote Config の依存関係を追加し、アプリ内で Remote Config を設定します。

  1. モジュール(アプリレベル)の Gradle ファイル(通常は app/build.gradle.kts または app/build.gradle)に Remote Config 依存関係を追加します。

    dependencies {
        implementation(platform("com.google.firebase:firebase-bom:33.6.0"))
        implementation("com.google.firebase:firebase-vertexai")
        implementation("com.google.firebase:firebase-config")
        // ... other dependencies
    }
    
  2. Remote Config をメインのアプリケーション ロジックに追加します。ここでは、Remote Config を初期化し、最小フェッチ間隔を追加します。

    Kotlin+KTX

    val remoteConfig: FirebaseRemoteConfig = Firebase.remoteConfig
    val configSettings = remoteConfigSettings {
    minimumFetchIntervalInSeconds = 3600
    }
    remoteConfig.setConfigSettingsAsync(configSettings)
    

    Java

    FirebaseRemoteConfig mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
    FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder()
        .setMinimumFetchIntervalInSeconds(3600)
        .build();
    mFirebaseRemoteConfig.setConfigSettingsAsync(configSettings);
    

この例では、デフォルトのフェッチ間隔は 3,600 秒ですが、開発中はコード内で比較的短い最小フェッチ間隔を設定することをおすすめします。

ステップ 3: アプリ内パラメータ値を設定する

アプリ内デフォルト パラメータ値は Remote Config オブジェクトに設定する必要があります。これにより、Remote Config サービスから値を取得できない場合でも、アプリが想定どおりに動作します。

  1. Firebase コンソールRemote Config を開きます。
  2. [Parameters] タブでメニューを開き、[デフォルト値をダウンロード] を選択します。
  3. プロンプトが表示されたら、[.xml(Android 用)] を有効にして、[ファイルをダウンロード] をクリックします。
  4. ファイルをアプリの XML リソース ディレクトリに保存します。
  5. メイン アクティビティ ファイルを更新して、前に追加した configSettings の後にデフォルトを追加します。

    Kotlin+KTX

    // Set default values.
    remoteConfig.setDefaultsAsync(R.xml.remote_config_defaults)
    

    Java

    // Set default values.
    mFirebaseRemoteConfig.setDefaultsAsync(R.xml.remote_config_defaults);
    

ステップ 4: 値をフェッチして有効にする

デフォルトを設定したら、次のコードを追加して値をフェッチして有効にします。

Kotlin+KTX

// Fetch and activate Remote Config values
remoteConfig.fetchAndActivate()
     .addOnCompleteListener(this) { task ->
          if (task.isSuccessful) {
              val updated = task.result
              Log.d(TAG, "Remote Config values fetched and activated: $updated")
          } else {
              Log.e(TAG, "Error fetching Remote Config", task.exception)
          }

Java

  // Fetch and activate Remote Config values
  mFirebaseRemoteConfig.fetchAndActivate()
    .addOnCompleteListener(this, new OnCompleteListener<Boolean>() {
        @Override
        public void onComplete(@NonNull Task<Boolean> task) {
            if (task.isSuccessful()) {
                boolean updated = task.getResult();
                Log.d(TAG, "Config params updated: " + updated);
            } else {
                Log.e(TAG, "Error fetching Remote Config", task.exception)
            }
          }
    });

ステップ 5: リアルタイムの Remote Config リスナーを追加する

リアルタイム Remote Config リスナーをアプリに追加して、Remote Config テンプレートに変更を加えた後、すぐにクライアントに反映されるようにします。

次のコードは、パラメータ値が変更されるたびに Remote Config オブジェクトを更新します。必要に応じて、addOnCompleteListener の有効化内でアクションを構成することもできます。

Kotlin+KTX

      // Add a real-time Remote Config listener
      remoteConfig.addOnConfigUpdateListener(object : ConfigUpdateListener {
          override fun onUpdate(configUpdate : ConfigUpdate) {
              Log.d(ContentValues.TAG, "Updated keys: " + configUpdate.updatedKeys);
              remoteConfig.activate().addOnCompleteListener {
                  // Optionally, add an action to perform on update here.
              }
          }

          override fun onError(error : FirebaseRemoteConfigException) {
              Log.w(ContentValues.TAG, "Config update error with code: " + error.code, error)
          }
      }

Java

  // Add a real-time Remote Config listener
  remoteConfig.addOnConfigUpdateListener(new ConfigUpdateListener() {
      @Override
      public void onUpdate(ConfigUpdate configUpdate) {
          Log.d(ContentValues.TAG, "Updated keys: " + configUpdate.getUpdatedKeys());
                remoteConfig.activate().addOnCompleteListener(new OnCompleteListener<Boolean>() {
                  @Override
                  public void onComplete(@NonNull Task<Boolean> task) {
                      // Optionally, add an action to perform on update here.
                  }
              });
          }

      @Override
      public void onError(FirebaseRemoteConfigException error) {
          Log.w(ContentValues.TAG, "Config update error with code: " + error.getCode(), error);
      }
  });

ステップ 6: Remote Config 値を Vertex AI 変数に割り当てる

Remote Config が完全に構成されたので、コードを更新して、ハードコードされた値を Remote Config から取得した値に置き換えます。

ロケーション、モデル名、システム インストラクション、ユーザー プロンプトのハードコードされた値を、Remote Config から取得した値に置き換えます。

Kotlin+KTX

// Initialize FirebaseVertexAI instance
// Optionally specify a location in which to run the service and access the model
val vertexAI = Firebase.vertexAI(location = remoteConfig.getString("vertex_location"))

// Initialize the Vertex AI service and the generative model
// Specify a model that supports system instructions, like a Gemini 1.5 model
val generativeModel = Firebase.vertexAI.generativeModel(
  modelName = remoteConfig.getString("model_name"),
  systemInstruction = content { text(remoteConfig.getString("system_instructions")) }
)

// To generate text output, call generateContent with the text input
val response = generativeModel.generateContent(remoteConfig.getString("prompt"))
print(response.text)

Java

// Initialize FirebaseVertexAI instance
// Optionally specify a location in which to run the service and access the model
FirebaseVertexAI vertexAI = FirebaseVertexAI.getInstance(remoteConfig.getString("vertex_location"));

// Initialize the Vertex AI service and the generative model
// Specify a model that supports system instructions, like a Gemini 1.5 model
GenerativeModel gm = FirebaseVertexAI.getInstance().generativeModel(
  /* modelName */ remoteConfig.getString("model_name"),
  /* generationConfig (optional) */ null,
  /* safetySettings (optional) */ null,
  /* requestOptions (optional) */ new RequestOptions(),
  /* tools (optional) */ null,
  /* toolsConfig (optional) */ null,
  /* systemInstruction (optional) */ new Content.Builder().addText(remoteConfig.getString("system_instructions")).build()
);
GenerativeModelFutures model = GenerativeModelFutures.from(gm);

// Provide a prompt that contains text
Content userPrompt = new Content.Builder()
 addText(remoteConfig.getString("prompt"))
 build();

// To generate text output, call generateContent with the text input
ListenableFuture<GenerateContentResponse> response = model.generateContent(userPrompt);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
  @Override
  public void onSuccess(GenerateContentResponse result) {
    String resultText = result.getText();
    System.out.println(resultText);
  }

  @Override
  public void onFailure(Throwable t) {
    t.printStackTrace();
  }
}, executor);

ステップ 7: アプリを実行する

アプリをビルドして実行し、動作することを確認します。Firebase コンソールの Remote Config ページで構成を変更し、変更を公開して結果を確認します。

次のステップ