طرق التنفيذ

إنشاء تطبيقات 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
    )

عندما يطلب المستخدم من "المساعد" معلومات، إذا كانت ميزة "تحديد المصدر من عنوان 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"
    )

بما أنّ ردود موظف الاستقبال تكون باللغة المحلية للفندق (على سبيل المثال، الفرنسية في فندق Le Meurice في باريس)، علينا ترجمة الرسائل إلى اللغة المفضّلة للمستخدم.

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 Developers على YouTube أو LinkedIn.

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

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