操作指南

构建智能 Android 应用:云端推理和混合推理

8 分钟阅读时间

欢迎回到“构建智能 Android 应用”系列博文,我们将在此系列博文中介绍如何将基本的 Android 应用转变为个性化智能智能体驱动的体验。在我们的 上一篇博文 中,我们探讨了如何通过机器学习套件的 Prompt API 使用 Gemini Nano 构建智能设备端功能。

在这篇博文中,我们将介绍如何利用 Firebase AI Logic 构建云端托管和混合 AI 功能:

  • 根据真实世界情境提供答案
  • 使用混合推理在云端执行和本地执行之间动态路由请求
  • 使用自定义路由系统翻译内容

有时,用例需要具有更多世界知识、更大的上下文窗口或处理复杂查询的能力的 AI 模型。在这些情况下,我们可以利用云端模型。

在其他情况下,您可能希望兼具两者的优势:在可用时使用混合推理在设备端运行以降低成本,同时回退到云端以确保所有设备的兼容性。

features.png
Jetpacker 中的云端功能和混合功能:具有网络接地功能的博物馆助理、具有混合餐厅评价草稿功能的酒店支持聊天,以及具有自定义路由实时翻译功能的酒店支持聊天。

下面我们来看看如何在 Jetpacker 中实现三个云端功能和混合功能:

  • 具有网络接地功能的博物馆助理
  • 混合餐厅评价草稿
  • 具有自定义路由实时翻译功能的酒店支持聊天。

使用 LLM 接地获取最新信息具有 LLM 接地功能的博物馆助理聊天机器人

博物馆助理 是一款交互式聊天机器人,旨在帮助用户规划博物馆参观行程。它为游客提供有关特定展品、当前开放时间、门票价格等的最新详细信息。

museum_assistant_upscaled.png
博物馆助理是一款聊天机器人,可回答“如何获得卢浮宫门票折扣?”等问题

在构建 AI 功能时,让模型回答新鲜、准确且具体的真实世界信息是一项常见挑战。虽然云端模型拥有大量世界知识,但它们可能不知道季节性展品或当天的开放时间。

grounding.png
接地数据会添加到上下文窗口,使模型能够正确、准确地回答问题。

为了弥合这一差距,我们可以使用接地技术向模型的上下文窗口添加额外的上下文。Firebase AI Logic SDK 支持三种类型的接地:

  • 网址接地: 使用特定网页(例如当前门票价格或博物馆规则)的内容来接地回答。
  • Google 搜索接地: 让模型查询实时 Google 搜索索引以获取最新详细信息。
  • Google 地图接地: 使用 Google 地图位置数据。

在 Jetpacker 中,我们会根据已启用的功能标志动态构建可用工具,并使用 Firebase AI SDK 初始化生成模型:

// implementation("com.google.firebase:firebase-ai-logic")

private var toolList = mutableListOf<Tool>()

init {
    if (ENABLE_SEARCH_GROUNDING) {
        toolList.add(Tool.googleSearch())
    }
    if (ENABLE_URL_GROUNDING) {
        toolList.add(Tool.urlContext())
    }
}

private val generativeModel = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "gemini-3-flash",
        systemInstruction = content {
            text("You are a helpful museum assistant answering questions about a museum. Use plain text.")
        },
        tools = toolList
    )

当用户查询助理时,如果启用了网址接地,我们会将特定的博物馆资源网址直接附加到提示中:

val groundingText = if (FeatureFlags.ENABLE_URL_GROUNDING) {
    "\n If the following message above is about the rules and terms to visit Le Louvre, " +
    "if needed answer this urls ${urlList.joinToString()}"
} else {
    ""
}

val prompt = "$text $groundingText"

var response = chat.sendMessage(prompt)

并非每个 AI 任务都需要云端模型,也并非每个设备都处于在线状态。为了帮助开发者平衡延迟时间、费用和离线可用性,我们最近推出了 Firebase API for Hybrid Inference

在 Jetpacker 中,餐厅评价 功能允许用户评价所选主题并自动起草评价。为了让所有用户都能使用此功能,我们优先使用 Gemini Nano 在本地执行,并在不支持 Gemini Nano 的设备上回退到云端模型。

review_upscaled.png
餐厅评价功能使用混合推理根据主题起草评价
// implementation("com.google.firebase:firebase-ai-logic")
// implementation("com.google.firebase:firebase-ai-ondevice:16.0.0-beta03")


// Initialize the model with hybrid routing configuration
val reviewModel = Firebase.ai.generativeModel(
    modelName = "gemini-3.1-flash-lite",
    onDeviceConfig = OnDeviceConfig(
        inferenceMode = InferenceMode.PREFER_ON_DEVICE
    )
)

Hybrid Inference API 支持四种不同的路由模式:

  • PREFER_ON_DEVICE: 优先在本地执行,如果 Gemini Nano 不可用,则回退到云端。
  • PREFER_IN_CLOUD: 优先在云端执行,如果设备离线,则回退到设备端。
  • ONLY_ON_DEVICE: 将执行严格限制在设备端。
  • ONLY_IN_CLOUD: 将执行严格限制在云端。

生成评价后,我们会将其复制到剪贴板,并使用 intent 直接打开 Google 地图中的餐厅评价页面,从而提供无缝的用户体验:

private fun copyAndOpenMapsReview(context: Context, reviewText: String, placeId: String) {
    val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
    val clip = ClipData.newPlainText("User Review", reviewText)
    clipboard.setPrimaryClip(clip)

    val uri = Uri.parse("https://search.google.com/local/writereview/mobile?placeid=$placeId")
    val intent = Intent(Intent.ACTION_VIEW, uri).apply {
        setPackage("com.google.android.apps.maps")
    }
    context.startActivity(intent)
}

自定义混合路由:使用模拟角色进行酒店支持聊天翻译

酒店支持聊天 功能旨在让用户确定物流并查看酒店详细信息。此功能使用系统说明来配置本地化接待员助理。通过在说明中传递特定信息(例如首选语言和酒店信息),我们可以设置代表特定酒店的对话角色。

private val generativeModel = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        systemInstruction = content {
            text("""
              You are a helpful hotel receptionist at $hotelName only speaking $language. 
              Answer politely in $language. The bar closes at 10pm and breakfast is from 7am to 10am.
              There's someone at the desk 24/7. You can retrieve your luggage from the storage room 
              at the back of the lobby at any time.
              """)
        },
        modelName = "gemini-3-flash-preview"
    )

由于接待员的回答采用酒店的当地语言(例如,巴黎 Le Meurice 酒店的回答采用法语),因此我们需要将消息翻译成用户的首选语言。

translation_upscaled.png
酒店支持聊天消息会自动翻译成用户的首选语言 

虽然混合模型可以配置简单的路由偏好设置,但复杂的情况需要自定义路由逻辑。在 Jetpacker 中,我们实现了一个自定义路由堆栈,其中考虑了以下因素:

  • 语言识别: 使用设备端 机器学习套件语言识别 API,我们可以检测收到的消息的语言。
  • 设备端翻译 (Gemini Nano)借助机器学习套件的 Prompt API,我们可以直接在设备端翻译常见语言对,从而节省带宽和云端费用。
  • 云端翻译 (Gemini 3 Flash): 对于更复杂的语言,我们使用 Gemini Flash 3 来获得更高质量的翻译。
// implementation("com.google.android.gms:play-services-mlkit-language-id:17.0.0") 

// ML Kit for Language Identification (powered by Google Play Services)
private val languageIdentifier = LanguageIdentification.getClient()

// On-device translator model (prefer Gemini Nano) for translating common language pairs
private val hybridTranslationModel = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "gemini-3-flash",
        onDeviceConfig = OnDeviceConfig(mode = InferenceMode.PREFER_ON_DEVICE)
    )

// Cloud translator model for more complex language pairs
private val cloudTranslationModel = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "gemini-3-flash"
    )

当需要翻译消息时,我们会识别源语言并应用自定义路由逻辑,在设备端或云端执行翻译:

fun translateMessage(message: SupportChatMessage) {
    viewModelScope.launch {
        // 1. Detect language using ML Kit Language Identification
        val sourceLang = try {
            Tasks.await(languageIdentifier.identifyLanguage(message.text))
        } catch (e: Exception) {
            "Undefined"
        }

        // 2. Custom routing: we've verified the translation quality for English and Korean with Gemini Nano, and will translate message on-device for those two languages
        val routeToCloud = sourceLang != "en" && sourceLang != "kr"

        val prompt = "Translate the following text to $selectedLanguage. Just return the translated sentence: ${message.text}."

        val (translatedText, routePrefix) = if (routeToCloud) {
            val result = cloudTranslationModel.generateContent(prompt)
            result.text to "[Cloud]"
        } else {
            val result = hybridTranslationModel.generateContent(prompt)
            result.text to "[On-Device]"
        }

        if (translatedText != null) {
            _translations.update { current ->
                current + (message.id to "$routePrefix: $translatedText")
            }
        }
    }
}

在此示例中,自定义路由逻辑仅考虑翻译的源语言和目标语言。不过,根据应用的使用场景,您可以扩展路由逻辑,以包含其他因素,例如设备端模型版本、网络连接、电池状态等。

保护 AI 管道:Firebase App Check

最后,在云端使用 AI 会带来 API 密钥滥用或未经授权的结算的可能性。为了保护 API 调用,我们使用 Play Integrity(正式版)和本地调试提供程序(用于本地开发或模拟器)集成了 Firebase App Check

JetPackerApplication.kt 文件中,我们在启动时安装调试提供程序,并触发匿名身份验证以建立安全的用户会话:

//  implementation("com.google.firebase:firebase-appcheck-playintegrity") 
//  implementation("com.google.firebase:firebase-appcheck-debug")  
//  implementation("com.google.firebase:firebase-auth") 

override fun onCreate() {
    super.onCreate()
    Firebase.initialize(context = this)
    Firebase.appCheck.installAppCheckProviderFactory(
        DebugAppCheckProviderFactory.getInstance()
    )
    Firebase.auth.signInAnonymously()
}

在模拟器上进行本地构建时,App Check 会将本地令牌密钥输出到 logcat:

Enter this debug secret into the allow list in the Firebase Console: a8c2dd4c-xxxx-xxxx-xxxx-ef6c114ba27e

在 Firebase 控制台中注册后,本地请求会由 App Check 进行全面验证和身份验证,从而保护我们的后端,同时允许我们在本地测试应用。

总结

通过将云端模型功能(接地、系统说明)与设备端功能(混合路由、翻译、安全应用检查)相结合,我们创建了一款智能、安全且可离线使用的旅行应用。

在 GitHub 上查看 Jetpacker 的完整源代码,并探索 Firebase 文档以开始使用:

Firebase AI Logic 文档
Firebase Hybrid Inference API

了解详情

查看本系列博文的其他部分:

第 1 部分: 应用简介和概览。
第 2 部分:设备端智能。深入了解机器学习套件的生成式 AI API 和 Gemini Nano,以构建隐私至上的功能,例如行程摘要、收据解析和本地音频处理。
第 3 部分(本博文!)混合推理和云端推理。了解如何使用 Firebase AI Logic 根据真实世界数据(例如 Google 地图和网络上下文)接地 LLM 回答。
第 4 部分 系统集成。使用 AppFunctions 与 Android 智能系统集成。
第 5 部分(即将推出): 应用内智能体驱动的工作流。使用 A2UI 和 ADK 扩展应用,打造端到端预订助理。

想了解更多有关 Android 开发的信息?请在 YouTubeLinkedIn 上关注 Android Developers!

本博文中的所有代码段均遵循以下版权声明:

Copyright 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0
Written by:
继续阅读