راهنمای AI Edge RAG برای اندروید

کیت توسعه نرم‌افزاری AI Edge RAG اجزای اساسی برای ساخت یک خط تولید افزوده بازیابی (RAG) با رابط برنامه‌نویسی کاربردی استنتاج LLM را فراهم می‌کند. یک خط تولید RAG به LLMها امکان دسترسی به داده‌های ارائه شده توسط کاربر را می‌دهد که می‌تواند شامل اطلاعات به‌روز، حساس یا خاص دامنه باشد. با قابلیت‌های بازیابی اطلاعات اضافه شده از RAG، LLMها می‌توانند پاسخ‌های دقیق‌تر و آگاه‌تر از زمینه را برای موارد استفاده خاص تولید کنند.

این راهنما شما را در پیاده‌سازی اولیه یک برنامه نمونه با استفاده از LLM Inference API به همراه AI Edge RAG SDK راهنمایی می‌کند. این راهنما بر ساخت یک خط لوله RAG تمرکز دارد. برای اطلاعات بیشتر در مورد استفاده از LLM Inference API، به راهنمای LLM Inference for Android مراجعه کنید.

می‌توانید نمونه کامل برنامه را در GitHub پیدا کنید. برای شروع، برنامه را بسازید، داده‌های ارائه شده توسط کاربر ( sample_context.txt ) را بخوانید و سوالات LLM مربوط به اطلاعات موجود در فایل متنی را بپرسید.

اجرای برنامه مثال

این راهنما به نمونه‌ای از یک برنامه تولید متن پایه با RAG برای اندروید اشاره دارد. می‌توانید از این برنامه نمونه به عنوان نقطه شروع برای برنامه اندروید خود استفاده کنید، یا هنگام اصلاح یک برنامه موجود به آن مراجعه کنید.

این برنامه برای دستگاه‌های رده بالاتر مانند Pixel 8، Pixel 9، S23 و S24 بهینه شده است. یک دستگاه اندروید را به ایستگاه کاری خود متصل کنید و مطمئن شوید که نسخه به‌روز اندروید استودیو را دارید. برای اطلاعات بیشتر، به راهنمای راه‌اندازی اندروید مراجعه کنید.

کد برنامه را دانلود کنید

دستورالعمل‌های زیر به شما نشان می‌دهند که چگونه با استفاده از ابزار خط فرمان git، یک کپی محلی از کد مثال ایجاد کنید.

مخزن git را با استفاده از دستور زیر کلون کنید:

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

پس از ایجاد یک نسخه محلی از کد نمونه، می‌توانید پروژه را به اندروید استودیو وارد کرده و برنامه را اجرا کنید.

دانلود یک مدل

برنامه نمونه برای استفاده از Gemma-3 1B پیکربندی شده است. Gemma-3 1B بخشی از خانواده مدل‌های باز سبک و پیشرفته Gemma است که از همان تحقیقات و فناوری مورد استفاده برای ایجاد مدل‌های Gemini ساخته شده است. این مدل شامل پارامترهای 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

شما همچنین می‌توانید از مدل‌های دیگر با برنامه نمونه استفاده کنید، اما ممکن است به مراحل پیکربندی اضافی نیاز داشته باشد.

یک جاسازی‌کننده راه‌اندازی کنید

جاسازی‌کننده، تکه‌هایی از متن را از داده‌های ارائه شده توسط کاربر می‌گیرد و آنها را به نمایش‌های عددی برداری تبدیل می‌کند که معنای معنایی آن را در بر می‌گیرد. LLM به این جاسازی‌ها برای شناسایی بردارهای مرتبط مراجعه می‌کند و تکه‌هایی را که از نظر معنایی مرتبط‌تر هستند در خروجی تولید شده لحاظ می‌کند.

برنامه نمونه برای کار با دو جاسازی‌کننده، جاسازی‌کننده Gemini و جاسازی‌کننده Gecko، طراحی شده است.

با جاسازی‌کننده Gecko راه‌اندازی کنید

به طور پیش‌فرض، برنامه نمونه طوری پیکربندی شده است که از جاسازی‌کننده Gecko ( GeckoEmbeddingModel ) استفاده کند و مدل را کاملاً روی دستگاه اجرا کند.

دانلود گکو ۱۱۰ میلیون

جاسازی‌کننده‌ی Gecko به صورت مدل‌های float و quantized، با نسخه‌های متعدد برای طول‌های مختلف توالی، موجود است. برای اطلاعات بیشتر، به کارت مدل Gecko مراجعه کنید.

مشخصات مدل را می‌توان در نام فایل مدل یافت. برای مثال:

  • Gecko_256_f32.tflite : مدل اعشاری که از توالی‌هایی تا سقف ۲۵۶ توکن پشتیبانی می‌کند.
  • Gecko_1024_quant.tflite : مدل کوانتیزه شده‌ای که از توالی‌هایی تا سقف ۱۰۲۴ توکن پشتیبانی می‌کند.

طول توالی، حداکثر اندازه قطعه‌ای است که مدل می‌تواند جاسازی کند. برای مثال، به مدل Gecko_256_f32.tflite ، قطعه‌ای که از طول توالی بیشتر باشد، ارسال می‌شود. مدل ۲۵۶ توکن اول را جاسازی کرده و بقیه قطعه را کوتاه می‌کند.

مدل توکن‌ساز ( 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 روی GPU استخراج کند.

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

با Gemini Embedder تنظیم کنید

ابزار جاسازی جمینی ( GeminiEmbedder ) با استفاده از رابط برنامه‌نویسی نرم‌افزار Gemini Cloud، جاسازی‌ها را ایجاد می‌کند. برای اجرای برنامه، به کلید API گوگل جمینی نیاز است که می‌توانید آن را از صفحه تنظیمات Google Gemini API دریافت کنید.

دریافت کلید API جمینی در گوگل هوش مصنوعی استودیو

کلید API Gemini خود را اضافه کنید و COMPUTE_EMBEDDINGS_LOCALLY در RagPipeline.kt روی false تنظیم کنید:

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

چگونه کار می‌کند؟

این بخش اطلاعات عمیق‌تری در مورد اجزای خط لوله RAG برنامه ارائه می‌دهد. می‌توانید بیشتر کد را در RagPipeline.kt مشاهده کنید.

وابستگی‌ها

کیت توسعه نرم‌افزار RAG از کتابخانه com.google.ai.edge.localagents:localagents-rag استفاده می‌کند. این وابستگی را به فایل build.gradle برنامه اندروید خود اضافه کنید:

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 مدیریت می‌کند.

جاسازی

این برنامه دو مسیر برای جاسازی متن ارائه می‌دهد:

برنامه نمونه، جاسازی‌کننده را بر اساس اینکه کاربر قصد دارد جاسازی‌ها را به صورت محلی یا از طریق 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
    )
)

برنامه نمونه، بُعد جاسازی را روی ۷۶۸ تنظیم می‌کند که به طول هر بردار در پایگاه داده بردار اشاره دارد.

زنجیره

کیت توسعه نرم‌افزار RAG، زنجیره‌هایی را ارائه می‌دهد که چندین مؤلفه RAG را در یک خط لوله واحد ترکیب می‌کند. می‌توانید از زنجیره‌ها برای هماهنگ‌سازی مدل‌های بازیابی و پرس‌وجو استفاده کنید. این API بر اساس رابط 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
    }