Petunjuk

Membangun aplikasi Android cerdas: Inferensi cloud dan hybrid

Waktu baca: 8 menit

Selamat datang kembali di seri postingan blog "Membangun aplikasi Android yang cerdas" tempat kita mengambil aplikasi Android dasar dan mengubahnya menjadi pengalaman yang dipersonalisasi, cerdas, dan agentik. Dalam postingan sebelumnya, kita telah mempelajari cara membuat fitur cerdas di perangkat menggunakan Gemini Nano melalui Prompt API ML Kit.

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

  • Mendasarkan jawaban 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 dunia: menggunakan inferensi hybrid untuk berjalan di perangkat jika tersedia guna menurunkan biaya, sekaligus melakukan penggantian ke cloud untuk memastikan kompatibilitas semua perangkat.

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

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

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

Menggunakan perujukan LLM untuk informasi terbaru Chatbot asisten museum dengan perujukan LLM

Asisten museum adalah chatbot interaktif yang dirancang untuk membantu pengguna merencanakan kunjungan mereka ke museum. Halaman 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, membuat model menjawab dengan informasi dunia nyata yang baru, akurat, dan spesifik adalah tantangan umum. Meskipun model cloud memiliki pengetahuan dunia yang sangat luas, model ini mungkin tidak mengetahui pameran musiman atau jam buka hari ini.

grounding.png
Data grounding ditambahkan ke jendela konteks agar model dapat menjawab pertanyaan dengan benar dan akurat.

Untuk menjembatani kesenjangan ini, kita dapat menggunakan teknik perujukan untuk menambahkan konteks ekstra ke jendela konteks model. Firebase AI Logic SDK mendukung tiga jenis perujukan:

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

Di Jetpacker, kami membuat alat yang tersedia secara dinamis berdasarkan tanda 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 membuat kueri ke asisten, jika perujukan URL diaktifkan, kami 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 terhubung ke internet. 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 meninjau topik tertentu dan otomatis membuat draf ulasan. Untuk mengaktifkannya bagi semua pengguna, kami memprioritaskan eksekusi lokal dengan Gemini Nano, dan melakukan penggantian ke model cloud 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 melakukan penggantian ke cloud jika Gemini Nano tidak tersedia.
  • PREFER_IN_CLOUD: Memprioritaskan eksekusi di cloud dan melakukan penggantian ke perangkat jika perangkat offline.
  • ONLY_ON_DEVICE: Membatasi eksekusi hanya pada perangkat.
  • ONLY_IN_CLOUD: Membatasi eksekusi secara ketat ke cloud.

Setelah ulasan dibuat, kami 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)
}

Pemilihan rute hybrid kustom: Terjemahan chat dukungan hotel dengan persona simulasi

Chat dukungan hotel dibuat agar pengguna dapat 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, kami 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), kami perlu menerjemahkan pesan ke bahasa pilihan pengguna.

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

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

  • Identifikasi bahasa: Dengan menggunakan API Identifikasi Bahasa ML Kit 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, kami menggunakan Gemini Flash 3 untuk mendapatkan terjemahan yang lebih berkualitas.
// 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"
    )

Saat pesan perlu diterjemahkan, kami mengidentifikasi bahasa sumber dan menerapkan logika perutean kustom kami, yang dijalankan di perangkat atau terjemahan 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 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, kami mengintegrasikan Firebase App Check menggunakan Play Integrity (produksi) dan Penyedia Debug 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 mem-build secara lokal di emulator, App Check 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 konsol Firebase, permintaan lokal akan diverifikasi dan diautentikasi sepenuhnya oleh App Check, sehingga melindungi backend kami sekaligus memungkinkan kami menguji aplikasi secara lokal.

Kesimpulan

Dengan menggabungkan kemampuan model cloud (perujukan, petunjuk sistem) dengan kemampuan di perangkat (perutean hybrid, terjemahan, pemeriksaan aplikasi keamanan), kami membuat aplikasi perjalanan yang cerdas, aman, dan tersedia secara 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

Baca bagian lain dari seri postingan blog ini:

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

Tertarik dengan Pengembangan Android lainnya? 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