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 億個參數和開放權重。
從 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 嵌入器可做為浮點和量化模型使用,並提供多個版本,以便處理不同序列長度。詳情請參閱 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
}