使用 Firebase 遠端設定,在 Firebase 應用程式中動態更新 Vertex AI

使用 Vertex AI in Firebase SDK 從應用程式呼叫 Gemini API 時,您的要求會包含多個參數,用於控制生成式 AI 回應。這些通常包括模型名稱、模型生成設定 (最大符記、溫度等)、安全設定、系統指示和提示資料。

在大多數情況下,您都會根據需求或在多種情況下視需要變更這些設定:

  • 無須發布新版應用程式,即可更新生成式 AI 模型。您可以在舊版停用前升級至較新的穩定模型版本,也可以根據使用者的需要和屬性,改用成本較低或效能較高的模型,或是有條件地將最新的最佳模型部署至特定使用者區隔 (例如 Beta 版測試人員)。
  • 設定模型的存取位置,讓模型更靠近使用者。
  • 進行 A/B 測試,針對不同的系統指示和提示進行測試,然後逐步向使用者推出最佳實驗值。
  • 使用功能旗標,快速在應用程式中顯示或隱藏生成式 AI 功能。

Firebase Remote Config 可執行上述所有操作,甚至更多,讓您可以視需要更新參數值,並有條件地針對符合您在 Firebase 控制台中設定的特性的應用程式執行個體進行更新,而無須發布新版應用程式。

本解決方案指南提供特定建議用途,並說明如何在生成式 AI 應用程式中加入 Remote Config

跳至程式碼導入程序

為什麼要將 Firebase Remote Config 與應用程式搭配使用?

Firebase Remote Config 可讓您動態調整應用程式的行為,而無需更新應用程式。對於使用生成式 AI 的應用程式而言,這項功能特別實用,因為這類應用程式需要快速迭代和精細調整。

Remote Config 與生成式 AI 應用程式的重要用途

建議您將 Remote ConfigVertex AI in Firebase 搭配使用,以便支援下列必要用途:

  • 無須更新應用程式,即可升級至最新模型版本:使用 Remote Config 參數視需要變更模型名稱,這樣一來,您就能在可用時立即升級至所需的最新 Gemini 模型版本。
  • 不需更新應用程式即可更新系統指示和安全設定:請將系統指示和安全設定儲存在 Remote Config 參數中,以確保在部署後發現問題時,可視需要變更這些設定。
  • 降低風險並確保 AI 安全性:使用Remote Config Rollouts,安全地逐步向 iOS 和 Android 使用者發布生成式 AI 變更。

Remote Config 搭配生成式 AI 應用程式的進階和建議用途

使用 Remote ConfigGoogle Analytics 檢測應用程式後,您可以探索進階用途:

  • 根據用戶端位置設定位置:使用 Remote Config 條件,根據用戶端偵測到的所在位置設定模型的位置
  • 嘗試不同的模型:快速測試各種生成式 AI 模型,並在不同使用者區隔中切換模型,找出最適合您特定用途的模型。
  • 改善模型效能:微調模型參數,例如系統提示、輸出符記上限、溫度和其他設定。
  • 根據使用者屬性使用不同的系統指示、提示和模型設定:當您將 Remote ConfigGoogle Analytics 搭配使用時,可以根據使用者屬性或自訂目標對象建立條件,並根據這些屬性設定不同的參數。

    舉例來說,如果您使用生成式 AI 在應用程式中提供技術支援,建議您設定應用程式平台專屬的系統操作說明,確保 Android、iOS 和網頁平台使用者都能獲得正確的操作說明。

  • 為每位使用者提供個人化體驗:使用 Remote Config 個人化功能,自動為每位使用者決定最佳生成式 AI 設定。

  • 控管成本:從遠端調整要呼叫的生成式 AI 模型、這些模型的使用頻率,並根據使用者目標對象動態設定最大輸出符記值,以減少不必要的成本。

  • 改善應用程式體驗和成效:在 iOS、Android 和 Flutter 應用程式中使用 A/B Testing 搭配 Remote 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. 設定新的或現有的 Firebase 專案,包括使用 Blaze 定價方案和啟用必要的 API。
    2. 將應用程式連結至 Firebase,包括註冊應用程式,以及將 Firebase 設定新增至應用程式。
    3. 新增 SDK,並在應用程式中初始化 Vertex AI 服務和生成式模型。
  • 在專案中啟用 Google Analytics,並將其 SDK 新增至應用程式 (這是設定條件式指定目標的必要條件,例如根據用戶端裝置的位置設定服務和模型的位置)。

步驟 1:在 Firebase 控制台中設定參數值

建立用戶端 Remote Config 範本,並設定要在應用程式中擷取及使用的參數和值。

  1. Firebase 控制台中開啟 Firebase 專案,然後在導覽選單中展開「Run」,並選取「Run」Remote Config
  2. 確認您已在 Remote Config 頁面頂端的「Client/Server」選取器中選取「Client」
    • 如果這是您第一次使用 Remote Config 用戶端範本,請按一下「建立設定」。「Create your first parameter」窗格隨即顯示。
    • 如果您之前曾使用過 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 範本,請查看變更內容,然後再次按一下「Publish changes」

步驟 2:在應用程式中新增及初始化 Remote Config SDK

新增 Remote Config 依附元件,並在應用程式中設定 Remote Config

  1. Remote Config 依附元件新增至模組 (應用程式層級) Gradle 檔案 (通常為 app/build.gradle.ktsapp/build.gradle):

    dependencies {
        implementation(platform("com.google.firebase:firebase-bom:33.7.0"))
        implementation("com.google.firebase:firebase-vertexai")
        implementation("com.google.firebase:firebase-config")
        // ... other dependencies
    }
    
  2. Remote Config 新增至主要應用程式邏輯。在此,您將初始化 Remote Config 並新增最小擷取間隔:

    Kotlin

    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);
    

在這個範例中,預設擷取間隔為 3600 秒,但我們建議您在開發期間,在程式碼中設定較低的擷取間隔。

步驟 3:設定應用程式內參數值

您應在 Remote Config 物件中設定應用程式內的預設參數值。這可確保即使應用程式無法從 Remote Config 服務擷取值,也能正常運作。

  1. Firebase 主控台中開啟 Remote Config
  2. 在「參數」分頁中,開啟「選單」,然後選取「下載預設值」
  3. 系統提示時,請啟用「.xml (適用於 Android)」,然後點選「下載檔案」
  4. 將檔案儲存在應用程式的 XML 資源目錄中。
  5. 更新主要活動檔案,在先前新增的 configSettings 後方新增預設值:

    Kotlin

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

    Java

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

步驟 4:擷取並啟用值

設定預設值後,請加入下列程式碼,擷取並啟用值:

Kotlin

// 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

      // 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

// 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 頁面變更設定、發布變更,然後驗證結果。

後續步驟