Udhëzues AI Edge RAG për Android

AI Edge RAG SDK ofron komponentët themelorë për të ndërtuar një tubacion të Gjenerimit të Shtuar të Rikthimit (RAG) me API-në e Inference LLM. Një tubacion RAG u ofron LLM-ve qasje në të dhënat e ofruara nga përdoruesi, të cilat mund të përfshijnë informacione të azhurnuara, të ndjeshme ose specifike për domenin. Me aftësitë e shtuara të rikthimit të informacionit nga RAG, LLM-të mund të gjenerojnë përgjigje më të sakta dhe të ndërgjegjshme për kontekstin për raste specifike përdorimi.

Ky udhëzues ju udhëzon përmes një implementimi bazë të një aplikacioni shembull duke përdorur API-në LLM Inference me AI Edge RAG SDK. Ky udhëzues përqendrohet në ndërtimin e një tubacioni RAG. Për më shumë informacion mbi përdorimin e API-së LLM Inference, shihni udhëzuesin LLM Inference për Android .

Mund ta gjeni aplikacionin e plotë shembull në GitHub . Për të filluar, ndërtoni aplikacionin, lexoni të dhënat e dhëna nga përdoruesi ( sample_context.txt ) dhe bëni pyetje LLM në lidhje me informacionin në skedarin tekstual.

Ekzekutoni aplikacionin shembull

Ky udhëzues i referohet një shembulli të një aplikacioni bazë për gjenerimin e tekstit me RAG për Android. Mund ta përdorni aplikacionin shembull si pikënisje për aplikacionin tuaj Android ose t'i referoheni atij kur modifikoni një aplikacion ekzistues.

Aplikacioni është i optimizuar për pajisje të nivelit të lartë si Pixel 8, Pixel 9, S23 dhe S24. Lidhni një pajisje Android me stacionin tuaj të punës dhe sigurohuni që keni një version të azhurnuar të Android Studio. Për më shumë informacion, shihni udhëzuesin e konfigurimit të Android .

Shkarko kodin e aplikacionit

Udhëzimet e mëposhtme ju tregojnë se si të krijoni një kopje lokale të kodit shembull duke përdorur mjetin e linjës së komandës git.

Klononi repozitorin git duke përdorur komandën e mëposhtme:

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

Pasi të krijoni një version lokal të kodit shembullor, mund ta importoni projektin në Android Studio dhe ta ekzekutoni aplikacionin.

Shkarkoni një model

Aplikacioni shembull është konfiguruar për të përdorur Gemma-3 1B . Gemma-3 1B është pjesë e familjes Gemma të modeleve të hapura të lehta dhe të teknologjisë së fundit, të ndërtuara nga i njëjti kërkim dhe teknologji e përdorur për të krijuar modelet Gemini. Modeli përmban parametra 1B dhe pesha të hapura.

Shkarkoni Gemma-3 1B

Pasi të keni shkarkuar Gemma-3 1B nga Hugging Face, vendosni modelin në pajisjen tuaj:

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

Mund të përdorni edhe modele të tjera me aplikacionin shembull, por kjo mund të kërkojë hapa shtesë konfigurimi.

Konfiguro një ngulitës

Përpunuesi i tekstit merr pjesë të tekstit nga të dhënat e ofruara nga përdoruesi dhe i shndërron ato në përfaqësime numerike të vektorizuara që kapin kuptimin e tyre semantik. LLM i referohet këtyre përfshirjeve për të identifikuar vektorët përkatës dhe përfshin pjesët më të rëndësishme semantikisht në rezultatin e gjeneruar.

Aplikacioni shembull është projektuar për të funksionuar me dy ngulitës, ngulitësin Gemini dhe ngulitësin Gecko.

Konfiguro me Gecko embedder

Si parazgjedhje, aplikacioni shembull është konfiguruar për të përdorur ngulitësin Gecko ( GeckoEmbeddingModel ) dhe e ekzekuton modelin plotësisht në pajisje.

Shkarkoni Gecko 110m-en

Mbjellësi Gecko është i disponueshëm si modele lundruese dhe të kuantizuara, me versione të shumëfishta për gjatësi të ndryshme sekuencash. Për më shumë informacion, shihni kartën e modelit Gecko .

Specifikimet e modelit mund të gjenden në emrin e skedarit të modelit. Për shembull:

  • Gecko_256_f32.tflite : Model lundrues që mbështet sekuenca deri në 256 tokena.
  • Gecko_1024_quant.tflite : Model i kuantizuar që mbështet sekuenca deri në 1024 tokena.

Gjatësia e sekuencës është madhësia maksimale e copës që modeli mund të ngulit. Për shembull, modelit Gecko_256_f32.tflite i kalohet një copë që tejkalon gjatësinë e sekuencës, modeli do të ngulitë 256 tokenët e parë dhe do të shkurtojë pjesën tjetër të copës.

Vendosni modelin e tokenizuesit ( sentencepiece.model ) dhe ngulitësin Gecko në pajisjen tuaj:

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

Modeli i ngulitur është i pajtueshëm si me CPU-në ashtu edhe me GPU-në. Si parazgjedhje, aplikacioni shembull është konfiguruar për të nxjerrë ngulitur me modelin Gecko në GPU.

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

Konfiguro me Gemini Embedder

Gemini Embedder ( GeminiEmbedder ) krijon ngulitje duke përdorur Gemini Cloud API. Kjo kërkon një çelës Google Gemini API për të ekzekutuar aplikacionin, të cilin mund ta merrni nga faqja e konfigurimit të Google Gemini API.

Merrni një çelës API Gemini në Google AI Studio

Shtoni çelësin tuaj Gemini API dhe vendosni COMPUTE_EMBEDDINGS_LOCALLY në false në RagPipeline.kt :

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

Si funksionon

Ky seksion ofron informacion më të hollësishëm mbi komponentët e tubacionit RAG të aplikacionit. Mund ta shikoni pjesën më të madhe të kodit në RagPipeline.kt .

Varësitë

SDK-ja RAG përdor bibliotekën com.google.ai.edge.localagents:localagents-rag . Shtoni këtë varësi në skedarin build.gradle të aplikacionit tuaj Android:

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

Të dhëna të ofruara nga përdoruesi

Të dhënat e ofruara nga përdoruesi në aplikacion janë një skedar teksti me emrin sample_context.txt , i cili ruhet në direktorinë assets . Aplikacioni merr pjesë të skedarit të tekstit, krijon ngulitje të këtyre pjesëve dhe i referohet ngulitjeve kur gjeneron tekstin e daljes.

Fragmenti i mëposhtëm i kodit mund të gjendet në MainActivity.kt :

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

Grumbullim

Për thjeshtësi, skedari sample_context.txt përfshin etiketat <chunk_splitter> që aplikacioni shembull përdor për të krijuar chunk-e. Më pas krijohen integrime për secilin chunk. Në aplikacionet e prodhimit, madhësia e chunk-eve është një konsideratë kyçe. Kur një chunk është shumë i madh, vektori nuk përmban specifikim të mjaftueshëm për të qenë i dobishëm; dhe kur është shumë i vogël, nuk përmban kontekst të mjaftueshëm.

Aplikacioni shembull merret me ndarjen në grupe përmes funksionit memorizeChunksRagPipeline.kt .

Vendosja

Aplikacioni ofron dy mënyra për të futur tekst:

  • Integrator Gecko : Nxjerrje lokale (në pajisje) e integrimit të tekstit me modelin Gecko.
  • Gemini Embedder : Nxjerrje e ngulitjes së tekstit në cloud me API-n Generative Language Cloud.

Aplikacioni shembull zgjedh ngulitësin bazuar në faktin nëse përdoruesi synon të llogarisë ngulitje lokalisht apo përmes Google Cloud. Fragmenti i mëposhtëm i kodit mund të gjendet në 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
      )
  }

Baza e të dhënave

Aplikacioni shembull përdor SQLite ( SqliteVectorStore ) për të ruajtur ngulitje teksti. Gjithashtu mund të përdorni bazën e të dhënave DefaultVectorStore për ruajtje vektoriale jo të përhershme.

Fragmenti i mëposhtëm i kodit mund të gjendet në RagPipeline.kt :

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

Aplikacioni shembull e cakton dimensionin e ngulitur në 768, që i referohet gjatësisë së secilit vektor në bazën e të dhënave të vektorëve.

Zinxhir

SDK-ja RAG ofron zinxhirë, të cilët kombinojnë disa komponentë RAG në një tubacion të vetëm. Ju mund të përdorni zinxhirë për të orkestruar modelet e rikuperimit dhe pyetjeve. API bazohet në ndërfaqen Chain .

Aplikacioni shembull përdor zinxhirin Retrieval and Inference . Fragmenti i mëposhtëm i kodit mund të gjendet në RagPipeline.kt :

private val retrievalAndInferenceChain = RetrievalAndInferenceChain(config)

Zinxhiri thirret kur modeli gjeneron përgjigje:

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
    }