วิธีการ

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

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

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

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

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

บางครั้ง Use Case อาจต้องใช้โมเดล 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 Search แบบเรียลไทม์เพื่อดูรายละเอียดล่าสุด
  • การอ้างอิงจาก 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"
    )

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

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 ของ ML Kit และ Gemini Nano เพื่อสร้างฟีเจอร์ที่คำนึงถึงความเป็นส่วนตัวเป็นอันดับแรก เช่น การสรุปแผนการเดินทาง การแยกวิเคราะห์ใบเสร็จ และการประมวลผลเสียงในเครื่อง
ตอนที่ 3 (โพสต์นี้): การให้เหตุผลแบบไฮบริดและแบบคลาวด์ ดูวิธีใช้ Firebase AI Logic เพื่อเชื่อมต่อแหล่งข้อมูลคำตอบของ LLM จากข้อมูลในโลกแห่งความเป็นจริง เช่น Google Maps และบริบทของเว็บ
ตอนที่ 4: การผสานรวมระบบ การผสานรวมกับระบบอัจฉริยะของ Android โดยใช้ AppFunctions 
ส่วนที่ 5 (เร็วๆ นี้): เวิร์กโฟลว์ของ Agent ในแอป ขยายแอปด้วยผู้ช่วยการจองแบบครบวงจรที่ขับเคลื่อนโดย A2UI และ ADK

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

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

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