คำแนะนำการฝังข้อความสำหรับ Android

งานเครื่องมือฝังข้อความ MediaPipe ให้คุณสร้างการนำเสนอแบบตัวเลขของข้อมูลข้อความเพื่อบันทึกความหมายเชิงความหมาย วิธีการเหล่านี้จะแสดงวิธีใช้ เครื่องมือฝังข้อความกับแอป Android

ดูข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ โมเดล และตัวเลือกการกำหนดค่าของงานนี้ได้ที่ภาพรวม

ตัวอย่างโค้ด

โค้ดตัวอย่างงาน MediaPipe Tasks เป็นการใช้งานแอปเครื่องมือฝังข้อความสำหรับ Android แบบง่ายๆ ตัวอย่างนี้จะประเมินความคล้ายคลึงกันเชิงความหมายระหว่างข้อความ 2 ส่วน และต้องใช้อุปกรณ์ Android จริงหรือโปรแกรมจำลอง Android

คุณสามารถใช้แอปเป็นจุดเริ่มต้นสำหรับแอป Android ของคุณเองหรือใช้อ้างอิงเมื่อแก้ไขแอปที่มีอยู่ โค้ดตัวอย่างของเครื่องมือฝังข้อความโฮสต์อยู่ใน GitHub

ดาวน์โหลดโค้ด

วิธีการต่อไปนี้แสดงวิธีสร้างสำเนาโค้ดตัวอย่างในเครื่องโดยใช้เครื่องมือบรรทัดคำสั่ง git

วิธีดาวน์โหลดโค้ดตัวอย่าง

  1. โคลนที่เก็บ Git โดยใช้คำสั่งต่อไปนี้
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. (ไม่บังคับ) กำหนดค่าอินสแตนซ์ Git เพื่อใช้การชำระเงินแบบกะทัดรัด เพื่อให้คุณมีเพียงไฟล์สำหรับแอปตัวอย่างเครื่องมือฝังข้อความ ดังนี้
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/text_embedder/android
    

หลังจากสร้างโค้ดตัวอย่างเวอร์ชันในเครื่องแล้ว คุณจะนำเข้าโปรเจ็กต์ไปยัง Android Studio และเรียกใช้แอปได้ โปรดดูวิธีการที่หัวข้อคู่มือการตั้งค่าสำหรับ Android

องค์ประกอบหลัก

ไฟล์ต่อไปนี้มีโค้ดที่สำคัญสำหรับแอปพลิเคชันตัวอย่างเครื่องมือฝังข้อความนี้

  • TextEmbedderHelper.kt: เริ่มต้นการทำงานของเครื่องมือฝังข้อความ รวมถึงจัดการโมเดลและมอบสิทธิ์ในการเลือก
  • MainActivity.kt: ใช้งานแอปพลิเคชันและประกอบคอมโพเนนต์อินเทอร์เฟซผู้ใช้

ตั้งค่า

ส่วนนี้จะอธิบายขั้นตอนสำคัญในการตั้งค่าสภาพแวดล้อมการพัฒนาและโปรเจ็กต์โค้ดสำหรับการใช้เครื่องมือฝังข้อความโดยเฉพาะ สำหรับข้อมูลทั่วไปเกี่ยวกับการตั้งค่าสภาพแวดล้อมการพัฒนาเพื่อใช้งาน MediaPipe รวมถึงข้อกำหนดเวอร์ชันแพลตฟอร์ม โปรดดูคู่มือการตั้งค่าสำหรับ Android

การอ้างอิง

เครื่องมือฝังข้อความใช้ไลบรารี com.google.mediapipe:tasks-text เพิ่มทรัพยากร Dependency นี้ไปยังไฟล์ build.gradle ของโครงการการพัฒนาแอป Android ของคุณ คุณนำเข้าทรัพยากร Dependency ที่จำเป็นได้ด้วยโค้ดต่อไปนี้

dependencies {
    implementation 'com.google.mediapipe:tasks-text:latest.release'
}

รุ่น

งานเครื่องมือฝังข้อความ MediaPipe ต้องใช้โมเดลที่ผ่านการฝึกซึ่งเข้ากันได้กับงานนี้ ดูข้อมูลเพิ่มเติมเกี่ยวกับโมเดลที่ผ่านการฝึกที่พร้อมใช้งานสำหรับเครื่องมือฝังข้อความได้ในภาพรวมงานส่วนโมเดล

เลือกและดาวน์โหลดโมเดล แล้วจัดเก็บไว้ในไดเรกทอรีโปรเจ็กต์ โดยทำดังนี้

<dev-project-root>/src/main/assets

ระบุเส้นทางของโมเดลภายในพารามิเตอร์ ModelAssetPath ในโค้ดตัวอย่าง โมเดลจะได้รับการกำหนดในฟังก์ชัน setupTextEmbedder() ในไฟล์ TextEmbedderHelper.kt ดังนี้

ใช้ฟังก์ชัน BaseOptions.Builder.setModelAssetPath() เพื่อระบุเส้นทางที่โมเดลใช้ วิธีการนี้จะอยู่ในตัวอย่างโค้ดในส่วนถัดไป

สร้างงาน

คุณจะใช้ฟังก์ชันใดฟังก์ชันหนึ่งของ createFrom...() เพื่อสร้างงานได้ ฟังก์ชัน createFromOptions() จะยอมรับตัวเลือกการกำหนดค่าเพื่อตั้งค่าตัวเลือกเครื่องมือฝัง นอกจากนี้คุณยังเริ่มต้นงานโดยใช้ฟังก์ชันเริ่มต้นของ createFromFile() ได้ด้วย ฟังก์ชัน createFromFile() ยอมรับเส้นทางแบบสัมพัทธ์หรือสัมบูรณ์ไปยังไฟล์โมเดลที่ฝึกแล้ว ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกการกำหนดค่าได้ที่ตัวเลือกการกำหนดค่า

โค้ดต่อไปนี้แสดงวิธีการสร้างและกำหนดค่างานนี้

val baseOptions = baseOptionsBuilder.build()
val optionsBuilder =
    TextEmbedderOptions.builder().setBaseOptions(baseOptions)
val options = optionsBuilder.build()
textEmbedder = TextEmbedder.createFromOptions(context, options)

การใช้โค้ดตัวอย่างจะกำหนดตัวเลือกเครื่องมือฝังข้อความในฟังก์ชัน setupTextEmbedder() ในไฟล์ TextEmbedderHelper.kt

ตัวเลือกการกำหนดค่า

งานมีตัวเลือกการกำหนดค่าต่อไปนี้สำหรับแอป Android

ชื่อตัวเลือก คำอธิบาย ช่วงของค่า ค่าเริ่มต้น
l2_normalize ดูว่าจะปรับเวกเตอร์ของฟีเจอร์ที่ส่งคืนด้วยค่าปกติ L2 หรือไม่ ใช้ตัวเลือกนี้เฉพาะเมื่อโมเดลยังไม่มี L2_NORMALIZATION TFLite Op แบบเนทีฟ ในกรณีส่วนใหญ่ ก็มีกรณีเช่นนี้อยู่แล้ว และระบบจะทำการปรับให้สอดคล้องตามมาตรฐาน L2 ผ่านการอนุมาน TFLite โดยไม่จำเป็นต้องใช้ตัวเลือกนี้ Boolean False
quantize ควรทำให้การฝังที่ส่งคืนแปลงเป็นไบต์ผ่านการกำหนดปริมาณแบบสเกลาร์ไหม การฝังมีสมมติฐานโดยนัยว่าเป็นหน่วยบรรทัดฐาน ดังนั้นมิติข้อมูลใดๆ ก็มีค่าเป็น [-1.0, 1.0] อย่างแน่นอน ในกรณีนี้ ให้ใช้ตัวเลือก l2_normalize Boolean False

เตรียมข้อมูล

เครื่องมือฝังข้อความใช้งานได้กับข้อมูลข้อความ (String) งานนี้จะจัดการการประมวลผลอินพุตข้อมูลล่วงหน้า ซึ่งรวมถึงการแปลงข้อมูลเป็นโทเค็นและการประมวลผลล่วงหน้าของ tensor การประมวลผลล่วงหน้าทั้งหมดจะได้รับการจัดการภายในฟังก์ชัน embed() โดยไม่จำเป็นต้องประมวลผล ข้อความอินพุตล่วงหน้าเพิ่มเติม

val inputText = "The input text to be embedded."

เรียกใช้งาน

เครื่องมือฝังข้อความใช้ฟังก์ชัน embed เพื่อทริกเกอร์การอนุมาน สำหรับการฝังข้อความ จะหมายถึงการแสดงเวกเตอร์การฝังสำหรับข้อความอินพุต

โค้ดต่อไปนี้แสดงวิธีดำเนินการประมวลผลด้วยโมเดลงาน

textEmbedder?.let {
    val firstEmbed =
        it.embed(firstText).embeddingResult().embeddings().first()
    val secondEmbed =
        it.embed(secondText).embeddingResult().embeddings().first()
    ...
}

ในโค้ดตัวอย่าง ฟังก์ชัน embed จะถูกเรียกใช้ในไฟล์ TextEmbedderHelper.kt

แฮนเดิลและแสดงผลลัพธ์

เมื่อเรียกใช้การอนุมาน งานเครื่องมือฝังข้อความจะแสดงผลออบเจ็กต์ TextEmbedderResult ที่มีรายการการฝัง (จุดลอยตัวหรือการวัดเชิงสเกลาร์) สำหรับข้อความอินพุต

ตัวอย่างต่อไปนี้แสดงตัวอย่างข้อมูลเอาต์พุตจากงานนี้

TextEmbedderResult:
  Embedding #0 (sole embedding head):
    float_embedding: {0.2345f, 0.1234f, ..., 0.6789f}
    head_index: 0

คุณเปรียบเทียบความคล้ายคลึงกันเชิงความหมายของการฝัง 2 การฝังได้โดยใช้ฟังก์ชัน TextEmbedder.cosineSimilarity ดูตัวอย่างโค้ดต่อไปนี้

val similarity = TextEmbedder.cosineSimilarity(firstEmbed, secondEmbed)

ในโค้ดตัวอย่าง ฟังก์ชัน TextEmbedder.cosineSimilarity() จะถูกเรียกใช้ในไฟล์ TextEmbedderHelper.kt