بناء ميزات مولّدة تعمل بالكامل على الجهاز مع Gemini Nano وML Kit Prompt API
مقدمة: لماذا على‑الجهاز (On‑device) ولماذا Gemini Nano؟
خلال السنوات الأخيرة أصبحت تطبيقات الجوال تطلب ميزات ذكاء اصطناعي مولد قريبة من المستخدم — مثل التلخيص، إعادة الصياغة، وصف الصور أو توليد عناوين — مع متطلبات صارمة على الخصوصية وزمن الاستجابة. تشغيل هذه الميزات محلياً على الجهاز يقلل الاعتماد على السحابة، يخفض الكمون ويحسن خصوصية المستخدمين لأن البيانات لا تغادر الجهاز.
جميني نانو (Gemini Nano) هي نسخة مُحسَّنة للعمل على الأجهزة المحمولة، وقد أدرجت Google واجهات عالية المستوى في ML Kit لتمكين المطورين من استدعاء قدرات التوليد هذه داخل تطبيقاتهم بسهولة. هذا الدليل العملي يشرح بنية العمل، خطوات التهيئة، مثال كود عملي (Kotlin)، ونصائح للنشر والإنتاج.
كيف تعمل سلسلة ML Kit + Gemini Nano؟ نظرة تقنية موجزة
ML Kit تقدم واجهات GenAI عالية المستوى (مثل Summarization, Proofreading, Rewrite وPrompt API) مبنية فوق خدمة AICore على Android. عند تشغيل أحد هذه الواجهات، يقوم ML Kit بالتعامل مع تنزيل نموذج Gemini Nano (وأي نماذج مساعدّة مثل محولات LoRA مخصّصة للميزة) وإدارة المعلمات المثلى للاستدلال (مثل temperature، topK، وعدد النتائج المرغوبة). تشغيل النماذج يحدث محلياً عبر AICore، مما يسمح بالمزايا المتعلقة بالخصوصية والأداء.
نقاط تقنية أساسية يجب معرفتها قبل البدء:
- اعتماد النظام: APIs تتطلب Android API level 26+ وتعمل عبر Android AICore.
- حالة الميزة: قبل الاستدعاء يجب فحص حالة Gemini Nano (UNAVAILABLE / DOWNLOADABLE / AVAILABLE) وتنزيل النموذج عند الحاجة.
- قيود الإدخال/الإخراج: حدّ التوكنات للإدخال حوالى 4000 توكن؛ والمخرجات الطويلة جداً غير مُوصى بها. كما يوجد حدّ استعلامات (quota) مفروض بواسطة AICore لكل تطبيق.
- قابلية الأجهزة: الأداء والتوافق يختلفان — بعض الأجهزة (مثل سلسلة Pixel الحديثة) تعطي أفضل تجربة، بينما تدعم ML Kit مجموعة واسعة من رقاقات MediaTek وQualcomm وGoogle Tensor على أجهزة متعددة.
فهم هذه النقاط يساعدك على تصميم سير عمل يُعدّ التنزيل، تسخين النموذج (warmup) وإدارة الحالات غير المتاحة (fallback) بشكل صريح داخل التطبيق.
دليل خطوة‑بخطوة مع مثال عملي (Kotlin)
في هذا القسم سنعرض مثالاً مختصراً لبناء ميزة تستخدم ML Kit Prompt API لاستدعاء Gemini Nano محلياً: فحص الحالة، تنزيل النموذج، وإرسال طلب نصي بسيط (text‑only) واستلام النتيجة.
التحضير:
- أضف الاعتماد في build.gradle للمشروع:
implementation("com.google.mlkit:genai-prompt:1.0.0-beta2"). - تأكد من targetSDK وminSDK مناسبين (API 26+) ومن أن تطبيقك يتعامل مع أذونات الشبكة لتنزيل النموذج.
مثال Kotlin مبسّط:
import com.google.mlkit.genai.generation.Generation
import com.google.mlkit.genai.generation.GenerateContentRequest
// الحصول على كائن العميل
val generativeClient = Generation.getClient()
// 1) فحص الحالة وتنزيل النموذج إن لزم
val status = generativeClient.checkStatus()
when (status) {
FeatureStatus.DOWNLOADABLE -> {
// تنزيل في الخلفية (يمكن إظهار تقدم للمستخدم)
generativeClient.download().collect { downloadStatus ->
// تحقق من DownloadStarted / DownloadProgress / DownloadCompleted
}
}
FeatureStatus.AVAILABLE -> { /* جاهز للاستخدام */ }
FeatureStatus.UNAVAILABLE -> { /* خطة بديلة أو إعلام المستخدم */ }
}
// 2) إنشاء طلب توليد محتوى نصي
val request = GenerateContentRequest.Builder(
TextPart("اكتب قصة قصيرة من 3 جمل عن كلب سحري.")
).apply {
temperature = 0.2f
topK = 10
candidateCount = 1
}.build()
// 3) استدعاء التوليد (غير متدفق)
val response = generativeClient.generateContent(request)
val text = response.candidates.firstOrNull()?.text ?: ""
// عرض النص في واجهة المستخدم
يمكنك أيضاً استخدام واجهة البث (streaming) لعرض النتائج أثناء توليدها أو جمع مدخلات متعددة (مثل صورة + نص) باستخدام ImagePart(bitmap) وTextPart لسيناريوهات multimodal. راجع التوثيق الرسمي لمعلمات إضافية (maxOutputTokens، seed، إلخ).
ملاحظات عملية: استدعاء warmup() قبل أول استدلال يقلل زمن الاستجابة الأولي، واحرص على إدارة حالات الأخطاء مثل مشكلات اتصال AICore أو أجهزة ذات bootloader مفتوح حيث لا تُدعم هذه الواجهات.
اعتبارات أداء، خصوصية ونشر في الإنتاج
قبل نشر ميزة تعتمد على Gemini Nano محلياً، خذ بعين الاعتبار النقاط التالية:
| المجال | نصيحة عملية |
|---|---|
| حجم التنزيل والتخزين | أبلغ المستخدم بخطوة تنزيل النموذج وقدم خيار التنزيل عبر Wi‑Fi؛ حافظ على مؤشر تقدم. قم بتخطيط مساحة التخزين لأن النموذج وأي ملحقات LoRA قد تشغل عشرات ميغابايت. |
| الكمون | استخدم warmup واحتفظ بنسخة جاهزة في الذاكرة عند حالات الاستخدام المتكررة؛ للخدمات الثقيلة فكر في توليد النتائج في خلفية مستقلة لتفادي تجميد الواجهة. |
| اللغة وجودة المخرجات | الـPrompt API تم التحقق منه أساسياً للإنجليزية والكورية (قيد التوسيع) — اختبر جودة المخرجات في لغتك المستهدفة وضع اختبارات قبول جودة داخل التطبيق. |
| القيود والسياسات | هناك قيود على عدد الاستدعاءات (quota) وفحص التوافق مع bootloader مُقفل؛ ضع آليات Retry وFallback إلى خدمات سحابية إن لزم الأمر. |
| الخصوصية | بما أن المعالجة تتم على الجهاز، يمكنك تقليل جمع البيانات السحابية وحفظ السياسات المحلية للخصوصية. وثق الأسباب التقنية لعدم إرسال بيانات المستخدمين إلى السحابة ضمن سياسة الخصوصية لتطبيقك. |
أخيراً، اختبر التطبيق عبر مجموعة واسعة من الأجهزة (Tensor، Snapdragon، Dimensity) لأن الأداء والتوافر يختلفان بحسب النسخة والتهيئة. راقب قياس استعمال البطارية ودرجة حرارة الجهاز أثناء جلسات inference، ووفّر إعدادات تقنين للمستخدم (مثال: وضع اقتصاد الطاقة يُعطّل تنزيل النماذج أو يخفض تكرار التوليد).
لمزيد من الموارد العملية: راجع الوثائق الرسمية لبدء العمل مع Prompt API ومثال GitHub الذي يوفر تطبيق عرضي يبرهن السيناريوهات المذكورة.