طرق التنفيذ

إنشاء تطبيقات Android ذكية: الاستدلال السحابي والمختلط

مدّة القراءة: 8 دقائق
3 المؤلفون
Thomas Ezan, Jolanda Verhoef, Caren Chang

مرحبًا بك مجددًا في سلسلة مشاركات المدونة "إنشاء تطبيقات Android ذكية"، حيث نأخذ تطبيق Android أساسيًا ونحوّله إلى تجربة مخصّصة وذكية واستباقية. في منشورنا السابق، استعرضنا كيفية إنشاء ميزات ذكية تعمل على الجهاز فقط باستخدام Gemini Nano من خلال Prompt API في حزمة تعلّم الآلة.

في هذه المشاركة، سنتعرّف على كيفية الاستفادة من Firebase AI Logic لإنشاء ميزات مستندة إلى الذكاء الاصطناعي ومستضافة على السحابة الإلكترونية أو مختلطة: 

  • تحديد المصدر لضمان أن تكون الإجابات مبنية على الواقع
  • توجيه الطلبات ديناميكيًا بين التنفيذ على السحابة الإلكترونية والتنفيذ على الجهاز باستخدام الاستدلال المختلط
  • ترجمة المحتوى باستخدام أنظمة توجيه مخصّصة

في بعض الأحيان، تتطلّب حالة الاستخدام نماذج ذكاء اصطناعي تتمتّع بمعرفة أكبر بالعالم الواقعي، أو قدرة استيعاب أكبر بكثير، أو القدرة على التعامل مع طلبات بحث معقّدة. في هذه السيناريوهات، يمكننا الاستفادة من النماذج السحابية. 

في أحيان أخرى، تريد الاستفادة من مزايا كلتا الطريقتَين، أي استخدام الاستدلال المختلط لتنفيذه على الجهاز فقط عندما يكون ذلك متاحًا لخفض التكاليف، مع الرجوع إلى السحابة الإلكترونية لضمان التوافق مع جميع الأجهزة.

features.png
ميزات السحابة الإلكترونية والميزات المختلطة في Jetpacker: مساعد في المتحف مع إمكانية البحث على الويب، وميزة صياغة مراجعات المطاعم المختلطة، ودردشة الدعم التي تتضمّن ترجمة مباشرة موجّهة بشكل مخصّص.

في ما يلي كيفية تنفيذ ثلاث ميزات سحابية ومختلطة في Jetpacker:

  • مساعد في متحف لديه معرفة بالويب
  • صياغة مراجعات المطاعم المختلطة
  • محادثة دعم الفندق التي تتضمّن ترجمة مباشرة موجّهة حسب الطلب

استخدام تحديد مصدر المعلومات في النماذج اللغوية الكبيرة للحصول على معلومات محدّثةروبوت دردشة مساعد في المتحف يستند إلى تحديد مصدر المعلومات في النماذج اللغوية الكبيرة

مساعد المتحف هو روبوت دردشة تفاعلي مصمّم لمساعدة المستخدمين في التخطيط لزياراتهم إلى المتاحف. ويقدّم للزوّار تفاصيل محدّثة بشأن معروضات معيّنة وساعات العمل الحالية وأسعار التذاكر وغير ذلك.

museum_assistant_upscaled.png
مساعد المتحف هو روبوت محادثة يجيب عن أسئلة مثل "كيف يمكنني الحصول على خصم على تذكرة دخول إلى متحف اللوفر؟"

عند إنشاء ميزات مستندة إلى الذكاء الاصطناعي، يواجهنا عادةً تحدّي يتمثل في جعل النموذج يجيب بمعلومات حديثة ودقيقة ومحدّدة من العالم الحقيقي. على الرغم من أنّ النماذج المستندة إلى السحابة الإلكترونية تتضمّن كميات هائلة من المعلومات حول العالم، قد لا تكون على دراية بالمعارض الموسمية أو ساعات العمل في اليوم الحالي.

grounding.png
تتم إضافة بيانات تحديد المصدر إلى قدرة الاستيعاب لتمكين النموذج من الإجابة عن الأسئلة بشكل صحيح ودقيق.

ولسدّ هذه الفجوة، يمكننا استخدام تقنيات الاستناد إلى مصادر موثوقة لإضافة سياق إضافي إلى قدرة الاستيعاب في النموذج. تتيح حزمة تطوير البرامج (SDK) من Firebase AI Logic ثلاثة أنواع من التأسيس:

في Jetpacker، ننشئ الأدوات المتاحة بشكل ديناميكي استنادًا إلى علامات الميزات المفعَّلة، ونبدأ النموذج التوليدي باستخدام حزمة تطوير البرامج (SDK) الخاصة بـ Firebase AI:

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

عندما يطلب المستخدم من "مساعد Google" معلومات، إذا كانت ميزة "الاستناد إلى عناوين URL" مفعّلة، نضيف عناوين URL الخاصة بموارد المتحف مباشرةً إلى الطلب:

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

تتيح واجهة برمجة التطبيقات Hybrid Inference API أربعة أوضاع توجيه مختلفة:

  • PREFER_ON_DEVICE: يمنح الأولوية للتنفيذ المحلي، ويستخدم السحابة الإلكترونية كحلّ بديل في حال عدم توفّر Gemini Nano.
  • PREFER_IN_CLOUD: يمنح الأولوية للتنفيذ على السحابة الإلكترونية، ويتم الرجوع إلى التنفيذ على الجهاز فقط إذا انقطع اتصال الجهاز بالإنترنت.
  • ONLY_ON_DEVICE: يقتصر التنفيذ على الجهاز فقط.
  • ONLY_IN_CLOUD: يحصر التنفيذ في السحابة الإلكترونية فقط.

بعد إنشاء المراجعة، ننسخها إلى الحافظة ونستخدم هدفًا لفتح "خرائط Google" مباشرةً إلى صفحة مراجعة المطعم، ما يوفّر تجربة سلسة للمستخدم:

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، ننفّذ مجموعة توجيه مخصّصة تأخذ في الاعتبار ما يلي:

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

أخيرًا، يتيح استخدام الذكاء الاصطناعي في السحابة إمكانية إساءة استخدام مفتاح واجهة برمجة التطبيقات أو الفوترة غير المصرح بها. لتأمين طلبات البيانات من واجهة برمجة التطبيقات، دمَجنا فحص التطبيقات من Firebase باستخدام كلّ من 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()
}

عند إنشاء التطبيق محليًا على محاكي، تطبع خدمة فحص التطبيقات سر الرمز المميز المحلي إلى أداة Logcat:

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

بعد التسجيل في وحدة تحكّم Firebase، يتم التحقّق من صحة الطلبات المحلية ومصادقتها بالكامل من خلال ميزة "فحص التطبيقات"، ما يحمي الخلفية ويسمح لنا باختبار التطبيق محليًا.

الخاتمة

من خلال الجمع بين إمكانات النموذج المستند إلى السحابة الإلكترونية (تحديد المصدر، تعليمات النظام) والإمكانات المتوفّرة على الجهاز فقط (التوجيه المختلط، والترجمة، وعمليات فحص تطبيقات الأمان)، أنشأنا تطبيق سفر ذكيًا وآمنًا ومتاحًا بلا إنترنت.

يمكنك الاطّلاع على رمز المصدر الكامل لتطبيق Jetpacker على GitHub، واستكشاف مستندات Firebase للبدء:

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

مزيد من المعلومات

يمكنك الاطّلاع على الأجزاء الأخرى من سلسلة منشورات المدوّنة هذه:

الجزء 1: مقدّمة عن التطبيق ونظرة عامة شاملة
الجزء 2: الذكاء على الجهاز فقط التعمّق في واجهات برمجة التطبيقات المستندة إلى الذكاء الاصطناعي التوليدي في حزمة تعلّم الآلة وGemini Nano لإنشاء ميزات يركّز على الخصوصية، مثل تلخيص برامج الرحلات وتحليل الإيصالات ومعالجة الصوت محليًا
الجزء 3 (هذه المشاركة): الاستدلال المختلط والسحابي تعرَّف على كيفية استخدام Firebase AI Logic لتوفير إجابات نماذج اللغات الكبيرة (LLM) التي تستند إلى بيانات من العالم الحقيقي، مثل "خرائط Google" وسياق الويب.
الجزء 4: دمج الأنظمة. التكامل مع نظام Android الذكي باستخدام AppFunctions 
الجزء 5 (سيتم إطلاقه قريبًا): مهام سير العمل المستنِدة إلى الذكاء الاصطناعي الوكيل داخل التطبيق توسيع نطاق التطبيق ليشمل مساعدًا لإجراء الحجوزات بشكل كامل باستخدام A2UI وADK

هل يهمّك معرفة المزيد عن تطوير تطبيقات Android؟ تابِع "مطوّرو تطبيقات Android" على YouTube أو LinkedIn.

تخضع جميع مقتطفات الرموز البرمجية في مشاركة المدونة هذه لإشعار حقوق الطبع والنشر التالي:

Copyright 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0
من تأليف:
متابعة القراءة