Bentornati alla serie di post del blog "Crea app per Android intelligenti", in cui prendiamo un'app per Android di base e la trasformiamo in un'esperienza personalizzata, intelligente e agentica. Nel nostro post precedente abbiamo esplorato come creare funzionalità intelligenti sul dispositivo utilizzando Gemini Nano tramite l'API Prompt di ML Kit.
In questo post vedremo come sfruttare Firebase AI Logic per creare funzionalità di AI ibride e ospitate sul cloud:
- Basare le risposte su un contesto reale
- Instradamento dinamico delle richieste tra l'esecuzione cloud e quella locale utilizzando l'inferenza ibrida
- Traduzione di contenuti con sistemi di routing personalizzati
A volte un caso d'uso richiede modelli di AI con una maggiore conoscenza del mondo, una finestra contestuale molto più ampia o la capacità di gestire query complesse. In questi scenari, possiamo sfruttare i modelli cloud.
Altre volte, vuoi il meglio di entrambi i mondi: utilizzare l'inferenza ibrida per l'esecuzione sul dispositivo quando disponibile per ridurre i costi, ricorrendo al cloud per garantire la compatibilità con tutti i dispositivi.
Vediamo come abbiamo implementato tre funzionalità cloud e ibride in Jetpacker:
- un assistente del museo con conoscenze del web
- bozza ibrida di recensioni di ristoranti
- chat di assistenza per gli hotel con traduzione in tempo reale personalizzata.
Utilizzare la grounding LLM per informazioni aggiornateChatbot assistente del museo con grounding LLM
L'assistente del museo è un chatbot interattivo progettato per aiutare gli utenti a pianificare le loro visite al museo. Fornisce ai visitatori dettagli aggiornati su mostre specifiche, orari di apertura attuali, prezzi dei biglietti e altro ancora.
Quando si creano funzionalità di AI, ottenere che il modello risponda con informazioni fresche, accurate e specifiche del mondo reale è una sfida comune. Sebbene i modelli cloud possiedano una grande quantità di conoscenze sul mondo, potrebbero non conoscere le mostre stagionali o gli orari di apertura del giorno corrente.
Per colmare questo divario, possiamo utilizzare tecniche di grounding per aggiungere ulteriore contesto alla finestra contestuale del modello. L'SDK Firebase AI Logic supporta tre tipi di grounding:
- URL grounding: le risposte si basano sui contenuti di una pagina web specifica (ad es. prezzi attuali dei biglietti o regole del museo).
- Grounding con la Ricerca Google: consente al modello di eseguire query sull'indice della Ricerca Google in tempo reale per ottenere dettagli aggiornati.
- Grounding di Maps: utilizzo dei dati sulla posizione di Google Maps.
In Jetpacker, costruiamo dinamicamente gli strumenti disponibili in base ai flag delle funzionalità abilitati e inizializziamo il modello generativo utilizzando l'SDK Firebase AI:
// 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 )
Quando l'utente esegue una query sull'assistente, se l'ancoraggio degli URL è attivato, aggiungiamo gli URL delle risorse del museo specifiche direttamente al prompt:
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)
Inferenza ibrida: generazione di recensioni sul dispositivo con link diretto di Maps
Non tutte le attività AI richiedono un modello basato sul cloud e non tutti i dispositivi sono online. Per aiutare gli sviluppatori a bilanciare latenza, costi e disponibilità offline, di recente abbiamo introdotto l'API Firebase per l'inferenza ibrida.
In Jetpacker, la funzionalità Recensione del ristorante consente agli utenti di esaminare argomenti selezionati e di creare automaticamente una bozza di recensione. Per attivare questa funzionalità per tutti gli utenti, diamo la priorità all'esecuzione locale con Gemini Nano e ricorriamo ai modelli cloud sui dispositivi che non supportano 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 ) )
L'API Hybrid Inference supporta quattro diverse modalità di routing:
- PREFER_ON_DEVICE:dà la priorità all'esecuzione locale e passa al cloud se Gemini Nano non è disponibile.
- PREFER_IN_CLOUD:dà la priorità all'esecuzione sul cloud e torna al dispositivo se questo va offline.
- ONLY_ON_DEVICE:limita l'esecuzione rigorosamente al dispositivo.
- ONLY_IN_CLOUD:limita l'esecuzione rigorosamente al cloud.
Una volta generata la recensione, la copiamo negli appunti e utilizziamo un intent per aprire Google Maps direttamente nella pagina delle recensioni del ristorante, offrendo un'esperienza utente ottimale:
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) }
Routing ibrido personalizzato: traduzione della chat di assistenza per gli hotel con personaggi simulati
La chat di assistenza per gli hotel è stata creata per consentire agli utenti di finalizzare la logistica e controllare i dettagli dell'hotel. Questa funzionalità utilizza le istruzioni di sistema per configurare un assistente receptionist localizzato. Se nelle istruzioni vengono trasmesse informazioni specifiche, come la lingua preferita e i dati dell'hotel, possiamo configurare una persona conversazionale che rappresenti un hotel specifico.
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" )
Poiché le risposte del receptionist sono nella lingua locale dell'hotel (ad esempio, francese per l'Hotel Le Meurice di Parigi), dobbiamo tradurre i messaggi nella lingua preferita dell'utente.
Sebbene i modelli ibridi possano configurare preferenze di routing semplici, gli scenari complessi richiedono una logica di routing personalizzata. In Jetpacker, implementiamo uno stack di routing personalizzato che tiene conto di:
- Identificazione della lingua:utilizzando l'API ML Kit Language Identification sul dispositivo, possiamo rilevare la lingua del messaggio in arrivo.
- Traduzione on-device (Gemini Nano): l'API Prompt di ML Kit ci consente di tradurre le coppie di lingue comuni direttamente sul dispositivo, risparmiando larghezza di banda e costi del cloud.
- Traduzione sul cloud (Gemini 3 Flash): per le lingue più complesse, utilizziamo Gemini Flash 3 per ottenere una traduzione di qualità superiore.
// 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" )
Quando un messaggio deve essere tradotto, identifichiamo la lingua di origine e applichiamo la nostra logica di routing personalizzata, eseguendo la traduzione sul dispositivo o sul 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") } } } }
In questo esempio, la logica di routing personalizzata prende in considerazione solo la lingua di origine e di destinazione della traduzione. Tuttavia, in base al caso d'uso dell'app, puoi espandere la logica di routing per includere altri fattori come la versione del modello sul dispositivo, la connettività di rete, lo stato della batteria e altro ancora.
Protezione delle pipeline AI: Firebase App Check
Infine, l'utilizzo dell'AI nel cloud apre le porte all'abuso delle chiavi API o alla fatturazione non autorizzata. Per proteggere le chiamate API, abbiamo integrato Firebase App Check utilizzando sia Play Integrity (produzione) sia il provider di debug locale (per lo sviluppo locale o gli emulatori).
Nel file JetPackerApplication.kt, installiamo il provider di debug all'avvio e attiviamo l'autenticazione anonima per stabilire una sessione utente sicura:
// 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() }
Quando esegui la build in locale su un emulatore, App Check stampa un secret del token locale in logcat:
Enter this debug secret into the allow list in the Firebase Console: a8c2dd4c-xxxx-xxxx-xxxx-ef6c114ba27e
Una volta registrate nella console Firebase, le richieste locali vengono completamente verificate e autenticate da App Check, proteggendo il nostro backend e consentendoci di testare l'app localmente.
Conclusione
Combinando le funzionalità del modello cloud (grounding, istruzioni di sistema) con quelle sul dispositivo (routing ibrido, traduzione, controlli delle app di sicurezza), abbiamo creato un'app di viaggio intelligente, sicura e disponibile offline.
Consulta il codice sorgente completo di Jetpacker su GitHub ed esplora la documentazione di Firebase per iniziare:
Documentazione di Firebase AI Logic
API Firebase Hybrid Inference
Scopri di più
Dai un'occhiata alle altre parti di questa serie di post del blog:
Parte 1: introduzione dell'app e una panoramica generale.
Parte 2: intelligenza on-device. Approfondisci le API AI generativa di ML Kit e Gemini Nano per creare funzionalità incentrate sulla privacy, come il riepilogo dell'itinerario, l'analisi delle ricevute e l'elaborazione audio locale.
Parte 3 (questo post): Ragionamento ibrido e sul cloud. Scopri come utilizzare Firebase AI Logic per basare le risposte degli LLM su dati reali come Google Maps e il contesto web.
Parte 4: Integrazione del sistema. Integrazione con il sistema di intelligence Android tramite AppFunctions.
Parte 5 (in arrivo): workflow agentici in-app. Estendi l'app con un assistente per le prenotazioni end-to-end basato su A2UI e ADK.
Ti interessa saperne di più sullo sviluppo per Android? Segui Android Developers su YouTube o LinkedIn.
Tutti gli snippet di codice in questo post del blog seguono la seguente nota sul copyright:
Copyright 2026 Google LLC. SPDX-License-Identifier: Apache-2.0
-
IstruzioniBentornato alla serie di post del blog "Crea app per Android intelligenti", in cui prendiamo un'app per Android di base e la trasformiamo in un'esperienza personalizzata, intelligente e basata su agenti. Nel post precedente abbiamo presentato Jetpacker, l'app demo che utilizzeremo in questa serie.
Caren Chang • Lettura di 6 minuti -
IstruzioniJetpacker è un'app di dimostrazione tecnica che il nostro team ha creato da zero per il Google I/O di quest'anno (utilizzando Antigravity). Nella sua essenza, Jetpacker aiuta gli utenti a pianificare, esplorare e godersi la loro prossima grande avventura.
Jolanda Verhoef • Lettura di 4 minuti -
IstruzioniBentornato alla serie di post del blog "Crea app per Android intelligenti", in cui prendiamo un'app per Android di base e la trasformiamo in un'esperienza personalizzata, intelligente e basata su agenti. Nel post precedente, abbiamo esplorato come utilizzare Firebase AI Logic per creare funzionalità di AI ibrida e ospitata sul cloud.
Ben Weiss • Lettura di 6 minuti
Ricevi ogni settimana gli ultimi approfondimenti sullo sviluppo per Android direttamente nella tua casella di posta.