AI Edge RAG SDK มีคอมโพเนนต์พื้นฐานในการสร้างไปป์ไลน์การสร้างแบบดึงข้อมูลเพิ่มเติม (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
โดยจะต้องใช้คีย์ API ของ Google Gemini เพื่อเรียกใช้แอปพลิเคชัน ซึ่งคุณสามารถ
รับได้จากหน้าการตั้งค่า 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
}