在 Android 应用中构建混合体验,使用设备端模型和云端托管模型


您可以使用 Firebase AI Logic 通过混合推理构建 AI 赋能的 Android 应用和功能。混合推理支持在可用时使用设备端模型运行推理,否则无缝回退到云托管模型(反之亦然)。

本页介绍了如何开始使用客户端 SDK,并展示了其他配置选项和功能。

请注意,使用 Firebase AI Logic SDK v17.10.0+ (BoM v34.10.0+) 并在特定设备上运行的 Android 应用支持通过 Firebase AI Logic 进行设备端推理。 它受机器学习套件条款以及机器学习套件生成式 AI 方面的特定条款约束。

推荐的使用场景和支持的功能

推荐的用例

  • 使用设备端模型进行推理具有以下优势:

    • 隐私保护更完善
    • Local Context
    • 免费推理
    • 离线功能
  • 使用混合功能可提供:

    • 通过适应设备端模型的可用性和互联网连接,覆盖更多受众群体

设备端推理支持的功能和特性

设备端推理仅支持单轮文本生成(而非对话),并提供流式或非流式输出。它支持以下文本生成功能:

请务必查看本页底部的设备端推理尚不可用的功能列表。

准备工作

请注意以下几点:

支持的 Android 设备及其设备端模型

对于设备端推理(使用机器学习套件中的 Prompt API),您可以在机器学习套件文档中找到支持的设备及其设备端模型的列表。

开始使用

这些入门步骤介绍了您要发送的任何受支持提示请求所需的一般设置。

第 1 步:设置 Firebase 项目并将您的应用连接到 Firebase

  1. 登录 Firebase 控制台,然后选择您的 Firebase 项目。

  2. 在 Firebase 控制台中,依次前往 AI 服务 > AI Logic。

  3. 点击开始,启动引导式工作流,帮助您为项目设置所需的 API 和资源。

  4. 如果系统提示,请按照屏幕上的说明注册您的应用,并将 Firebase 配置添加到您的应用中。

  5. 当系统要求您选择“Gemini API 提供方”时,我们建议您选择 Gemini Developer API,这样您就可以免费快速开始使用。

    之后,您可以随时设置 Agent Platform Gemini API (formerly Vertex AI)(及其结算要求)。

  6. 继续执行工作流,为 Firebase AI Logic 设置所需的 API 和关联服务。

    工作流的这一阶段会自动 为 AI Logic 强制执行 Firebase App Check, 这是一项关键服务,可在从应用直接访问 时帮助保护 Gemini API。在开始使用时(请参阅本指南后面 的步骤),您需要为本地开发配置 App Check 调试提供程序 ,以便在强制执行 App Check 时使用。

  7. 继续执行本指南中的下一步,将所需的 SDK 添加到您的应用中。

第 2 步:添加所需的 SDK

Firebase AI Logic SDK for Android (firebase-ai) 以及 Firebase AI Logic On-Device SDK (firebase-ai-ondevice) 提供了用于与生成模型交互的 API。

在模块(应用级)Gradle 文件(例如 <project>/<app-module>/build.gradle.kts)中,为 Android 添加 Firebase AI Logic 和 App Check 库的依赖项:

Kotlin

dependencies {
  // ... other androidx dependencies

  // Add the dependencies for the Firebase AI Logic and App Check libraries
  // Note that the on-device SDK is not yet included in the Firebase Android BoM
  implementation("com.google.firebase:firebase-ai:18.1.0")
  implementation("com.google.firebase:firebase-ai-ondevice:16.0.0-beta07")
  implementation("com.google.firebase:firebase-appcheck-debug:20.0.0")
}

Java

对于 Java,您需要添加两个额外的库。

dependencies {
  // ... other androidx dependencies

  // Add the dependencies for the Firebase AI Logic and App Check libraries
  // Note that the on-device SDK is not yet included in the Firebase Android BoM
  implementation("com.google.firebase:firebase-ai:18.1.0")
  implementation("com.google.firebase:firebase-ai-ondevice:16.0.0-beta07")
  implementation("com.google.firebase:firebase-appcheck-debug:20.0.0")

  // Required for one-shot operations (to use `ListenableFuture` from Guava Android)
  implementation("com.google.guava:guava:31.0.1-android")

  // Required for streaming operations (to use `Publisher` from Reactive Streams)
  implementation("org.reactivestreams:reactive-streams:1.0.4")
}

第 3 步:为本地开发配置 App Check 调试提供程序

在控制台中,作为 AI Logic 的引导式设置工作流的一部分,系统会自动强制执行 Firebase App Check,以保护 Gemini API。对于本地开发,您需要配置 App Check 调试提供程序,以绕过证明,同时仍保持 App Check 的强制执行。

  1. 在调试 build 中,将 App Check 配置为使用调试提供方工厂:

    Kotlin

    Firebase.initialize(context = this)
    Firebase.appCheck.installAppCheckProviderFactory(
        DebugAppCheckProviderFactory.getInstance(),
    )
    

    Java

    FirebaseApp.initializeApp(/*context=*/ this);
    FirebaseAppCheck firebaseAppCheck = FirebaseAppCheck.getInstance();
    firebaseAppCheck.installAppCheckProviderFactory(
            DebugAppCheckProviderFactory.getInstance());
    
  2. 获取调试令牌:

    1. 在模拟器中或在测试设备上运行应用。

    2. 在日志中查找 App Check 调试令牌。例如:

      D DebugAppCheckProvider: Enter this debug secret into the allow list
      in the Firebase Console for your project: 123a4567-b89c-12d3-e456-789012345678
      
    3. 复制令牌(例如 123a4567-b89c-12d3-e456-789012345678)。

  3. 向 App Check 注册调试令牌:

    1. 在 Firebase 控制台中,前往安全性 > App Check > 应用标签页。

    2. 找到您的应用,点击溢出菜单 (),然后选择管理调试令牌。

    3. 按照屏幕上的说明注册调试令牌。

如需详细了解调试提供程序(包括如何获取新的调试令牌),请参阅官方 App Check 文档。

第 4 步:检查设备端模型是否可用

使用 FirebaseAIOnDevice 检查设备端模型是否可用,如果不可用,则下载该模型。

下载后,AICore 会自动使模型保持最新状态。如需详细了解 AICore 以及如何管理设备端模型下载,请参阅代码段后面的说明。

Kotlin

val status = FirebaseAIOnDevice.checkStatus()
when (status) {
  OnDeviceModelStatus.UNAVAILABLE -> {
    Log.w(TAG, "On-device model is unavailable")
  }

  OnDeviceModelStatus.DOWNLOADABLE -> {
    FirebaseAIOnDevice.download().collect { status ->
      when (status) {
        is DownloadStatus.DownloadStarted ->
          Log.w(TAG, "Starting download - ${status.bytesToDownload}")

        is DownloadStatus.DownloadInProgress ->
          Log.w(TAG, "Download in progress ${status.totalBytesDownloaded} bytes downloaded")

        is DownloadStatus.DownloadCompleted ->
          Log.w(TAG, "On-device model download complete")

        is DownloadStatus.DownloadFailed ->
          Log.e(TAG, "Download failed ${status}")
      }
    }
  }
  OnDeviceModelStatus.DOWNLOADING -> {
    Log.w(TAG, "On-device model is being downloaded")
  }

  OnDeviceModelStatus.AVAILABLE -> {
    Log.w(TAG, "On-device model is available")
  }
}

Java

Checking for, downloading, and warming up the model is not yet available for Java.

However, all other APIs and interactions in this guide are available for Java.

关于下载设备端模型,请注意以下几点:

  • 下载设备端模型所需的时间取决于许多因素,包括您的网络。

  • 如果您的代码使用设备端模型进行主要推理或后备推理,请确保在应用生命周期的早期下载该模型,以便在最终用户遇到应用中的代码之前,设备端模型已可用。

  • 如果在发出设备端推理请求时设备端模型不可用,SDK 不会自动触发设备端模型的下载。SDK 将回退到云托管模型或抛出异常(请参阅有关推理模式行为的详细信息)。

  • AICore(一项 Android 系统服务)会为您管理下载的模型和版本、使模型保持最新状态等。请注意,设备只会下载一个模型,因此,如果设备上的其他应用之前已成功下载设备端模型,则此检查将返回模型可用。

延迟时间优化

如需针对首次推理调用进行优化,您可以让应用调用 onDeviceExtension?.warmUp()(目前仅适用于 Kotlin)。这会将设备端模型加载到内存中,并初始化运行时组件。

第 5 步:初始化服务并创建模型实例

点击您的 Gemini API 提供商,以查看此页面上特定于提供商的内容和代码。

在向模型发送提示请求之前,请先完成以下设置。

  1. 为您选择的 API 提供方初始化服务。

  2. 创建 GenerativeModel 实例,并将 mode 设置为以下值之一。此处的说明非常简略,但您可以在设置推理模式中详细了解这些模式的行为。

    • PREFER_ON_DEVICE:尝试使用设备端模型;否则,回退到云托管模型。

    • ONLY_ON_DEVICE:尝试使用设备端模型; 否则,抛出异常。

    • PREFER_IN_CLOUD:尝试使用云托管模型;否则,回退到设备端模型。

    • ONLY_IN_CLOUD:尝试使用云托管模型;否则,抛出异常。

Kotlin

// Using this SDK to access on-device inference is an Experimental release and requires opt-in
@OptIn(PublicPreviewAPI::class)

// ...

// Initialize the Gemini Developer API backend service
// Create a GenerativeModel instance with a model that supports your use case
// Set the inference mode (like PREFER_ON_DEVICE to use the on-device model if available)
val model = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "CLOUD_MODEL_NAME",
        onDeviceConfig = OnDeviceConfig(mode = InferenceMode.PREFER_ON_DEVICE)
    )

Java

// Initialize the Gemini Developer API backend service
// Create a GenerativeModel instance with a model that supports your use case
// Set the inference mode (like PREFER_ON_DEVICE to use the on-device model if available)
GenerativeModel ai = FirebaseAI.getInstance(GenerativeBackend.googleAI())
    .generativeModel(
        "CLOUD_MODEL_NAME",
        new OnDeviceConfig(InferenceMode.PREFER_ON_DEVICE)
    );

// Use the GenerativeModelFutures Java compatibility layer which offers
// support for ListenableFuture and Publisher APIs
GenerativeModelFutures model = GenerativeModelFutures.from(ai);

第 6 步:向模型发送提示请求

本部分介绍了如何发送各种类型的输入以生成不同类型的输出,包括:

根据纯文本输入生成文本

在尝试此示例之前,请确保您已完成本指南的入门部分。

您可以使用 generateContent() 根据包含文本的提示生成文本:

Kotlin

// Imports + initialization of Gemini API backend service + creation of model instance

// Provide a prompt that contains text
val prompt = "Write a story about a magic backpack."

// To generate text output, call generateContent with the text input
val response = model.generateContent(prompt)
print(response.text)

Java

// Imports + initialization of Gemini API backend service + creation of model instance

// Provide a prompt that contains text
Content prompt = new Content.Builder()
    .addText("Write a story about a magic backpack.")
    .build();

// To generate text output, call generateContent with the text input
ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt);
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);

请注意,Firebase AI Logic 还支持使用 generateContentStream(而不是 generateContent)流式传输文本回答。

根据文本和图片(多模态)输入生成文本

在尝试此示例之前,请确保您已完成本指南的入门部分。

您可以使用 generateContent() 根据包含文本和最多一个图片文件(仅限位图)的提示生成文本,并提供每个输入文件的 mimeType 和文件本身。

Kotlin

// Imports + initialization of Gemini API backend service + creation of model instance

// Loads an image from the app/res/drawable/ directory
val bitmap: Bitmap = BitmapFactory.decodeResource(resources, R.drawable.sparky)

// Provide a prompt that includes the image specified above and text
val prompt = content {
  image(bitmap)
  text("What developer tool is this mascot from?")
}

// To generate text output, call generateContent with the prompt
val response = model.generateContent(prompt)
print(response.text)

Java

// Imports + initialization of Gemini API backend service + creation of model instance

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sparky);

// Provide a prompt that includes the image specified above and text
Content content = new Content.Builder()
        .addImage(bitmap)
        .addText("What developer tool is this mascot from?")
        .build();

// To generate text output, call generateContent with the prompt
ListenableFuture<GenerateContentResponse> response = model.generateContent(content);
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);

请注意,Firebase AI Logic 还支持使用 generateContentStream(而不是 generateContent)流式传输文本回答。

你还可以做些什么?

您可以为混合体验使用各种其他配置选项和功能:

设备端推理尚不支持的功能

作为实验性版本,并非所有云模型功能都可用于设备端推理。以下功能尚不适用于设备端推理(但通常适用于基于云的推理)。

  • 正在生成图片

    • 可以回退到云托管模型;不过,ONLY_ON_DEVICE 模式会抛出异常。
  • 根据位图(加载到内存中的图片)以外的图片文件输入类型生成文本

    • 可以回退到云托管模型;不过,ONLY_ON_DEVICE 模式会抛出异常。
  • 根据纯图片文件输入生成文本。对于设备端推理,您必须在多模态请求中提供文本。

    • 可以回退到云托管模型;不过,ONLY_ON_DEVICE 模式会抛出异常。
  • 根据多个图片文件输入生成文本

    • 可以回退到云托管模型;不过,ONLY_ON_DEVICE 模式会抛出异常。
  • 根据输入的音频、视频和文档(例如 PDF)生成文本

    • 可以回退到云托管模型;不过,ONLY_ON_DEVICE 模式会抛出异常。
  • 在多模态请求中使用网址提供文件。对于设备端推理,您必须以位图形式提供单张图片。

    • 如果您使用 fileData (FileDataPart) 提供文件网址,则可以回退到云托管模型(ONLY_ON_DEVICE 模式会抛出异常)。
    • 如果您直接在文本提示词中嵌入网址,系统不会自动回退到云托管模型(设备端模型会忽略嵌入的网址)。
  • 发送超过 4,000 个 token(或大约 3,000 个英文单词)的请求

    • 可以回退到云托管模型;不过,ONLY_ON_DEVICE 模式会抛出异常。
  • 多轮对话

    • 不会自动回退到云托管模型(设备端推理会将提示历史记录串联成单个文本提示词;由于设备端模型不区分角色,并将历史记录视为单个消息,因此其精确度不如云托管模型)。
    • 如果您想使用多轮对话,我们建议您使用 ONLY_IN_CLOUD 模式。
  • 为模型提供工具,帮助其生成回答(例如函数调用、代码执行、网址上下文、依托 Google Search 进行接地以及依托 Google Maps 进行接地)

    • 不会自动回退到云托管模型。如果您想使用工具,我们建议您使用 ONLY_IN_CLOUD 模式。

Firebase 控制台中的 AI 监控不会显示任何设备端推理数据(包括设备端日志)。不过,任何使用云托管模型的推理都可以像通过 Firebase AI Logic 进行的其他推理一样进行监控。

其他限制

除了上述限制之外,设备端推理还具有以下限制(如需了解详情,请参阅机器学习套件文档):

  • 应用的最终用户必须使用受支持的设备才能进行设备端推理。

  • 应用只能在前台运行时执行设备端推理。

  • 目前仅验证了英语和韩语的设备端推理。

  • 整个设备端推理请求的 token 数量上限为 4,000 个。如果您的请求可能会超出此限制,请务必配置可使用云托管模型的推理模式。

  • 我们建议避免需要长输出(超过 256 个词元)的设备端推理用例。

  • AICore(用于管理设备端模型的 Android 系统服务)会强制执行每个应用的推理配额。在短时间内发出过多 API 请求会导致 ErrorCode.BUSY 响应。如果您收到此错误,请考虑使用指数退避算法重试请求。此外,如果应用超出长期配额(例如每日配额),则可能会返回 ErrorCode.PER_APP_BATTERY_USE_QUOTA_EXCEEDED。


就您使用 Firebase AI Logic 的体验提供反馈