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

AI Edge RAG SDK مؤلفه‌های اساسی را برای ایجاد خط لوله بازیابی نسل افزوده (RAG) با API استنتاج 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 برای اندروید اشاره دارد. می‌توانید از برنامه نمونه به‌عنوان نقطه شروع برای برنامه Android خود استفاده کنید، یا هنگام تغییر برنامه موجود به آن مراجعه کنید.

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

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

دستورالعمل های زیر به شما نشان می دهد که چگونه با استفاده از ابزار خط فرمان 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 را دانلود کنید

پس از دانلود 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

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

یک embedder راه اندازی کنید

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

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

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

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

دانلود Gecko 110m-en

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

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

  • Gecko_256_f32.tflite : مدل شناور که توالی تا 256 توکن را پشتیبانی می کند.
  • Gecko_1024_quant.tflite : مدل کوانتیزه شده که توالی تا 1024 توکن را پشتیبانی می کند.

طول دنباله حداکثر اندازه تکه ای است که مدل می تواند جاسازی کند. به عنوان مثال، به مدل 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 در GPU پیکربندی شده است.

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

با Gemini Embedder راه اندازی کنید

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

یک کلید API Gemini در Google AI Studio دریافت کنید

کلید Gemini API خود را اضافه کنید و 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 SDK از کتابخانه 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، تکه تکه شدن را مدیریت می کند.

جاسازی

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

  • جاسازی Gecko : استخراج متن محلی (روی دستگاه) با مدل Gecko.
  • Gemini Embedder : استخراج متن مبتنی بر ابر با استفاده از Generative Language Cloud API.

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

زنجیر

RAG SDK زنجیره هایی را ارائه می دهد که چندین جزء RAG را در یک خط لوله واحد ترکیب می کند. می‌توانید از زنجیره‌ها برای تنظیم مدل‌های بازیابی و پرس و جو استفاده کنید. API بر اساس رابط زنجیره ای است.

برنامه نمونه از زنجیره بازیابی و استنتاج استفاده می کند. قطعه کد زیر را می توان در 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
    }