歡迎回到「建構智慧型 Android 應用程式」系列網誌文章。我們將以基本的 Android 應用程式為基礎,逐步改造為個人化、智慧型和代理型體驗。在上一篇文章中,我們探討如何透過 ML Kit 的 Prompt API,使用 Gemini Nano 建構智慧型裝置端功能。
在這篇文章中,我們將探討如何運用 Firebase AI Logic 建構雲端代管和混合式 AI 功能:
- 根據真實世界情境提供答案
- 使用混合式推論,在雲端和本機執行之間動態轉送要求
- 使用自訂路徑系統翻譯內容
有時,用例需要具備更豐富世界知識、更大脈絡視窗,或能處理複雜查詢的 AI 模型。在這種情況下,我們可以使用雲端模型。
有時您會希望兩全其美:盡可能使用混合式推論在裝置端執行,以降低成本,同時回歸雲端,確保所有裝置都能相容。
我們來看看如何在 Jetpacker 中實作三項雲端和混合式功能:
- 博物館助理,可根據網頁內容提供資訊
- 混合型餐廳評論草稿
- 飯店支援即時通訊,提供客製化路徑的即時翻譯。
使用 LLM 基礎模型取得最新資訊:博物館助理聊天機器人,採用 LLM 基礎模型
博物館助理 是互動式聊天機器人,可協助使用者規劃博物館參觀行程。為訪客提供特定展覽、目前營業時間、票價等最新詳細資訊。
建構 AI 功能時,如何讓模型提供最新、準確且具體的實際資訊,是常見的挑戰。雲端模型擁有大量世界知識,但可能不知道季節性展覽或當天的營業時間。
為填補這項落差,我們可以運用基礎技術,在模型的脈絡窗口中加入額外脈絡。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 )
使用者查詢 Google 助理時,如果已啟用網址基礎功能,我們會直接在提示中附加特定博物館資源網址:
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:嚴格限制只能在雲端執行。
評論生成後,我們會將其複製到剪貼簿,並使用意圖直接開啟 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 中,我們實作了自訂的路由堆疊,並考量以下因素:
- 語言識別:使用裝置端 ML Kit Language Identification 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 (正式版) 和本機 Debug Provider (適用於本機開發或模擬器)。
在 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 部分:裝置端智慧功能。深入瞭解 ML Kit 的 GenAI API 和 Gemini Nano,建構以隱私權為優先的功能,例如行程摘要、收據剖析和本機音訊處理。
第 3 部分 (本文):混合雲和雲端推理。瞭解如何使用 Firebase AI Logic,根據 Google 地圖和網路環境等真實世界資料,提供 LLM 回覆。
第 4 部分: 系統整合。使用 AppFunctions 與 Android 智慧系統整合。
第 5 部分 (即將推出):應用程式內代理工作流程。使用 A2UI 和 ADK 擴充應用程式,加入端對端預訂助理。
想進一步瞭解 Android 開發作業嗎?在 YouTube 或 LinkedIn 上追蹤 Android 開發人員!
本網誌文章中的所有程式碼片段均遵守下列著作權通知:
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 功能。
每週透過電子郵件接收最新的 Android 開發洞察資料。