คู่มือ RAG สำหรับ AI Edge สำหรับ Android

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

หลังจากดาวน์โหลด 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 110m-en

โปรแกรมฝัง 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
    }