Chào mừng bạn quay lại với loạt bài đăng trên blog "Tạo ứng dụng Android thông minh", trong đó chúng tôi sẽ lấy một ứng dụng Android cơ bản và biến đổi ứng dụng đó thành một trải nghiệm được cá nhân hoá, thông minh và dựa trên tác nhân. Trong bài đăng trước, chúng tôi đã giới thiệu Jetpacker, ứng dụng minh họa mà chúng tôi sẽ sử dụng trong suốt loạt bài này.
Trong bài đăng này trên blog, chúng tôi sẽ chia sẻ cách bạn có thể sử dụng Gemini Nano thông qua Prompt API của Bộ công cụ học máy để tạo các tính năng thông minh trên thiết bị.
Xây dựng các tính năng thông minh trên thiết bị là khả năng xử lý câu lệnh và dữ liệu ngay trên thiết bị mà không cần gửi dữ liệu đến máy chủ. Điều này mang lại một số lợi ích:
- Dữ liệu người dùng có thể được xử lý trên thiết bị, giúp bảo vệ quyền riêng tư của người dùng
- Chức năng của mô hình này đáng tin cậy ngay cả khi kết nối Internet không ổn định hoặc không có kết nối Internet
- Không mất thêm chi phí suy luận trên đám mây, vì mọi thứ đều chạy trên phần cứng của người dùng
Nhờ những lợi ích của việc xử lý trên thiết bị, chúng tôi đã xác định được 3 tính năng cần thêm vào Jetpacker để cải thiện trải nghiệm người dùng: tóm tắt hành trình chuyến đi, quản lý chi phí và ghi lại ghi chú bằng giọng nói.
Tóm tắt văn bản ngắn chất lượng cao theo yêu cầu
Màn hình hành trình cung cấp cho người dùng thông tin tổng quan nhanh về tất cả hoạt động của một chuyến đi cụ thể. Vì màn hình này chứa nhiều thông tin, nên bạn có thể nhanh chóng cảm thấy choáng ngợp. Để giúp người dùng chuẩn bị mà không cảm thấy quá tải, chúng ta có thể thêm phần "Chuẩn bị sẵn sàng cho chuyến đi" ở trên cùng.
Bằng cách nhập hành trình chuyến đi và yêu cầu một LLM tóm tắt hành trình đó, chúng ta có thể tạo một bản tóm tắt nhanh về chuyến đi cùng với các mẹo đóng gói và cụm từ hữu ích tại địa phương. Đây là một trường hợp sử dụng tuyệt vời cho mô hình trên thiết bị vì một số lý do:
- Hiệu suất và chất lượng: Cả văn bản đầu vào và đầu ra đều tương đối ngắn. Nhờ đó, chúng ta có thể kỳ vọng hiệu suất và chất lượng của một giải pháp trên thiết bị sẽ tương đương với các mô hình đám mây mạnh mẽ hơn.
- Khả năng mở rộng: Việc chuyển suy luận trên thiết bị cho phép chúng tôi mở rộng quy mô tính năng này từ một số ít người dùng lên đến hàng triệu người dùng mà không phải lo lắng về việc quản lý chi phí suy luận trên đám mây ngày càng tăng.
- Độ trễ thấp và độ tin cậy: Suy luận trên thiết bị đảm bảo độ trễ thấp, mang lại trải nghiệm đáng tin cậy ngay cả khi người dùng không kết nối mạng.
Để tạo ứng dụng trên thiết bị, chúng tôi sử dụng Gemini Nano, mô hình hiệu quả nhất của Google được tối ưu hoá cho thiết bị di động. Gemini Nano được ra mắt lần đầu tiên cách đây vài năm và hiện đang chạy trên hơn 140 triệu thiết bị. Phiên bản mới nhất của mô hình, Gemini Nano 4, được xây dựng dựa trên nền tảng kiến trúc của mô hình Gemma 4 mới phát hành gần đây và được tối ưu hóa hơn nữa để đạt hiệu quả pin và hiệu suất tối đa.
Bằng cách sử dụng Prompt API của Bộ công cụ học máy, chúng ta có thể tận dụng các chức năng mới của mô hình Gemini Nano 4 để tạo mẫu cho các tính năng trên thiết bị. Chúng ta sẽ tạo một câu lệnh bao gồm hành trình của một chuyến đi và yêu cầu mô hình tạo bản tóm tắt cùng với mọi mẹo chuẩn bị.
Thông thường, bạn cần lặp lại một số lần để tìm được câu lệnh tối ưu và ứng dụng AICore là lựa chọn hoàn hảo cho bước này trong quy trình. Sau khi chọn sử dụng lựa chọn bản dùng thử cho nhà phát triển AICore, chúng ta có thể tải các mô hình dùng thử xuống (chẳng hạn như Gemini Nano 4) để kiểm thử câu lệnh và xem đầu ra dự kiến của mô hình. Sau một vài lần điều chỉnh câu lệnh, chúng tôi đã có thể cải thiện tốc độ phản hồi từ 13 giây xuống dưới 2 giây! Hãy xem phương thức triển khai mã cuối cùng và lời nhắc tại đây.
[ASSET HERE - FILE TOO LARGE ATM]
Xử lý cục bộ đối với dữ liệu nhạy cảm do người dùng nhập
Tiếp theo, để giúp người dùng tận hưởng chuyến đi trọn vẹn hơn, chúng tôi sẽ tạo một trình quản lý chi phí đơn giản giúp loại bỏ công việc thủ công là sắp xếp biên nhận và tính toán ngân sách.
Vì biên nhận có thể chứa thông tin nhạy cảm như số thẻ tín dụng và địa chỉ, nên đây là một trường hợp sử dụng tuyệt vời khác cho giải pháp trên thiết bị. Với tính năng trên thiết bị, người dùng có thể yên tâm rằng thông tin riêng tư sẽ được xử lý cục bộ trên thiết bị mà không có bất kỳ dữ liệu nào của họ được gửi lên đám mây.
Ngoài ra, Gemini Nano 4 còn cải thiện khả năng của mô hình cho tính năng đa phương thức, đặc biệt là đối với các tác vụ hiểu hình ảnh như OCR và trích xuất dữ liệu trực quan, nhờ đó, đây là một giải pháp tuyệt vời cho các tác vụ như trích xuất thông tin từ biên nhận.
Đối với trường hợp sử dụng này, câu lệnh sẽ phân tích hình ảnh biên nhận và xuất thông tin như: tiêu đề được tạo, số tiền đã chi tiêu và danh mục chi phí. Để đảm bảo mô hình xuất thông tin ở định dạng ưu tiên, chúng ta có thể sử dụng Structured Output API của ML Kit để xuất liền mạch một đối tượng dữ liệu Kotlin mà chúng ta xác định.
// implementation("com.google.mlkit:genai-prompt:1.0.0-beta3")
// ksp("com.google.mlkit:genai-schema-compiler:1.0.0-alpha1")
@Generable("Information extracted from an expense receipt")
data class ParsedReceipt(
@Guide("Generated title for the expense less than 6 words. Based on restaurant or activity name.")
val title: String,
@Guide("Total amount of the expense. Look for values at the bottom and words like total or balance due.")
val amount: Double,
@Guide("Type of expense", enumValues = ["travel", "food", "shopping", "entertainment", "other"])
val category: String,
)
val prompt = "Determine if the image is a receipt or expense.
If it is NOT a receipt or expense, output the text 'NOT_A_RECEIPT'.
Otherwise, parse the receipt information."
val request = generateContentRequest(ImagePart(bitmap), TextPart(prompt)) {}
val requestWithStructuredOutput = generateTypedContentRequest(request, ParsedReceipt::class)
// Define the configuration for Gemini Nano 4 E4B preview model
// When selecting models, you can specify which performance charactertists are most important
// for your use case. Use ModelPreference.FULL when you want to prioritize reasoning power over speed.
// Use ModelPreference.FAST when complex logic is not required and latency is a priority.
val previewFullConfig = generationConfig {
modelConfig = modelConfig {
releaseStage = ModelReleaseStage.PREVIEW
preference = ModelPreference.FULL
}
}
val geminiNano4BPreviewModel = Generation.getClient(previewFullConfig)
val response = geminiNano4BPreviewModel.generateContent(requestWithStructuredOutput)
val parsedReceipt: ParsedReceipt? = response.candidates.firstOrNull()?.responseThông tin đầu vào đa phương thức
Cuối cùng, để giúp người dùng ghi lại bản ghi nhớ bằng âm thanh trong chuyến đi, hãy tạo một tính năng ghi chú bằng giọng nói hoàn toàn trên thiết bị. Bằng cách sử dụng API Nhận dạng lời nói của Bộ công cụ máy học, chúng tôi sẽ cho phép người dùng ghi lại các ghi chú thoại ngắn được tự động chép lời thành văn bản. Với văn bản được chép lời, chúng tôi sẽ sử dụng Prompt API của ML Kit để xác định hoạt động nào trong chuyến đi được liên kết với ghi chú bằng giọng nói đã ghi âm, giúp người dùng dễ dàng tóm tắt chuyến đi khi họ di chuyển qua hành trình của chuyến đi.
API Nhận dạng lời nói dựa trên AI tạo sinh của Bộ công cụ học máy cho phép bạn chép lời nội dung âm thanh thành văn bản hoàn toàn trên thiết bị bằng hai chế độ riêng biệt. Chế độ cơ bản sử dụng mô hình nhận dạng lời nói truyền thống trên thiết bị và có trên hầu hết các thiết bị Android có cấp độ API 31 trở lên. Chế độ nâng cao sử dụng Gemini Nano để hỗ trợ nhiều ngôn ngữ hơn và có chất lượng tốt hơn. Chế độ này hiện được hỗ trợ trên các thiết bị Pixel 10.
Đối với tính năng của mình, chúng tôi kết hợp Speech Recognition API với ML Kit GenAI Prompt API:
// implementation("com.google.mlkit:genai-prompt:1.0.0-beta3")
// implementation("com.google.mlkit:genai-speech-recognition:1.0.0-alpha1")
val tripEvents = ...
// Set up speech recognition
val speechRecognizerOptions =
speechRecognizerOptions {
locale = Locale.US
preferredMode = SpeechRecognizerOptions.Mode.MODE_ADVANCED
}
val speechRecognizer: SpeechRecognizer = SpeechRecognition.getClient(speechRecognizerOptions)
suspend fun transcribeVoiceNote(recognizer: SpeechRecognizer) {
// Display partial text as the user is recording audio
var partialTextResponse = ""
// Display the full text once user is finished recording audio
var transcription = ""
val request: SpeechRecognizerRequest
= speechRecognizerRequest { audioSource = AudioSource.fromMic() }
recognizer.startRecognition(request).collect { response ->
when (response) {
is SpeechRecognizerResponse.PartialTextResponse -> {
partialTextResponse = response.text
}
is SpeechRecognizerResponse.FinalTextResponse -> {
transcription = response.text
processAndCategorizeVoiceNote(transcription, tripEvents)
}
}
}
}
fun processAndCategorizeVoiceNote(transcribedVoiceNote: String, events: List<Event>) {
val prompt = "Given the voice note $transcribedVoiceNote
and the following events for this trip: $events, rewrite this transcription
to remove filler words. Then, identify which events from the
list this rewritten transcription matches to."
// Utilize ML Kit's Prompt API to process voice note and tag it with the relevant trip activities
Generation.getClient().generateContent(prompt)
}Kết luận
Bằng cách sử dụng các API GenAI của ML Kit, chúng tôi có thể tận dụng Gemini Nano để phát triển các tính năng thông minh hoàn toàn trên thiết bị cho ứng dụng JetPacker và mang đến trải nghiệm người dùng được cải thiện mà không tốn thêm chi phí trên đám mây.
Hãy xem toàn bộ mã nguồn của Jetpacker trên GitHub và xem video Tạo ứng dụng Android thông minh bằng AI của Google để tìm hiểu thêm về cách tích hợp các tính năng thông minh trực tiếp vào ứng dụng của bạn bằng cách sử dụng các mô hình trên thiết bị, tính năng suy luận dựa trên đám mây và các khung tác nhân mới nhất.
Tìm hiểu thêm
Hãy xem các phần khác trong loạt bài đăng này trên blog:
Phần 1: Giới thiệu về ứng dụng và thông tin tổng quan.
Phần 2 (bài đăng này!): Trí thông minh trên thiết bị. Tìm hiểu sâu về các API GenAI của Bộ công cụ học máy và Gemini Nano để xây dựng các tính năng ưu tiên quyền riêng tư như tóm tắt hành trình, phân tích biên nhận và xử lý âm thanh cục bộ.
Phần 3: Lý luận kết hợp và lý luận trên đám mây. Khám phá cách sử dụng Firebase AI Logic để neo bám câu trả lời của LLM vào dữ liệu thực tế như Google Maps và bối cảnh trên web.
Phần 4: Tích hợp hệ thống. Tích hợp với hệ thống thông minh Android bằng AppFunctions.
Phần 5 (sắp ra mắt): Quy trình công việc dựa trên tác nhân trong ứng dụng. Mở rộng ứng dụng bằng một trợ lý đặt phòng toàn diện dựa trên A2UI và ADK.
Bạn muốn tìm hiểu thêm về hoạt động phát triển trên Android? Theo dõi Android Developers trên YouTube hoặc LinkedIn!
Tất cả đoạn mã trong bài đăng này trên blog đều tuân theo thông báo bản quyền sau đây:
Copyright 2026 Google LLC. SPDX-License-Identifier: Apache-2.0
-
Hướng dẫnChào mừng bạn quay lại loạt bài đăng trên blog "Tạo ứng dụng Android thông minh", nơi chúng ta sẽ lấy một ứng dụng Android cơ bản và biến đổi ứng dụng đó thành một trải nghiệm được cá nhân hoá, thông minh và có tác nhân.
Thomas Ezan, Jolanda Verhoef, Caren Chang • 8 phút đọc -
Hướng dẫnJetpacker là một ứng dụng trình diễn kỹ thuật do nhóm của chúng tôi xây dựng từ đầu cho Google I/O năm nay (được xây dựng bằng Antigravity). Về cơ bản, Jetpacker giúp người dùng lên kế hoạch, khám phá và tận hưởng chuyến phiêu lưu lớn tiếp theo.
Jolanda Verhoef • 4 phút đọc -
Hướng dẫnChào mừng bạn quay lại loạt bài đăng trên blog "Tạo ứng dụng Android thông minh", nơi chúng ta sẽ lấy một ứng dụng Android cơ bản và biến đổi ứng dụng đó thành một trải nghiệm được cá nhân hoá, thông minh và có tác nhân. Trong bài đăng trước, chúng ta đã tìm hiểu cách tận dụng Firebase AI Logic để tạo các tính năng AI kết hợp và được lưu trữ trên đám mây.
Ben Weiss • 6 phút đọc
Nhận thông tin chi tiết mới nhất về hoạt động phát triển trên Android trong hộp thư đến của bạn mỗi tuần.