คู่มือการสรุป LLM สำหรับ Android

LLM Inference API ช่วยให้คุณเรียกใช้โมเดลภาษาขนาดใหญ่ (LLM) บนอุปกรณ์ได้ทั้งหมดสําหรับแอปพลิเคชัน Android ซึ่งคุณสามารถใช้เพื่อทํางานได้หลากหลาย เช่น การสร้างข้อความ การดึงข้อมูลในรูปแบบภาษาธรรมชาติ และการสรุปเอกสาร งานนี้รองรับโมเดลภาษาขนาดใหญ่แบบข้อความเป็นข้อความหลายรายการในตัว คุณจึงใช้โมเดล Generative AI บนอุปกรณ์ล่าสุดกับแอป Android ได้

หากต้องการเพิ่ม LLM Inference API ลงในแอปพลิเคชัน Android อย่างรวดเร็ว ให้ทําตามการเริ่มต้นใช้งานอย่างรวดเร็ว ดูตัวอย่างพื้นฐานของแอปพลิเคชัน Android ที่เรียกใช้ LLM Inference API ได้ที่ตัวอย่างแอปพลิเคชัน หากต้องการทําความเข้าใจวิธีการทํางานของ LLM Inference API อย่างละเอียดยิ่งขึ้น โปรดดูส่วนตัวเลือกการกําหนดค่า การเปลี่ยนรูปแบบ และการปรับ LoRA

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

คู่มือเริ่มใช้งานฉบับย่อ

ทําตามขั้นตอนต่อไปนี้เพื่อเพิ่ม LLM Inference API ลงในแอปพลิเคชัน Android LLM Inference API ได้รับการปรับให้เหมาะกับอุปกรณ์ Android ระดับสูง เช่น Pixel 8 และ Samsung S23 ขึ้นไป และไม่รองรับโปรแกรมจำลองอุปกรณ์อย่างน่าเชื่อถือ

เพิ่มทรัพยากร Dependency

LLM Inference API ใช้ไลบรารี com.google.mediapipe:tasks-genai เพิ่มข้อกำหนดต่อไปนี้ลงในไฟล์ build.gradle ของแอป Android

dependencies {
    implementation 'com.google.mediapipe:tasks-genai:0.10.24'
}

ดาวน์โหลดโมเดล

ดาวน์โหลด Gemma-3 1B ในรูปแบบการแปลงค่า 4 บิตจาก Hugging Face ดูข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบที่ใช้ได้ได้ที่เอกสารประกอบเกี่ยวกับรูปแบบ

พุชเนื้อหาของโฟลเดอร์ output_path ไปยังอุปกรณ์ Android

$ 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

เริ่มต้นใช้งาน Tasks

เริ่มต้นใช้งานงานด้วยตัวเลือกการกําหนดค่าพื้นฐาน ดังนี้

// Set the configuration options for the LLM Inference task
val taskOptions = LlmInferenceOptions.builder()
        .setModelPath('/data/local/tmp/llm/model_version.task')
        .setMaxTopK(64)
        .build()

// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, taskOptions)

เรียกใช้งาน

ใช้เมธอด generateResponse() เพื่อสร้างคำตอบที่เป็นข้อความ ซึ่งจะสร้างคำตอบที่สร้างขึ้นรายการเดียว

val result = llmInference.generateResponse(inputPrompt)
logger.atInfo().log("result: $result")

หากต้องการสตรีมคำตอบ ให้ใช้เมธอด generateResponseAsync()

val options = LlmInference.LlmInferenceOptions.builder()
  ...
  .setResultListener { partialResult, done ->
    logger.atInfo().log("partial result: $partialResult")
  }
  .build()

llmInference.generateResponseAsync(inputPrompt)

แอปพลิเคชันตัวอย่าง

หากต้องการดูการทำงานของ LLM Inference API และสำรวจความสามารถที่ครอบคลุมของ Generative AI ในอุปกรณ์ ให้ไปที่แอป Google AI Edge Gallery

Google AI Edge Gallery เป็นแอปพลิเคชัน Android แบบโอเพนซอร์สที่ทำหน้าที่เป็นพื้นที่ทดสอบแบบอินเทอร์แอกทีฟสำหรับนักพัฒนาซอฟต์แวร์ โดยจะแสดงข้อมูลต่อไปนี้

  • ตัวอย่างการใช้งานจริงของ LLM Inference API สําหรับงานต่างๆ ซึ่งรวมถึงตัวอย่างต่อไปนี้
    • ถามรูปภาพ: อัปโหลดรูปภาพและถามคำถามเกี่ยวกับรูปภาพ ดูคำอธิบาย แก้ปัญหา หรือระบุวัตถุ
    • ห้องทดลองพรอมต์: สรุป เขียนใหม่ สร้างโค้ด หรือใช้พรอมต์แบบอิสระเพื่อสำรวจกรณีการใช้งาน LLM แบบ 1 เทิร์น
    • แชทกับ AI: มีส่วนร่วมในการสนทนาแบบหลายรอบ
  • ความสามารถในการค้นพบ ดาวน์โหลด และทดสอบโมเดลที่เพิ่มประสิทธิภาพด้วย LiteRT หลากหลายรูปแบบจากชุมชน Hugging Face LiteRT และรุ่นอย่างเป็นทางการของ Google (เช่น Gemma 3N)
  • เกณฑ์ประสิทธิภาพในอุปกรณ์แบบเรียลไทม์สำหรับอุปกรณ์รุ่นต่างๆ (เวลาในการรับโทเค็นแรก ความเร็วในการถอดรหัส ฯลฯ)
  • วิธีนําเข้าและทดสอบโมเดล .task ที่กําหนดเอง

แอปนี้เป็นทรัพยากรที่จะช่วยให้เข้าใจการใช้งาน LLM Inference API จริงและศักยภาพของ Generative AI ในอุปกรณ์ สำรวจซอร์สโค้ดและดาวน์โหลดแอปจาก ที่เก็บ GitHub ของ Google AI Edge Gallery

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

ใช้ตัวเลือกการกําหนดค่าต่อไปนี้เพื่อตั้งค่าแอป Android

ชื่อตัวเลือก คำอธิบาย ช่วงของค่า ค่าเริ่มต้น
modelPath เส้นทางไปยังตำแหน่งที่จัดเก็บโมเดลภายในไดเรกทอรีโปรเจ็กต์ PATH ไม่มี
maxTokens จํานวนโทเค็นสูงสุด (โทเค็นอินพุต + โทเค็นเอาต์พุต) ที่โมเดลจัดการได้ จำนวนเต็ม 512
topK จำนวนโทเค็นที่โมเดลพิจารณาในแต่ละขั้นตอนของการสร้าง จำกัดการคาดการณ์ไว้ที่โทเค็นที่เป็นไปได้มากที่สุด k รายการแรก จำนวนเต็ม 40
temperature ระดับความสุ่มที่เกิดขึ้นระหว่างการสร้าง อุณหภูมิที่สูงขึ้นจะทำให้ข้อความที่สร้างขึ้นมีความสร้างสรรค์มากขึ้น ขณะที่อุณหภูมิที่ต่ำลงจะทำให้ระบบสร้างข้อความที่คาดเดาได้มากขึ้น ทศนิยม 0.8
randomSeed เมล็ดพันธุ์แบบสุ่มที่ใช้ระหว่างการสร้างข้อความ จำนวนเต็ม 0
loraPath เส้นทางแบบสัมบูรณ์ไปยังโมเดล LoRA ในอุปกรณ์ หมายเหตุ: ใช้ได้กับ GPU บางรุ่นเท่านั้น PATH ไม่มี
resultListener ตั้งค่าโปรแกรมรับฟังผลลัพธ์ให้รับผลลัพธ์แบบไม่พร้อมกัน ใช้ได้เฉพาะเมื่อใช้วิธีการสร้างแบบแอสซิงค์เท่านั้น ไม่มี ไม่มี
errorListener ตั้งค่าโปรแกรมรับฟังข้อผิดพลาด (ไม่บังคับ) ไม่มี ไม่มี

พรอมต์แบบหลายรูปแบบ

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

หากต้องการเริ่มต้นใช้งาน ให้ใช้ Gemma 3n รูปแบบที่ใช้งานร่วมกับ MediaPipe ได้ ดังนี้

  • Gemma-3n E2B: โมเดล 2B ของตระกูล Gemma-3n
  • Gemma-3n E4B: โมเดล 4B ของตระกูล Gemma-3n

ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบของ Gemma-3n

หากต้องการระบุรูปภาพภายในพรอมต์ ให้แปลงรูปภาพหรือเฟรมอินพุตเป็นออบเจ็กต์ com.google.mediapipe.framework.image.MPImage ก่อนส่งไปยัง LLM Inference API โดยทำดังนี้

import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage

// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(image).build()

หากต้องการเปิดใช้การรองรับการมองเห็นสําหรับ LLM Inference API ให้ตั้งค่าEnableVisionModalityตัวเลือกการกําหนดค่าเป็น true ภายในตัวเลือกกราฟ ดังนี้

LlmInferenceSession.LlmInferenceSessionOptions sessionOptions =
  LlmInferenceSession.LlmInferenceSessionOptions.builder()
    ...
    .setGraphOptions(GraphOptions.builder().setEnableVisionModality(true).build())
    .build();

Gemma-3n ยอมรับรูปภาพได้สูงสุด 1 รูปต่อเซสชัน ดังนั้นให้ตั้งค่า MaxNumImages เป็น 1

LlmInferenceOptions options = LlmInferenceOptions.builder()
  ...
  .setMaxNumImages(1)
  .build();

ต่อไปนี้เป็นตัวอย่างการใช้งาน LLM Inference API ที่ตั้งค่าให้จัดการกับอินพุตภาพและข้อความ

MPImage image = getImageFromAsset(BURGER_IMAGE);

LlmInferenceSession.LlmInferenceSessionOptions sessionOptions =
  LlmInferenceSession.LlmInferenceSessionOptions.builder()
    .setTopK(10)
    .setTemperature(0.4f)
    .setGraphOptions(GraphOptions.builder().setEnableVisionModality(true).build())
    .build();

try (LlmInference llmInference =
    LlmInference.createFromOptions(ApplicationProvider.getApplicationContext(), options);
  LlmInferenceSession session =
    LlmInferenceSession.createFromOptions(llmInference, sessionOptions)) {
  session.addQueryChunk("Describe the objects in the image.");
  session.addImage(image);
  String result = session.generateResponse();
}

การปรับแต่ง LoRA

LLM Inference API รองรับการปรับ LoRA (Low-Rank Adaptation) โดยใช้ไลบรารี PEFT (Parameter-Efficient Fine-Tuning) การปรับ LoRA จะปรับแต่งลักษณะการทํางานของ LLM ผ่านกระบวนการฝึกที่ประหยัดต้นทุน โดยสร้างชุดน้ำหนักที่ฝึกได้จำนวนน้อยๆ โดยอิงตามข้อมูลการฝึกใหม่แทนที่จะฝึกโมเดลทั้งชุดใหม่

LLM Inference API รองรับการเพิ่มน้ำหนัก LoRA ไปยังเลเยอร์ Attention ของโมเดล Gemma-2 2B, Gemma 2B และ Phi-2 ดาวน์โหลดโมเดลในรูปแบบ safetensors

โมเดลพื้นฐานต้องอยู่ในรูปแบบ safetensors จึงจะสร้างน้ำหนัก LoRA ได้ หลังจากการฝึก LoRA แล้ว คุณสามารถแปลงโมเดลเป็นรูปแบบ FlatBuffers เพื่อใช้งานใน MediaPipe

เตรียมน้ำหนัก LoRA

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

LLM Inference API รองรับ LoRA ในเลเยอร์ Attention เท่านั้น ดังนั้นโปรดระบุเฉพาะเลเยอร์ Attention ใน LoraConfig

# For Gemma
from peft import LoraConfig
config = LoraConfig(
    r=LORA_RANK,
    target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
)

# For Phi-2
config = LoraConfig(
    r=LORA_RANK,
    target_modules=["q_proj", "v_proj", "k_proj", "dense"],
)

หลังจากฝึกชุดข้อมูลที่เตรียมไว้และบันทึกโมเดลแล้ว น้ำหนักโมเดล LoRA ที่ปรับแต่งอย่างละเอียดจะพร้อมใช้งานใน adapter_model.safetensors ไฟล์ safetensors คือจุดตรวจสอบ LoRA ที่ใช้ในการแปลงโมเดล

การแปลงโมเดล

ใช้แพ็กเกจ MediaPipe Python เพื่อแปลงน้ำหนักโมเดลเป็นรูปแบบ Flatbuffer ConversionConfig จะระบุตัวเลือกโมเดลพื้นฐานพร้อมกับตัวเลือก LoRA เพิ่มเติม

import mediapipe as mp
from mediapipe.tasks.python.genai import converter

config = converter.ConversionConfig(
  # Other params related to base model
  ...
  # Must use gpu backend for LoRA conversion
  backend='gpu',
  # LoRA related params
  lora_ckpt=LORA_CKPT,
  lora_rank=LORA_RANK,
  lora_output_tflite_file=LORA_OUTPUT_FILE,
)

converter.convert_checkpoint(config)

ตัวแปลงจะสร้างไฟล์ Flatbuffer 2 ไฟล์ ไฟล์หนึ่งสำหรับโมเดลฐานและอีกไฟล์สำหรับโมเดล LoRA

การอนุมานโมเดล LoRA

Android รองรับ LoRA แบบคงที่ระหว่างการเริ่มต้น หากต้องการโหลดโมเดล LoRA ให้ระบุเส้นทางโมเดล LoRA และ LLM พื้นฐาน

// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
        .setModelPath(BASE_MODEL_PATH)
        .setMaxTokens(1000)
        .setTopK(40)
        .setTemperature(0.8)
        .setRandomSeed(101)
        .setLoraPath(LORA_MODEL_PATH)
        .build()

// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, options)

หากต้องการเรียกใช้การอนุมาน LLM ด้วย LoRA ให้ใช้วิธีการ generateResponse() หรือ generateResponseAsync() เดียวกันกับโมเดลพื้นฐาน