Android 適用的 AI Edge RAG 指南

AI Edge RAG SDK 提供基本元件,可透過 LLM 推論 API 建構擷取擴增生成 (RAG) 管道。RAG 管道可讓 LLM 存取使用者提供的資料,其中可能包含更新、機密或特定領域的資訊。透過 RAG 新增的資訊檢索功能,LLM 可針對特定用途產生更準確且符合情境的回覆。

本指南將逐步引導您使用 LLM Inference API 和 AI Edge RAG SDK 實作範例應用程式的基本功能。本指南著重於建構 RAG 管道。如要進一步瞭解如何使用 LLM Inference API,請參閱 Android 版 LLM Inference 指南

您可以在 GitHub 上找到完整的應用程式範例。如要開始使用,請建構應用程式、閱讀使用者提供的資料 (sample_context.txt),並向 LLM 提出與文字檔中資訊相關的問題。

執行範例應用程式

本指南將以 Android 版 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

建立本機版本的範例程式碼後,您可以將專案匯入 Android Studio 並執行應用程式。

下載模型

範例應用程式已設定為使用 Gemma-3 1B。Gemma-3 1B 是 Gemma 系列的一部分,這一系列先進的輕量級開放式模型採用與建立 Gemini 模型時相同的研究成果和技術打造而成。模型包含 10 億個參數和開放權重。

下載 Gemma-3 1B

從 Hugging Face 下載 Gemma-3 1B 後,請將模型推送至裝置:

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 110m-en

Gecko 嵌入器可做為浮點和量化模型使用,並提供多個版本,以便處理不同序列長度。詳情請參閱 Gecko 模型資訊卡

您可以在模型檔案名稱中找到模型規格。例如:

  • Gecko_256_fp32.tflite:支援序列長度最多 256 個符號的浮點模型。
  • Gecko_1024_quant.tflite:支援最多 1024 個符號序列的量化模型。

序列長度是模型可嵌入的最大區塊大小。舉例來說,如果 Gecko_256_fp32.tflite 模型傳遞的區塊超過序列長度,模型會嵌入前 256 個符記,並截斷區塊的其餘部分。

將代碼化工具模型 (sentencepiece.model) 和 Gecko 嵌入器推送至裝置:

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

嵌入模型支援 CPU 和 GPU。根據預設,範例應用程式會在 GPU 上使用 Gecko 模型擷取嵌入資料。

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

使用 Gemini 嵌入工具設定

Gemini 嵌入器 (GeminiEmbedder) 會使用 Gemini Cloud API 建立嵌入內容。您必須取得 Google Gemini API 金鑰才能執行應用程式,可前往 Google Gemini API 設定頁面取得金鑰。

在 Google AI Studio 中取得 Gemini API 金鑰

RagPipeline.kt 中新增 Gemini API 金鑰,並將 COMPUTE_EMBEDDINGS_LOCALLY 設為 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 程式庫。將這個依附元件新增至 Android 應用程式的 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> 標記。然後為每個區塊建立嵌入項目。在實際應用程式中,區塊大小是重要的考量因素。如果區塊太大,向量就不會包含足夠的特定性,因此無法派上用場;如果區塊太小,則不會包含足夠的上下文。

範例應用程式會透過 RagPipeline.kt 中的 memorizeChunks 函式處理分割作業。

嵌入

應用程式提供兩種文字嵌入方式:

  • Gecko 嵌入器:使用 Gecko 模型擷取本機 (裝置端) 文字嵌入內容。
  • Gemini 嵌入器:使用生成式語言雲端 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 是以 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
    }