1. نظرة عامة
في عالم تطبيقات الصحة واللياقة البدنية، من المهم تقديم تجربة ثرية وجذابة للمستخدمين. بالنسبة إلى تطبيق اليوغا، يعني ذلك تقديم معلومات شاملة ومحتوى وسائط متعددة وإمكانات بحث ذكية بدلاً من الأوصاف النصية البسيطة للوضعيات. في هذه المقالة، سنستكشف كيفية إنشاء قاعدة بيانات فعّالة لحركات اليوغا باستخدام Firestore من Google Cloud، والاستفادة من إضافة "بحث المتجهات" للمطابقة السياقية، ودمج إمكانات Gemini 2.0 Flash (تجريبي) للعمل مع المحتوى المتعدّد الوسائط.
لماذا Firestore؟
إنّ Firestore، وهي قاعدة بيانات مستندات NoSQL تعمل بدون خادم من Google Cloud، هي خيار ممتاز لإنشاء تطبيقات قابلة للتوسع والتغيير. في ما يلي أسباب ملاءمة هذا الجهاز لتطبيق اليوغا:
- قابلية التوسّع والأداء: يتم توسيع نطاق Firestore تلقائيًا ليتعامل مع ملايين المستخدمين ومجموعات البيانات الكبيرة، ما يضمن استمرار استجابة تطبيقك حتى مع نموه.
- التعديلات في الوقت الفعلي: تحافظ المزامنة المضمّنة في الوقت الفعلي على اتساق البيانات في جميع الأجهزة المتصلة، ما يجعلها مثالية لاستخدام ميزات مثل الصفوف المباشرة أو التمارين التعاونية.
- نموذج البيانات المرن: تتيح لك البنية المستندة إلى المستندات في Firestore تخزين أنواع بيانات متنوعة، بما في ذلك النصوص والصور وحتى العناصر المضمّنة، ما يجعلها مثالية لتمثيل معلومات معقدة عن وضعيات اليوغا.
- طلبات بحث فعّالة: يتيح Firestore طلبات البحث المعقّدة، بما في ذلك طلب البحث عن المساواة وعدم المساواة، والآن، باستخدام الإضافة الجديدة، عمليات البحث عن التشابه في المتجهات.
- التوافق مع وضع عدم الاتّصال بالإنترنت: يخزّن Firestore البيانات مؤقتًا على الجهاز، ما يتيح لتطبيقك العمل حتى عندما يكون المستخدمون بلا اتصال بالإنترنت.
تحسين البحث باستخدام إضافة "البحث المتجه" في Firestore
يمكن أن يكون البحث التقليدي المستنِد إلى الكلمات الرئيسية محدودًا عند التعامل مع مفاهيم معقّدة مثل أوضاع اليوغا. قد يبحث المستخدم عن وضعية "تفتح الوركين" أو "تحسّن التوازن" بدون معرفة اسم الوضعية المحدّد. وهنا يأتي دور ميزة "بحث المتجهات".
تتيح لك ميزة "البحث باستخدام المتجهات" مع Firestore إجراء ما يلي:
- إنشاء embeddings: يمكنك تحويل الأوصاف النصية، وفي المستقبل ربما الصور والمحتوى الصوتي، إلى تمثيلات متّجهية رقمية (embeddings) تُعبّر عن معناها الدلالي باستخدام نماذج مثل تلك المتوفّرة في Vertex AI أو النماذج المخصّصة.
- تخزين عمليات التضمين: يمكنك تخزين عمليات التضمين هذه مباشرةً في مستندات Firestore.
- إجراء عمليات بحث تستند إلى التشابه: يمكنك طلب البحث في قاعدة بياناتك للعثور على مستندات مشابهة من الناحية الدلالية لمجموعة متجه معيّنة لطلب البحث، ما يتيح المطابقة السياقية.
دمج نموذج Gemini 2.0 Flash (تجريبي)
Gemini 2.0 Flash هو نموذج الذكاء الاصطناعي المتعدد الوسائط والمتطوّر من Google. على الرغم من أنّ هذه الميزة لا تزال تجريبية، إلا أنّها تتيح إمكانيات مثيرة لتحسين تطبيق "اليوغا":
- إنشاء النصوص: استخدِم Gemini 2.0 Flash لإنشاء أوصاف تفصيلية لحركات اليوغا، بما في ذلك المزايا والتعديلات والموانع.
- إنشاء الصور (المحاكاة): على الرغم من أنّ ميزة إنشاء الصور مباشرةً باستخدام Gemini غير متاحة للجميع بعد، حاولت محاكاة ذلك باستخدام Imagen من Google، ما أدى إلى إنشاء صور تمثّل الوضعيات المرئية.
- إنشاء الصوت (محاكاة): بالمثل، يمكننا استخدام خدمة تحويل النص إلى كلام (TTS) لإنشاء تعليمات صوتية لكل وضعية، ما يوجّه المستخدمين خلال الممارسة.
أعتقد أنّه من الممكن أن نقترح الدمج لتحسين التطبيق لاستخدام الميزات التالية للنموذج:
- Multimodal Live API: تساعدك واجهة برمجة التطبيقات الجديدة هذه في إنشاء تطبيقات لبثّ المحتوى الصوتي والمرئي في الوقت الفعلي باستخدام الأدوات.
- السرعة والأداء: يُظهر نموذج Gemini 2.0 Flash تحسُّنًا كبيرًا في وقت الوصول إلى الرمز المميّز الأول (TTFT) مقارنةً بنموذج Gemini 1.5 Flash.
- تجارب محسّنة للتفاعل مع موظّفي الدعم: يقدّم Gemini 2.0 تحسينات على فهم المحتوى المتعدّد الوسائط والترميز واتّباع التعليمات المعقّدة وطلب تنفيذ وظائف معيّنة. تعمل هذه التحسينات معًا لتوفير تجارب أفضل للعملاء.
لمزيد من التفاصيل، يُرجى الرجوع إلى صفحة هذه حول Gemini%201.5%20Flash).
الاطّلاع على المعلومات الأساسية باستخدام "بحث Google"
لتعزيز المصداقية وتوفير المزيد من المراجع، يمكننا دمج "بحث Google" لتأكيد صحة المعلومات التي يوفّرها تطبيقنا. ويعني ذلك ما يلي:
- البحث السياقي: عندما يُدخل أحد المشرفين تفاصيل إحدى الوضعيات، يمكننا استخدام اسم الوضعية لإجراء بحث على Google.
- استخراج عناوين URL: من نتائج البحث، يمكننا استخراج عناوين URL ذات الصلة، مثل المقالات أو الفيديوهات أو المواقع الإلكترونية الموثوقة حول اليوغا، وعرضها داخل التطبيق.
ما ستُنشئه
كجزء من هذا الدرس التطبيقي، عليك تنفيذ ما يلي:
- إنشاء مجموعة في Firestore وتحميل مستندات Yoga
- التعرّف على كيفية إنشاء تطبيقات CRUD باستخدام Firestore
- إنشاء وصف لوضعية اليوغا باستخدام Gemini 2.0 Flash
- تفعيل ميزة "البحث المرئي" في Firebase مع دمج Firestore
- إنشاء عناصر مضمّنة من وصف اليوغا
- إجراء بحث تشابه لنص بحث المستخدم
المتطلبات
2. قبل البدء
إنشاء مشروع
- في Google Cloud Console، في صفحة أداة اختيار المشاريع، اختَر مشروعًا على Google Cloud أو أنشِئه.
- تأكَّد من تفعيل الفوترة لمشروعك على Cloud. تعرَّف على كيفية التحقّق مما إذا كانت الفوترة مفعَّلة في مشروع .
- ستستخدم Cloud Shell، وهي بيئة سطر أوامر تعمل في Google Cloud ومزوّدة مسبقًا بـ bq. انقر على "تفعيل Cloud Shell" في أعلى "وحدة تحكّم Google Cloud".
- بعد الاتصال بخدمة Cloud Shell، تأكَّد من أنّك سبق أن تم مصادقة حسابك وأنّه تم ضبط المشروع على معرّف مشروعك باستخدام الأمر التالي:
gcloud auth list
- شغِّل الأمر التالي في Cloud Shell للتأكّد من أنّ الأمر gcloud يعرف مشروعك.
gcloud config list project
- إذا لم يتم ضبط مشروعك، استخدِم الأمر التالي لضبطه:
gcloud config set project <YOUR_PROJECT_ID>
- فعِّل واجهات برمجة التطبيقات المطلوبة.
gcloud services enable firestore.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
cloudfunctions.googleapis.com \
aiplatform.googleapis.com \
storage.googleapis.com \
secretmanager.googleapis.com \
texttospeech.googleapis.com
يمكنك استخدام وحدة التحكّم للبحث عن كل منتج أو استخدام هذا الرابط كبديل لأمر gcloud.
في حال عدم تفعيل أي واجهة برمجة تطبيقات، يمكنك تفعيلها في أي وقت أثناء عملية التنفيذ.
راجِع المستندات لمعرفة أوامر gcloud وكيفية استخدامها.
3- إعداد قاعدة البيانات
تتضمّن المستندات خطوات أكثر اكتمالاً حول كيفية إعداد مثيل Firestore. بشكل عام، سأتبع الخطوات التالية للبدء:
1 انتقِل إلى Firestore Viewer (عارض Firestore) ومن شاشة Select a database service (اختيار خدمة قاعدة بيانات)، اختَر Firestore في الوضع الأصلي.
- اختيار موقع جغرافي لخدمة Firestore
- انقر على "إنشاء قاعدة بيانات" (إذا كانت هذه هي المرة الأولى، اتركها كقاعدة بيانات "(default)").
عند إنشاء مشروع على Firestore، يتم أيضًا تفعيل واجهة برمجة التطبيقات في أداة Cloud API Manager.
- ملاحظة مهمة: اختَر إصدار "الإصدار التجريبي" (وليس "الإصدار العلني") من قواعد الأمان حتى تتمكّن من الوصول إلى البيانات.
- بعد الانتهاء من الإعداد، من المفترض أن تظهر لك قاعدة بيانات Firestore وعرض "المجموعات" و"المستندات" في الوضع الأصلي كما هو موضّح في الصورة أدناه:
- لا داعي لتنفيذ هذه الخطوة الآن، ولكن يمكنك النقر على "بدء مجموعة" وإنشاء مجموعة جديدة. اضبط رقم تعريف المجموعة على "وضعيات". انقر على الزر حفظ.
نصائح للمحترفين بشأن تطبيق الإصدار العلني:
- بعد الانتهاء من نموذج البيانات وتحديد المستخدمين الذين يمكنهم الوصول إلى أنواع مختلفة من المستندات، يمكنك إنشاء قواعد الأمان وتعديلها ومراقبتها من واجهة Firebase. يمكنك الوصول إلى قواعد الأمان من خلال هذا الرابط: https://console.firebase.google.com/u/0/project/<<your_project_id>>/firestore/rules
- احرص على تعديل قواعد الأمان ومراقبتها واختبارها قبل نشر المشروع من مرحلة التطوير، لأنّها غالبًا ما تكون السبب الصامت وراء عمل تطبيقك بشكل مختلف.
في هذا العرض التجريبي، سنستخدمه في وضع الاختبار.
4. واجهة برمجة التطبيقات Firestore REST API
- يمكن أن تكون واجهة برمجة التطبيقات REST مفيدة في حالات الاستخدام التالية:أ. الوصول إلى Firestore من بيئة محدودة الموارد حيث لا يمكن تشغيل مكتبة عملاء كاملة أتمتة إدارة قاعدة البيانات أو استرداد بيانات التعريف التفصيلية لقاعدة البيانات
- أسهل طريقة لاستخدام Firestore هي استخدام إحدى مكتبات العملاء الأصلية، ولكن في بعض الحالات يكون من المفيد استدعاء واجهة برمجة التطبيقات REST API مباشرةً.
- في نطاق هذه المدوّنة، ستتعرّف على استخدام واجهات برمجة تطبيقات REST في Firestore وكيفية عرضها، وليس على مكتبات العملاء الأصلية.
- للمصادقة، تقبل واجهة برمجة التطبيقات Firestore REST API إما رمز تعريف مصادقة Firebase أو رمز OAuth 2.0 لـ Google Identity. لمزيد من المعلومات حول موضوع المصادقة والتفويض، يُرجى الرجوع إلى المستندات.
- تتوفّر جميع نقاط نهاية واجهة برمجة التطبيقات REST ضمن عنوان URL الأساسي https://firestore.googleapis.com/v1/.
Spring Boot وFirestore API
يهدف هذا الحل في إطار عمل Spring Boot إلى عرض تطبيق عملاء يستخدم واجهات برمجة تطبيقات Firestore لجمع تفاصيل وضعيات اليوغا وتفاصيل التنفس وتعديلها من خلال تجربة تفاعلية للمستخدم.
للحصول على شرح مفصّل ومفصّل لحلّ CRUD في Firestore الذي يشكّل جزءًا من تطبيق Yoga poses، يمكنك الانتقال إلى رابط المدوّنة.
للتركيز على الحلّ الحالي والتعرّف على جزء CRUD أثناء التنقل، يمكنك استنساخ الحلّ الكامل الذي تركّز عليه هذه المدونة من المستودع أدناه من Cloud Shell Terminal والحصول على نسخة من قاعدة البيانات.
git clone https://github.com/AbiramiSukumaran/firestore-poserecommender
ملاحظة:
- بعد نسخ هذا المستودع، ما عليك سوى إجراء بعض التغييرات على معرّف المشروع وواجهات برمجة التطبيقات وما إلى ذلك. ولا يلزم إجراء أي تغيير آخر لتشغيل تطبيقك. يتم شرح كل مكوّن من مكوّنات التطبيق في الأقسام القادمة. في ما يلي قائمة بالتغييرات:
- في ملف
src/main/java/com/example/demo/GenerateImageSample.java
، استبدِل "<<YOUR_PROJECT_ID>>" بمعرّف مشروعك. - في ملف
src/main/java/com/example/demo/GenerateEmbeddings.java
، استبدِل "<<YOUR_PROJECT_ID>>" بمعرّف مشروعك. - في
src/main/java/com/example/demo/PoseController.java
، استبدِل جميع نُسخ<<YOUR_PROJECT_ID>>"
واسم قاعدة البيانات,
في هذه الحالة"(default)",
بالقيم المناسبة من الإعدادات: - في
src/main/java/com/example/demo/PoseController.java
، استبدِل "[YOUR_API_KEY]
" بمفتاح واجهة برمجة التطبيقات الخاص بك لواجهة Gemini 2.0 Flash. يمكنك الحصول على هذه البيانات من AI Studio. - إذا أردت إجراء الاختبار على الجهاز، نفِّذ الأوامر التالية من مجلد المشروع في وحدة تحكّم Cloud Shell الطرفية:
mvn package
mvn spring-boot:run
في الوقت الحالي، يمكنك عرض تطبيقك أثناء تشغيله من خلال النقر على خيار "معاينة الويب" من وحدة Cloud Shell الطرفية. نحن لسنا جاهزين لإجراء الاختبارات وتجربة التطبيق بعد.
- اختياري: إذا كنت تريد نشر التطبيق في Cloud Run، عليك إنشاء تطبيق Java Cloud Run جديد تمامًا من البداية من خلال Cloud Shell Editor، وإضافة ملفات src وملفات النماذج من repo إلى مشروعك الجديد في المجلدات المعنية (لأنّ مشروع مستودع GitHub الحالي لم يتم إعداده تلقائيًا لإعدادات نشر Cloud Run). في هذه الحالة، إليك الخطوات التي يجب اتّباعها (بدلاً من استنساخ المستودع الحالي):
- انتقِل إلى محرِّر Cloud Shell (تأكَّد من أنّ المحرِّر مفتوح وليس المحطة الطرفية)، وانقر على رمز اسم مشروع Google Cloud في الجانب الأيسر من شريط الحالة (الجزء المحظور في لقطة الشاشة أدناه).
- اختَر تطبيق جديد -> تطبيق Cloud Run -> Java: Cloud Run من قائمة الخيارات واسمه "firestore-poserecommender".
- من المفترض أن يظهر لك الآن نموذج حزمة كاملة لتطبيق Java Cloud Run تم إعداده مسبقًا وأصبح جاهزًا للاستخدام.
- أزِل فئة Controller الحالية وانسخ الملفات التالية إلى مجلّدها المعنيّ في بنية المشروع:
firestore-poserecommender/src/main/java/com/example/demo/
- FirestoreSampleApplication.java
- GenerateEmbeddings.java
- GenerateImageSample.java
- Pose.java
- PoseController.java
- ServletInitializer.java
firestore-poserecommender/src/main/resources/static/
- Index.html
firestore-poserecommender/src/main/resources/templates/
- contextsearch.html
- createpose.html
- errmessage.html
- pose.html
- ryoq.html
- searchpose.html
- showmessage.html
firestore-poserecommender/
- ملف شامل
- عليك إجراء التغييرات في الملفات المقابلة لاستبدال PROJECT ID وAPI KEY بالقيم ذات الصلة. (الخطوات 1 (أ) و(ب) و(ج) و(د) أعلاه).
5- نقل البيانات
تتوفّر بيانات التطبيق في ملف data.json هذا: https://github.com/AbiramiSukumaran/firestore-poserecommender/blob/main/data.json
إذا أردت البدء ببعض البيانات المحدّدة مسبقًا، يمكنك نسخ ملف json واستبدال جميع مواضع "<<YOUR_PROJECT_ID>>" بقيمتك.
- انتقِل إلى Firestore Studio.
- تأكَّد من أنّك أنشأت مجموعة باسم "وضعيات".
- إضافة المستندات يدويًا من ملف المستودع المذكور أعلاه واحدًا تلو الآخر
يمكنك بدلاً من ذلك استيراد البيانات في خطوة واحدة من المجموعة المحدّدة مسبقًا التي أنشأناها لك من خلال تنفيذ الخطوات التالية:
- انتقِل إلى وحدة Cloud Shell الطرفية وتأكَّد من إعداد مشروعك النشط على Google Cloud وتأكَّد من أنّ لديك الإذن اللازم. أنشئ حزمة في مشروعك باستخدام الأمر gsutil الوارد أدناه. استبدِل المتغيّر <PROJECT_ID> في الأمر أدناه بمعرّف مشروعك على Google Cloud:
gsutil mb -l us gs://<PROJECT_ID>-yoga-poses-bucket
- بعد إنشاء الحزمة، نحتاج إلى نسخ ملف تصدير قاعدة البيانات الذي أعددناه إلى هذه الحزمة، قبل أن نتمكّن من استيراده إلى قاعدة بيانات Firebase. استخدِم الأمر الوارد أدناه:
gsutil cp -r gs://demo-bq-gemini-public/yoga_poses gs://<PROJECT_ID>-yoga-poses-bucket
الآن بعد أن حصلنا على البيانات المطلوب استيرادها، يمكننا الانتقال إلى الخطوة الأخيرة وهي استيراد البيانات إلى قاعدة بيانات Firebase (التلقائية) التي أنشأناها.
- انتقِل الآن إلى وحدة تحكّم Firestore وانقر على استيراد/تصدير من قائمة التنقّل على يمين الصفحة.
انقر على "استيراد" واختَر مسار Cloud Storage الذي أنشأته للتو وانتقِل إلى أن تتمكّن من اختيار الملف yoga_poses.overall_export_metadata:
- انقر على "استيراد".
ستستغرق عملية الاستيراد بضع ثوانٍ، وبعد أن تصبح جاهزة، يمكنك التحقّق من صحة قاعدة بيانات Firestore والمجموعة من خلال الانتقال إلى https://console.cloud.google.com/firestore/databases واختيار قاعدة البيانات default ومجموعة poses كما هو موضّح أدناه:
- هناك طريقة أخرى وهي أنّه يمكنك أيضًا إنشاء السجلّات يدويًا من خلال التطبيق بعد نشرها باستخدام الإجراء "إنشاء وضع جديد".
6- البحث باستخدام المتّجهات
تفعيل إضافة "البحث المتجه" في Firestore
استخدِم هذه الإضافة لتضمين مستندات Firestore وإجراء طلبات بحث عنها تلقائيًا باستخدام ميزة البحث بالاستناد إلى متجهات. سينقلك هذا الإجراء إلى مركز Firebase Extensions Hub.
عند تثبيت إضافة "بحث المتجهات"، يمكنك تحديد مجموعة واسم حقل مستند. يؤدي إضافة مستند يتضمّن هذا الحقل أو تعديله إلى تنشيط هذه الإضافة لاحتساب عملية تضمين متّجه للمستند. تتم إعادة كتابة عملية تضمين المتّجه هذه إلى المستند نفسه، ويتم فهرسة المستند في "متجر المتّجهات"، ويصبح جاهزًا للبحث عنه.
لنطّلِع على الخطوات التالية:
تثبيت الإضافة:
ثبِّت إضافة "البحث المتجه باستخدام Firestore" من "سوق إضافات Firebase" بالنقر على "التثبيت في وحدة تحكّم Firebase".
ملاحظة مهمة:
عند الانتقال لأول مرة إلى صفحة الإضافات هذه، عليك اختيار المشروع نفسه الذي تعمل عليه في وحدة تحكّم Google Cloud المدرَجة في وحدة تحكّم Firebase.
إذا لم يكن مشروعك مُدرَجًا، يمكنك إضافة المشروع في Firebase (اختَر مشروعك الحالي على Google Cloud من القائمة).
ضبط الإضافة:
حدِّد المجموعة ("الوضعيات") والحقل الذي يحتوي على النص المطلوب تضمينه ("الوضع") ومَعلمات أخرى، مثل سمات التضمين.
إذا كانت هناك واجهات برمجة تطبيقات يجب تفعيلها مُدرَجة في هذه الخطوة، ستسمح لك صفحة الضبط بتنفيذ ذلك، واتّبِع الخطوات وفقًا لذلك.
إذا لم تستجِب الصفحة بعد تفعيل واجهات برمجة التطبيقات لبعض الوقت، ما عليك سوى إعادة تحميل الصفحة ومن المفترض أن تظهر لك واجهات برمجة التطبيقات مفعّلة.
في إحدى الخطوات التالية، يسمح لك هذا الإجراء باستخدام نموذج اللغة الكبيرة الذي تختاره لإنشاء النماذج المضمّنة. اختَر Vertex AI.
ترتبط الإعدادات القليلة التالية بمجموعة البيانات والحقل الذي تريد تضمينه:
LLM: Vertex AI
مسار المجموعة: أوضاع
الحدّ الأقصى لطلبات البحث التلقائية: 3
مقياس المسافة: جيب التمام
اسم حقل الإدخال: posture
اسم حقل الإخراج: embedding
اسم حقل الحالة: status
تضمين المستندات الحالية: نعم
تعديل البيانات المضمّنة الحالية: نعم
موقع وظائف السحابة الإلكترونية: us-central1
تفعيل الأحداث: بدون علامة في المربّع
بعد الانتهاء من ضبط كل هذه الإعدادات، انقر على زر "تثبيت الإضافة". سيستغرق ذلك مدة تتراوح بين 3 و5 دقائق.
إنشاء العناصر المضمّنة:
عند إضافة مستندات أو تعديلها في مجموعة "الوضعيات"، ستنشئ الإضافة تلقائيًا عناصر تمثيلية باستخدام نموذج مدرَّب مسبقًا أو نموذج من اختيارك عبر نقطة نهاية واجهة برمجة التطبيقات. في هذه الحالة، اخترنا Vertex AI في إعدادات الإضافة.
إنشاء الفهرس
سيفرض ذلك إنشاء فهرس في حقل التضمين في وقت استخدام التضمين في التطبيق.
ينشئ Firestore تلقائيًا فهارس لطلبات البحث الأساسية، ومع ذلك، يمكنك السماح لخدمة Firestore بإنشاء بنية فهرسة من خلال تنفيذ طلبات بحث لا تحتوي على فهرس، وسيقدّم لك رابطًا إلى الفهرس الذي تم إنشاؤه في رسالة الخطأ على جانب التطبيق. في ما يلي قائمة الخطوات لإنشاء فهرس متّجه:
- الانتقال إلى وحدة Cloud Shell الطرفية
- نفِّذ الأمر التالي:
gcloud firestore indexes composite create --collection-group="poses" --query-scope=COLLECTION --database="(default)" --field-config vector-config='{"dimension":"768", "flat": "{}"}',field-path="embedding"
يمكنك الاطّلاع على مزيد من المعلومات حول هذا الموضوع هنا.
بعد إنشاء فهرس متّجه، يمكنك إجراء بحث عن أقرب جار باستخدام عمليات إدراج المتّجهات.
ملاحظة مهمة:
من هذه النقطة فصاعدًا، لن يكون عليك إجراء أي تغييرات على المصدر. ما عليك سوى المتابعة لمعرفة ما يفعله التطبيق.
تنفيذ البحث في نموذج متجه
لنلقِ نظرة على كيفية تعامل تطبيقك الذي تم إنشاؤه حديثًا مع ميزة "البحث بالاستناد إلى الرسومات". بعد تخزين البيانات المضمّنة، يمكنك استخدام فئة VectorQuery من حزمة تطوير البرامج (SDK) لـ Firestore Java لتنفيذ البحث بالاستناد إلى المتجهات والحصول على نتائج أقرب العناصر المتشابهة:
CollectionReference coll = firestore.collection("poses");
VectorQuery vectorQuery = coll.findNearest(
"embedding",
userSearchTextEmbedding,
/* limit */ 3,
VectorQuery.DistanceMeasure.EUCLIDEAN,
VectorQueryOptions.newBuilder().setDistanceResultField("vector_distance")
.setDistanceThreshold(2.0)
.build());
ApiFuture<VectorQuerySnapshot> future = vectorQuery.get();
VectorQuerySnapshot vectorQuerySnapshot = future.get();
List<Pose> posesList = new ArrayList<Pose>();
// Get the ID of the closest document (assuming results are sorted by distance)
String closestDocumentId = vectorQuerySnapshot.getDocuments().get(0).getId();
تقارن هذه المقتطفة بين تضمين نص بحث المستخدم وتضمين المستندات في Firestore، وتستخرج النتيجة الأقرب من السياق.
7- Gemini 2.0 Flash
دمج نموذج Gemini 2.0 Flash (لإنشاء الأوصاف)
لنلقِ نظرة على كيفية تعامل تطبيقك الذي تم إنشاؤه حديثًا مع دمج Gemini 2.0 Flash لإنشاء الوصف.
لنفترض الآن أنّ أحد المشرفين أو مدرّبي اليوغا يريد إدخال تفاصيل الوضعيات بمساعدة Gemini 2.0 Flash ثم إجراء بحث للاطّلاع على أقرب المطابقات. ويؤدي ذلك إلى استخراج تفاصيل الوضعيات المطابقة إلى جانب العناصر المتعددة الوسائط التي تدعم النتائج.
String apiUrl = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-exp:generateContent?key=[YOUR_API_KEY]";
Map<String, Object> requestBody = new HashMap<>();
List<Map<String, Object>> contents = new ArrayList<>();
List<Map<String, Object>> tools = new ArrayList<>();
Map<String, Object> content = new HashMap<>();
List<Map<String, Object>> parts = new ArrayList<>();
Map<String, Object> part = new HashMap<>();
part.put("text", prompt);
parts.add(part);
content.put("parts", parts);
contents.add(content);
requestBody.put("contents", contents);
/**Setting up Grounding*/
Map<String, Object> googleSearchTool = new HashMap<>();
googleSearchTool.put("googleSearch", new HashMap<>());
tools.add(googleSearchTool);
requestBody.put("tools", tools);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers);
ResponseEntity<String> response = restTemplate.exchange(apiUrl, HttpMethod.POST, requestEntity, String.class);
System.out.println("Generated response: " + response);
String responseBody = response.getBody();
JSONObject jsonObject = new JSONObject(responseBody);
JSONArray candidates = jsonObject.getJSONArray("candidates");
JSONObject candidate = candidates.getJSONObject(0);
JSONObject contentResponse = candidate.getJSONObject("content");
JSONArray partsResponse = contentResponse.getJSONArray("parts");
JSONObject partResponse = partsResponse.getJSONObject(0);
String generatedText = partResponse.getString("text");
System.out.println("Generated Text: " + generatedText);
أ- محاكاة إنشاء الصور والصوت
يمكن للنموذج التجريبي 2.0 Flash من Gemini إنشاء نتائج متعددة الوسائط، ولكن لم أشترك في البرنامج التجريبي للوصول المبكر إليه بعد، لذا قلّدت إخراج الصور والصوت باستخدام واجهات برمجة التطبيقات Imagen وTTS على التوالي. تخيل مدى روعة إنشاء كل هذا من خلال طلب واحد من واجهة برمجة التطبيقات إلى Gemini 2.0 Flash.
try (PredictionServiceClient predictionServiceClient =
PredictionServiceClient.create(predictionServiceSettings)) {
final EndpointName endpointName =
EndpointName.ofProjectLocationPublisherModelName(
projectId, location, "google", "imagen-3.0-generate-001");
Map<String, Object> instancesMap = new HashMap<>();
instancesMap.put("prompt", prompt);
Value instances = mapToValue(instancesMap);
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("sampleCount", 1);
paramsMap.put("aspectRatio", "1:1");
paramsMap.put("safetyFilterLevel", "block_few");
paramsMap.put("personGeneration", "allow_adult");
Value parameters = mapToValue(paramsMap);
PredictResponse predictResponse =
predictionServiceClient.predict(
endpointName, Collections.singletonList(instances), parameters);
for (Value prediction : predictResponse.getPredictionsList()) {
Map<String, Value> fieldsMap = prediction.getStructValue().getFieldsMap();
if (fieldsMap.containsKey("bytesBase64Encoded")) {
bytesBase64Encoded = fieldsMap.get("bytesBase64Encoded").getStringValue();
}
}
return bytesBase64Encoded;
}
try {
// Create a Text-to-Speech client
try (TextToSpeechClient textToSpeechClient = TextToSpeechClient.create()) {
// Set the text input to be synthesized
SynthesisInput input = SynthesisInput.newBuilder().setText(postureString).build();
// Build the voice request, select the language code ("en-US") and the ssml
// voice gender
// ("neutral")
VoiceSelectionParams voice =
VoiceSelectionParams.newBuilder()
.setLanguageCode("en-US")
.setSsmlGender(SsmlVoiceGender.NEUTRAL)
.build();
// Select the type of audio file you want returned
AudioConfig audioConfig =
AudioConfig.newBuilder().setAudioEncoding(AudioEncoding.MP3).build();
// Perform the text-to-speech request on the text input with the selected voice
// parameters and audio file type
SynthesizeSpeechResponse response =
textToSpeechClient.synthesizeSpeech(input, voice, audioConfig);
// Get the audio contents from the response
ByteString audioContents = response.getAudioContent();
// Convert to Base64 string
String base64Audio = Base64.getEncoder().encodeToString(audioContents.toByteArray());
// Add the Base64 encoded audio to the Pose object
return base64Audio;
}
} catch (Exception e) {
e.printStackTrace(); // Handle exceptions appropriately. For a real app, log and provide user feedback.
return "Error in Audio Generation";
}
}
ب- التأكّد من صحة المعلومات باستخدام "بحث Google":
إذا راجعت رمز استدعاء Gemini في الخطوة 6، ستلاحظ المقتطف التالي من الرمز لتفعيل ميزة تحديد مصدر المعلومات في "بحث Google" لردّ LLM:
/**Setting up Grounding*/
Map<String, Object> googleSearchTool = new HashMap<>();
googleSearchTool.put("googleSearch", new HashMap<>());
tools.add(googleSearchTool);
requestBody.put("tools", tools);
يهدف ذلك إلى ضمان ما يلي:
- ربط نموذجنا بنتائج البحث الفعلية
- استخراج عناوين URL ذات الصلة المُشار إليها في عملية البحث
8. تشغيل تطبيقك
لنلقِ نظرة على جميع إمكانات تطبيق Java Spring Boot الذي تم إنشاؤه حديثًا باستخدام واجهة ويب Thymeleaf بسيطة:
- عمليات CRUD في Firestore (الإنشاء والقراءة والتعديل والحذف)
- البحث عن الكلمات الرئيسية
- إنشاء السياق بالاستناد إلى الذكاء الاصطناعي التوليدي
- البحث السياقي (البحث بالاستناد إلى المتجهات)
- إخراج متعدد الوسائط لربطه بطلب البحث
- تنفيذ طلبك الخاص (الطلبات بتنسيق structuredQuery)
مثال: {"structuredQuery":{"select":{"fields":[{"fieldPath":"name"}]},"from":[{"collectionId":"fitness_poses"}]}}
جميع هذه الميزات التي تمت مناقشتها حتى الآن هي جزء من التطبيق الذي أنشأته للتو من المستودع: https://github.com/AbiramiSukumaran/firestore-poserecommender
لإنشاء التطبيق وتشغيله ونشره، نفِّذ الأوامر التالية من وحدة Cloud Shell الطرفية:
mvn package
mvn spring-boot:run
من المفترض أن تظهر لك النتيجة وأن تتمكّن من استخدام ميزات تطبيقاتك. يمكنك مشاهدة الفيديو أدناه للاطّلاع على العرض الترويجي للنتيجة:
اقتراح الوضعيات باستخدام Firestore وVector Search وGemini 2.0 Flash
خطوة اختيارية:
لنشره على Cloud Run (على افتراض أنّك قد بدأت تطبيقًا جديدًا باستخدام Dockerfile ونسخت الملفات حسب الحاجة)، شغِّل الأمر التالي من Cloud Shell Terminal من داخل دليل مشروعك:
gcloud run deploy --source .
أدخِل اسم التطبيق ورقم تعريف المنطقة (اختَر us-central1) واختَر "Y" للطلب غير المُعتمَد كما هو مطلوب. من المفترض أن تظهر لك نقطة نهاية تطبيقك في المحطة الطرفية بعد نجاح عملية النشر.
9. تَنظيم
لتجنُّب تحصيل رسوم من حسابك على Google Cloud مقابل الموارد المستخدَمة في هذه المشاركة، اتّبِع الخطوات التالية:
- في وحدة تحكّم Google Cloud، انتقِل إلى صفحة إدارة الموارد.
- في قائمة المشاريع، اختَر المشروع الذي تريد حذفه، ثم انقر على حذف.
- في مربّع الحوار، اكتب رقم تعريف المشروع، ثم انقر على إيقاف لحذف المشروع.
10. تهانينا
تهانينا! لقد استخدمت بنجاح Firestore لإنشاء تطبيق فعّال وذكي لإدارة أوضاع اليوغا. من خلال الجمع بين فعالية Firestore و"إضافة البحث بالاستناد إلى المتجهات" وإمكانات Gemini 2.0 Flash (مع إنشاء صور وأصوات محاكية)، أنشأنا تطبيق يوغا مفيدًا وشائقًا لتنفيذ عمليات CRUD وإجراء بحث استنادًا إلى الكلمات الرئيسية والبحث بالاستناد إلى المتجهات السياقية وإنشاء محتوى وسائط متعددة.
ولا يقتصر هذا النهج على تطبيقات اليوغا. مع استمرار تطوير نماذج الذكاء الاصطناعي، مثل Gemini، ستتزايد الإمكانيات لإنشاء تجارب مستخدمين أكثر تفاعلاً وشخصية. ننصحك بالاطّلاع باستمرار على آخر التطورات والمستندات من Google Cloud وFirebase للاستفادة من الإمكانات الكاملة لهذه التقنيات.
إذا أردت توسيع نطاق هذا التطبيق، سأحاول إجراء أمرَين باستخدام Gemini 2.0 Flash:
- استخدِم واجهة برمجة التطبيقات Multimodal Live من خلال إنشاء بث مباشر للصوت والصورة في الوقت الفعلي لحالة الاستخدام.
- فعِّل وضع التفكير لإنشاء الأفكار التي تستند إليها الردود من أجل التفاعل مع البيانات في الوقت الفعلي وجعل التجربة أكثر واقعية.
يُرجى تجربة هذه الميزة وإرسال طلب سحب :>D.