Anleitungen

Intelligente Android-Apps entwickeln: Cloud- und Hybrid-Inferenz

Lesezeit: 8 Minuten

Willkommen zurück zur Blogpost-Reihe "Intelligente Android-Apps entwickeln". Hier zeigen wir, wie Sie eine einfache Android-App in eine personalisierte, intelligente und agentenbasierte Anwendung verwandeln. Im vorherigen Beitrag haben wir uns angesehen, wie Sie mit Gemini Nano über die Prompt API von ML Kit intelligente On-Device-Funktionen entwickeln können.

In diesem Beitrag erfahren Sie, wie Sie Firebase AI Logic nutzen können, um cloudbasierte und hybride KI-Funktionen zu entwickeln: 

  • Antworten im realen Kontext verankern
  • Anfragen mithilfe von Hybrid-Inferenz dynamisch zwischen Cloud- und lokaler Ausführung weiterleiten
  • Inhalte mit benutzerdefinierten Weiterleitungssystemen übersetzen

Manchmal sind für einen Anwendungsfall KI-Modelle mit mehr Weltwissen, einem viel größeren Kontextfenster oder der Möglichkeit zur Verarbeitung komplexer Abfragen erforderlich. In diesen Fällen können wir Cloud-Modelle nutzen. 

Manchmal möchten Sie aber auch das Beste aus beiden Welten: Hybrid-Inferenz verwenden, um die Ausführung auf dem Gerät zu ermöglichen und Kosten zu senken, und gleichzeitig auf die Cloud zurückgreifen, um die Kompatibilität für alle Geräte zu gewährleisten.

features.png
Cloud- und Hybrid-Funktionen in Jetpacker: Museumsassistent mit Web-Fundierung, hybride Restaurantrezension und Support-Chat mit benutzerdefinierter Weiterleitung für Live-Übersetzung.

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

  • Museumsassistent mit Web-Fundierung
  • Hybride Restaurantrezension
  • Hotel-Support-Chat mit benutzerdefinierter Weiterleitung für Live-Übersetzung

LLM-Fundierung für aktuelle InformationenMuseumsassistent-Chatbot mit LLM-Fundierung

Der Museumsassistent ist ein interaktiver Chatbot, der Nutzern bei der Planung von Museumsbesuchen hilft. Er bietet Besuchern aktuelle Informationen zu bestimmten Ausstellungen, aktuellen Öffnungszeiten, Ticketpreisen und mehr.

museum_assistant_upscaled.png
Der Museumsassistent ist ein Chatbot, der Fragen beantwortet, z. B. „Wie erhalte ich eine Ermäßigung auf Tickets für den Louvre?“

Bei der Entwicklung von KI-Funktionen ist es oft eine Herausforderung, das Modell so zu trainieren, dass es mit aktuellen, genauen und spezifischen Informationen aus der realen Welt antwortet. Cloud-Modelle verfügen zwar über riesige Mengen an Weltwissen, wissen aber möglicherweise nichts über saisonale Ausstellungen oder die aktuellen Öffnungszeiten.

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 Fundierungstechniken verwenden, um dem Kontextfenster des Modells zusätzlichen Kontext hinzuzufügen. Das Firebase AI Logic SDK unterstützt drei Arten der Fundierung:

In Jetpacker erstellen wir die verfügbaren Tools dynamisch anhand der 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 abfragt und die URL-Fundierung aktiviert ist, fügen wir die URLs der spezifischen Museumsressourcen direkt in den Prompt ein:

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 Latenz, Kosten und Offline-Verfügbarkeit besser ausbalancieren können, haben wir vor Kurzem die Firebase API für Hybrid-Inferenz eingeführt.

Mit der Funktion Restaurantrezension in Jetpacker können Nutzer ausgewählte Themen bewerten und automatisch eine Rezension erstellen. Damit dies für alle Nutzer möglich ist, priorisieren wir die lokale Ausführung mit Gemini Nano und greifen auf Geräten, die Gemini Nano nicht unterstützen, auf Cloud-Modelle zurück. 

review_upscaled.png
Die Funktion „Restaurantrezension“ 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 Weiterleitungsmodi:

  • PREFER_ON_DEVICE:Priorisiert die lokale Ausführung und greift auf die Cloud zurück, wenn Gemini Nano nicht verfügbar ist.
  • PREFER_IN_CLOUD:Priorisiert die Ausführung in der Cloud und greift auf das Gerät zurück, wenn das Gerät offline ist.
  • ONLY_ON_DEVICE:Beschränkt die Ausführung ausschließlich auf das Gerät.
  • ONLY_IN_CLOUD:Beschränkt die Ausführung ausschließlich auf die Cloud.

Sobald die Rezension erstellt wurde, kopieren wir sie in die Zwischenablage und verwenden eine Intent, um Google Maps direkt auf der Rezensionsseite des Restaurants zu öffnen. So sorgen wir für eine nahtlose Nutzererfahrung:

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

Benutzerdefinierte hybride Weiterleitung: Übersetzung im Hotel-Support-Chat mit simulierten Personas

Der Hotel-Support-Chat wurde entwickelt, damit Nutzer Logistik abschließen und Hoteldetails prüfen können. Diese Funktion verwendet Systemanweisungen, um einen lokalisierten Rezeptionisten-Assistenten zu konfigurieren. Indem wir in den Anweisungen bestimmte Informationen wie die bevorzugte Sprache und Hotelinformationen übergeben, können wir eine Konversationspersona 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 lokalen Sprache des Hotels verfasst sind (z. B. Französisch für das Hotel Le Meurice in Paris), müssen wir die Nachrichten in die bevorzugte Sprache des Nutzers übersetzen.

translation_upscaled.png
Nachrichten im Hotel-Support-Chat werden automatisch in die bevorzugte Sprache des Nutzers übersetzt. 

Hybride Modelle können zwar einfache Weiterleitungseinstellungen konfigurieren, für komplexe Szenarien ist jedoch eine benutzerdefinierte Weiterleitungslogik erforderlich. In Jetpacker implementieren wir einen benutzerdefinierten Weiterleitungsstack, der Folgendes berücksichtigt:

  • Spracherkennung:Mit der On-Device-API zur Spracherkennung von ML Kit können wir die Sprache der eingehenden Nachricht erkennen.
  • 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) : Für komplexere Sprachen verwenden wir Gemini Flash 3, um eine Übersetzung von höherer Qualität zu erhalten.
// 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, erkennen wir die Ausgangssprache und wenden unsere benutzerdefinierte Weiterleitungslogik an, um die Übersetzung entweder auf dem Gerät oder in der Cloud auszuführen:

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 berücksichtigt die benutzerdefinierte Weiterleitungslogik nur die Ausgangs- und Zielsprache der Übersetzung. Je nach Anwendungsfall Ihrer App können Sie die Weiterleitungslogik jedoch um andere Faktoren erweitern, z. B. die On-Device-Modellversion, die Netzwerkverbindung und den Akkustatus.

KI-Pipelines schützen: Firebase App Check

Schließlich birgt die Verwendung von KI in der Cloud die Gefahr von API-Schlüsselmissbrauch oder unbefugter Abrechnung. Um API-Aufrufe zu schützen, haben wir Firebase App Check sowohl mit Play Integrity (Produktion) als auch mit dem lokalen Debug-Anbieter (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 Tokensicherheitsgeheimnis 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 schützen wir unser Back-End und können die App lokal testen.

Fazit

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

Den vollständigen Quellcode für Jetpacker finden Sie auf GitHub. In der Firebase-Dokumentation erfahren Sie, wie Sie loslegen können:

Firebase AI Logic-Dokumentation
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-Intelligenz. Detaillierte Informationen zu den GenAI APIs von ML Kit und Gemini Nano, um datenschutzorientierte Funktionen zu entwickeln, z. B. Zusammenfassung von Reiseplänen, Parsing von Belegen und lokale Audioverarbeitung.
Teil 3 (dieser Beitrag): Hybride und Cloud-basierte Schlussfolgerungen. Informationen zur Verwendung von Firebase AI Logic, um LLM-Antworten mit realen Daten wie Google Maps und Web-Kontext zu fundieren.
Teil 4: Systemintegration. Integration in das Android-Intelligenzsystem mit AppFunctions.
Teil 5 (bald verfügbar): Agentenbasierte Workflows in der App. Erweitern Sie die App mit einem End-to-End-Buchungsassistenten, der auf A2UI und ADK basiert.

Sie interessieren sich für weitere Informationen zur Android-Entwicklung? 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