使用 Firebase Remote Config 动态更新您的 Vertex AI in Firebase 应用

使用 Vertex AI in Firebase SDK 从应用调用 Gemini API 时,您的请求包含用于控制生成式 AI 回答的多个参数。这些数据通常包括模型名称、模型生成配置(令牌数上限、温度等)、安全设置、系统说明和提示数据。

在大多数情况下,您需要根据需要或在多种情况下进行更改:

  • 无需发布新应用即可更新生成式 AI 模型。您可以在旧版弃用之前升级到较新的稳定版模型,根据用户的需求和属性降级到更低成本或更高性能的模型,或者有条件地向特定细分用户群(例如 Beta 版测试人员)部署最新的模型。
  • 设置您访问模型的位置,以便模型更靠近您的用户。
  • 对不同的系统说明和提示进行 A/B 测试,然后逐步向用户推广效果最佳的实验值。
  • 使用功能标志在应用中快速显示或隐藏生成式 AI 功能。

Firebase Remote Config 可执行上述所有操作,还可让您根据需要更新参数值,并有条件地针对与您在 Firebase 控制台中设置的特征匹配的应用实例更新参数值,而无需发布应用的新版本。

本解决方案指南提供了具体的推荐用例,并介绍了如何将 Remote Config 添加到生成式 AI 应用。

跳转到代码实现

为什么要在应用中使用 Firebase Remote Config

借助 Firebase Remote Config,您无需更新应用即可动态调整应用的行为。对于使用生成式 AI 的应用,这尤其强大,因为快速迭代和微调至关重要。

Remote Config 与生成式 AI 应用的必备用例

我们建议将 Remote ConfigVertex AI in Firebase 搭配使用,以实现以下基本用例:

  • 在不更新应用的情况下升级到最新的模型版本:使用 Remote Config 参数根据需要更改模型名称,以便在首选 Gemini 模型的最新版本可用时立即升级到该版本。
  • 在不更新应用的情况下更新系统说明和安全设置:将系统说明和安全设置存储在 Remote Config 参数中,以确保您在部署后发现问题时可以按需进行更改。
  • 降低风险并强制执行 AI 安全性:使用 Remote Config发布功能,安全地逐步向 iOS 和 Android 用户发布生成式 AI 更改。

Remote Config 与生成式 AI 应用的推荐高级用例

使用 Remote ConfigGoogle Analytics 对应用进行插桩后,您可以探索高级用例:

  • 根据客户端位置设置位置:使用 Remote Config 条件根据客户端的检测到的位置设置模型的位置
  • 试验不同的模型:快速测试各种生成式 AI 模型并在它们之间切换,甚至向不同的用户细分受众群体部署不同的模型,以找到最适合您的具体应用场景的模型。
  • 优化模型性能:微调模型参数,例如系统提示、输出令牌数上限、温度和其他设置。
  • 根据客户端属性使用不同的系统说明、提示和模型配置:将 Remote ConfigGoogle Analytics 搭配使用时,您可以根据客户端属性或自定义受众群体创建条件,并根据这些属性设置不同的参数。

    例如,如果您在应用中使用生成式 AI 提供技术支持,则可能需要设置特定于应用平台的系统说明,以确保向 Android、iOS 和 Web 平台用户提供准确的说明。

  • 为每位用户提供个性化体验:使用 Remote Config 个性化功能自动为每位用户确定最佳生成式 AI 设置。

  • 控制费用:远程调整调用的生成式 AI 模型、这些模型的使用频率,并根据用户受众群体动态配置输出令牌的最大值,以减少不必要的费用。

  • 优化应用体验和成效:将 A/B TestingRemote Config 搭配使用,在 iOS、Android 和 Flutter 应用中测试对生成式 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 项目或一个现有的 Firebase 项目,包括使用 Blaze 定价方案并启用所需的 API。
    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. Remote Config 依赖项添加到您的模块(应用级)Gradle 文件(通常为 app/build.gradle.ktsapp/build.gradle)中:

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

在此示例中,默认提取间隔为 3600 秒,但我们建议您在开发期间在代码中设置相对较短的最小提取间隔。

第 3 步:设置应用内参数值

您应在 Remote Config 对象中设置应用内默认参数值。这样可确保您的应用即使无法从 Remote Config 服务提取值,也能按预期运行。

  1. Firebase 控制台中,打开 Remote Config
  2. 参数标签页中,打开菜单,然后选择下载默认值
  3. 看到提示时,启用 .xml (Android),然后点击下载文件
  4. 将该文件保存在应用的 XML 资源目录中。
  5. 更新主 activity 文件,在您之前添加的 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 步:向 Vertex AI 变量分配 Remote Config

现在,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 页面中更改配置,发布更改,然后验证结果。

后续步骤