آموزش گام‌به‌گام

ساختن برنامه‌های Android هوشمند: استنباط ابری و ترکیبی

‫۸ دقیقه خواندن
۳ نویسندگان
Thomas Ezan, Jolanda Verhoef, Caren Chang

به مجموعه پست‌های وبلاگ «ساختن برنامه‌های هوشمند Android» خوش آمدید. در این مجموعه، یک برنامه Android ساده را به تجربه‌ای شخصی‌سازی‌شده، هوشمند، و عامل‌محور تبدیل می‌کنیم. در پست قبلی خود، نحوه ساخت ویژگی‌های هوشمند درون‌دستگاهی بااستفاده از Gemini Nano ازطریق ML Kit's Prompt API را بررسی کردیم.

در این پست، به نحوه استفاده از Firebase AI Logic برای ساختن ویژگی‌های هوش مصنوعی ترکیبی و میزبانی‌شده در فضای ابری می‌پردازیم: 

  • پاسخ‌های مستند در بافت دنیای واقعی
  • مسیردهی پویا درخواست‌ها بین اجرای ابری و محلی بااستفاده از استنباط ترکیبی
  • ترجمه محتوا با سیستم‌های مسیریابی سفارشی

گاهی اوقات یک مورد استفاده به مدل‌های هوش مصنوعی با دانش جهانی بیشتر، پنجره بافت بسیار بزرگ‌تر، یا توانایی مدیریت پُرسمان‌های پیچیده نیاز دارد. در این سناریوها، می‌توانیم از مدل‌های ابری استفاده کنیم. 

در مواقع دیگر، بهترین حالت این است که از هر دو روش استفاده کنید: از استنباط ترکیبی برای اجرای روی دستگاه درصورت دردسترس بودن برای کاهش هزینه‌ها استفاده کنید، و درصورت عدم دردسترس بودن، از فضای ابری برای اطمینان از سازگاری با همه دستگاه‌ها استفاده کنید.

features.png
ویژگی‌های ابری و ترکیبی در Jetpacker: دستیار موزه با زمینه وب، پیش‌نویس بررسی رستوران ترکیبی، و گپ پشتیبانی با ترجمه زنده سفارشی‌سازی‌شده.

بیایید ببینیم چگونه سه ویژگی ابری و ترکیبی را در Jetpacker پیاده‌سازی کردیم:

  • دستیار موزه با زمینه وب
  • پیش‌نویس کردن مرور رستوران ترکیبی
  • گپ پشتیبانی هتل با ترجمه زنده سفارشی‌سازی‌شده.

استفاده از «پایه LLM» برای اطلاعات به‌روز روبات گپ دستیار موزه با «پایه LLM»

دستیار موزه یک روبات گپ تعاملی است که برای کمک به کاربران در برنامه‌ریزی بازدید از موزه‌ها طراحی شده است. این سایت جزئیات به‌روزی درباره نمایشگاه‌های ویژه، ساعات کاری فعلی، قیمت بلیت، و موارد دیگر به بازدیدکنندگان ارائه می‌دهد.

museum_assistant_upscaled.png
دستیار موزه یک روبات گپ است که به سؤالاتی مانند «چگونه می‌توانم تخفیف بلیط لوور را دریافت کنم؟» پاسخ می‌دهد.

هنگام ساختن ویژگی‌های هوش مصنوعی، اینکه مدل را وادار کنیم با اطلاعات تازه، دقیق، و مشخص دنیای واقعی پاسخ دهد یک چالش رایج است. اگرچه مدل‌های ابری دارای حجم عظیمی از دانش جهانی هستند، اما ممکن است درباره نمایشگاه‌های فصلی یا ساعات کاری امروز اطلاعی نداشته باشند.

grounding.png
داده‌های زمینه‌ای به پنجره زمینه‌ای اضافه می‌شود تا مدل بتواند به سؤالات به‌درستی و با دقت پاسخ دهد.

برای پر کردن این شکاف، می‌توانیم از تکنیک‌های زمینه‌سازی برای افزودن بافت اضافی به پنجره زمینه‌ای مدل استفاده کنیم. کیت توسعه نرم‌افزار Firebase AI Logic از سه نوع زمینه‌سازی پشتیبانی می‌کند:

  • پاسخ‌دهی با نشانی وب: پاسخ‌دهی بااستفاده از محتوای یک صفحه وب خاص (مثلاً قیمت‌های فعلی بلیت یا قوانین موزه).
  • پایه جستجوی Google: به مدل اجازه می‌دهد تا شاخص جستجوی Google را به‌صورت هم‌زمان برای جزئیات به‌روز پرس‌وجو کند.
  • پایه‌مندسازی Maps: استفاده از داده‌های مکان Google Maps.

در Jetpacker، ابزارهای دردسترس را براساس پرچم‌های ویژگی فعال‌شده به‌صورت پویا می‌سازیم و مدل زایا را بااستفاده از «کیت توسعه نرم‌افزار هوش مصنوعی Firebase» مقداردهی اولیه می‌کنیم:

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

همه تکالیف هوش مصنوعی به مدل ابری نیاز ندارند و همه دستگاه‌ها آنلاین نیستند. برای کمک به توسعه‌دهندگان در ایجاد تعادل بین تأخیر، هزینه، و دردسترس بودن آفلاین، اخیراً 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’s Prompt API به ما امکان می‌دهد جفت‌های زبان رایج را مستقیماً در دستگاه ترجمه کنیم و در پهنای باند و هزینه ابری صرفه‌جویی کنیم.
  • ترجمه ابری (Gemini 3 Flash): برای زبان‌های پیچیده‌تر، از Gemini Flash 3 برای دریافت ترجمه با کیفیت بالاتر استفاده می‌کنیم.
// 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

درنهایت، استفاده از هوش مصنوعی در فضای ابری امکان سوءاستفاده از کلید API یا صدور صورت‌حساب غیرمجاز را فراهم می‌کند. برای ایمن کردن فراخوانی‌های API، از Firebase App Check بااستفاده از Play Integrity (تولید) و «ارائه‌دهنده اشکال‌زدایی» محلی (برای توسعه محلی یا شبیه‌سازها) استفاده کردیم.

در فایل 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 درستی‌سنجی و اصالت‌سنجی می‌شوند و از زیرینه ما محافظت می‌کنند و درعین‌حال به ما اجازه می‌دهند برنامه را به‌صورت محلی آزمایش کنیم.

نتیجه‌گیری

با ترکیب قابلیت‌های مدل ابری (زمینه‌سازی، دستورالعمل‌های سیستم) با قابلیت‌های درون‌دستگاهی (مسیریابی ترکیبی، ترجمه، بررسی‌های امنیتی برنامه)، برنامه سفری هوشمند، ایمن، و دردسترس به‌صورت آفلاین ایجاد کردیم.

کد منبع کامل Jetpacker را در GitHub بررسی کنید و برای شروع، اسناد Firebase را کاوش کنید:

مستندات Firebase AI Logic
Firebase Hybrid Inference API

بیشتر بدانید

بخش‌های دیگر این مجموعه پست وبلاگ را بررسی کنید:

بخش ۱: معرفی برنامه و نمای کلی سطح بالا.
بخش ۲: هوش درون‌دستگاهی. برای ساختن ویژگی‌های حریم خصوصی‌محور مثل خلاصه کردن برنامه سفر، تجزیه رسید، و پردازش صوتی محلی، در APIهای GenAI مربوط به ML Kit و Gemini Nano دقیق شوید.
بخش ۳ (این پست!): استدلال ترکیبی و ابری. کاوش کنید که چگونه از «منطق هوش مصنوعی Firebase» برای استوار کردن پاسخ‌های مدل زبانی بزرگ در داده‌های دنیای واقعی مثل Google Maps و بافت وب استفاده کنید.
بخش ۴: یکپارچه‌سازی سیستم. ادغام با سیستم هوش Android بااستفاده از «عملکردهای برنامه». 
بخش ۵ (به‌زودی): گردش‌های کار عامل درون‌برنامه‌ای. برنامه را با دستیار رزرو سرتاسری که از A2UI و ADK بهره می‌برد گسترش دهید.

به توسعه Android علاقه دارید؟ «توسعه‌دهندگان برنامه Android» را در YouTube یا LinkedIn دنبال کنید!

همه تکه‌کدهای موجود در این پست وبلاگ از اطلاعیه حق نشر زیر پیروی می‌کنند:

Copyright 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0
نوشته:
ادامه خواندن