สร้างประสบการณ์แบบไฮบริดในแอป Android ด้วยโมเดลในอุปกรณ์และโมเดลที่โฮสต์ในระบบคลาวด์


คุณสามารถสร้างแอปและฟีเจอร์ Android ที่ทำงานด้วยระบบ AI ด้วยการอนุมานแบบไฮบริดโดยใช้ Firebase AI Logic การอนุมานแบบไฮบริดช่วยให้สามารถเรียกใช้การอนุมานโดยใช้ โมเดลในอุปกรณ์เมื่อพร้อมใช้งาน และเปลี่ยนกลับไปใช้ โมเดลที่โฮสต์ในระบบคลาวด์ได้อย่างราบรื่นในกรณีอื่นๆ (และในทางกลับกัน)

หน้านี้อธิบายวิธี เริ่มต้นใช้งาน Client SDK รวมถึงแสดง ตัวเลือกการกำหนดค่าและความสามารถเพิ่มเติม เช่น อุณหภูมิ

โปรดทราบว่าการอนุมานบนอุปกรณ์ผ่าน Firebase AI Logic รองรับสำหรับแอป Android ที่ทำงานบนอุปกรณ์บางรุ่น และอยู่ภายใต้ข้อกำหนดของ ML Kit รวมถึงข้อกำหนดที่เฉพาะเจาะจงสำหรับลักษณะ Gen AI ของ ML Kit

กรณีการใช้งานที่แนะนำและความสามารถที่รองรับ

กรณีการใช้งานที่แนะนำ

  • การใช้โมเดลในอุปกรณ์สำหรับการอนุมานมีข้อดีดังนี้

    • ความเป็นส่วนตัวที่ดียิ่งขึ้น
    • บริบทเฉพาะรายการ
    • การอนุมานโดยไม่มีค่าใช้จ่าย
    • ฟังก์ชันการทำงานแบบออฟไลน์
  • การใช้ฟังก์ชันไฮบริดมีข้อดีดังนี้

    • เข้าถึงกลุ่มเป้าหมายได้มากขึ้นด้วยการรองรับความพร้อมใช้งานของโมเดลในอุปกรณ์ และการเชื่อมต่ออินเทอร์เน็ต

ความสามารถและฟีเจอร์ที่รองรับสำหรับการอนุมานในอุปกรณ์

การอนุมานในอุปกรณ์รองรับเฉพาะการสร้างข้อความแบบเทิร์นเดียว (ไม่ใช่แชท) โดยมีเอาต์พุตแบบสตรีมมิงหรือไม่ใช่สตรีมมิง โดยรองรับความสามารถในการสร้างข้อความต่อไปนี้

โปรดดูรายการ ฟีเจอร์ที่ยังไม่พร้อมใช้งานสำหรับการอนุมานในอุปกรณ์ ที่ด้านล่างของหน้านี้

ก่อนเริ่มต้น

ข้อควรทราบมีดังนี้

อุปกรณ์ Android ที่รองรับและโมเดลในอุปกรณ์

สำหรับการอนุมานบนอุปกรณ์ (ซึ่งใช้ Prompt API ของ ML Kit) คุณจะดูรายการ อุปกรณ์ที่รองรับและโมเดลบนอุปกรณ์ของอุปกรณ์เหล่านั้น ได้ในเอกสารประกอบของ ML Kit

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

ขั้นตอนการเริ่มต้นใช้งานเหล่านี้อธิบายการตั้งค่าทั่วไปที่จำเป็นสำหรับคำขอพรอมต์ที่รองรับ ที่คุณต้องการส่ง

ขั้นตอนที่ 1: ตั้งค่าโปรเจ็กต์ Firebase และเชื่อมต่อแอปกับ Firebase

  1. ลงชื่อเข้าใช้คอนโซล Firebase แล้วเลือกโปรเจ็กต์ Firebase

  2. ในFirebase Console ให้ไปที่หน้า Firebase AI Logic

  3. คลิกเริ่มต้นใช้งานเพื่อเปิดตัวเวิร์กโฟลว์แบบมีคำแนะนำที่จะช่วยคุณตั้งค่า API ที่จำเป็น และทรัพยากรสำหรับโปรเจ็กต์

  4. ตั้งค่าโปรเจ็กต์ให้ใช้ผู้ให้บริการ "Gemini API"

    เราขอแนะนำให้เริ่มต้นใช้งานโดยใช้ Gemini Developer API คุณสามารถตั้งค่าVertex AI Gemini API (และข้อกำหนดสำหรับการเรียกเก็บเงิน) ได้ทุกเมื่อ

    สำหรับ Gemini Developer API คอนโซลจะเปิดใช้ API ที่จำเป็น และสร้างคีย์ API ของ Gemini ในโปรเจ็กต์
    อย่าเพิ่มคีย์ API Gemini นี้ลงในโค้ดเบสของแอป ดูข้อมูลเพิ่มเติม

  5. หากได้รับแจ้งในเวิร์กโฟลว์ของคอนโซล ให้ทำตามวิธีการบนหน้าจอเพื่อ ลงทะเบียนแอปและเชื่อมต่อกับ Firebase

  6. ทําตามขั้นตอนถัดไปในคู่มือนี้เพื่อเพิ่ม SDK ลงในแอป

ขั้นตอนที่ 2: เพิ่ม SDK ที่จำเป็น

Firebase AI Logic SDK สำหรับ Android (firebase-ai) พร้อมกับ Firebase AI Logic On-Device SDK (firebase-ai-ondevice) ให้สิทธิ์เข้าถึง API สำหรับการโต้ตอบกับโมเดล Generative

ในไฟล์ Gradle ของโมดูล (ระดับแอป) (เช่น <project>/<app-module>/build.gradle.kts) ให้เพิ่มทรัพยากร Dependency สำหรับคลัง Firebase AI Logic สำหรับ Android ดังนี้

Kotlin

dependencies {
  // ... other androidx dependencies

  // Add the dependencies for the Firebase AI Logic libraries
  // Note that the on-device SDK is not yet included in the Firebase Android BoM
  implementation("com.google.firebase:firebase-ai:17.10.0")
  implementation("com.google.firebase:firebase-ai-ondevice:16.0.0-beta01")
}

Java

สำหรับ Java คุณต้องเพิ่มไลบรารีอีก 2 รายการ

dependencies {
  // ... other androidx dependencies

  // Add the dependencies for the Firebase AI Logic libraries
  // Note that the on-device SDK is not yet included in the Firebase Android BoM
  implementation("com.google.firebase:firebase-ai:17.10.0")
  implementation("com.google.firebase:firebase-ai-ondevice:16.0.0-beta01")

  // Required for one-shot operations (to use `ListenableFuture` from Guava Android)
  implementation("com.google.guava:guava:31.0.1-android")

  // Required for streaming operations (to use `Publisher` from Reactive Streams)
  implementation("org.reactivestreams:reactive-streams:1.0.4")
}

ขั้นตอนที่ 3: ตรวจสอบว่าโมเดลในอุปกรณ์พร้อมใช้งานหรือไม่

ใช้ FirebaseAIOnDevice เพื่อตรวจสอบว่าโมเดลในอุปกรณ์พร้อมใช้งานหรือไม่ และดาวน์โหลดโมเดลหากยังไม่พร้อมใช้งาน

เมื่อดาวน์โหลดแล้ว AICore จะอัปเดตโมเดลให้โดยอัตโนมัติ ดูรายละเอียดเพิ่มเติมเกี่ยวกับ AICore และการจัดการการดาวน์โหลดโมเดลในอุปกรณ์ได้ใน หมายเหตุหลังตัวอย่างโค้ด

Kotlin

val status = FirebaseAIOnDevice.checkStatus()
when (status) {
  OnDeviceModelStatus.UNAVAILABLE -> {
    Log.w(TAG, "On-device model is unavailable")
  }

  OnDeviceModelStatus.DOWNLOADABLE -> {
    FirebaseAIOnDevice.download().collect { status ->
      when (status) {
        is DownloadStatus.DownloadStarted ->
          Log.w(TAG, "Starting download - ${status.bytesToDownload}")

        is DownloadStatus.DownloadInProgress ->
          Log.w(TAG, "Download in progress ${status.totalBytesDownloaded} bytes downloaded")

        is DownloadStatus.DownloadCompleted ->
          Log.w(TAG, "On-device model download complete")

        is DownloadStatus.DownloadFailed ->
          Log.e(TAG, "Download failed ${status}")
      }
    }
  }
  OnDeviceModelStatus.DOWNLOADING -> {
    Log.w(TAG, "On-device model is being downloaded")
  }

  OnDeviceModelStatus.AVAILABLE -> {
    Log.w(TAG, "On-device model is available")
  }
}

Java

Checking for and downloading the model is not yet available for Java.

However, all other APIs and interactions in this guide are available for Java.

ข้อควรทราบเกี่ยวกับการดาวน์โหลดโมเดลในอุปกรณ์มีดังนี้

  • เวลาที่ใช้ในการดาวน์โหลดโมเดลในอุปกรณ์ขึ้นอยู่กับหลายปัจจัย รวมถึงเครือข่ายของคุณ

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

  • หากโมเดลในอุปกรณ์ไม่พร้อมใช้งานเมื่อมีการส่งคำขออนุมานในอุปกรณ์ SDK จะไม่ทริกเกอร์การดาวน์โหลดโมเดลในอุปกรณ์โดยอัตโนมัติ SDK จะกลับไปใช้โมเดลที่โฮสต์ในระบบคลาวด์หรือ ส่งข้อยกเว้น (ดูรายละเอียดเกี่ยวกับลักษณะการทำงานของ โหมดการอนุมาน)

  • AICore (บริการระบบ Android) จะจัดการให้คุณว่าดาวน์โหลดโมเดลและเวอร์ชันใด ไว้แล้ว รวมถึงดูแลให้โมเดลเป็นเวอร์ชันล่าสุดอยู่เสมอ ฯลฯ โปรดทราบว่าอุปกรณ์จะดาวน์โหลดโมเดลได้เพียงโมเดลเดียว ดังนั้นหากแอปอื่นในอุปกรณ์เคยดาวน์โหลดโมเดลในอุปกรณ์สำเร็จแล้ว การตรวจสอบนี้จะแสดงว่าโมเดลพร้อมใช้งาน

การเพิ่มประสิทธิภาพเวลาในการตอบสนอง

หากต้องการเพิ่มประสิทธิภาพสำหรับการเรียกใช้การอนุมานครั้งแรก คุณสามารถให้แอปเรียกใช้ warmup() ได้ ซึ่งจะโหลดโมเดลในอุปกรณ์ลงในหน่วยความจำและเริ่มต้นคอมโพเนนต์รันไทม์

ขั้นตอนที่ 4: เริ่มต้นบริการและสร้างอินสแตนซ์โมเดล

คลิกผู้ให้บริการ Gemini API เพื่อดูเนื้อหาและรหัสเฉพาะของผู้ให้บริการ ในหน้านี้

ตั้งค่าสิ่งต่อไปนี้ก่อนส่งคำขอพรอมต์ไปยังโมเดล

  1. เริ่มต้นบริการสำหรับผู้ให้บริการ API ที่คุณเลือก

  2. สร้างอินสแตนซ์ GenerativeModel และตั้งค่า mode เป็นค่าใดค่าหนึ่งต่อไปนี้ คำอธิบายที่นี่เป็นเพียงภาพรวม แต่คุณสามารถดูรายละเอียดเกี่ยวกับลักษณะการทำงานของโหมดเหล่านี้ได้ในตั้งค่าโหมดการอนุมาน

    • PREFER_ON_DEVICE: พยายามใช้โมเดลในอุปกรณ์ หากไม่ได้ ให้ใช้โมเดลที่โฮสต์ในระบบคลาวด์แทน

    • ONLY_ON_DEVICE: พยายามใช้โมเดลในอุปกรณ์ มิฉะนั้น throw an exception

    • PREFER_IN_CLOUD: พยายามใช้โมเดลที่โฮสต์บนระบบคลาวด์ หรือกลับไปใช้โมเดลในอุปกรณ์

    • ONLY_IN_CLOUD: พยายามใช้โมเดลที่โฮสต์บนระบบคลาวด์ มิฉะนั้น throw an exception

Kotlin

// Using this SDK to access on-device inference is an Experimental release and requires opt-in
@OptIn(PublicPreviewAPI::class)

// ...

// Initialize the Gemini Developer API backend service
// Create a GenerativeModel instance with a model that supports your use case
// Set the inference mode (like PREFER_ON_DEVICE to use the on-device model if available)
val model = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "MODEL_NAME",
        onDeviceConfig = OnDeviceConfig(mode = InferenceMode.PREFER_ON_DEVICE)
    )

Java

// Initialize the Gemini Developer API backend service
// Create a GenerativeModel instance with a model that supports your use case
// Set the inference mode (like PREFER_ON_DEVICE to use the on-device model if available)
GenerativeModel ai = FirebaseAI.getInstance(GenerativeBackend.googleAI())
    .generativeModel(
        "MODEL_NAME",
        new OnDeviceConfig(InferenceMode.PREFER_ON_DEVICE)
    );

// Use the GenerativeModelFutures Java compatibility layer which offers
// support for ListenableFuture and Publisher APIs
GenerativeModelFutures model = GenerativeModelFutures.from(ai);

ขั้นตอนที่ 5: ส่งคำขอพรอมต์ไปยังโมเดล

ส่วนนี้จะแสดงวิธีส่งอินพุตประเภทต่างๆ เพื่อสร้างเอาต์พุตประเภทต่างๆ ซึ่งรวมถึง

สร้างข้อความจากอินพุตที่เป็นข้อความเท่านั้น

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

คุณใช้ generateContent() เพื่อสร้างข้อความจากพรอมต์ที่มีข้อความได้โดยทำดังนี้

Kotlin

// Imports + initialization of Gemini API backend service + creation of model instance

// Provide a prompt that contains text
val prompt = "Write a story about a magic backpack."

// To generate text output, call generateContent with the text input
val response = model.generateContent(prompt)
print(response.text)

Java

// Imports + initialization of Gemini API backend service + creation of model instance

// Provide a prompt that contains text
Content prompt = new Content.Builder()
    .addText("Write a story about a magic backpack.")
    .build();

// To generate text output, call generateContent with the text input
ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        String resultText = result.getText();
        System.out.println(resultText);
    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
    }
}, executor);

โปรดทราบว่า Firebase AI Logic ยังรองรับการสตรีมคำตอบที่เป็นข้อความโดยใช้ generateContentStream (แทน generateContent) ด้วย

สร้างข้อความจากอินพุตข้อความและรูปภาพ (หลายรูปแบบ)

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

คุณสามารถใช้ generateContent() เพื่อสร้างข้อความจากพรอมต์ที่มีข้อความและไฟล์รูปภาพสูงสุด1 ไฟล์ (บิตแมปเท่านั้น) โดยระบุ mimeType ของไฟล์อินพุตแต่ละไฟล์และตัวไฟล์เอง

Kotlin

// Imports + initialization of Gemini API backend service + creation of model instance

// Loads an image from the app/res/drawable/ directory
val bitmap: Bitmap = BitmapFactory.decodeResource(resources, R.drawable.sparky)

// Provide a prompt that includes the image specified above and text
val prompt = content {
  image(bitmap)
  text("What developer tool is this mascot from?")
}

// To generate text output, call generateContent with the prompt
val response = model.generateContent(prompt)
print(response.text)

Java

// Imports + initialization of Gemini API backend service + creation of model instance

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sparky);

// Provide a prompt that includes the image specified above and text
Content content = new Content.Builder()
        .addImage(bitmap)
        .addText("What developer tool is this mascot from?")
        .build();

// To generate text output, call generateContent with the prompt
ListenableFuture<GenerateContentResponse> response = model.generateContent(content);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        String resultText = result.getText();
        System.out.println(resultText);
    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
    }
}, executor);

โปรดทราบว่า Firebase AI Logic ยังรองรับการสตรีมคำตอบที่เป็นข้อความโดยใช้ generateContentStream (แทน generateContent) ด้วย

คุณทำอะไรได้อีกบ้าง

คุณสามารถใช้ตัวเลือกการกำหนดค่าและความสามารถเพิ่มเติมต่างๆ สำหรับ ประสบการณ์แบบไฮบริดได้ดังนี้

ฟีเจอร์ที่ยังไม่พร้อมใช้งานสำหรับการอนุมานในอุปกรณ์

เนื่องจากเป็นรุ่นทดลอง ความสามารถบางอย่างของโมเดลระบบคลาวด์จึงยังไม่พร้อมใช้งานสำหรับการอนุมานในอุปกรณ์

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

  • การสร้างเอาต์พุตที่มีโครงสร้าง (เช่น JSON หรือ Enum)

  • การสร้างข้อความจากประเภทอินพุตไฟล์รูปภาพที่ไม่ใช่บิตแมป (รูปภาพที่โหลดลงในหน่วยความจำ)

  • การสร้างข้อความจากไฟล์รูปภาพมากกว่า 1 ไฟล์

  • การสร้างข้อความจากอินพุตเสียง วิดีโอ และเอกสาร (เช่น PDF)

  • การสร้างรูปภาพโดยใช้โมเดล Gemini หรือ Imagen

  • การระบุไฟล์โดยใช้ URL ในคำขอแบบมัลติโมดัล คุณต้องระบุไฟล์เป็น ข้อมูลแบบอินไลน์ให้กับโมเดลในอุปกรณ์

  • การส่งคำขอที่มีโทเค็นเกิน 4,000 รายการ (หรือประมาณ 3,000 คำภาษาอังกฤษ)

  • แชทแบบหลายรอบ

  • การให้เครื่องมือแก่โมเดลเพื่อช่วยสร้างคำตอบ (เช่น การเรียกใช้ฟังก์ชัน การเรียกใช้โค้ด บริบท URL และการอ้างอิงจาก Google Search)

การตรวจสอบ AI ในคอนโซล Firebase จะไม่แสดงข้อมูลใดๆ สำหรับ การอนุมานในอุปกรณ์ (รวมถึงบันทึกในอุปกรณ์) อย่างไรก็ตาม คุณสามารถตรวจสอบการอนุมานที่ใช้โมเดลที่โฮสต์ในระบบคลาวด์ได้เช่นเดียวกับการอนุมานอื่นๆ ผ่าน Firebase AI Logic

ข้อจำกัดเพิ่มเติม

นอกจากที่กล่าวมาข้างต้นแล้ว การอนุมานในอุปกรณ์ยังมีข้อจำกัดต่อไปนี้ (ดูข้อมูลเพิ่มเติมได้ในเอกสารประกอบของ ML Kit)

  • ผู้ใช้ปลายทางของแอปต้องใช้อุปกรณ์ที่รองรับ สำหรับการอนุมานในอุปกรณ์

  • แอปจะเรียกใช้การอนุมานในอุปกรณ์ได้เมื่อทำงานอยู่เบื้องหน้าเท่านั้น

  • เฉพาะภาษาอังกฤษและภาษาเกาหลีเท่านั้นที่ได้รับการตรวจสอบแล้วว่าใช้ได้กับการอนุมานในอุปกรณ์

  • ขีดจำกัดโทเค็นสูงสุดสำหรับคำขอการอนุมานบนอุปกรณ์ทั้งหมดคือ 4,000 โทเค็น หากคำขออาจเกินขีดจำกัดนี้ ให้ตรวจสอบว่าได้ กำหนดค่าโหมดการอนุมานที่ใช้โมเดลที่โฮสต์ในระบบคลาวด์ได้

  • เราขอแนะนำให้หลีกเลี่ยงกรณีการใช้งานการอนุมานในอุปกรณ์ที่ต้องมีเอาต์พุตยาว (มากกว่า 256 โทเค็น)

  • AICore (บริการของระบบ Android ที่จัดการโมเดลในอุปกรณ์) จะบังคับใช้ โควต้าการอนุมานต่อแอป การส่งคำขอ API มากเกินไปในระยะเวลาอันสั้น จะส่งผลให้ได้รับคำตอบ ErrorCode.BUSY หากคุณได้รับข้อผิดพลาดนี้ ให้ลองใช้ Exponential Backoff เพื่อส่งคำขออีกครั้ง นอกจากนี้ ระบบยังอาจแสดงข้อผิดพลาด ErrorCode.PER_APP_BATTERY_USE_QUOTA_EXCEEDED หากแอป ใช้โควต้าแบบระยะยาวเกิน (เช่น โควต้าต่อวัน)


แสดงความคิดเห็น เกี่ยวกับประสบการณ์การใช้งาน Firebase AI Logic