कैसे करें

इंटेलिजेंट Android ऐप्लिकेशन बनाना: क्लाउड और हाइब्रिड इन्फ़रेंस

8 मिनट में पढ़ा जा सकता है
3 लेखक
Thomas Ezan, Jolanda Verhoef, Caren Chang

"इंटेलिजेंट Android ऐप्लिकेशन बनाना" ब्लॉग पोस्ट सीरीज़ में आपका फिर से स्वागत है. इस सीरीज़ में, हम एक सामान्य Android ऐप्लिकेशन को उपयोगकर्ता की दिलचस्पी के हिसाब से बनाए गए, इंटेलिजेंट, और एजेंटिक अनुभव में बदलते हैं. हमने पिछली पोस्ट में, ML Kit के Prompt API का इस्तेमाल करके, Gemini Nano की मदद से उपयोगकर्ता के डिवाइस पर स्मार्ट सुविधाएं बनाने का तरीका बताया था.

इस पोस्ट में, हम देखेंगे कि क्लाउड पर होस्ट की गई और हाइब्रिड एआई सुविधाएं बनाने के लिए, Firebase AI Logic का इस्तेमाल कैसे किया जा सकता है: 

  • जवाबों को असल दुनिया के कॉन्टेक्स्ट के हिसाब से तैयार करना
  • हाइब्रिड इन्फ़्रेंस का इस्तेमाल करके, क्लाउड और लोकल एक्ज़ीक्यूशन के बीच अनुरोधों को डाइनैमिक तरीके से रूट करना
  • कस्टम रूटिंग सिस्टम की मदद से कॉन्टेंट का अनुवाद करना

कभी-कभी, किसी इस्तेमाल के उदाहरण के लिए, ऐसे एआई मॉडल की ज़रूरत होती है जिनके पास दुनिया भर की ज़्यादा जानकारी हो, बड़ी कॉन्टेक्स्ट विंडो हो या जटिल क्वेरी को हैंडल करने की क्षमता हो. ऐसे मामलों में, हम क्लाउड मॉडल का इस्तेमाल कर सकते हैं. 

कभी-कभी, आपको दोनों दुनिया का सबसे अच्छा अनुभव चाहिए होता है: लागत कम करने के लिए उपलब्ध होने पर हाइब्रिड अनुमान को उपयोगकर्ता के डिवाइस पर चलाना, जबकि सभी डिवाइसों के लिए अनुकूलता सुनिश्चित करने के लिए क्लाउड पर वापस जाना.

features.png
Jetpacker में क्लाउड और हाइब्रिड सुविधाएं: वेब पर आधारित म्यूज़ियम असिस्टेंट, हाइब्रिड रेस्टोरेंट की समीक्षा लिखने की सुविधा, और कस्टम-रूट की गई लाइव ट्रांसलेशन की सुविधा के साथ सहायता चैट.

आइए, देखते हैं कि हमने Jetpacker में क्लाउड और हाइब्रिड की तीन सुविधाओं को कैसे लागू किया:

  • संग्रहालय में काम करने वाला एक असिस्टेंट, जो वेब पर उपलब्ध भरोसेमंद स्रोतों से जानकारी लेता है
  • रेस्टोरेंट की समीक्षा लिखने के लिए हाइब्रिड सुविधा
  • होटल के लिए सहायता चैट की सुविधा. इसमें कस्टम-रूट की गई लाइव अनुवाद की सुविधा शामिल है.

अप-टू-डेट जानकारी के लिए, एलएलएम ग्राउंडिंग का इस्तेमाल करनाएलएलएम ग्राउंडिंग की सुविधा वाला म्यूज़ियम असिस्टेंट चैटबॉट

म्यूज़ियम असिस्टेंट एक इंटरैक्टिव चैटबॉट है. इसे लोगों को म्यूज़ियम जाने का प्लान बनाने में मदद करने के लिए डिज़ाइन किया गया है. इससे लोगों को खास प्रदर्शनियों, खुलने के मौजूदा समय, टिकट की कीमत वगैरह के बारे में अप-टू-डेट जानकारी मिलती है.

museum_assistant_upscaled.png
म्यूज़ियम असिस्टेंट एक चैटबॉट है. यह सवालों के जवाब देता है. जैसे, ‘मुझे लूव्र के टिकट पर छूट कैसे मिल सकती है?’

एआई की सुविधाएं बनाते समय, मॉडल से ताज़ा, सटीक, और असल दुनिया की जानकारी के साथ जवाब पाना एक आम चुनौती है. क्लाउड मॉडल के पास दुनिया भर की जानकारी होती है. हालांकि, हो सकता है कि उन्हें सीज़नल प्रदर्शनियों या आज के दिन के कारोबार के खुले होने के समय के बारे में जानकारी न हो.

grounding.png
कॉन्टेक्स्ट विंडो में ग्राउंडिंग डेटा जोड़ा जाता है, ताकि मॉडल सवालों के सही और सटीक जवाब दे सके.

इस अंतर को कम करने के लिए, हम ग्राउंडिंग तकनीकों का इस्तेमाल कर सकते हैं. इससे मॉडल की कॉन्टेक्स्ट विंडो में ज़्यादा कॉन्टेक्स्ट जोड़ा जा सकता है. Firebase AI Logic SDK में तीन तरह की ग्राउंडिंग की सुविधा उपलब्ध है:

Jetpacker में, चालू की गई सुविधा के फ़्लैग के आधार पर उपलब्ध टूल को डाइनैमिक तरीके से बनाया जाता है. साथ ही, 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
    )

जब कोई उपयोगकर्ता, Assistant से कोई सवाल पूछता है और यूआरएल ग्राउंडिंग की सुविधा चालू होती है, तो हम सीधे तौर पर म्यूज़ियम के संसाधन के यूआरएल को प्रॉम्प्ट में जोड़ देते हैं:

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)

एआई के हर टास्क के लिए, क्लाउड-आधारित मॉडल की ज़रूरत नहीं होती. साथ ही, हर डिवाइस ऑनलाइन नहीं होता. डेवलपर को लेटेन्सी, लागत, और ऑफ़लाइन उपलब्धता को बैलेंस करने में मदद करने के लिए, हमने हाल ही में Firebase API for Hybrid Inference लॉन्च किया है.

Jetpacker में, रेस्टोरेंट की समीक्षा सुविधा की मदद से, लोग कुछ विषयों की समीक्षा कर सकते हैं. साथ ही, यह सुविधा अपने-आप एक समीक्षा का ड्राफ़्ट तैयार कर देती है. सभी उपयोगकर्ताओं के लिए इस सुविधा को चालू करने के लिए, हम Gemini Nano की मदद से स्थानीय तौर पर प्रोसेस करने को प्राथमिकता देते हैं. साथ ही, उन डिवाइसों पर क्लाउड मॉडल का इस्तेमाल करते हैं जिन पर Gemini Nano काम नहीं करता. 

review_upscaled.png
रेस्टोरेंट की समीक्षा करने की सुविधा, विषयों के आधार पर समीक्षा का मसौदा तैयार करने के लिए हाइब्रिड इन्फ़रेंस का इस्तेमाल करती है
// 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
    )
)

हाइब्रिड इन्फ़रेंस एपीआई में, राउटिंग के चार अलग-अलग मोड इस्तेमाल किए जा सकते हैं:

  • PREFER_ON_DEVICE: इसमें, डिवाइस पर मौजूद डेटा को प्रोसेस करने को प्राथमिकता दी जाती है. अगर Gemini Nano उपलब्ध नहीं है, तो क्लाउड का इस्तेमाल किया जाता है.
  • PREFER_IN_CLOUD: यह क्लाउड पर प्रोसेस करने को प्राथमिकता देता है. अगर डिवाइस ऑफ़लाइन हो जाता है, तो यह उपयोगकर्ता के डिवाइस पर प्रोसेस करने की सुविधा पर वापस आ जाता है.
  • ONLY_ON_DEVICE: इस सेटिंग को चालू करने पर, डिवाइस पर ही कार्रवाई की जा सकती है.
  • ONLY_IN_CLOUD: यह विकल्प, सिर्फ़ क्लाउड में एक्ज़ीक्यूट करने की अनुमति देता है.

समीक्षा जनरेट होने के बाद, हम उसे क्लिपबोर्ड पर कॉपी करते हैं. इसके बाद, Google Maps को सीधे तौर पर रेस्टोरेंट के समीक्षा पेज पर खोलने के लिए, इंटेंट का इस्तेमाल करते हैं. इससे लोगों को बेहतर अनुभव मिलता है:

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

कस्टम हाइब्रिड राउटिंग: होटल के लिए सहायता चैट में, सिमुलेट किए गए पर्सोना के साथ अनुवाद करने की सुविधा

होटल की सहायता टीम से चैट करने की सुविधा इसलिए बनाई गई है, ताकि लोग लॉजिस्टिक्स से जुड़ी जानकारी को फ़ाइनल कर सकें और होटल की जानकारी देख सकें. इस सुविधा में, सिस्टम के निर्देशों का इस्तेमाल करके, स्थानीय भाषा में रिसेप्शनिस्ट असिस्टेंट को कॉन्फ़िगर किया जाता है. निर्देशों में कुछ खास जानकारी देकर, जैसे कि पसंदीदा भाषा और होटल की जानकारी, हम किसी होटल के लिए बातचीत करने वाला पर्सोना सेट अप कर सकते हैं.

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

रिसेप्शनिस्ट के जवाब, होटल की स्थानीय भाषा में होते हैं. उदाहरण के लिए, पेरिस में मौजूद होटल ले मेरिडियन के लिए फ़्रेंच भाषा. इसलिए, हमें मैसेज को उपयोगकर्ता की पसंदीदा भाषा में अनुवाद करना होगा.

translation_upscaled.png
होटल की सहायता टीम के साथ चैट करने पर, मैसेज का अनुवाद उपयोगकर्ता की पसंदीदा भाषा में अपने-आप हो जाता है 

हाइब्रिड मॉडल, सामान्य राउटिंग की प्राथमिकताओं को कॉन्फ़िगर कर सकते हैं. हालांकि, जटिल स्थितियों के लिए कस्टम राउटिंग लॉजिक की ज़रूरत होती है. Jetpacker में, हम कस्टम रूटिंग स्टैक लागू करते हैं. इसमें इन बातों का ध्यान रखा जाता है:

  • भाषा की पहचान करना: उपयोगकर्ता के डिवाइस पर मौजूद ML Kit Language Identification API का इस्तेमाल करके, हम आने वाले मैसेज की भाषा का पता लगा सकते हैं.
  • उपयोगकर्ता के डिवाइस पर अनुवाद करने की सुविधा (Gemini Nano): ML Kit के Prompt API की मदद से, हम सामान्य भाषा के जोड़े का अनुवाद सीधे डिवाइस पर कर सकते हैं. इससे बैंडविथ और क्लाउड की लागत बचती है.
  • क्लाउड ट्रांसलेशन (Gemini 3 Flash): ज़्यादा मुश्किल भाषाओं के लिए, हम Gemini 3 Flash का इस्तेमाल करते हैं, ताकि बेहतर क्वालिटी में अनुवाद किया जा सके.
// 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"
    )

जब किसी मैसेज का अनुवाद करना होता है, तो हम जिस भाषा का अनुवाद करना है उसकी पहचान करते हैं और अपने कस्टम रूटिंग लॉजिक को लागू करते हैं. इसके बाद, उपयोगकर्ता के डिवाइस पर या क्लाउड पर अनुवाद किया जाता है:

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

इस उदाहरण में, कस्टम राउटिंग लॉजिक सिर्फ़ अनुवाद की सोर्स और टारगेट भाषा को ध्यान में रखता है. हालांकि, आपके ऐप्लिकेशन के इस्तेमाल के उदाहरण के आधार पर, राउटिंग लॉजिक को बढ़ाया जा सकता है. इसमें अन्य फ़ैक्टर शामिल किए जा सकते हैं. जैसे, उपयोगकर्ता के डिवाइस पर मौजूद मॉडल का वर्शन, नेटवर्क कनेक्टिविटी, बैटरी की स्थिति वगैरह.

एआई पाइपलाइन को सुरक्षित करना: Firebase App Check

आखिर में, क्लाउड में एआई का इस्तेमाल करने से, एपीआई कुंजी के गलत इस्तेमाल या बिना अनुमति के बिलिंग की संभावनाएं बढ़ जाती हैं. एपीआई कॉल को सुरक्षित बनाने के लिए, हमने Firebase App Check को इंटिग्रेट किया है. इसके लिए, हमने Play Integrity (प्रोडक्शन) और लोकल Debug Provider (लोकल डेवलपमेंट या एम्युलेटर के लिए) दोनों का इस्तेमाल किया है.

JetPackerApplication.kt फ़ाइल में, हम स्टार्टअप के समय डीबग प्रोवाइडर इंस्टॉल करते हैं. साथ ही, पहचान ज़ाहिर किए बिना पुष्टि करने की सुविधा को ट्रिगर करते हैं, ताकि उपयोगकर्ता के लिए सुरक्षित सेशन बनाया जा सके:

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

एम्युलेटर पर स्थानीय तौर पर ऐप्लिकेशन बनाते समय, App Check, logcat में लोकल टोकन सीक्रेट प्रिंट करता है:

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

Firebase कंसोल में रजिस्टर करने के बाद, स्थानीय अनुरोधों की पूरी तरह से पुष्टि की जाती है. साथ ही, App Check से इनकी पुष्टि की जाती है. इससे हमारे बैकएंड की सुरक्षा होती है. साथ ही, हमें ऐप्लिकेशन को स्थानीय तौर पर टेस्ट करने की अनुमति मिलती है.

नतीजा

हमने क्लाउड मॉडल की सुविधाओं (ग्राउंडिंग, सिस्टम के निर्देश) को उपयोगकर्ता के डिवाइस पर मौजूद सुविधाओं (हाइब्रिड राउटिंग, अनुवाद, सुरक्षा के लिए ऐप्लिकेशन की जांच) के साथ मिलाकर, एक ऐसा यात्रा ऐप्लिकेशन बनाया है जो स्मार्ट, सुरक्षित, और ऑफ़लाइन उपलब्ध है.

GitHub पर Jetpacker का पूरा सोर्स कोड देखें. साथ ही, शुरू करने के लिए Firebase का दस्तावेज़ पढ़ें:

Firebase AI Logic का दस्तावेज़
Firebase Hybrid Inference API

ज़्यादा जानें

इस ब्लॉग पोस्ट सीरीज़ के अन्य हिस्से देखें:

पहला हिस्सा: ऐप्लिकेशन के बारे में जानकारी और खास जानकारी.
दूसरा हिस्सा: उपयोगकर्ता के डिवाइस पर मौजूद इंटेलिजेंस. एमएल किट के जेन एआई एपीआई और Gemini Nano के बारे में ज़्यादा जानें. साथ ही, निजता को प्राथमिकता देने वाली सुविधाएँ बनाएँ. जैसे, यात्रा की योजना की खास जानकारी, रसीद पार्स करना, और स्थानीय ऑडियो प्रोसेसिंग.
तीसरा हिस्सा (यह पोस्ट!): हाइब्रिड और क्लाउड रीज़निंग. एलएलएम के जवाबों को Google Maps और वेब कॉन्टेक्स्ट जैसे असल दुनिया के डेटा के आधार पर तैयार करने के लिए, Firebase के एआई लॉजिक का इस्तेमाल करने का तरीका जानें.
चौथा हिस्सा: सिस्टम इंटिग्रेशन. AppFunctions का इस्तेमाल करके, Android के इंटेलिजेंस सिस्टम के साथ इंटिग्रेट करना. 
पांचवां हिस्सा (जल्द आ रहा है): ऐप्लिकेशन में एआई एजेंट के वर्कफ़्लो. A2UI और ADK की मदद से, बुकिंग से जुड़ी सभी सुविधाओं को ऐप्लिकेशन में जोड़ें.

क्या आपको Android डेवलपमेंट के बारे में ज़्यादा जानना है? Android Developers को YouTube या LinkedIn पर फ़ॉलो करें!

इस ब्लॉग पोस्ट में दिए गए सभी कोड स्निपेट के लिए, कॉपीराइट से जुड़ा यह नोटिस लागू होता है:

Copyright 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0
लेखक:
पढ़ना जारी रखें