AI Edge RAG SDK menyediakan komponen dasar untuk membuat pipeline Retrieval Augmented Generation (RAG) dengan LLM Inference API. Pipeline RAG memberi LLM akses ke data yang disediakan pengguna, yang dapat mencakup informasi yang diperbarui, sensitif, atau khusus domain. Dengan kemampuan pengambilan informasi tambahan dari RAG, LLM dapat menghasilkan respons yang lebih akurat dan sesuai konteks untuk kasus penggunaan tertentu.
Panduan ini membahas implementasi dasar aplikasi contoh menggunakan LLM Inference API dengan AI Edge RAG SDK. Panduan ini berfokus pada pembuatan pipeline RAG. Untuk mengetahui informasi selengkapnya tentang penggunaan LLM Inference API, lihat panduan LLM Inference untuk Android.
Anda dapat menemukan aplikasi contoh lengkap di
GitHub.
Untuk memulai, buat aplikasi, baca data yang disediakan pengguna
(sample_context.txt),
dan ajukan pertanyaan LLM terkait informasi dalam file teks.
Menjalankan aplikasi contoh
Panduan ini mengacu pada contoh aplikasi pembuatan teks dasar dengan RAG untuk Android. Anda dapat menggunakan aplikasi contoh sebagai titik awal untuk aplikasi Android Anda sendiri, atau merujuknya saat mengubah aplikasi yang ada.
Aplikasi ini dioptimalkan untuk perangkat kelas atas seperti Pixel 8, Pixel 9, S23, dan S24. Hubungkan perangkat Android ke workstation Anda dan pastikan Anda memiliki Android Studio versi terbaru. Untuk mengetahui informasi selengkapnya, lihat panduan penyiapan Android guide.
Mendownload kode aplikasi
Petunjuk berikut menunjukkan cara membuat salinan lokal kode contoh menggunakan alat command line git.
Clone repositori git menggunakan perintah berikut:
git clone https://github.com/google-ai-edge/ai-edge-apis
Setelah membuat versi lokal kode contoh, Anda dapat mengimpor project ke Android Studio dan menjalankan aplikasi.
Mendownload model
Aplikasi contoh dikonfigurasi untuk menggunakan Gemma-3 1B. Gemma-3 1B adalah bagian dari keluarga Gemma, yaitu model open source yang ringan dan canggih, dibangun dari riset dan teknologi yang sama dengan yang digunakan untuk membuat model Gemini. Model ini berisi 1 miliar parameter dan bobot terbuka.
Setelah mendownload Gemma-3 1B dari Hugging Face, kirim model ke perangkat Anda:
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
Anda juga dapat menggunakan model lain dengan aplikasi contoh, tetapi mungkin memerlukan langkah-langkah konfigurasi tambahan.
Menyiapkan embedder
Embedder mengambil potongan teks dari data yang disediakan pengguna dan mengubahnya menjadi representasi numerik vektor yang menangkap makna semantiknya. LLM merujuk ke embedding ini untuk mengidentifikasi vektor yang relevan, dan menggabungkan potongan yang paling relevan secara semantik dalam output yang dihasilkan.
Aplikasi contoh dirancang untuk berfungsi dengan dua embedder, yaitu embedder Gemini dan embedder Gecko.
Menyiapkan dengan embedder Gecko
Secara default, aplikasi contoh dikonfigurasi untuk menggunakan embedder Gecko (GeckoEmbeddingModel), dan menjalankan model sepenuhnya di perangkat.
Embedder Gecko tersedia sebagai model float dan terkuantisasi, dengan beberapa versi untuk panjang urutan yang berbeda. Untuk mengetahui informasi selengkapnya, lihat kartu model Gecko.
Spesifikasi model dapat ditemukan dalam nama file model. Contoh:
Gecko_256_f32.tflite: Model float yang mendukung urutan hingga 256 token.Gecko_1024_quant.tflite: Model terkuantisasi yang mendukung urutan hingga 1.024 token.
Panjang urutan adalah ukuran potongan maksimum yang dapat disematkan oleh model. Misalnya, jika model Gecko_256_f32.tflite meneruskan potongan yang melebihi panjang urutan, model akan menyematkan 256 token pertama dan memangkas sisa potongan.
Kirim model tokenizer (sentencepiece.model) dan embedder Gecko ke perangkat Anda:
adb push sentencepiece.model /data/local/tmp/sentencepiece.model
adb push Gecko_256_f32.tflite /data/local/tmp/gecko.tflite
Model embedding kompatibel dengan CPU dan GPU. Secara default, aplikasi contoh dikonfigurasi untuk mengekstrak embedding dengan model Gecko di GPU.
companion object {
...
private const val USE_GPU_FOR_EMBEDDINGS = true
}
Menyiapkan dengan Embedder Gemini
Embedder Gemini (GeminiEmbedder) membuat embedding menggunakan Gemini Cloud API. Hal ini memerlukan kunci Google Gemini API untuk menjalankan aplikasi, yang dapat Anda peroleh dari halaman penyiapan Google Gemini API.
Mendapatkan kunci Gemini API di Google AI Studio
Tambahkan kunci Gemini API Anda dan tetapkan COMPUTE_EMBEDDINGS_LOCALLY ke false di
RagPipeline.kt:
companion object {
...
private const val COMPUTE_EMBEDDINGS_LOCALLY = false
private const val GEMINI_API_KEY = "<API_KEY>"
}
Cara kerjanya
Bagian ini memberikan informasi yang lebih mendalam tentang komponen pipeline RAG aplikasi. Anda dapat melihat sebagian besar kode di RagPipeline.kt.
Dependensi
RAG SDK menggunakan library com.google.ai.edge.localagents:localagents-rag.
Tambahkan dependensi ini ke file build.gradle aplikasi Android Anda:
dependencies {
...
implementation("com.google.ai.edge.localagents:localagents-rag:0.1.0")
implementation("com.google.mediapipe:tasks-genai:0.10.22")
}
Data yang disediakan pengguna
Data yang disediakan pengguna dalam aplikasi adalah file teks bernama
sample_context.txt,
yang disimpan di direktori assets. Aplikasi mengambil potongan file teks, membuat embedding potongan tersebut, dan merujuk ke embedding saat membuat teks output.
Cuplikan kode berikut dapat ditemukan di MainActivity.kt:
class MainActivity : ComponentActivity() {
lateinit var chatViewModel: ChatViewModel
...
chatViewModel.memorizeChunks("sample_context.txt")
...
}
Pemotongan
Untuk mempermudah, file menyertakan <chunk_splitter> tag yang digunakan aplikasi contoh untuk membuat potongan.sample_context.txt Embedding kemudian dibuat untuk setiap potongan. Dalam aplikasi produksi, ukuran potongan adalah pertimbangan utama. Jika potongan terlalu besar, vektor tidak akan berisi spesifisitas yang cukup untuk berguna; dan jika terlalu kecil, vektor tidak akan berisi konteks yang cukup.
Aplikasi contoh menangani pemotongan melalui memorizeChunks
fungsi di
RagPipeline.kt.
Embedding
Aplikasi ini menawarkan dua jalur untuk embedding teks:
- Embedder Gecko: Ekstraksi embedding teks lokal (di perangkat) dengan model Gecko.
- Embedder Gemini: Ekstraksi embedding teks berbasis cloud dengan Generative Language Cloud API.
Aplikasi contoh memilih embedder berdasarkan apakah pengguna ingin menghitung embedding secara lokal atau melalui Google Cloud. Cuplikan kode berikut dapat ditemukan di 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
)
}
Database
Aplikasi contoh menggunakan SQLite (SqliteVectorStore) untuk menyimpan embedding teks. Anda juga dapat menggunakan database DefaultVectorStore untuk penyimpanan vektor non-persisten.
Cuplikan kode berikut dapat ditemukan di RagPipeline.kt:
private val config = ChainConfig.create(
mediaPipeLanguageModel, PromptBuilder(QA_PROMPT_TEMPLATE1),
DefaultSemanticTextMemory(
SqliteVectorStore(768), embedder
)
)
Aplikasi contoh menetapkan dimensi embedding ke 768, yang mengacu pada panjang setiap vektor dalam database vektor.
Chain
RAG SDK menyediakan chain, yang menggabungkan beberapa komponen RAG ke dalam satu pipeline. Anda dapat menggunakan chain untuk mengatur model pengambilan dan kueri. API ini didasarkan pada antarmuka Chain.
Aplikasi contoh menggunakan chain Pengambilan dan Inferensi. Cuplikan kode berikut dapat ditemukan di RagPipeline.kt:
private val retrievalAndInferenceChain = RetrievalAndInferenceChain(config)
Chain dipanggil saat model menghasilkan respons:
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
}