使用指南

建構智慧型 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
    )

使用者查詢 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)

並非所有 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:嚴格限制只能在雲端執行。

評論生成後,我們會將其複製到剪貼簿,並使用意圖直接開啟 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 中,我們實作了自訂的路由堆疊,並考量以下因素:

  • 語言識別:使用裝置端 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 開發作業嗎?在 YouTubeLinkedIn 上追蹤 Android 開發人員!

本網誌文章中的所有程式碼片段均遵守下列著作權通知:

Copyright 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0
撰寫者:
繼續閱讀