أضف توصيات إلى تطبيقك باستخدام TensorFlow Lite و Firebase - Android Codelab

تنظيم صفحاتك في مجموعات يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.

1. نظرة عامة

مرحبًا بك في التوصيات مع TensorFlow Lite و Firebase codelab. ستتعلم في مختبر الرموز هذا كيفية استخدام TensorFlow Lite و Firebase لنشر نموذج توصية لتطبيقك. يعتمد مختبر الرموز هذا على مثال TensorFlow Lite هذا.

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

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

ماذا ستتعلم

  • ادمج Firebase Analytics في تطبيق android لجمع بيانات سلوك المستخدم
  • قم بتصدير تلك البيانات إلى Google Big Query
  • قم بمعالجة البيانات مسبقًا وتدريب نموذج توصيات TF Lite
  • انشر نموذج TF Lite على Firebase ML وقم بالوصول إليه من تطبيقك
  • قم بتشغيل الاستدلال على الجهاز باستخدام النموذج لاقتراح توصيات للمستخدمين

ماذا ستحتاج

  • الإصدار 3.4+ من Android Studio.
  • عينة من الرموز.
  • جهاز اختبار يعمل بنظام Android 2.3+ وخدمات Google Play 9.8 أو أحدث ، أو محاكي مع خدمات Google Play 9.8 أو أحدث
  • في حالة استخدام جهاز ، كبل اتصال.

كيف ستستخدم هذا البرنامج التعليمي؟

اقرأها فقط اقرأها وأكمل التدريبات

كيف تقيم تجربتك مع إنشاء تطبيقات Android؟

مبتدئ متوسط بارع

2. احصل على نموذج التعليمات البرمجية

استنساخ مستودع GitHub من سطر الأوامر.

$ git clone https://github.com/FirebaseExtended/codelab-contentrecommendation-android.git

3. استيراد تطبيق المبتدئين

من Android Studio ، حدد دليل codelab-recommendations-android ( android_studio_folder.png ) من نموذج الكود الذي تم تنزيله ( ملف > فتح > ... / codelab-articles-android / start).

يجب أن يكون لديك الآن مشروع البدء مفتوحًا في Android Studio.

4. إنشاء مشروع وحدة تحكم Firebase

أنشئ مشروعًا جديدًا

  1. انتقل إلى وحدة تحكم Firebase .
  2. حدد إضافة مشروع (أو إنشاء مشروع إذا كان المشروع الأول).
  3. حدد أو أدخل اسم المشروع وانقر فوق متابعة .
  4. تأكد من تمكين "تمكين Google Analytics لهذا المشروع".
  5. اتبع خطوات الإعداد المتبقية في وحدة تحكم Firebase ، ثم انقر على إنشاء مشروع (أو إضافة Firebase ، إذا كنت تستخدم مشروع Google موجودًا).

5. أضف Firebase

  1. من شاشة النظرة العامة لمشروعك الجديد ، انقر فوق أيقونة Android لبدء سير عمل الإعداد.
  2. أدخل اسم حزمة مختبر الكود: com.google.firebase.codelabs.recommendations
  3. حدد تسجيل التطبيق .

أضف ملف google-services.json إلى تطبيقك

بعد إضافة اسم الحزمة وتحديد تسجيل ، انقر فوق تنزيل google-services.json للحصول على ملف تهيئة Firebase Android ثم انسخ ملف google-services.json في دليل app في مشروعك. بعد تنزيل الملف ، يمكنك تخطي الخطوات التالية الموضحة في وحدة التحكم (تم إنجازها بالفعل من أجلك في مشروع build-android-start).

أضف المكوِّن الإضافي لخدمات google إلى تطبيقك

يستخدم المكون الإضافي لخدمات google ملف google-services.json لتهيئة تطبيقك لاستخدام Firebase. يجب إضافة الأسطر التالية بالفعل إلى ملفات build.gradle في المشروع (تحقق للتأكيد):

app / build.grade

apply plugin: 'com.google.gms.google-services'

بناء

classpath 'com.google.gms:google-services:4.3.13'

مزامنة مشروعك مع ملفات gradle

للتأكد من أن جميع التبعيات متاحة لتطبيقك ، يجب عليك مزامنة مشروعك مع ملفات gradle في هذه المرحلة. حدد File> Sync Project with Gradle Files من شريط أدوات Android Studio.

6. قم بتشغيل تطبيق المبتدئين

الآن بعد أن قمت باستيراد المشروع إلى Android Studio وقمت بتهيئة المكون الإضافي google-services بملف JSON ، فأنت جاهز لتشغيل التطبيق لأول مرة. قم بتوصيل جهاز Android الخاص بك ، وانقر فوق تشغيل ( execute.png ) في شريط أدوات Android Studio.

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

7. أضف Firebase Analytics إلى التطبيق

في هذه الخطوة ، ستضيف Firebase Analytics إلى التطبيق لتسجيل بيانات سلوك المستخدم (في هذه الحالة ، الأفلام التي يحبها المستخدم). سيتم استخدام هذه البيانات بشكل إجمالي في الخطوات المستقبلية لتدريب نموذج التوصيات.

أضف تبعية Firebase Analytics

التبعية التالية ضرورية لإضافة Firebase Analytics إلى تطبيقك. يجب أن يتم تضمينه بالفعل في ملف app / build.gradle (تحقق).

app / build.grade

implementation 'com.google.firebase:firebase-analytics-ktx:21.1.0'

قم بإعداد Firebase Analytics في التطبيق

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

أضف وظيفة onMovieLiked مع الكود أدناه لتسجيل حدث تحليلي عندما ينقر المستخدم على الإعجاب بفيلم.

أعجبني

import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.analytics.ktx.logEvent
import com.google.firebase.ktx.Firebase


class LikedMoviesViewModel internal constructor (application: Application) : AndroidViewModel(application) {

    ...

    fun onMovieLiked(movie: Movie) {
        movies.setLike(movie, true)
        logAnalyticsEvent(movie.id.toString())
    }
       
}

أضف الحقل والوظيفة التالية لتسجيل حدث Analytics عند إضافة فيلم إلى قائمة الإعجابات الخاصة بالمستخدم.

أعجبني

import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.analytics.ktx.logEvent
import com.google.firebase.ktx.Firebase


class LikedMoviesViewModel internal constructor (application: Application) : AndroidViewModel(application) {
    ...
    private val firebaseAnalytics = Firebase.analytics

    ...

    /**
     * Logs an event in Firebase Analytics that is used in aggregate to train the recommendations
     * model.
     */
    private fun logAnalyticsEvent(id: String) {
        firebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_ITEM) {
            param(FirebaseAnalytics.Param.ITEM_ID, id)
        }
    }

8. اختبر تكامل برنامج Analytics

في هذه الخطوة ، سننشئ أحداث Analytics في التطبيق ونتحقق من إرسالها إلى Firebase Console.

تمكين Analytics Debug Logging

تم تصميم Firebase Analytics لإطالة عمر بطارية المستخدم إلى أقصى حد وسيعمل على تجميع الأحداث على الجهاز وإرسالها فقط إلى Firebase من حين لآخر. لأغراض تصحيح الأخطاء ، يمكننا تعطيل هذا السلوك لرؤية الأحداث أثناء تسجيلها في الوقت الفعلي عن طريق تشغيل الأمر التالي في shell.

صالة

adb shell setprop debug.firebase.analytics.app com.google.firebase.codelabs.recommendations

تحقق من إنشاء أحداث Analytics

  1. في Android studio ، افتح نافذة Logcat لفحص التسجيل من تطبيقك.
  2. اضبط مرشح Logcat على السلسلة "حدث التسجيل".
  3. تحقق من أن أحداث "select_item" في Analytics تصدر في كل مرة تحب فيها فيلمًا في التطبيق.

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

اختياري: قم بتأكيد أحداث Analytics في Firebase Console

  1. انتقل إلى وحدة تحكم Firebase .
  2. حدد DebugView ضمن Analytics
  3. في Android Studio ، حدد Run لتشغيل التطبيق وإضافة بعض الأفلام إلى قائمة الإعجابات.
  4. في DebugView لوحدة تحكم Firebase ، تحقق من أنه يتم تسجيل هذه الأحداث أثناء إضافة أفلام في التطبيق.

9. تصدير بيانات التحليلات إلى Big Query

Big Query هو أحد منتجات Google Cloud التي تتيح لك فحص ومعالجة كميات كبيرة من البيانات. في هذه الخطوة ، ستقوم بتوصيل مشروع Firebase Console الخاص بك بـ Big Query بحيث يتم تصدير بيانات التحليلات التي تم إنشاؤها بواسطة تطبيقك تلقائيًا إلى Big Query.

تفعيل تصدير Big Query

  1. انتقل إلى وحدة تحكم Firebase .
  2. حدد رمز ترس الإعدادات بجوار نظرة عامة على المشروع ، ثم حدد إعدادات المشروع
  3. حدد علامة التبويب التكامل .
  4. حدد ارتباط (أو إدارة ) داخل مجموعة BigQuery .
  5. حدد " التالي " في الخطوة " حول ربط Firebase بـ BigQuery ".
  6. ضمن قسم تكوين التكامل ، انقر على مفتاح التبديل لتمكين إرسال بيانات Google Analytics وحدد ارتباط إلى BigQuery .

لقد قمت الآن بتمكين مشروع وحدة تحكم Firebase لإرسال بيانات حدث Firebase Analytics تلقائيًا إلى Big Query. يحدث هذا تلقائيًا دون أي تفاعل إضافي ، ومع ذلك ، قد لا يحدث التصدير الأول الذي ينشئ مجموعة بيانات التحليلات في BigQuery لمدة 24 ساعة. بعد إنشاء مجموعة البيانات ، يقوم Firebase باستمرار بتصدير أحداث Analytics الجديدة إلى Big Query في جدول اليوم ، ويقوم بتجميع الأحداث من الأيام الماضية في جدول الأحداث.

يتطلب تدريب نموذج التوصيات الكثير من البيانات. نظرًا لعدم وجود تطبيق يعمل بالفعل على إنشاء كميات كبيرة من البيانات ، سنقوم في الخطوة التالية باستيراد عينة مجموعة بيانات إلى BigQuery لاستخدامها في بقية هذا البرنامج التعليمي.

10. استخدم BigQuery للحصول على بيانات تدريب نموذجية

الآن بعد أن ربطنا Firebase Console للتصدير إلى BigQuery ، ستظهر بيانات أحداث تحليلات التطبيق تلقائيًا في وحدة تحكم BigQuery بعد مرور بعض الوقت. للحصول على بعض البيانات الأولية لأغراض هذا البرنامج التعليمي ، سنقوم في هذه الخطوة باستيراد عينة مجموعة بيانات حالية إلى وحدة تحكم BigQuery لاستخدامها في تدريب نموذج التوصيات الخاص بنا.

استيراد عينة مجموعة بيانات إلى BigQuery

  1. انتقل إلى لوحة معلومات BigQuery في وحدة التحكم السحابية من Google.
  2. حدد اسم مشروعك في القائمة.
  3. حدد اسم مشروعك في الجزء السفلي من شريط التنقل الأيمن في BigQuery للاطلاع على التفاصيل.
  4. حدد إنشاء مجموعة بيانات لفتح لوحة إنشاء مجموعة البيانات.
  5. أدخل "firebase_recommendations_dataset" لمعرف مجموعة البيانات وحدد إنشاء مجموعة البيانات .
  6. ستظهر مجموعة البيانات الجديدة في القائمة اليسرى تحت اسم المشروع. انقر فوقه.
  7. حدد إنشاء جدول لفتح لوحة إنشاء الجدول.
  8. لإنشاء جدول من تحديد "Google Cloud Storage".
  9. في حقل تحديد ملف من حاوية GCS ، أدخل "gs: //firebase-recommendations/recommendations-test/formatted_data_filtered.txt".
  10. حدد "JSONL" في القائمة المنسدلة لتنسيق الملف .
  11. أدخل "جدول التوصيات" في اسم الجدول .
  12. حدد المربع ضمن المخطط> الاكتشاف التلقائي> المخطط ومعلمات الإدخال
  13. حدد إنشاء جدول

استكشاف عينة مجموعة البيانات

في هذه المرحلة ، يمكنك استكشاف المخطط ومعاينة مجموعة البيانات هذه اختياريًا.

  1. حدد مجموعة بيانات firebase-التوصيات-dataset في القائمة اليمنى لتوسيع الجداول التي تحتوي عليها.
  2. حدد جدول جدول التوصيات لعرض مخطط الجدول.
  3. حدد معاينة لمشاهدة بيانات حدث Analytics الفعلية التي يحتوي عليها هذا الجدول.

إنشاء بيانات اعتماد حساب الخدمة

الآن ، سننشئ بيانات اعتماد حساب الخدمة في مشروع وحدة التحكم في السحاب من Google والذي يمكننا استخدامه في بيئة Colab في الخطوة التالية للوصول إلى بيانات BigQuery وتحميلها.

  1. تأكد من تمكين الفوترة لمشروع Google Cloud الخاص بك.
  2. تفعيل واجهات برمجة تطبيقات BigQuery و BigQuery Storage API. < انقر هنا >
  3. انتقل إلى صفحة إنشاء مفتاح حساب الخدمة .
  4. من قائمة حساب الخدمة ، حدد حساب خدمة جديد .
  5. في حقل اسم حساب الخدمة ، أدخل اسمًا.
  6. من قائمة الدور ، حدد المشروع > المالك .
  7. انقر فوق إنشاء . ملف JSON يحتوي على تنزيلات رئيسية لجهاز الكمبيوتر الخاص بك.

في الخطوة التالية ، سنستخدم Google Colab لمعالجة هذه البيانات مسبقًا وتدريب نموذج توصياتنا.

11. بيانات ما قبل العملية ونموذج توصيات القطار

في هذه الخطوة ، سنستخدم دفتر Colab للقيام بالخطوات التالية:

  1. استيراد بيانات BigQuery إلى دفتر Colab المحمول
  2. المعالجة المسبقة للبيانات لإعدادها للتدريب النموذجي
  3. تدريب نموذج التوصيات على بيانات التحليلات
  4. تصدير النموذج كنموذج TF لايت
  5. نشر النموذج على Firebase Console حتى نتمكن من استخدامه في تطبيقنا

قبل أن نطلق دفتر تدريب Colab ، سنعمل أولاً على تمكين Firebase Model Management API حتى تتمكن Colab من نشر النموذج المدرب في وحدة تحكم Firebase الخاصة بنا.

تفعيل Firebase Model Management API

قم بإنشاء دلو لتخزين نماذج ML الخاصة بك

في وحدة تحكم Firebase ، انتقل إلى التخزين وانقر على البدء. fbbea78f0eb3dc9f.png

اتبع الحوار لإعداد دلو الخاص بك.

19517c0d6d2aa14d.png

تفعيل Firebase ML API

انتقل إلى صفحة Firebase ML API على Google Cloud Console وانقر على تمكين.

استخدم دفتر Colab لتدريب النموذج ونشره

افتح دفتر colab باستخدام الرابط التالي وأكمل الخطوات الموجودة بداخله. بعد الانتهاء من الخطوات في دفتر Colab المحمول ، سيكون لديك ملف نموذج TF lite تم نشره على وحدة تحكم Firebase بحيث يمكننا مزامنته مع تطبيقنا.

فتح في كولاب

12. قم بتنزيل النموذج في تطبيقك

في هذه الخطوة ، سنقوم بتعديل تطبيقنا لتنزيل النموذج الذي دربناه للتو من Firebase Machine Learning.

أضف تبعية Firebase ML

التبعية التالية ضرورية لاستخدام نماذج Firebase Machine Learning في تطبيقك. يجب بالفعل إضافته (تحقق).

app / build.grade

implementation 'com.google.firebase:firebase-ml-modeldownloader:24.0.4'

قم بتنزيل النموذج باستخدام Firebase Model Manager API

قم بنسخ الكود أدناه إلى التوصية .

التوصية

    private fun downloadModel(modelName: String) {
        val conditions = CustomModelDownloadConditions.Builder()
            .requireWifi()
            .build()
        FirebaseModelDownloader.getInstance()
            .getModel(modelName, DownloadType.LOCAL_MODEL, conditions)
            .addOnCompleteListener {
                if (!it.isSuccessful) {
                    showToast(context, "Failed to get model file.")
                } else {
                    showToast(context, "Downloaded remote model: $modelName")
                    GlobalScope.launch { initializeInterpreter(it.result) }
                }
            }
            .addOnFailureListener {
                showToast(context, "Model download failed for recommendations, please check your connection.")
            }
    }

13. ادمج نموذج توصية Tensorflow Lite في تطبيقك

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

تحميل القاموس والتسميات

يتم سرد التسميات المستخدمة لإنشاء التوصيات المرشحة بواسطة نموذج التوصيات في الملف Sorted_movie_vocab.json في مجلد res / الأصول. انسخ الكود التالي لتحميل هؤلاء المرشحين.

التوصية

    /** Load recommendation candidate list.  */
    private suspend fun loadCandidateList() {
        return withContext(Dispatchers.IO) {
            val collection = MovieRepository.getInstance(context).getContent()
            for (item in collection) {
                candidates[item.id] = item
            }
            Log.v(TAG, "Candidate list loaded.")
        }
    }

تنفيذ المعالجة المسبقة

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

التوصية

    /** Given a list of selected items, preprocess to get tflite input.  */
    @Synchronized
    private suspend fun preprocess(selectedMovies: List<Movie>): IntArray {
        return withContext(Dispatchers.Default) {
            val inputContext = IntArray(config.inputLength)
            for (i in 0 until config.inputLength) {
                if (i < selectedMovies.size) {
                    val (id) = selectedMovies[i]
                    inputContext[i] = id
                } else {
                    // Padding input.
                    inputContext[i] = config.pad
                }
            }
            inputContext
        }
    }


قم بتشغيل المترجم لتوليد التوصيات

هنا نستخدم النموذج الذي قمنا بتنزيله في خطوة سابقة لتشغيل الاستدلال على المدخلات التي تمت معالجتها مسبقًا. قمنا بتعيين نوع الإدخال والإخراج لنموذجنا وتشغيل الاستدلال لإنشاء توصيات الفيلم الخاصة بنا. انسخ الكود التالي إلى تطبيقك.

التوصية

    /** Given a list of selected items, and returns the recommendation results.  */
    @Synchronized
    suspend fun recommend(selectedMovies: List<Movie>): List<Result> {
        return withContext(Dispatchers.Default) {
            val inputs = arrayOf<Any>(preprocess(selectedMovies))

            // Run inference.
            val outputIds = IntArray(config.outputLength)
            val confidences = FloatArray(config.outputLength)
            val outputs: MutableMap<Int, Any> = HashMap()
            outputs[config.outputIdsIndex] = outputIds
            outputs[config.outputScoresIndex] = confidences
            tflite?.let {
                it.runForMultipleInputsOutputs(inputs, outputs)
                postprocess(outputIds, confidences, selectedMovies)
            } ?: run {
                Log.e(TAG, "No tflite interpreter loaded")
                emptyList()
            }
        }
    }



تنفيذ المعالجة اللاحقة

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

التوصية

    /** Postprocess to gets results from tflite inference.  */
    @Synchronized
    private suspend fun postprocess(
        outputIds: IntArray, confidences: FloatArray, selectedMovies: List<Movie>
    ): List<Result> {
        return withContext(Dispatchers.Default) {
            val results = ArrayList<Result>()

            // Add recommendation results. Filter null or contained items.
            for (i in outputIds.indices) {
                if (results.size >= config.topK) {
                    Log.v(TAG, String.format("Selected top K: %d. Ignore the rest.", config.topK))
                    break
                }
                val id = outputIds[i]
                val item = candidates[id]
                if (item == null) {
                    Log.v(TAG, String.format("Inference output[%d]. Id: %s is null", i, id))
                    continue
                }
                if (selectedMovies.contains(item)) {
                    Log.v(TAG, String.format("Inference output[%d]. Id: %s is contained", i, id))
                    continue
                }
                val result = Result(
                    id, item,
                    confidences[i]
                )
                results.add(result)
                Log.v(TAG, String.format("Inference output[%d]. Result: %s", i, result))
            }
            results
        }
    }


اختبر تطبيقك!

أعد تشغيل التطبيق الخاص بك. عند تحديد عدد قليل من الأفلام ، يجب تنزيل النموذج الجديد تلقائيًا والبدء في إنشاء التوصيات!

14. مبروك!

لقد أنشأت ميزة التوصيات في تطبيقك باستخدام TensorFlow Lite و Firebase. لاحظ أنه يمكن تعميم التقنيات وخطوط الأنابيب الموضحة في مختبر الرموز هذا واستخدامها لخدمة أنواع أخرى من التوصيات أيضًا.

ما غطينا

  • Firebase ML
  • تحليلات Firebase
  • تصدير أحداث التحليلات إلى BigQuery
  • أحداث تحليلات ما قبل العملية
  • توصيات القطار نموذج TensorFlow
  • تصدير النموذج ونشره في Firebase Console
  • خدمة توصيات الفيلم في التطبيق

الخطوات التالية

  • نفِّذ توصيات Firebase ML في تطبيقك.

يتعلم أكثر

لدي سؤال؟

الإبلاغ عن المشكلات