方法指南

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

阅读用时:8 分钟

欢迎回到“构建智能 Android 应用”系列博文,我们将在此系列中介绍如何将基本的 Android 应用转变为个性化智能化代理式体验。在上一篇博文中,我们探讨了如何通过 ML Kit 的 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 地图位置数据。

在 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

在 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"
    )

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

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

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

  • 语言识别:使用设备端 机器学习套件 语言识别 API,我们可以检测收到的消息所用的语言。
  • 设备端翻译 (Gemini Nano):借助 ML Kit 的 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 调用的安全性,我们集成了 Firebase App Check,同时使用 Play Integrity(正式版)和本地调试提供方(用于本地开发或模拟器)。

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 混合推理 API

了解详情

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

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

想详细了解 Android 开发?欢迎在 YouTubeLinkedIn 上关注 Android 开发者!

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

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