Nasıl yapılır? rehberleri

Akıllı Android uygulamaları oluşturma: Bulut ve karma çıkarım

Okuma süresi 8 dakika

Temel bir Android uygulamasını kişiselleştirilmiş, akıllı ve aracı bir deneyime dönüştürdüğümüz "Akıllı Android uygulamaları oluşturma" blog yayınları serisine tekrar hoş geldiniz. Önceki yayınımızda, Makine Öğrenimi Kiti'nin Prompt API'si aracılığıyla Gemini Nano'yu kullanarak cihaz üzerinde akıllı özellikler oluşturmayı ele almıştık.

Bu yayında, bulutta barındırılan ve hibrit yapay zeka özellikleri oluşturmak için Firebase AI Logic özelliğinden nasıl yararlanabileceğinizi ele alacağız: 

  • Yanıtları gerçek dünya bağlamında temellendirme
  • Karma çıkarımı kullanarak istekleri bulut ve yerel yürütme arasında dinamik olarak yönlendirme
  • Özel yönlendirme sistemleriyle içerik çevirme

Bazı kullanım alanlarında daha fazla dünya bilgisine, çok daha büyük bir bağlam penceresine veya karmaşık sorguları işleme yeteneğine sahip yapay zeka modelleri gerekir. Bu gibi durumlarda bulut modellerinden yararlanabiliriz. 

Bazı durumlarda ise her iki dünyanın da en iyisini istersiniz: Maliyetleri düşürmek için uygun olduğunda cihaz üzerinde çalıştırmak üzere hibrit çıkarım kullanırken tüm cihazlarda uyumluluğu sağlamak için buluta geri dönmek.

features.png
Jetpacker'daki bulut ve karma özellikler: Web temelli müze asistanı, karma restoran yorumu taslağı ve özel yönlendirilmiş canlı çeviri içeren destek sohbeti.

Jetpacker'da üç bulut ve hibrit özelliği nasıl uyguladığımıza bakalım:

  • Web temelli bir müze asistanı
  • karma restoran yorumu taslağı oluşturma
  • Özel yönlendirmeli canlı çeviri içeren otel destek sohbeti

Güncel bilgiler için LLM temellendirmesini kullanmaMüze asistanı chatbot'u

Müze asistanı , kullanıcıların müze ziyaretlerini planlamalarına yardımcı olmak için tasarlanmış etkileşimli bir chatbot'tur. Ziyaretçilere belirli sergiler, güncel çalışma saatleri, bilet fiyatları ve daha fazlası hakkında güncel bilgiler sağlar.

museum_assistant_upscaled.png
Müze asistanı, "Louvre Müzesi'nde bilet indirimi nasıl alabilirim?" gibi soruları yanıtlayan bir chatbot'tur.

Yapay zeka özellikleri geliştirirken modelin güncel, doğru ve gerçek dünyayla ilgili bilgilerle yanıt vermesini sağlamak yaygın bir zorluktur. Bulut modelleri, dünya bilgisi açısından çok zengin olsa da sezonluk sergiler veya o günkü açılış saatleri hakkında bilgi sahibi olmayabilir.

grounding.png
Modelin soruları doğru ve eksiksiz şekilde yanıtlaması için bağlam penceresine temellendirme verileri eklenir.

Bu boşluğu doldurmak için modelin bağlam penceresine ekstra bağlam eklemek üzere temellendirme tekniklerini kullanabiliriz. Firebase AI Logic SDK'sı üç tür temellendirmeyi destekler:

  • URL temellendirme: Belirli bir web sayfasındaki içerikleri (ör. güncel bilet fiyatları veya müze kuralları) kullanarak yanıtları temellendirme.
  • Google Arama temellendirmesi: Modelin güncel ayrıntılar için gerçek zamanlı Google Arama dizinini sorgulamasına olanak tanır.
  • Haritalar'da temellendirme: Google Haritalar konum verilerini kullanır.

Jetpacker'da, etkinleştirilen özellik işaretlerine göre kullanılabilir araçları dinamik olarak oluştururuz ve Firebase AI SDK'yı kullanarak üretken modeli başlatırız:

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

Kullanıcı asistana sorgu gönderdiğinde URL temellendirme etkinse belirli müze kaynağı URL'lerini doğrudan isteme ekleriz:

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)

Her yapay zeka görevi için bulut tabanlı bir model gerekmez ve her cihaz internete bağlı değildir. Geliştiricilerin gecikme, maliyet ve çevrimdışı kullanılabilirlik arasında denge kurmasına yardımcı olmak için kısa süre önce Hibrit Çıkarım için Firebase API'yi kullanıma sunduk.

Jetpacker'daki restoran yorumu özelliği, kullanıcıların belirli konuları incelemesine ve otomatik olarak yorum taslağı oluşturmasına olanak tanır. Bu özelliği tüm kullanıcılar için etkinleştirmek amacıyla Gemini Nano ile yerel yürütmeye öncelik veriyoruz ve Gemini Nano'yu desteklemeyen cihazlarda bulut modellerine geri dönüyoruz. 

review_upscaled.png
Restoran yorumu özelliği, konulara dayalı bir yorum taslağı oluşturmak için karma çıkarım kullanır
// 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
    )
)

Hibrit çıkarım API'si dört farklı yönlendirme modunu destekler:

  • PREFER_ON_DEVICE: Yerel yürütmeye öncelik verir ve Gemini Nano kullanılamıyorsa buluta geri döner.
  • PREFER_IN_CLOUD: Bulutta yürütmeye öncelik verir ve cihaz çevrimdışı kalırsa cihaz üzerinde yürütmeye geri döner.
  • ONLY_ON_DEVICE: Yürütmeyi kesinlikle cihazla sınırlar.
  • ONLY_IN_CLOUD: Yürütmeyi kesinlikle bulutla kısıtlar.

Yorum oluşturulduktan sonra, yorumu panoya kopyalayıp Google Haritalar'ı doğrudan restoranın yorum sayfasına açmak için bir amaç kullanırız. Böylece sorunsuz bir kullanıcı deneyimi sunarız:

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

Özel karma yönlendirme: Simüle edilmiş karakterlerle otel destek sohbeti çevirisi

Otel destek sohbeti, kullanıcıların lojistik işlemlerini tamamlamasına ve otel bilgilerini kontrol etmesine olanak tanımak için geliştirilmiştir. Bu özellik, yerelleştirilmiş bir resepsiyonist asistanı yapılandırmak için sistem talimatlarını kullanır. Talimatlarda tercih edilen dil ve otel bilgileri gibi belirli bilgileri ileterek belirli bir oteli temsil eden bir sohbet kişiliği oluşturabiliriz.

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

Resepsiyonist yanıtları otelin yerel dilinde (örneğin, Paris'teki Hotel Le Meurice için Fransızca) olduğundan mesajları kullanıcının tercih ettiği dile çevirmemiz gerekir.

translation_upscaled.png
Otelin destek ekibiyle yapılan sohbet mesajları, kullanıcının tercih ettiği dile otomatik olarak çevrilir. 

Karma modeller basit yönlendirme tercihlerini yapılandırabilirken karmaşık senaryolar özel yönlendirme mantığı gerektirir. Jetpacker'da, aşağıdakileri dikkate alan özel bir yönlendirme yığını uyguluyoruz:

  • Dil tanımlama: Cihaz üzerinde ML Kit Language Identification API'yi kullanarak gelen mesajın dilini algılayabiliriz.
  • Cihaz üzerinde çeviri (Gemini Nano): ML Kit'in Prompt API'si, yaygın dil çiftlerini doğrudan cihaz üzerinde çevirmemize olanak tanıyarak bant genişliğinden ve bulut maliyetinden tasarruf etmemizi sağlar.
  • Bulut çevirisi (Gemini 3 Flash): Daha karmaşık dillerde daha kaliteli çeviri elde etmek için Gemini Flash 3'ü kullanırız.
// 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"
    )

Çevrilmesi gereken bir mesaj olduğunda kaynak dili belirleriz ve özel yönlendirme mantığımızı uygulayarak cihaz üzerinde veya bulut çevirisi gerçekleştiririz:

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

Bu örnekte, özel yönlendirme mantığı yalnızca çevirinin kaynak ve hedef dilini dikkate alır. Ancak uygulamanızın kullanım alanına bağlı olarak yönlendirme mantığını genişleterek cihaz üzerinde model sürümü, ağ bağlantısı, pil durumu gibi diğer faktörleri de dahil edebilirsiniz.

Yapay Zeka İşlem Hatlarının Güvenliğini Sağlama: Firebase Uygulama Kontrolü

Son olarak, yapay zekanın bulutta kullanılması API anahtarı kötüye kullanımı veya yetkisiz faturalandırma olasılıklarını artırır. API çağrılarını güvenli hale getirmek için hem Play Integrity (canlı sürüm) hem de yerel hata ayıklama sağlayıcısı (yerel geliştirme veya emülatörler için) kullanılarak Firebase Uygulama Kontrolü entegre edildi.

JetPackerApplication.kt dosyasında, hata ayıklama sağlayıcısını başlangıçta yüklüyoruz ve güvenli bir kullanıcı oturumu oluşturmak için anonim kimlik doğrulamayı tetikliyoruz:

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

Bir emülatörde yerel olarak derleme yaparken App Check, logcat'e yerel bir jeton gizli anahtarı yazdırır:

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

Firebase konsoluna kaydedildikten sonra yerel istekler, Uygulama Kontrolü tarafından tamamen doğrulanır ve kimliği onaylanır. Bu sayede, arka ucumuz korunurken uygulamayı yerel olarak test edebiliriz.

Sonuç

Bulut modeli özelliklerini (temellendirme, sistem talimatları) cihaz üzerinde özelliklerle (karma yönlendirme, çeviri, güvenlik uygulaması kontrolleri) birleştirerek akıllı, güvenli ve çevrimdışı kullanılabilen bir seyahat uygulaması oluşturduk.

GitHub'da Jetpacker'ın tam kaynak koduna göz atın ve Firebase dokümanlarını inceleyerek başlayın:

Firebase AI Logic Belgeleri
Firebase Hybrid Inference API

Daha fazla bilgi

Bu blog yayını dizisinin diğer bölümlerine göz atın:

1. bölüm: Uygulamanın tanıtımı ve genel bir bakış.
2. bölüm: Cihaz üzerinde yapay zeka. Seyahat planı özetleme, makbuz ayrıştırma ve yerel ses işleme gibi gizliliğe öncelik veren özellikler oluşturmak için ML Kit'in üretken yapay zeka API'lerini ve Gemini Nano'yu ayrıntılı olarak inceleyin.
3. Bölüm (bu gönderi!): Karma ve bulut akıl yürütme. LLM yanıtlarını Google Haritalar ve web bağlamı gibi gerçek dünya verilerine temellendirmek için Firebase AI Logic'i nasıl kullanacağınızı keşfedin.
4. Bölüm: Sistem entegrasyonu. AppFunctions kullanarak Android Intelligence sistemiyle entegrasyon. 
5. bölüm (yakında): Uygulama içi ajan tabanlı iş akışları. Uygulamayı A2UI ve ADK destekli uçtan uca rezervasyon asistanıyla genişletin.

Android geliştirme hakkında daha fazla bilgi edinmek ister misiniz? Android Developers'ı YouTube veya LinkedIn'de takip edin.

Bu blog yayınındaki tüm kod snippet'leri aşağıdaki telif hakkı bildirimine tabidir:

Copyright 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0
Yazan:
Okumaya devam et