تتيح لك LLM Inference API تشغيل النماذج اللغوية الكبيرة (LLM) بالكامل على الجهاز لتطبيقات Android، ويمكنك استخدامها لتنفيذ مجموعة كبيرة من المهام، مثل إنشاء النصوص واسترداد المعلومات بلغة طبيعية وتلخيص المستندات. توفّر المهمة إمكانية استخدام العديد من النماذج اللغوية الكبيرة التي تحوّل النص إلى نص، ما يتيح لك تطبيق أحدث نماذج الذكاء الاصطناعي التوليدي على الأجهزة في تطبيقات Android.
لإضافة واجهة LLM Inference API بسرعة إلى تطبيق Android، اتّبِع دليل التشغيل السريع. للحصول على مثال أساسي لتطبيق Android يستخدم واجهة برمجة التطبيقات LLM Inference API، يمكنك الاطّلاع على التطبيق النموذجي. للحصول على فهم أكثر تفصيلاً لطريقة عمل LLM Inference API، يُرجى الرجوع إلى أقسام خيارات الإعداد وتحويل النموذج وضبط LoRA.
يمكنك الاطّلاع على هذه المهمة أثناء العمل من خلال العرض التوضيحي في MediaPipe Studio. لمزيد من المعلومات حول إمكانات هذه المهمة ونماذجها وخيارات الإعداد، يُرجى الاطّلاع على نظرة عامة.
البدء السريع
اتّبِع الخطوات التالية لإضافة واجهة LLM Inference API إلى تطبيق Android. تم تحسين LLM Inference API للأجهزة المتطورة التي تعمل بنظام التشغيل Android، مثل هواتف Pixel 8 وSamsung S23 أو الإصدارات الأحدث، ولا تتوافق بشكل موثوق مع محاكيات الأجهزة.
إضافة عناصر تابعة
تستخدِم واجهة LLM Inference API مكتبة com.google.mediapipe:tasks-genai
. أضِف هذه التبعية إلى ملف build.gradle
في تطبيق Android:
dependencies {
implementation 'com.google.mediapipe:tasks-genai:0.10.27'
}
تنزيل نموذج
نزِّل نموذج Gemma-3 1B بتنسيق كمّي 4 بت من Hugging Face. لمزيد من المعلومات عن النماذج المتاحة، راجِع مستندات النماذج.
أرسِل محتوى المجلد output_path إلى جهاز Android.
$ adb shell rm -r /data/local/tmp/llm/ # Remove any previously loaded models
$ adb shell mkdir -p /data/local/tmp/llm/
$ adb push output_path /data/local/tmp/llm/model_version.task
إعداد المهمة
ابدأ المهمة باستخدام خيارات الإعداد الأساسية:
// Set the configuration options for the LLM Inference task
val taskOptions = LlmInferenceOptions.builder()
.setModelPath('/data/local/tmp/llm/model_version.task')
.setMaxTopK(64)
.build()
// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, taskOptions)
تنفيذ المهمة
استخدِم طريقة generateResponse()
لإنشاء ردّ نصي. يؤدي ذلك إلى إنشاء ردّ واحد.
val result = llmInference.generateResponse(inputPrompt)
logger.atInfo().log("result: $result")
لبث الرد، استخدِم طريقة generateResponseAsync()
.
val options = LlmInference.LlmInferenceOptions.builder()
...
.setResultListener { partialResult, done ->
logger.atInfo().log("partial result: $partialResult")
}
.build()
llmInference.generateResponseAsync(inputPrompt)
تطبيق نموذجي
للاطّلاع على كيفية عمل واجهات LLM Inference API واستكشاف مجموعة شاملة من إمكانات الذكاء الاصطناعي التوليدي على الجهاز فقط، يمكنك تجربة تطبيق Google AI Edge Gallery.
Google AI Edge Gallery هو تطبيق Android مفتوح المصدر يعمل كساحة تفاعلية للمطوّرين. تعرض هذه الصفحة ما يلي:
- أمثلة عملية على استخدام LLM Inference API في مهام مختلفة،
بما في ذلك:
- "اسأل الصورة": حمِّل صورة واطرح أسئلة بشأنها. الحصول على أوصاف أو حلّ المشاكل أو تحديد العناصر
- "مختبر الطلبات": يمكنك تلخيص المحتوى أو إعادة كتابته أو إنشاء رمز أو استخدام طلبات ذات تصميم مرن لاستكشاف حالات استخدام نماذج اللغات الكبيرة ذات المحادثة الواحدة.
- الدردشة مع الذكاء الاصطناعي: يمكنك إجراء محادثات متعددة الأدوار.
- إمكانية اكتشاف مجموعة متنوعة من النماذج المحسّنة باستخدام LiteRT وتنزيلها وتجربتها من "منتدى LiteRT" على Hugging Face وإصدارات Google الرسمية (مثل Gemma 3N)
- مقاييس أداء في الوقت الفعلي على الجهاز لنماذج مختلفة (الوقت اللازم لإنشاء الرمز المميز الأول وسرعة فك الترميز وما إلى ذلك)
- كيفية استيراد نماذج
.litertlm
أو.task
مخصّصة واختبارها
هذا التطبيق هو مرجع لفهم التنفيذ العملي لواجهة برمجة التطبيقات LLM Inference API وإمكانات الذكاء الاصطناعي التوليدي على الأجهزة. يمكنك الاطّلاع على رمز المصدر وتنزيل التطبيق من مستودع Google AI Edge Gallery على GitHub.
خيارات الإعداد
استخدِم خيارات الإعداد التالية لإعداد تطبيق Android:
اسم الخيار | الوصف | نطاق القيم | القيمة التلقائية |
---|---|---|---|
modelPath |
مسار مكان تخزين النموذج داخل دليل المشروع | المسار | غير متوفّر |
maxTokens |
الحد الأقصى لعدد الرموز المميزة (رموز الإدخال + رموز الإخراج) التي يمكن للنموذج التعامل معها | عدد صحيح | 512 |
topK |
عدد الرموز المميزة التي يأخذها النموذج في الاعتبار في كل خطوة من خطوات الإنشاء يقتصر التوقّع على أهم k رموز مميّزة محتملة. | عدد صحيح | 40 |
temperature |
مقدار العشوائية التي يتم إدخالها أثناء الإنشاء يؤدي ارتفاع معدّل ابتكار الردود إلى زيادة الإبداع في النص الذي يتم إنشاؤه، بينما يؤدي انخفاضه إلى إنتاج ردود أكثر قابلية للتوقّع. | عدد عائم | 0.8 |
randomSeed |
تمثّل هذه السمة قيمة البداية العشوائية المستخدَمة أثناء إنشاء النص. | عدد صحيح | 0 |
loraPath |
المسار المطلق إلى نموذج LoRA على الجهاز ملاحظة: لا يتوافق هذا الخيار إلا مع طُرز وحدة معالجة الرسومات. | المسار | غير متوفّر |
resultListener |
تضبط هذه السمة أداة معالجة النتائج لتلقّي النتائج بشكل غير متزامن. لا ينطبق ذلك إلا عند استخدام طريقة الإنشاء غير المتزامن. | غير متوفّر | غير متوفّر |
errorListener |
تضبط هذه السمة أداة معالجة الأخطاء الاختيارية. | غير متوفّر | غير متوفّر |
التلقين المتعدّد الوسائط
تتيح واجهات برمجة التطبيقات لنظام التشغيل Android الخاصة بواجهة LLM Inference API استخدام الطلبات المتعددة الوسائط مع النماذج التي تقبل إدخالات النصوص والصور والمقاطع الصوتية. عند تفعيل ميزة تعدُّد الوسائط، يمكن للمستخدمين تضمين مجموعة من الصور والنصوص أو الصوت والنصوص في طلباتهم، ثم يقدّم النموذج اللغوي الكبير ردًا نصيًا.
للبدء، استخدِم إصدارًا متوافقًا مع MediaPipe من Gemma 3n:
- Gemma-3n E2B: نموذج فعّال بحجم 2 مليار مَعلمة من عائلة Gemma-3n.
- Gemma-3n E4B: نموذج فعّال بسعة 4 مليار مَعلمة من عائلة Gemma-3n
لمزيد من المعلومات، راجِع مستندات Gemma-3n.
اتّبِع الخطوات التالية لتفعيل إدخال الصور أو الصوت في LLM Inference API.
إدخال صورة
لتوفير صور ضمن طلب، عليك تحويل الصور أو اللقطات المدخلة إلى عنصر
com.google.mediapipe.framework.image.MPImage
قبل تمريره إلى
LLM Inference API:
import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage
// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(image).build()
لتفعيل إمكانية استخدام واجهة LLM Inference API مع أدوات مساعدة بصريّة، اضبط EnableVisionModality
خيار الإعداد على true
ضمن خيارات الرسم البياني:
LlmInferenceSession.LlmInferenceSessionOptions sessionOptions =
LlmInferenceSession.LlmInferenceSessionOptions.builder()
...
.setGraphOptions(GraphOptions.builder().setEnableVisionModality(true).build())
.build();
اضبط الحد الأقصى لعدد الصور على 10 صور لكل جلسة.
LlmInferenceOptions options = LlmInferenceOptions.builder()
...
.setMaxNumImages(10)
.build();
في ما يلي مثال على تنفيذ واجهة LLM Inference API تم إعدادها للتعامل مع مدخلات الرؤية والنص:
MPImage image = getImageFromAsset(BURGER_IMAGE);
LlmInferenceSession.LlmInferenceSessionOptions sessionOptions =
LlmInferenceSession.LlmInferenceSessionOptions.builder()
.setTopK(10)
.setTemperature(0.4f)
.setGraphOptions(GraphOptions.builder().setEnableVisionModality(true).build())
.build();
try (LlmInference llmInference =
LlmInference.createFromOptions(ApplicationProvider.getApplicationContext(), options);
LlmInferenceSession session =
LlmInferenceSession.createFromOptions(llmInference, sessionOptions)) {
session.addQueryChunk("Describe the objects in the image.");
session.addImage(image);
String result = session.generateResponse();
}
إدخال الصوت
تفعيل دعم الصوت في LlmInferenceOptions
val inferenceOptions = LlmInference.LlmInferenceOptions.builder()
...
.setAudioModelOptions(AudioModelOptions.builder().build())
.build()
تفعيل دعم الصوت في sessionOptions
val sessionOptions = LlmInferenceSessionOptions.builder()
...
.setGraphOptions(GraphOptions.builder().setEnableAudioModality(true).build())
.build()
إرسال بيانات صوتية أثناء الاستدلال ملاحظة: يجب أن يكون الصوت بتنسيق قناة أحادية .wav
val audioData: ByteArray = ...
inferenceEngine.llmInferenceSession.addAudio(audioData)
في ما يلي مثال على عملية تنفيذ لواجهة LLM Inference API تم إعدادها للتعامل مع إدخالات الصوت والنص:
val audioData: ByteArray = ...
val inferenceOptions = LlmInference.LlmInferenceOptions.builder()
...
.setAudioModelOptions(AudioModelOptions.builder().build())
.build()
val sessionOptions = LlmInferenceSessionOptions.builder()
...
.setGraphOptions(GraphOptions.builder().setEnableAudioModality(true).build())
.build()
LlmInference.createFromOptions(context, inferenceOptions).use { llmInference ->
LlmInferenceSession.createFromOptions(llmInference, sessionOptions).use { session ->
session.addQueryChunk("Transcribe the following speech segment:")
session.addAudio(audioData)
val result = session.generateResponse()
}
}
تخصيص LoRA
تتيح واجهة LLM Inference API ضبط LoRA (Low-Rank Adaptation) باستخدام مكتبة PEFT (الضبط الدقيق الفعّال للمعلَمات). تخصّص عملية الضبط الدقيق باستخدام LoRA سلوك النماذج اللغوية الكبيرة من خلال عملية تدريب فعّالة من حيث التكلفة، ما يؤدي إلى إنشاء مجموعة صغيرة من الأوزان القابلة للتدريب استنادًا إلى بيانات تدريب جديدة بدلاً من إعادة تدريب النموذج بأكمله.
تتيح واجهة LLM Inference API إضافة أوزان LoRA إلى طبقات الانتباه في نماذج
Gemma-2 2B وGemma
2B وPhi-2. نزِّل النموذج بتنسيق safetensors
.
يجب أن يكون النموذج الأساسي بالتنسيق safetensors
لإنشاء أوزان LoRA. بعد تدريب LoRA، يمكنك تحويل النماذج إلى تنسيق FlatBuffers لتشغيلها على MediaPipe.
إعداد أوزان LoRA
استخدِم دليل طُرق LoRA من PEFT لتدريب نموذج LoRA تم تحسينه على مجموعة البيانات الخاصة بك.
لا تتيح واجهة برمجة التطبيقات LLM Inference API استخدام LoRA إلا في طبقات الانتباه، لذا حدِّد طبقات الانتباه فقط في LoraConfig
:
# For Gemma
from peft import LoraConfig
config = LoraConfig(
r=LORA_RANK,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
)
# For Phi-2
config = LoraConfig(
r=LORA_RANK,
target_modules=["q_proj", "v_proj", "k_proj", "dense"],
)
بعد التدريب على مجموعة البيانات المُعدّة وحفظ النموذج، ستتوفّر أوزان نموذج LoRA المعدَّل بدقة في adapter_model.safetensors
. ملف safetensors
هو نقطة التحقّق من LoRA المستخدَمة أثناء تحويل النموذج.
الإحالة الناجحة المستندة إلى نموذج
استخدِم حزمة MediaPipe Python لتحويل أوزان النموذج إلى تنسيق Flatbuffer. تحدّد ConversionConfig
خيارات النموذج الأساسي بالإضافة إلى خيارات LoRA الإضافية.
import mediapipe as mp
from mediapipe.tasks.python.genai import converter
config = converter.ConversionConfig(
# Other params related to base model
...
# Must use gpu backend for LoRA conversion
backend='gpu',
# LoRA related params
lora_ckpt=LORA_CKPT,
lora_rank=LORA_RANK,
lora_output_tflite_file=LORA_OUTPUT_FILE,
)
converter.convert_checkpoint(config)
سينتج المحوّل ملفَّي Flatbuffer، أحدهما للنموذج الأساسي والآخر لنموذج LoRA.
استنتاج نموذج LoRA
يتوافق نظام التشغيل Android مع LoRA الثابت أثناء عملية التهيئة. لتحميل نموذج LoRA، حدِّد مسار نموذج LoRA بالإضافة إلى النموذج اللغوي الكبير الأساسي.
// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
.setModelPath(BASE_MODEL_PATH)
.setMaxTokens(1000)
.setTopK(40)
.setTemperature(0.8)
.setRandomSeed(101)
.setLoraPath(LORA_MODEL_PATH)
.build()
// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, options)
لتنفيذ استنتاج LLM باستخدام LoRA، استخدِم الطريقتَين generateResponse()
أو generateResponseAsync()
نفسيهما كما في النموذج الأساسي.