AI Edge RAG SDK มีคอมโพเนนต์พื้นฐานในการสร้างไปป์ไลน์ Retrieval Augmented Generation (RAG) ด้วย LLM Inference API ไปป์ไลน์ RAG ช่วยให้ LLM เข้าถึงข้อมูลที่ได้จากผู้ใช้ ซึ่งอาจรวมถึงข้อมูลที่อัปเดตแล้ว ข้อมูลที่ละเอียดอ่อน หรือข้อมูลเฉพาะโดเมน ความสามารถในการดึงข้อมูลเพิ่มเติมจาก RAG ช่วยให้ LLM สร้างคำตอบที่แม่นยำและคำนึงถึงบริบทมากขึ้นสำหรับ Use Case ที่เฉพาะเจาะจง
คู่มือนี้จะแนะนำการใช้งานพื้นฐานของแอปพลิเคชันตัวอย่าง โดยใช้ LLM Inference API กับ AI Edge RAG SDK คู่มือนี้มุ่งเน้นที่การสร้างไปป์ไลน์ RAG ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ LLM Inference API ได้ที่คู่มือ LLM Inference สำหรับ Android
คุณดูแอปพลิเคชันตัวอย่างฉบับสมบูรณ์ได้ใน
GitHub
หากต้องการเริ่มต้นใช้งาน ให้สร้างแอปพลิเคชัน อ่านข้อมูลที่ได้จากผู้ใช้
(sample_context.txt)
และถามคำถาม LLM ที่เกี่ยวข้องกับข้อมูลในไฟล์ข้อความ
เรียกใช้แอปพลิเคชันตัวอย่าง
คู่มือนี้อ้างอิงถึงตัวอย่างแอปสร้างข้อความพื้นฐานที่มี RAG สำหรับ Android คุณสามารถใช้แอปตัวอย่างเป็นจุดเริ่มต้นสำหรับแอป 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 โมเดลนี้มีพารามิเตอร์ 1 พันล้านรายการและน้ำหนักแบบเปิด
หลังจากดาวน์โหลด 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
นอกจากนี้ คุณยังใช้โมเดลอื่นๆ กับแอปพลิเคชันตัวอย่างได้ด้วย แต่ต้องมีขั้นตอนการกำหนดค่าเพิ่มเติม
ตั้งค่าโปรแกรมฝัง
โปรแกรมฝังจะนำข้อความบางส่วนจากข้อมูลที่ได้จากผู้ใช้และเปลี่ยนเป็น การแสดงตัวเลขแบบเวกเตอร์ที่บันทึกความหมายเชิงความหมาย LLM จะอ้างอิงการฝังเหล่านี้เพื่อระบุเวกเตอร์ที่เกี่ยวข้อง และรวม กลุ่มข้อมูลที่เกี่ยวข้องทางความหมายมากที่สุดไว้ในเอาต์พุตที่สร้างขึ้น
แอปพลิเคชันตัวอย่างออกแบบมาให้ทำงานร่วมกับโปรแกรมฝัง 2 รายการ ได้แก่ โปรแกรมฝัง Gemini และโปรแกรมฝัง Gecko
ตั้งค่าด้วยโปรแกรมฝัง Gecko
โดยค่าเริ่มต้น แอปตัวอย่างจะได้รับการกำหนดค่าให้ใช้โปรแกรมฝัง Gecko
(GeckoEmbeddingModel) และเรียกใช้โมเดลในอุปกรณ์ทั้งหมด
โปรแกรมฝัง Gecko มีให้ใช้งานในรูปแบบโมเดลแบบลอยและแบบควอนไทซ์ โดยมีหลายเวอร์ชันสำหรับความยาวของลำดับที่แตกต่างกัน ดูข้อมูลเพิ่มเติมได้ที่การ์ดโมเดล Gecko
คุณดูข้อมูลจำเพาะของโมเดลได้ในชื่อไฟล์ของโมเดล เช่น
Gecko_256_f32.tflite: โมเดล Float ที่รองรับลำดับโทเค็นสูงสุด 256 โทเค็นGecko_1024_quant.tflite: โมเดลที่แปลงเป็นจำนวนเต็มซึ่งรองรับลำดับโทเค็นสูงสุด 1,024 โทเค็น
ความยาวลำดับคือขนาดก้อนข้อมูลสูงสุดที่โมเดลฝังได้ ตัวอย่างเช่น
หากส่งก้อนข้อมูลที่เกินความยาวของลำดับไปยังโมเดล 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 โดยต้องใช้คีย์ Google Gemini API เพื่อเรียกใช้แอปพลิเคชัน ซึ่งคุณสามารถ
รับได้จากหน้าการตั้งค่า Google Gemini API
รับคีย์ Gemini API ใน Google AI Studio
เพิ่มคีย์ Gemini API และตั้งค่า COMPUTE_EMBEDDINGS_LOCALLY เป็น false ใน
RagPipeline.kt:
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
เพิ่มทรัพยากร Dependency นี้ลงในไฟล์ build.gradle ของแอป Android
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
การฝัง
แอปพลิเคชันมีเส้นทาง 2 เส้นทางสำหรับการฝังข้อความ ดังนี้
- Gecko embedder: การแยกการฝังข้อความในเครื่อง (ในอุปกรณ์) ด้วยโมเดล 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 หลายรายการไว้ในไปป์ไลน์เดียว คุณสามารถใช้ Chain เพื่อจัดระเบียบโมเดลการดึงข้อมูลและการค้นหา 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
}