دليل RAG لميزة الذكاء الاصطناعي على الأجهزة الطرفية لنظام التشغيل Android

توفّر حزمة تطوير البرامج (SDK) الخاصة بالتوليد المعزّز بالاسترجاع (RAG) في AI Edge المكوّنات الأساسية لإنشاء مسار RAG باستخدام LLM Inference API. توفّر سلسلة RAG إمكانية وصول النماذج اللغوية الكبيرة إلى البيانات التي يقدّمها المستخدمون، والتي يمكن أن تتضمّن معلومات معدَّلة أو حسّاسة أو خاصة بمجال معيّن. بفضل إمكانات استرجاع المعلومات الإضافية التي توفّرها آلية RAG، يمكن للنماذج اللغوية الكبيرة إنشاء ردود أكثر دقة وملاءمة للسياق في حالات استخدام محدّدة.

سنتعرّف في هذا الدليل على عملية تنفيذ أساسية لتطبيق نموذجي باستخدام LLM Inference API مع AI Edge RAG SDK. يركّز هذا الدليل على إنشاء مسار RAG. لمزيد من المعلومات حول استخدام واجهة برمجة التطبيقات LLM Inference، يُرجى الاطّلاع على دليل LLM Inference لنظام التشغيل Android.

يمكنك العثور على نموذج التطبيق الكامل على GitHub. للبدء، أنشئ التطبيق واقرأ البيانات التي يقدّمها المستخدم (sample_context.txt)، واطرح على النموذج اللغوي الكبير أسئلة ذات صلة بالمعلومات الواردة في الملف النصي.

تشغيل التطبيق النموذجي

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

تم تحسين التطبيق للأجهزة المتطورة، مثل هواتف Pixel 8 وPixel 9 وS23 وS24. وصِّل جهاز Android بمحطة العمل وتأكَّد من توفّر أحدث إصدار من Android Studio. لمزيد من المعلومات، يُرجى الاطّلاع على دليل إعداد Android.

تنزيل رمز التطبيق

توضّح لك التعليمات التالية كيفية إنشاء نسخة محلية من نموذج الرمز باستخدام أداة سطر الأوامر git.

استنسِخ مستودع git باستخدام الأمر التالي:

git clone https://github.com/google-ai-edge/ai-edge-apis

بعد إنشاء نسخة محلية من نموذج الرمز البرمجي، يمكنك استيراد المشروع إلى "استوديو Android" وتشغيل التطبيق.

تنزيل نموذج

تم ضبط التطبيق النموذجي لاستخدام Gemma-3 1B. ‫Gemma-3 1B هو جزء من عائلة Gemma التي تضم نماذج متطوّرة وخفيفة ومتاحة للجميع، وقد تم إنشاؤها بناءً على الأبحاث والتكنولوجيا نفسها المستخدمة في إنشاء نماذج Gemini. يحتوي النموذج على مليار مَعلمة وأوزان مفتوحة.

تنزيل Gemma-3 1B

بعد تنزيل Gemma-3 1B من Hugging Face، يمكنك نقل النموذج إلى جهازك:

cd ~/Downloads
tar -xvzf gemma3-1b-it-int4.tar.gz
$ 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

يمكنك أيضًا استخدام نماذج أخرى مع التطبيق النموذجي، ولكن قد يتطلب ذلك اتّخاذ خطوات إعداد إضافية.

إعداد أداة تضمين

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

تم تصميم التطبيق النموذجي ليعمل مع برنامجَين مضمّنَين، وهما البرنامج المضمّن في Gemini والبرنامج المضمّن في Gecko.

الإعداد باستخدام Gecko embedder

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

تنزيل Gecko 110m-en

يتوفّر برنامج تضمين Gecko كنموذجَي أعداد عشرية ونموذج كمّي، مع توفّر إصدارات متعددة لأطوال تسلسل مختلفة. لمزيد من المعلومات، يُرجى الاطّلاع على بطاقة نموذج Gecko.

يمكن العثور على مواصفات النموذج في اسم ملف النموذج. على سبيل المثال:

  • Gecko_256_f32.tflite: نموذج أرقام فاصلة عائمة يتيح استخدام تسلسلات تصل إلى 256 رمزًا مميزًا.
  • Gecko_1024_quant.tflite: نموذج تم تحويله إلى أعداد صحيحة يدعم تسلسلات تصل إلى 1,024 رمزًا مميزًا.

طول التسلسل هو الحد الأقصى لحجم الجزء الذي يمكن للنموذج تضمينه. على سبيل المثال، إذا تم تمرير جزء يتجاوز طول التسلسل إلى نموذج Gecko_256_f32.tflite، سيضمّن النموذج أول 256 رمزًا مميزًا ويقتطع الجزء المتبقي من الجزء.

أرسِل نموذج الترميز (sentencepiece.model) وبرنامج Gecko المضمّن إلى جهازك:

adb push sentencepiece.model /data/local/tmp/sentencepiece.model
adb push Gecko_256_f32.tflite /data/local/tmp/gecko.tflite

يتوافق نموذج التضمين مع كلّ من وحدة المعالجة المركزية (CPU) ووحدة معالجة الرسومات (GPU). يتم تلقائيًا ضبط التطبيق التجريبي لاستخراج التضمينات باستخدام نموذج Gecko على وحدة معالجة الرسومات.

companion object {
  ...
  private const val USE_GPU_FOR_EMBEDDINGS = true
}

الإعداد باستخدام Gemini Embedder

ينشئ Gemini Embedder (GeminiEmbedder) تضمينات باستخدام Gemini Cloud API. يتطلّب ذلك مفتاح Google Gemini API لتشغيل التطبيق، ويمكنك الحصول عليه من صفحة إعداد Google Gemini API.

الحصول على مفتاح Gemini API في Google AI Studio

أضِف مفتاح Gemini API واضبط COMPUTE_EMBEDDINGS_LOCALLY على false في RagPipeline.kt:

companion object {
  ...
  private const val COMPUTE_EMBEDDINGS_LOCALLY = false
  private const val GEMINI_API_KEY = "<API_KEY>"
}

آلية العمل

يقدّم هذا القسم معلومات أكثر تفصيلاً حول مكوّنات مسار RAG في التطبيق. يمكنك الاطّلاع على معظم الرمز البرمجي في RagPipeline.kt.

التبعيات

تستخدم حزمة تطوير البرامج (SDK) الخاصة بميزة "الاسترجاع والإنشاء" المكتبة com.google.ai.edge.localagents:localagents-rag. أضِف هذه التبعية إلى ملف build.gradle في تطبيق Android:

dependencies {
    ...
    implementation("com.google.ai.edge.localagents:localagents-rag:0.1.0")
    implementation("com.google.mediapipe:tasks-genai:0.10.22")
}

البيانات المقدَّمة من المستخدم

البيانات التي يقدّمها المستخدم في التطبيق هي ملف نصي باسم sample_context.txt، ويتم تخزينها في الدليل assets. يأخذ التطبيق أجزاء من الملف النصي، وينشئ تضمينات لهذه الأجزاء، ويشير إلى التضمينات عند إنشاء نص الإخراج.

يمكن العثور على مقتطف الرمز التالي في MainActivity.kt:

class MainActivity : ComponentActivity() {
  lateinit var chatViewModel: ChatViewModel
...
    chatViewModel.memorizeChunks("sample_context.txt")
...
}

التقطيع

لتبسيط الأمر، يتضمّن الملف sample_context.txt علامات <chunk_splitter> التي يستخدمها التطبيق النموذجي لإنشاء أجزاء. بعد ذلك، يتم إنشاء تضمينات لكل جزء. في التطبيقات المتاحة للاستخدام، يُعدّ حجم الأجزاء عاملاً أساسيًا يجب أخذه في الاعتبار. عندما تكون الأجزاء كبيرة جدًا، لا يحتوي المتّجه على تفاصيل كافية ليكون مفيدًا، وعندما تكون صغيرة جدًا، لا يحتوي على سياق كافٍ.

يتعامل التطبيق النموذجي مع تقسيم المحتوى إلى أجزاء من خلال الدالة memorizeChunks في RagPipeline.kt.

التضمين

يوفّر التطبيق مسارَين لتضمين النص:

  • Gecko embedder: استخراج عمليات تضمين النصوص المحلية (على الجهاز) باستخدام نموذج Gecko
  • Gemini Embedder: هي خدمة لاستخراج تضمينات النصوص المستندة إلى السحابة الإلكترونية باستخدام واجهة برمجة التطبيقات Generative Language Cloud.

يختار التطبيق النموذجي أداة التضمين استنادًا إلى ما إذا كان المستخدم ينوي حساب عمليات التضمين محليًا أو من خلال Google Cloud. يمكن العثور على مقتطف الرمز التالي في RagPipeline.kt:

private val embedder: Embedder<String> = if (COMPUTE_EMBEDDINGS_LOCALLY) {
  GeckoEmbeddingModel(
    GECKO_MODEL_PATH,
    Optional.of(TOKENIZER_MODEL_PATH),
    USE_GPU_FOR_EMBEDDINGS,
    )
  } else {
    GeminiEmbedder(
      GEMINI_EMBEDDING_MODEL,
      GEMINI_API_KEY
      )
  }

قاعدة البيانات

يستخدم التطبيق النموذجي SQLite (SqliteVectorStore) لتخزين تضمينات النص. يمكنك أيضًا استخدام قاعدة بيانات DefaultVectorStore لتخزين المتجهات غير الدائم.

يمكن العثور على مقتطف الرمز التالي في RagPipeline.kt:

private val config = ChainConfig.create(
    mediaPipeLanguageModel, PromptBuilder(QA_PROMPT_TEMPLATE1),
    DefaultSemanticTextMemory(
        SqliteVectorStore(768), embedder
    )
)

يضبط التطبيق النموذجي حجم التضمين على 768، وهو ما يشير إلى طول كل متّجه في قاعدة بيانات المتّجهات.

سلسلة

توفّر حزمة تطوير البرامج (SDK) الخاصة بـ RAG سلاسل تجمع عدة مكوّنات من RAG في مسار واحد. يمكنك استخدام السلاسل لتنظيم نماذج الاسترجاع والاستعلام. تستند واجهة برمجة التطبيقات إلى واجهة Chain.

يستخدم التطبيق النموذجي سلسلة الاسترجاع والاستدلال. يمكن العثور على مقتطف الرمز التالي في RagPipeline.kt:

private val retrievalAndInferenceChain = RetrievalAndInferenceChain(config)

يتم استدعاء السلسلة عندما ينشئ النموذج ردودًا:

suspend fun generateResponse(
    prompt: String,
    callback: AsyncProgressListener<LanguageModelResponse>?
): String =
    coroutineScope {
        val retrievalRequest =
            RetrievalRequest.create(
                prompt,
                RetrievalConfig.create(2, 0.0f, TaskType.QUESTION_ANSWERING)
            )
        retrievalAndInferenceChain.invoke(retrievalRequest, callback).await().text
    }