วิธีการ

สร้างแอป Android อัจฉริยะ: การอนุมานในระบบคลาวด์และแบบไฮบริด

ใช้เวลาอ่าน 8 นาที
ผู้เขียน 3 คน
Thomas Ezan, Jolanda Verhoef, Caren Chang

ยินดีต้อนรับกลับสู่ซีรีส์บล็อกโพสต์ "สร้างแอป Android อัจฉริยะ" ซึ่งเราจะนำแอป Android พื้นฐานมาเปลี่ยนให้เป็นประสบการณ์การใช้งานที่ปรับเปลี่ยนตามโปรไฟล์ของผู้ใช้ อัจฉริยะ และทำงานด้วยตัวเองได้ ในโพสต์ก่อนหน้านี้ เราได้พูดถึงวิธีสร้างฟีเจอร์อัจฉริยะในอุปกรณ์โดยใช้ Gemini Nano ผ่าน Prompt API ของ ML Kit

ในโพสต์นี้ เราจะมาดูวิธีใช้ประโยชน์จาก Firebase AI Logic เพื่อสร้างฟีเจอร์ AI ที่โฮสต์ในระบบคลาวด์และแบบไฮบริด

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

บางครั้งกรณีการใช้งานก็ต้องใช้โมเดล AI ที่มีความรู้เกี่ยวกับโลกมากขึ้น มีหน้าต่างบริบทที่ใหญ่ขึ้นมาก หรือมีความสามารถในการจัดการคำค้นหาที่ซับซ้อน ในสถานการณ์ดังกล่าว เราสามารถใช้ประโยชน์จากโมเดลในระบบคลาวด์ได้

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

features.png
ฟีเจอร์ในระบบคลาวด์และแบบไฮบริดใน Jetpacker: ผู้ช่วยพิพิธภัณฑ์ที่มีการอิงตามเว็บ การร่างรีวิวร้านอาหารแบบไฮบริด และแชทสนับสนุนที่มีการแปลแบบเรียลไทม์ที่กำหนดเส้นทางเอง

มาดูวิธีที่เราใช้ฟีเจอร์ 3 อย่างในระบบคลาวด์และแบบไฮบริดใน Jetpacker กัน

  • ผู้ช่วยพิพิธภัณฑ์ที่มีการอิงตามเว็บ
  • การร่างรีวิวร้านอาหารแบบไฮบริด
  • แชทสนับสนุนโรงแรมที่มีการแปลแบบเรียลไทม์ที่กำหนดเส้นทางเอง

ใช้การอิงตาม LLM เพื่อรับข้อมูลล่าสุด แชทบ็อตผู้ช่วยพิพิธภัณฑ์ที่มีการอิงตาม LLM

ผู้ช่วยพิพิธภัณฑ์ เป็นแชทบ็อตแบบอินเทอร์แอกทีฟที่ออกแบบมาเพื่อช่วยผู้ใช้วางแผนการมาเยี่ยมชมพิพิธภัณฑ์ โดยจะให้รายละเอียดล่าสุดแก่ผู้เข้าชมเกี่ยวกับนิทรรศการที่เฉพาะเจาะจง เวลาทำการปัจจุบัน ราคาตั๋ว และอื่นๆ

museum_assistant_upscaled.png
ผู้ช่วยพิพิธภัณฑ์เป็นแชทบ็อตที่ตอบคำถาม เช่น "ฉันจะรับส่วนลดตั๋วเข้าชมพิพิธภัณฑ์ลูฟวร์ได้อย่างไร"

เมื่อสร้างฟีเจอร์ AI ความท้าทายที่พบบ่อยคือการทำให้โมเดลตอบคำถามด้วยข้อมูลที่สดใหม่ แม่นยำ และเฉพาะเจาะจงเกี่ยวกับโลกแห่งความเป็นจริง แม้ว่าโมเดลในระบบคลาวด์จะมีความรู้เกี่ยวกับโลกมากมาย แต่ก็อาจไม่ทราบเกี่ยวกับนิทรรศการตามฤดูกาลหรือเวลาทำการของวันนี้

grounding.png
เราเพิ่มข้อมูลการอิงตามลงในหน้าต่างบริบทเพื่อให้โมเดลตอบคำถามได้อย่างถูกต้องและแม่นยำ

เราสามารถใช้เทคนิคการอิงตามเพื่อเพิ่มบริบทพิเศษลงในหน้าต่างบริบทของโมเดลเพื่อลดช่องว่างนี้ Firebase AI Logic SDK รองรับการอิงตาม 3 ประเภท ได้แก่

  • การอิงตาม URL: การอิงตามคำตอบโดยใช้เนื้อหาจากหน้าเว็บที่เฉพาะเจาะจง (เช่น ราค่าตั๋วปัจจุบันหรือกฎของพิพิธภัณฑ์)
  • การอิงตาม Google Search: การอนุญาตให้โมเดลค้นหาดัชนีการค้นหาของ Google แบบเรียลไทม์เพื่อดูรายละเอียดล่าสุด
  • การอิงตาม Maps: การใช้ข้อมูลสถานที่ของ Google Maps

ใน Jetpacker เราจะสร้างเครื่องมือที่พร้อมใช้งานแบบไดนามิกตามแฟล็กฟีเจอร์ที่เปิดใช้ และเริ่มต้นโมเดล Generative โดยใช้ Firebase AI SDK ดังนี้

// implementation("com.google.firebase:firebase-ai-logic")

private var toolList = mutableListOf<Tool>()

init {
    if (ENABLE_SEARCH_GROUNDING) {
        toolList.add(Tool.googleSearch())
    }
    if (ENABLE_URL_GROUNDING) {
        toolList.add(Tool.urlContext())
    }
}

private val generativeModel = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "gemini-3-flash",
        systemInstruction = content {
            text("You are a helpful museum assistant answering questions about a museum. Use plain text.")
        },
        tools = toolList
    )

เมื่อผู้ใช้ค้นหาผู้ช่วย หากเปิดใช้การอิงตาม URL เราจะแนบ URL ของแหล่งข้อมูลพิพิธภัณฑ์ที่เฉพาะเจาะจงลงในพรอมต์โดยตรงดังนี้

val groundingText = if (FeatureFlags.ENABLE_URL_GROUNDING) {
    "\n If the following message above is about the rules and terms to visit Le Louvre, " +
    "if needed answer this urls ${urlList.joinToString()}"
} else {
    ""
}

val prompt = "$text $groundingText"

var response = chat.sendMessage(prompt)

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

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

review_upscaled.png
ฟีเจอร์รีวิวร้านอาหารใช้การอนุมานแบบไฮบริดเพื่อร่างรีวิวตามหัวข้อ
// implementation("com.google.firebase:firebase-ai-logic")
// implementation("com.google.firebase:firebase-ai-ondevice:16.0.0-beta03")


// Initialize the model with hybrid routing configuration
val reviewModel = Firebase.ai.generativeModel(
    modelName = "gemini-3.1-flash-lite",
    onDeviceConfig = OnDeviceConfig(
        inferenceMode = InferenceMode.PREFER_ON_DEVICE
    )
)

Hybrid Inference API รองรับโหมดการกำหนดเส้นทางที่แตกต่างกัน 4 โหมด ได้แก่

  • PREFER_ON_DEVICE: ให้ความสำคัญกับการดำเนินการในเครื่องและใช้ระบบคลาวด์เป็นตัวเลือกสำรองหาก Gemini Nano ไม่พร้อมใช้งาน
  • PREFER_IN_CLOUD: ให้ความสำคัญกับการดำเนินการในระบบคลาวด์และใช้การดำเนินการในอุปกรณ์เป็นตัวเลือกสำรองหากอุปกรณ์ออฟไลน์
  • ONLY_ON_DEVICE: จำกัดการดำเนินการไว้ในอุปกรณ์เท่านั้น
  • ONLY_IN_CLOUD: จำกัดการดำเนินการไว้ในระบบคลาวด์เท่านั้น

เมื่อสร้างรีวิวแล้ว เราจะคัดลอกรีวิวไปยังคลิปบอร์ดและใช้ Intent เพื่อเปิด Google Maps ไปยังหน้ารีวิวของร้านอาหารโดยตรง ซึ่งจะมอบประสบการณ์การใช้งานที่ราบรื่นให้แก่ผู้ใช้

private fun copyAndOpenMapsReview(context: Context, reviewText: String, placeId: String) {
    val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
    val clip = ClipData.newPlainText("User Review", reviewText)
    clipboard.setPrimaryClip(clip)

    val uri = Uri.parse("https://search.google.com/local/writereview/mobile?placeid=$placeId")
    val intent = Intent(Intent.ACTION_VIEW, uri).apply {
        setPackage("com.google.android.apps.maps")
    }
    context.startActivity(intent)
}

การกำหนดเส้นทางแบบไฮบริดที่กำหนดเอง: การแปลแชทสนับสนุนโรงแรมด้วยเพอร์โซนาจำลอง

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

private val generativeModel = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        systemInstruction = content {
            text("""
              You are a helpful hotel receptionist at $hotelName only speaking $language. 
              Answer politely in $language. The bar closes at 10pm and breakfast is from 7am to 10am.
              There's someone at the desk 24/7. You can retrieve your luggage from the storage room 
              at the back of the lobby at any time.
              """)
        },
        modelName = "gemini-3-flash-preview"
    )

เนื่องจากคำตอบของพนักงานต้อนรับเป็นภาษาท้องถิ่นของโรงแรม (เช่น ภาษาฝรั่งเศสสำหรับ Hotel Le Meurice ในปารีส) เราจึงต้องแปลข้อความเป็นภาษาที่ผู้ใช้ต้องการ

translation_upscaled.png
ระบบจะแปลข้อความแชทสนับสนุนโรงแรมเป็นภาษาที่ผู้ใช้ต้องการโดยอัตโนมัติ 

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

  • การระบุภาษา: เราสามารถตรวจหาภาษาของข้อความขาเข้าได้โดยใช้ ML Kit Language Identification API ในอุปกรณ์
  • การแปลในอุปกรณ์ (Gemini Nano): Prompt API ของ ML Kit ช่วยให้เราแปลคู่ภาษาทั่วไปในอุปกรณ์ได้โดยตรง ซึ่งช่วยประหยัดแบนด์วิดท์และค่าใช้จ่ายในระบบคลาวด์
  • การแปลในระบบคลาวด์ (Gemini 3 Flash): สำหรับภาษาที่ซับซ้อนมากขึ้น เราจะใช้ Gemini Flash 3 เพื่อให้ได้คำแปลที่มีคุณภาพสูงขึ้น
// implementation("com.google.android.gms:play-services-mlkit-language-id:17.0.0") 

// ML Kit for Language Identification (powered by Google Play Services)
private val languageIdentifier = LanguageIdentification.getClient()

// On-device translator model (prefer Gemini Nano) for translating common language pairs
private val hybridTranslationModel = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "gemini-3-flash",
        onDeviceConfig = OnDeviceConfig(mode = InferenceMode.PREFER_ON_DEVICE)
    )

// Cloud translator model for more complex language pairs
private val cloudTranslationModel = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "gemini-3-flash"
    )

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

fun translateMessage(message: SupportChatMessage) {
    viewModelScope.launch {
        // 1. Detect language using ML Kit Language Identification
        val sourceLang = try {
            Tasks.await(languageIdentifier.identifyLanguage(message.text))
        } catch (e: Exception) {
            "Undefined"
        }

        // 2. Custom routing: we've verified the translation quality for English and Korean with Gemini Nano, and will translate message on-device for those two languages
        val routeToCloud = sourceLang != "en" && sourceLang != "kr"

        val prompt = "Translate the following text to $selectedLanguage. Just return the translated sentence: ${message.text}."

        val (translatedText, routePrefix) = if (routeToCloud) {
            val result = cloudTranslationModel.generateContent(prompt)
            result.text to "[Cloud]"
        } else {
            val result = hybridTranslationModel.generateContent(prompt)
            result.text to "[On-Device]"
        }

        if (translatedText != null) {
            _translations.update { current ->
                current + (message.id to "$routePrefix: $translatedText")
            }
        }
    }
}

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

การรักษาความปลอดภัยของไปป์ไลน์ AI: Firebase App Check

สุดท้าย การใช้ AI ในระบบคลาวด์จะเปิดโอกาสให้มีการละเมิดคีย์ API หรือการเรียกเก็บเงินที่ไม่ได้รับอนุญาต เราจึงผสานรวม Firebase App Check โดยใช้ทั้ง Play Integrity (เวอร์ชันที่ใช้งานจริง) และผู้ให้บริการการแก้ไขข้อบกพร่องในเครื่อง (สำหรับการพัฒนาในเครื่องหรือโปรแกรมจำลอง) เพื่อรักษาความปลอดภัยให้กับการเรียก API

ในไฟล์ JetPackerApplication.kt เราจะติดตั้งผู้ให้บริการการแก้ไขข้อบกพร่องเมื่อเริ่มต้นและทริกเกอร์การตรวจสอบสิทธิ์แบบไม่ระบุตัวตนเพื่อสร้างเซสชันผู้ใช้ที่ปลอดภัย

//  implementation("com.google.firebase:firebase-appcheck-playintegrity") 
//  implementation("com.google.firebase:firebase-appcheck-debug")  
//  implementation("com.google.firebase:firebase-auth") 

override fun onCreate() {
    super.onCreate()
    Firebase.initialize(context = this)
    Firebase.appCheck.installAppCheckProviderFactory(
        DebugAppCheckProviderFactory.getInstance()
    )
    Firebase.auth.signInAnonymously()
}

เมื่อสร้างในเครื่องบนโปรแกรมจำลอง App Check จะพิมพ์ข้อมูลลับของโทเค็นในเครื่องลงใน logcat

Enter this debug secret into the allow list in the Firebase Console: a8c2dd4c-xxxx-xxxx-xxxx-ef6c114ba27e

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

บทสรุป

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

ดูซอร์สโค้ดฉบับเต็มของ Jetpacker ได้ที่ GitHub และสำรวจเอกสารประกอบของ Firebase เพื่อเริ่มต้นใช้งาน:

เอกสารประกอบของ Firebase AI Logic
Firebase Hybrid Inference API

ดูข้อมูลเพิ่มเติม

ดูส่วนอื่นๆ ของซีรีส์บล็อกโพสต์นี้ได้ที่

ส่วนที่ 1: ข้อมูลเบื้องต้นเกี่ยวกับแอปและภาพรวมระดับสูง
ส่วนที่ 2: ระบบอัจฉริยะในอุปกรณ์ เจาะลึก GenAI API และ Gemini Nano ของ ML Kit เพื่อสร้างฟีเจอร์ที่ให้ความสำคัญกับความเป็นส่วนตัวเป็นอันดับแรก เช่น การสรุปแผนการเดินทาง การแยกวิเคราะห์ใบเสร็จ และการประมวลผลเสียงในเครื่อง
ส่วนที่ 3 (โพสต์นี้): การให้เหตุผลแบบไฮบริดและในระบบคลาวด์ สำรวจวิธีใช้ Firebase AI Logic เพื่อให้คำตอบของ LLM อิงตามข้อมูลในโลกแห่งความเป็นจริง เช่น Google Maps และบริบทเว็บ
ส่วนที่ 4: การผสานรวมระบบ การผสานรวมกับระบบอัจฉริยะของ Android โดยใช้ AppFunctions
ส่วนที่ 5 (เร็วๆ นี้): เวิร์กโฟลว์แบบทำงานด้วยตัวเองได้ในแอป ขยายแอปด้วยผู้ช่วยการจองแบบครบวงจรที่ขับเคลื่อนโดย A2UI และ ADK

หากสนใจดูข้อมูลเพิ่มเติมเกี่ยวกับการพัฒนาแอป Android โปรดติดตามนักพัฒนาแอป Android บน YouTube หรือ LinkedIn

ข้อมูลโค้ดทั้งหมดในบล็อกโพสต์นี้เป็นไปตามการแจ้งเตือนลิขสิทธิ์ต่อไปนี้

Copyright 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0
เขียนโดย
อ่านต่อ