Panduan

Membangun aplikasi Android cerdas: Inferensi cloud dan hybrid

8 menit membaca

Selamat datang kembali di rangkaian postingan blog "Membangun aplikasi Android cerdas" yang membahas cara mengubah aplikasi Android dasar menjadi pengalaman dipersonalisasi, cerdas, dan agentic. Dalam postingan sebelumnya, kita telah membahas cara membangun fitur cerdas di perangkat menggunakan Gemini Nano melalui Prompt API ML Kit.

Dalam postingan ini, kita akan membahas cara memanfaatkan Firebase AI Logic untuk membangun fitur AI yang dihosting di cloud dan hybrid: 

  • Menyediakan jawaban yang didasarkan pada konteks dunia nyata
  • Merutekan permintaan secara dinamis antara eksekusi cloud dan lokal menggunakan inferensi hybrid
  • Menerjemahkan konten dengan sistem perutean kustom

Terkadang, kasus penggunaan memerlukan model AI dengan pengetahuan dunia yang lebih luas, jendela konteks yang jauh lebih besar, atau kemampuan untuk menangani kueri yang kompleks. Dalam skenario tersebut, kita dapat memanfaatkan model cloud. 

Terkadang, Anda menginginkan yang terbaik dari kedua model: menggunakan inferensi hybrid untuk menjalankan di perangkat jika tersedia guna menurunkan biaya, sekaligus menggunakan cloud sebagai alternatif untuk memastikan kompatibilitas bagi semua perangkat.

features.png
Fitur cloud dan hybrid di Jetpacker: Asisten museum dengan grounding web, pembuatan draf ulasan restoran hybrid, dan chat dukungan yang menampilkan terjemahan langsung dengan perutean kustom.

Mari kita lihat cara menerapkan tiga fitur cloud dan hybrid di Jetpacker:

  • asisten museum dengan grounding web
  • pembuatan draf ulasan restoran hybrid
  • chat dukungan hotel yang menampilkan terjemahan langsung dengan perutean kustom.

Menggunakan grounding LLM untuk informasi terbaruChatbot asisten museum dengan grounding LLM

Asisten museum adalah chatbot interaktif yang dirancang untuk membantu pengguna merencanakan kunjungan ke museum. Chatbot ini memberikan detail terbaru kepada pengunjung terkait pameran tertentu, jam buka saat ini, harga tiket, dan lainnya.

museum_assistant_upscaled.png
Asisten museum adalah chatbot yang menjawab pertanyaan, seperti 'Bagaimana cara mendapatkan diskon tiket untuk Le Louvre?'

Saat membangun fitur AI, mendapatkan model untuk menjawab dengan informasi dunia nyata yang terbaru, akurat, dan spesifik adalah tantangan umum. Meskipun model cloud memiliki pengetahuan dunia yang sangat banyak, model tersebut mungkin tidak mengetahui pameran musiman atau jam buka hari ini.

grounding.png
Data grounding ditambahkan ke jendela konteks untuk memungkinkan model menjawab pertanyaan dengan benar dan akurat.

Untuk mengatasi kesenjangan ini, kita dapat menggunakan teknik grounding untuk menambahkan konteks tambahan ke jendela konteks model. Firebase AI Logic SDK mendukung tiga jenis grounding:

  • Grounding URL: Respons grounding menggunakan konten dari halaman web tertentu (misalnya, harga tiket saat ini atau aturan museum).
  • Grounding Google Penelusuran: Memungkinkan model mengkueri indeks Google Penelusuran real-time untuk mendapatkan detail terbaru.
  • Grounding Maps: Menggunakan data lokasi Google Maps.

Di Jetpacker, kita membuat alat yang tersedia secara dinamis berdasarkan flag fitur yang diaktifkan dan menginisialisasi model generatif menggunakan 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
    )

Saat pengguna mengkueri asisten, jika grounding URL diaktifkan, kita akan menambahkan URL resource museum tertentu langsung ke perintah:

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)

Tidak semua tugas AI memerlukan model berbasis cloud, dan tidak semua perangkat online. Untuk membantu developer menyeimbangkan latensi, biaya, dan ketersediaan offline, kami baru-baru ini memperkenalkan Firebase API untuk Inferensi Hybrid.

Di Jetpacker, fitur ulasan restoran memungkinkan pengguna mengulas topik tertentu dan otomatis membuat draf ulasan. Untuk mengaktifkan fitur ini bagi semua pengguna, kami memprioritaskan eksekusi lokal dengan Gemini Nano, dan menggunakan model cloud sebagai alternatif di perangkat yang tidak mendukung Gemini Nano. 

review_upscaled.png
Fitur ulasan restoran menggunakan inferensi hybrid untuk membuat draf ulasan berdasarkan topik
// 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 mendukung empat mode perutean yang berbeda:

  • PREFER_ON_DEVICE: Memprioritaskan eksekusi lokal dan menggunakan cloud sebagai alternatif jika Gemini Nano tidak tersedia.
  • PREFER_IN_CLOUD: Memprioritaskan eksekusi cloud dan menggunakan di perangkat sebagai alternatif jika perangkat offline.
  • ONLY_ON_DEVICE: Membatasi eksekusi secara ketat ke perangkat.
  • ONLY_IN_CLOUD: Membatasi eksekusi secara ketat ke cloud.

Setelah ulasan dibuat, kita akan menyalinnya ke papan klip dan menggunakan intent untuk membuka Google Maps langsung ke halaman ulasan restoran, sehingga memberikan pengalaman pengguna yang lancar:

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)
}

Perutean hybrid kustom: Terjemahan chat dukungan hotel dengan persona simulasi

Chat dukungan hotel dibuat untuk memungkinkan pengguna menyelesaikan logistik dan memeriksa detail hotel. Fitur ini menggunakan petunjuk sistem untuk mengonfigurasi asisten resepsionis yang dilokalkan. Dengan meneruskan informasi tertentu—seperti bahasa pilihan dan informasi hotel—dalam petunjuk, kita dapat menyiapkan persona percakapan yang mewakili hotel tertentu.

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

Karena respons resepsionis menggunakan bahasa lokal hotel (misalnya, bahasa Prancis untuk Hotel Le Meurice di Paris), kita perlu menerjemahkan pesan ke bahasa pilihan pengguna.

translation_upscaled.png
Pesan chat dukungan hotel otomatis diterjemahkan ke bahasa pilihan pengguna 

Meskipun model hybrid dapat mengonfigurasi preferensi perutean sederhana, skenario yang kompleks memerlukan logika perutean kustom. Di Jetpacker, kita menerapkan tumpukan perutean kustom yang mempertimbangkan:

  • Identifikasi bahasa: Menggunakan ML Kit Language Identification API di perangkat, kita dapat mendeteksi bahasa pesan yang masuk.
  • Terjemahan di perangkat (Gemini Nano): Prompt API ML Kit memungkinkan kita menerjemahkan pasangan bahasa umum langsung di perangkat, sehingga menghemat bandwidth dan biaya cloud.
  • Terjemahan cloud (Gemini 3 Flash): Untuk bahasa yang lebih kompleks, kita menggunakan Gemini Flash 3 untuk mendapatkan terjemahan berkualitas lebih tinggi.
// 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"
    )

Jika pesan perlu diterjemahkan, kita akan mengidentifikasi bahasa sumber dan menerapkan logika perutean kustom, yang menjalankan terjemahan di perangkat atau cloud:

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

Dalam contoh ini, logika perutean kustom hanya mempertimbangkan bahasa sumber dan bahasa target terjemahan. Namun, berdasarkan kasus penggunaan aplikasi, Anda dapat memperluas logika perutean untuk menyertakan faktor lain seperti versi model di perangkat, konektivitas jaringan, status baterai, dan lainnya.

Mengamankan Pipeline AI: Firebase App Check

Terakhir, penggunaan AI di cloud membuka kemungkinan penyalahgunaan kunci API atau penagihan yang tidak sah. Untuk mengamankan panggilan API, kita mengintegrasikan Firebase App Check menggunakan Play Integrity (produksi) dan Debug Provider lokal (untuk pengembangan lokal atau emulator).

Dalam file JetPackerApplication.kt, kita menginstal penyedia debug saat startup dan memicu autentikasi anonim untuk membuat sesi pengguna yang aman:

//  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()
}

Saat membangun secara lokal di emulator, App Check akan mencetak rahasia token lokal ke logcat:

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

Setelah terdaftar di Firebase console, permintaan lokal akan diverifikasi dan diautentikasi sepenuhnya oleh App Check, sehingga melindungi backend kita sekaligus memungkinkan kita menguji aplikasi secara lokal.

Kesimpulan

Dengan menggabungkan kemampuan model cloud (grounding, petunjuk sistem) dengan kemampuan di perangkat (perutean hybrid, terjemahan, pemeriksaan aplikasi keamanan), kita telah membuat aplikasi perjalanan yang cerdas, aman, dan tersedia offline.

Lihat kode sumber lengkap untuk Jetpacker di GitHub, dan pelajari dokumentasi Firebase untuk memulai:

Dokumentasi Firebase AI Logic
Firebase Hybrid Inference API

Pelajari lebih lanjut

Lihat bagian lain dari rangkaian postingan blog ini:

Bagian 1: Pengantar aplikasi dan ringkasan tingkat tinggi.
Bagian 2: Kecerdasan di perangkat. Mempelajari lebih dalam GenAI API ML Kit dan Gemini Nano untuk membangun fitur yang mengutamakan privasi seperti ringkasan itinerari, penguraian tanda terima, dan pemrosesan audio lokal.
Bagian 3 (postingan ini!): Penalaran hybrid dan cloud. Pelajari cara menggunakan Firebase AI Logic untuk menyediakan jawaban LLM yang didasarkan pada data dunia nyata seperti Google Maps dan konteks web.
Bagian 4: Integrasi sistem. Mengintegrasikan dengan sistem kecerdasan Android menggunakan AppFunctions.
Bagian 5 (segera hadir): Alur kerja agentic dalam aplikasi. Memperluas aplikasi dengan asisten pemesanan menyeluruh yang didukung oleh A2UI dan ADK.

Tertarik mempelajari lebih lanjut Pengembangan Android? Ikuti Android Developers di YouTube atau LinkedIn.

Semua cuplikan kode dalam postingan blog ini mengikuti pemberitahuan hak cipta berikut:

Copyright 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0
Ditulis oleh:
Lanjutkan membaca