কীভাবে করবেন

বুদ্ধিমান অ্যান্ড্রয়েড অ্যাপ তৈরি করুন: ক্লাউড এবং হাইব্রিড ইনফারেন্স

৮ মিনিটের পাঠ
৩ জন লেখক
Thomas Ezan, Jolanda Verhoef, Caren Chang

" Build intelligent Android apps " ব্লগ পোস্ট সিরিজে আপনাকে আবার স্বাগত জানাই, যেখানে আমরা একটি সাধারণ অ্যান্ড্রয়েড অ্যাপকে একটি ব্যক্তিগতকৃত , বুদ্ধিমান এবং সক্রিয় অভিজ্ঞতায় রূপান্তরিত করি। আমাদের আগের পোস্টে আমরা এমএল কিট-এর প্রম্পট এপিআই (ML Kit's Prompt API) ব্যবহার করে জেমিনি ন্যানো (Gemini Nano)-র সাহায্যে কীভাবে ডিভাইসে বুদ্ধিমান ফিচার তৈরি করা যায়, তা আলোচনা করেছি।

এই পোস্টে আমরা দেখব কিভাবে আপনি Firebase AI Logic-কে কাজে লাগাতে পারেন। ক্লাউড-হোস্টেড এবং হাইব্রিড এআই ফিচার তৈরি করতে:

  • বাস্তব জগতের প্রেক্ষাপটে উত্তর দেওয়া
  • হাইব্রিড ইনফারেন্স ব্যবহার করে ক্লাউড এবং লোকাল এক্সিকিউশনের মধ্যে অনুরোধগুলি গতিশীলভাবে রাউটিং করা
  • কাস্টম রাউটিং সিস্টেম ব্যবহার করে বিষয়বস্তু অনুবাদ করা

কখনও কখনও কোনো ব্যবহারের ক্ষেত্রে এমন এআই মডেলের প্রয়োজন হয়, যেগুলোর বিশ্ব সম্পর্কে ব্যাপক জ্ঞান, অনেক বড় প্রেক্ষাপট বা জটিল কোয়েরি সামলানোর ক্ষমতা রয়েছে। এই ধরনের পরিস্থিতিতে আমরা ক্লাউড মডেল ব্যবহার করতে পারি।

অন্য সময়ে, আপনি উভয় ব্যবস্থারই সেরাটা চান: খরচ কমানোর জন্য সম্ভব হলে ডিভাইসে হাইব্রিড ইনফারেন্স ব্যবহার করা, এবং একই সাথে সব ডিভাইসের সামঞ্জস্যতা নিশ্চিত করতে ক্লাউডে ফিরে যাওয়া।

features.png
জেটপ্যাকারের ক্লাউড ও হাইব্রিড ফিচারসমূহ: ওয়েব-ভিত্তিক মিউজিয়াম অ্যাসিস্ট্যান্ট, হাইব্রিড পদ্ধতিতে রেস্তোরাঁ রিভিউ তৈরি, এবং কাস্টম-রাউটেড লাইভ ট্রান্সলেশন সুবিধাযুক্ত সাপোর্ট চ্যাট।

চলুন দেখে নেওয়া যাক, আমরা Jetpacker- এ কীভাবে তিনটি ক্লাউড ও হাইব্রিড ফিচার বাস্তবায়ন করেছি:

  • ওয়েব গ্রাউন্ডিং সহ একজন জাদুঘর সহকারী
  • হাইব্রিড রেস্তোরাঁ পর্যালোচনার খসড়া তৈরি
  • হোটেল সাপোর্ট চ্যাট, যেখানে কাস্টম-রাউটেড লাইভ অনুবাদের সুবিধা রয়েছে।

সর্বাধুনিক তথ্যের জন্য এলএলএম গ্রাউন্ডিং ব্যবহার করুন। এলএলএম গ্রাউন্ডিং সহ জাদুঘরের সহকারী চ্যাটবট।

মিউজিয়াম অ্যাসিস্ট্যান্ট হলো একটি ইন্টারেক্টিভ চ্যাটবট, যা ব্যবহারকারীদের জাদুঘর পরিদর্শনের পরিকল্পনা করতে সাহায্য করার জন্য তৈরি করা হয়েছে। এটি দর্শনার্থীদের নির্দিষ্ট প্রদর্শনী, বর্তমান খোলার সময়, টিকিটের মূল্য এবং আরও অনেক বিষয়ে হালনাগাদ তথ্য প্রদান করে।

museum_assistant_upscaled.png
মিউজিয়াম অ্যাসিস্ট্যান্ট হলো একটি চ্যাটবট যা বিভিন্ন প্রশ্নের উত্তর দেয়, যেমন ‘আমি লুভরের টিকিটে কীভাবে ছাড় পেতে পারি?’

এআই ফিচার তৈরি করার সময়, মডেলকে দিয়ে নতুন, নির্ভুল এবং সুনির্দিষ্ট বাস্তব-জগতের তথ্য দিয়ে উত্তর দেওয়ানো একটি সাধারণ চ্যালেঞ্জ। যদিও ক্লাউড মডেলগুলোর কাছে বিপুল পরিমাণ জাগতিক জ্ঞান থাকে, তবুও তারা হয়তো মৌসুমী প্রদর্শনী বা বর্তমান দিনের খোলার সময় সম্পর্কে জানে না।

গ্রাউন্ডিং.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
    )

যখন ব্যবহারকারী অ্যাসিস্ট্যান্টকে প্রশ্ন করেন, তখন যদি ইউআরএল গ্রাউন্ডিং সক্রিয় থাকে, আমরা নির্দিষ্ট জাদুঘরের রিসোর্স ইউআরএলগুলো সরাসরি প্রম্পটে যুক্ত করে দিই:

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)

সব AI কাজের জন্য ক্লাউড-ভিত্তিক মডেলের প্রয়োজন হয় না, এবং সব ডিভাইস অনলাইনে থাকে না। ডেভেলপারদের ল্যাটেন্সি, খরচ এবং অফলাইন প্রাপ্যতার মধ্যে ভারসাম্য বজায় রাখতে সাহায্য করার জন্য, আমরা সম্প্রতি হাইব্রিড ইনফারেন্সের জন্য ফায়ারবেস এপিআই (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: স্থানীয়ভাবে সম্পাদনে অগ্রাধিকার দেয় এবং জেমিনি ন্যানো অনুপলব্ধ থাকলে ক্লাউডে ফিরে যায়।
  • PREFER_IN_CLOUD: ক্লাউড এক্সিকিউশনকে অগ্রাধিকার দেয় এবং ডিভাইস অফলাইন হয়ে গেলে অন-ডিভাইস এক্সিকিউশনে ফিরে যায়।
  • ONLY_ON_DEVICE: কার্য সম্পাদন কঠোরভাবে ডিভাইসের মধ্যে সীমাবদ্ধ রাখে।
  • ONLY_IN_CLOUD: কার্য সম্পাদন কঠোরভাবে ক্লাউডে সীমাবদ্ধ করে।

রিভিউটি তৈরি হয়ে গেলে, আমরা সেটি ক্লিপবোর্ডে কপি করি এবং একটি ইন্টেন্ট ব্যবহার করে গুগল ম্যাপসের মাধ্যমে সরাসরি রেস্তোরাঁটির রিভিউ পেজটি খুলে দিই, যা ব্যবহারকারীকে একটি নির্বিঘ্ন অভিজ্ঞতা প্রদান করে।

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) ব্যবহার করে আমরা আগত বার্তার ভাষা শনাক্ত করতে পারি।
  • ডিভাইসেই অনুবাদ (জেমিনি ন্যানো): এমএল কিট-এর প্রম্পট এপিআই আমাদেরকে সরাসরি ডিভাইসেই সাধারণ ভাষা জোড়াগুলো অনুবাদ করতে দেয়, যা ব্যান্ডউইথ এবং ক্লাউড খরচ বাঁচায়।
  • ক্লাউড অনুবাদ (জেমিনি ৩ ফ্ল্যাশ): আরও জটিল ভাষার ক্ষেত্রে, আমরা উন্নত মানের অনুবাদের জন্য জেমিনি ফ্ল্যাশ ৩ ব্যবহার করি।
// 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")
            }
        }
    }
}

এই উদাহরণে, কাস্টম রাউটিং লজিকটি শুধুমাত্র অনুবাদের উৎস এবং লক্ষ্য ভাষা বিবেচনা করে। তবে, আপনার অ্যাপের ব্যবহারের ধরনের উপর ভিত্তি করে, আপনি রাউটিং লজিকটিকে আরও প্রসারিত করে ডিভাইসের মডেল সংস্করণ, নেটওয়ার্ক সংযোগ, ব্যাটারির অবস্থা এবং আরও অনেক কিছুর মতো অন্যান্য বিষয় অন্তর্ভুক্ত করতে পারেন।

এআই পাইপলাইন সুরক্ষিত করা: ফায়ারবেস অ্যাপ যাচাইকরণ

সর্বশেষে, ক্লাউডে এআই ব্যবহারের ফলে এপিআই কী-এর অপব্যবহার বা অননুমোদিত বিলিংয়ের সম্ভাবনা তৈরি হয়। এপিআই কল সুরক্ষিত করতে, আমরা প্লে ইন্টিগ্রিটি (প্রোডাকশন) এবং লোকাল ডিবাগ প্রোভাইডার (লোকাল ডেভেলপমেন্ট বা এমুলেটরের জন্য) উভয়ই ব্যবহার করে ফায়ারবেস অ্যাপ চেক ইন্টিগ্রেট করেছি।

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

এমুলেটরে স্থানীয়ভাবে বিল্ড করার সময়, অ্যাপ চেক লগক্যাটে একটি স্থানীয় টোকেন সিক্রেট প্রিন্ট করে:

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

ফায়ারবেস কনসোলে একবার নিবন্ধিত হয়ে গেলে, স্থানীয় অনুরোধগুলি অ্যাপ চেক দ্বারা সম্পূর্ণরূপে যাচাই ও প্রমাণীকৃত হয়, যা আমাদের ব্যাকএন্ডকে সুরক্ষিত রাখার পাশাপাশি অ্যাপটি স্থানীয়ভাবে পরীক্ষা করার সুযোগ দেয়।

উপসংহার

By combining cloud model capabilities (grounding, system instructions) with on-device capabilities (hybrid routing, translation, security app checks), we created a travel app that is smart, secure, and available offline.

শুরু করার জন্য GitHub-এ Jetpacker-এর সম্পূর্ণ সোর্স কোড দেখুন এবং Firebase ডকুমেন্টেশন অন্বেষণ করুন:

ফায়ারবেস এআই লজিক ডকুমেন্টেশন
ফায়ারবেস হাইব্রিড ইনফারেন্স এপিআই

আরও জানুন

এই ব্লগ পোস্ট সিরিজের অন্যান্য পর্বগুলো দেখে নিন:

পর্ব ১ : অ্যাপটির পরিচিতি এবং একটি সামগ্রিক সংক্ষিপ্ত বিবরণ।
পর্ব ২ : ডিভাইস-ভিত্তিক বুদ্ধিমত্তা। ভ্রমণসূচির সারাংশ, রসিদ বিশ্লেষণ এবং স্থানীয় অডিও প্রক্রিয়াকরণের মতো গোপনীয়তা-কেন্দ্রিক বৈশিষ্ট্য তৈরি করতে এমএল কিট-এর জেনএআই এপিআই এবং জেমিনি ন্যানো-র গভীরে প্রবেশ করুন।
পর্ব ৩ (এই পোস্টে!): হাইব্রিড এবং ক্লাউড রিজনিং। গুগল ম্যাপস এবং ওয়েব কনটেক্সটের মতো বাস্তব-জগতের ডেটার ওপর ভিত্তি করে এলএলএম (LLM) উত্তর তৈরিতে কীভাবে ফায়ারবেস এআই লজিক (Firebase AI Logic) ব্যবহার করা যায়, তা জানুন।
পর্ব ৪: সিস্টেম ইন্টিগ্রেশন। AppFunctions ব্যবহার করে অ্যান্ড্রয়েড ইন্টেলিজেন্স সিস্টেমের সাথে ইন্টিগ্রেট করা।
পর্ব ৫ (শীঘ্রই আসছে): অ্যাপের মধ্যেই এজেন্টিক ওয়ার্কফ্লো। A2UI এবং ADK দ্বারা চালিত একটি এন্ড-টু-এন্ড বুকিং অ্যাসিস্ট্যান্টের মাধ্যমে অ্যাপটিকে আরও উন্নত করুন।

অ্যান্ড্রয়েড ডেভেলপমেন্ট সম্পর্কে আরও জানতে আগ্রহী? ইউটিউব বা লিঙ্কডইন- এ অ্যান্ড্রয়েড ডেভেলপারদের অনুসরণ করুন!

এই ব্লগ পোস্টের সমস্ত কোড স্নিপেট নিম্নলিখিত কপিরাইট বিজ্ঞপ্তি অনুসরণ করে:

Copyright 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0
লিখেছেন:
পড়তে থাকুন