在服务器环境中使用 Remote Config

Firebase Remote Config 现在支持使用 Firebase Admin Node.js SDK 12.1.0 及更高版本进行服务器端配置。有了这项新功能,您就可以使用 Remote Config 动态管理服务器端应用的行为和配置。这包括 Cloud Functions 等无服务器实现。

Firebase 客户端 SDK 会从 Remote Config 模板中提取特定于客户端的配置,而服务器端 Remote Config SDK 会从 Firebase 下载完整的 Remote Config 模板。然后,您的服务器可以使用每个传入请求评估模板,并使用自己的逻辑以非常低的延迟提供自定义响应。

借助服务器端 Remote Config,您可以:

  • 为在服务器上运行的应用或通过服务器访问的应用定义配置参数,以支持远程配置 AI 模型参数和提示以及其他集成等用例,以确保 API 密钥始终安全。
  • 动态调整参数以适应环境变化或其他应用变化,如更新 LLM 参数和模型端点。
  • 通过远程更新服务器调用的 API 来控制费用。
  • 为访问服务器的客户端即时生成自定义配置。
  • 记录哪些客户端收到了参数值,并在 Cloud Functions 中将其用作权限验证系统的一部分。

您可以在 Cloud Run、Cloud Functions 或自托管的服务器环境中部署服务器端 Remote Config。

准备工作

按照将 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 只需一步即可提取和加载模板:

    // Initialize server-side Remote Config
    const rc = getRemoteConfig(firebaseApp);
    const template = await rc.getServerTemplate();
    
  2. 如需确保您的应用在与 Remote Config 后端服务器的连接中断时也能成功运行,请将每个参数的默认值添加到您的应用。为此,请在 initServerTemplategetServerTemplate 模板函数内添加一个 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 安装 ID 设置为 randomizationId 或用户 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 部署代码。例如,假设您有一个应用包含由生成式 AI API(如 Google AI 或 Vertex AI)提供支持的角色对话。在这种情况下,您可以将 LLM 服务逻辑托管在应用按需调用的函数中。

如果您的应用需要长时间运行(例如,包含资源的 Web 应用),您可以考虑使用 Cloud Run。如需使用 Cloud Run 部署服务器应用,请按照快速入门:将 Node.js 服务部署到 Cloud Run 中的指南操作。

如需详细了解 Cloud Run 和 Cloud Functions 的最佳用例,请参阅 Cloud Functions 与 Cloud Run:何时相得益彰