Anleitungen

Intelligente Android-Apps entwickeln: Cloud- und hybride Inferenz

Lesezeit: 8 Minuten

Willkommen zurück zur Blogreihe Intelligente Android-Apps entwickeln. In dieser Reihe verwandeln wir eine einfache Android-App in eine personalisierte, intelligente und agentische Anwendung. In unserem vorherigen Beitrag haben wir uns angesehen, wie intelligente On-Device-Funktionen mit Gemini Nano über die Prompt API von ML Kit entwickelt werden können.

In diesem Beitrag erfahren Sie, wie Sie mit Firebase AI Logic cloudbasierte und hybride KI-Funktionen erstellen können: 

  • Antworten auf realen Kontext stützen
  • Anfragen mit Hybrid Inference dynamisch zwischen Cloud und lokaler Ausführung weiterleiten
  • Inhalte mit benutzerdefinierten Routing-Systemen übersetzen

Manchmal sind für einen Anwendungsfall KI-Modelle mit mehr Weltwissen, einem viel größeren Kontextfenster oder der Fähigkeit, komplexe Anfragen zu verarbeiten, erforderlich. In diesen Fällen können wir Cloud-Modelle nutzen. 

Manchmal möchten Sie das Beste aus beiden Welten: Verwenden Sie die hybride Inferenz, um die Inferenz auf dem Gerät auszuführen, wenn sie verfügbar ist, um die Kosten zu senken, und greifen Sie auf die Cloud zurück, um die Kompatibilität für alle Geräte zu gewährleisten.

features.png
Cloud- und Hybridfunktionen in Jetpacker: Museumsassistent mit Web-Grounding, Hybrid-Restaurantrezensionsentwurf und Support-Chat mit benutzerdefiniert weitergeleiteter Live-Übersetzung.

Sehen wir uns an, wie wir drei Cloud- und Hybridfunktionen in Jetpacker implementiert haben:

  • ein Museumsmitarbeiter mit Web-Grundlagenwissen
  • Verfassen von Restaurantrezensionen im Hybridmodus
  • Chat-Support für Hotels mit benutzerdefiniert weitergeleiteter Live-Übersetzung.

LLM-Fundierung für aktuelle Informationen verwendenMuseumsassistent-Chatbot mit LLM-Fundierung

Der Museumsassistent ist ein interaktiver Chatbot, der Nutzern bei der Planung von Museumsbesuchen hilft. Besucher erhalten hier aktuelle Informationen zu bestimmten Ausstellungen, den aktuellen Öffnungszeiten, Ticketpreisen und mehr.

museum_assistant_upscaled.png
Der Museums-Assistent ist ein Chatbot, der Fragen wie „Wie erhalte ich eine Ermäßigung für Tickets für den Louvre?“ beantwortet.

Bei der Entwicklung von KI-Funktionen ist es oft schwierig, das Modell dazu zu bringen, mit aktuellen, genauen und spezifischen Informationen aus der realen Welt zu antworten. Cloud-Modelle verfügen zwar über ein enormes Wissen über die Welt, wissen aber möglicherweise nicht über saisonale Ausstellungen oder die Öffnungszeiten des aktuellen Tages Bescheid.

grounding.png
Dem Kontextfenster werden Fundierungsdaten hinzugefügt, damit das Modell Fragen richtig und genau beantworten kann.

Um diese Lücke zu schließen, können wir Grounding-Techniken verwenden, um dem Kontextfenster des Modells zusätzlichen Kontext hinzuzufügen. Das Firebase AI Logic SDK unterstützt drei Arten von Grounding:

  • URL-Fundierung:Antworten werden auf Grundlage von Inhalten einer bestimmten Webseite erstellt, z.B. aktuelle Ticketpreise oder Museumsregeln.
  • Fundierung mit der Google Suche:Das Modell kann den Google-Suchindex in Echtzeit nach aktuellen Details durchsuchen.
  • Maps-Fundierung:Hier werden Standortdaten von Google Maps verwendet.

In Jetpacker erstellen wir die verfügbaren Tools dynamisch basierend auf aktivierten Feature-Flags und initialisieren das generative Modell mit dem 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
    )

Wenn der Nutzer den Assistenten fragt und die URL-Fundierung aktiviert ist, hängen wir die spezifischen URLs der Museumsressourcen direkt an den Prompt an:

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)

Nicht für jede KI-Aufgabe ist ein cloudbasiertes Modell erforderlich und nicht jedes Gerät ist online. Damit Entwickler ein gutes Gleichgewicht zwischen Latenz, Kosten und Offlineverfügbarkeit finden, haben wir vor Kurzem die Firebase API for Hybrid Inference eingeführt.

Mit der Funktion Restaurantrezension in Jetpacker können Nutzer bestimmte Themen rezensieren und automatisch eine Rezension erstellen lassen. Damit alle Nutzer diese Funktion nutzen können, wird die lokale Ausführung mit Gemini Nano priorisiert. Auf Geräten, die Gemini Nano nicht unterstützen, wird auf Cloud-Modelle zurückgegriffen. 

review_upscaled.png
Die Funktion für Restaurantrezensionen verwendet Hybrid-Inferenz, um eine Rezension basierend auf Themen zu erstellen.
// 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
    )
)

Die Hybrid Inference API unterstützt vier verschiedene Routingmodi:

  • PREFER_ON_DEVICE:Die lokale Ausführung hat Priorität. Wenn Gemini Nano nicht verfügbar ist, wird auf die Cloud zurückgegriffen.
  • PREFER_IN_CLOUD:Die Ausführung in der Cloud wird priorisiert. Wenn das Gerät offline geht, wird auf die Ausführung auf dem Gerät zurückgegriffen.
  • ONLY_ON_DEVICE:Die Ausführung wird streng auf das Gerät beschränkt.
  • ONLY_IN_CLOUD:Die Ausführung wird ausschließlich auf die Cloud beschränkt.

Sobald die Rezension generiert wurde, kopieren wir sie in die Zwischenablage und öffnen die Rezensionsseite des Restaurants in Google Maps über einen Intent. So wird eine nahtlose Nutzererfahrung ermöglicht:

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

Benutzerdefiniertes hybrides Routing: Übersetzung von Hotel-Supportchats mit simulierten Identitäten

Der Chat für Hotelsupport wurde entwickelt, damit Nutzer die Logistik abschließen und Hoteldetails prüfen können. Bei dieser Funktion werden Systemanweisungen verwendet, um einen lokalisierten Rezeptionsassistenten zu konfigurieren. Wenn wir bestimmte Informationen wie die bevorzugte Sprache und Hotelinformationen in den Anweisungen angeben, können wir eine Konversations-Persona einrichten, die ein bestimmtes Hotel repräsentiert.

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

Da die Antworten des Rezeptionisten in der Landessprache des Hotels erfolgen (z. B. Französisch für das Hotel Le Meurice in Paris), müssen wir Nachrichten in die bevorzugte Sprache des Nutzers übersetzen.

translation_upscaled.png
Chatnachrichten des Hotelsupports werden automatisch in die bevorzugte Sprache des Nutzers übersetzt. 

Mit Hybridmodellen lassen sich zwar einfache Routing-Einstellungen konfigurieren, für komplexe Szenarien ist jedoch eine benutzerdefinierte Routing-Logik erforderlich. In Jetpacker implementieren wir einen benutzerdefinierten Routing-Stack, der Folgendes berücksichtigt:

  • Spracherkennung:Mit der ML Kit Language Identification API auf dem Gerät kann die Sprache der eingehenden Nachricht erkannt werden.
  • On-Device-Übersetzung (Gemini Nano): Mit der Prompt API von ML Kit können wir gängige Sprachpaare direkt auf dem Gerät übersetzen und so Bandbreite und Cloud-Kosten sparen.
  • Cloud-Übersetzung (Gemini 3 Flash): Bei komplexeren Sprachen verwenden wir Gemini 3 Flash, um eine höhere Übersetzungsqualität zu erzielen.
// 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"
    )

Wenn eine Nachricht übersetzt werden muss, ermitteln wir die Ausgangssprache und wenden unsere benutzerdefinierte Routing-Logik an. Die Übersetzung erfolgt dann entweder auf dem Gerät oder in der 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 diesem Beispiel wird bei der benutzerdefinierten Routing-Logik nur die Ausgangs- und Zielsprache der Übersetzung berücksichtigt. Je nach Anwendungsfall Ihrer App können Sie die Routing-Logik jedoch um andere Faktoren wie die Modellversion auf dem Gerät, die Netzwerkverbindung und den Akkustand erweitern.

KI-Pipelines schützen: Firebase App Check

Schließlich birgt der Einsatz von KI in der Cloud die Gefahr von API-Schlüsselmissbrauch oder unautorisierter Abrechnung. Um API-Aufrufe zu schützen, haben wir Firebase App Check mit Play Integrity (Produktion) und dem lokalen Debug Provider (für die lokale Entwicklung oder Emulatoren) integriert.

In der Datei JetPackerApplication.kt installieren wir den Debug-Anbieter beim Start und lösen die anonyme Authentifizierung aus, um eine sichere Nutzersitzung einzurichten:

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

Wenn Sie einen Build lokal auf einem Emulator ausführen, gibt App Check ein lokales Token-Secret in logcat aus:

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

Nach der Registrierung in der Firebase Console werden lokale Anfragen vollständig von App Check überprüft und authentifiziert. So wird unser Backend geschützt und wir können die App lokal testen.

Fazit

Durch die Kombination von Cloud-Modellfunktionen (Fundierung, Systemanweisungen) mit On-Device-Funktionen (Hybrid-Routing, Übersetzung, Sicherheits-App-Prüfungen) haben wir eine Reise-App entwickelt, die intelligent, sicher und offline verfügbar ist.

Vollständiger Quellcode für Jetpacker auf GitHub. Weitere Informationen finden Sie in der Firebase-Dokumentation:

Dokumentation zu Firebase AI Logic
Firebase Hybrid Inference API

Weitere Informationen

Weitere Teile dieser Blogpost-Reihe:

Teil 1:Einführung in die App und allgemeiner Überblick.
Teil 2: On-Device-KI. In diesem Beitrag geht es um die GenAI-APIs und Gemini Nano von ML Kit, mit denen Sie datenschutzfreundliche Funktionen wie die Zusammenfassung von Routen, das Parsen von Belegen und die lokale Audioverarbeitung entwickeln können.
Teil 3 (dieser Beitrag!): Hybrid- und Cloud-Schlussfolgerungen. Hier erfahren Sie, wie Sie mit Firebase AI Logic LLM-Antworten mit realen Daten wie Google Maps und Webkontext fundieren.
Teil 4 :Systemintegration. Integration in das Android-System für künstliche Intelligenz mit AppFunctions 
Teil 5 (demnächst verfügbar): Agentische In-App-Workflows. Erweitern Sie die App mit einem End-to-End-Buchungsassistenten, der auf A2UI und ADK basiert.

Möchten Sie mehr über die Android-Entwicklung erfahren? Folgen Sie Android Developers auf YouTube oder LinkedIn.

Für alle Code-Snippets in diesem Blogpost gilt der folgende Urheberrechtshinweis:

Copyright 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0
Geschrieben von:
Weiterlesen