欢迎回到“构建智能 Android 应用”系列博文,我们将在此系列博文中介绍如何将基本的 Android 应用转变为个性化、智能且智能体驱动的体验。在我们的 上一篇博文 中,我们探讨了如何通过机器学习套件的 Prompt API 使用 Gemini Nano 构建智能设备端功能。
在这篇博文中,我们将介绍如何利用 Firebase AI Logic 构建云端托管和混合 AI 功能:
- 根据真实世界情境提供答案
- 使用混合推理在云端执行和本地执行之间动态路由请求
- 使用自定义路由系统翻译内容
有时,用例需要具有更多世界知识、更大的上下文窗口或处理复杂查询的能力的 AI 模型。在这些情况下,我们可以利用云端模型。
在其他情况下,您可能希望兼具两者的优势:在可用时使用混合推理在设备端运行以降低成本,同时回退到云端以确保所有设备的兼容性。
下面我们来看看如何在 Jetpacker 中实现三个云端功能和混合功能:
- 具有网络接地功能的博物馆助理
- 混合餐厅评价草稿
- 具有自定义路由实时翻译功能的酒店支持聊天。
使用 LLM 接地获取最新信息具有 LLM 接地功能的博物馆助理聊天机器人
博物馆助理 是一款交互式聊天机器人,旨在帮助用户规划博物馆参观行程。它为游客提供有关特定展品、当前开放时间、门票价格等的最新详细信息。
在构建 AI 功能时,让模型回答新鲜、准确且具体的真实世界信息是一项常见挑战。虽然云端模型拥有大量世界知识,但它们可能不知道季节性展品或当天的开放时间。
为了弥合这一差距,我们可以使用接地技术向模型的上下文窗口添加额外的上下文。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)
混合推理:使用 Google 地图深层链接生成设备端评价
并非每个 AI 任务都需要云端模型,也并非每个设备都处于在线状态。为了帮助开发者平衡延迟时间、费用和离线可用性,我们最近推出了 Firebase API for Hybrid Inference。
在 Jetpacker 中,餐厅评价 功能允许用户评价所选主题并自动起草评价。为了让所有用户都能使用此功能,我们优先使用 Gemini Nano 在本地执行,并在不支持 Gemini Nano 的设备上回退到云端模型。
// 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 酒店的回答采用法语),因此我们需要将消息翻译成用户的首选语言。
虽然混合模型可以配置简单的路由偏好设置,但复杂的情况需要自定义路由逻辑。在 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 开发的信息?请在 YouTube 或 LinkedIn 上关注 Android Developers!
本博文中的所有代码段均遵循以下版权声明:
Copyright 2026 Google LLC. SPDX-License-Identifier: Apache-2.0
-
操作指南欢迎回到“构建智能 Android 应用”系列博文,我们将在此系列博文中介绍如何将基本的 Android 应用转变为个性化、智能且智能体驱动的体验。在上一篇博文中,我们介绍了 Jetpacker,这是我们将在本系列博文中使用的演示版应用。
Caren Chang • 6 分钟阅读时间 -
操作指南Jetpacker 是一款技术展示应用,由我们的团队从头开始构建,用于今年的 Google I/O 大会(使用 Antigravity 构建)。Jetpacker 的核心功能是帮助用户规划、探索和享受下一次大型冒险之旅。
Jolanda Verhoef • 4 分钟阅读时间 -
操作指南欢迎回到“构建智能 Android 应用”系列博文,我们将在此系列博文中介绍如何将基本的 Android 应用转变为个性化、智能且智能体驱动的体验。在上一篇博文中,我们探讨了如何利用 Firebase AI Logic 构建云端托管和混合 AI 功能。
Ben Weiss • 6 分钟阅读时间
每周通过电子邮件接收最新的 Android 开发洞见 每周。