Tworzenie inteligentnych aplikacji na Androida: wnioskowanie na urządzeniu
Czas czytania: 6 minut
Witamy z powrotem w serii postów na blogu „Tworzenie inteligentnych aplikacji na Androida”, w której przekształcamy podstawową aplikację na Androida w spersonalizowane, inteligentne i oparte na agentach środowisko. W poprzednim poście przedstawiliśmy Jetpackera, czyli aplikację w wersji demonstracyjnej, której będziemy używać w tej serii.
W tym poście na blogu pokażemy, jak za pomocą interfejsu Prompt API w ML Kit możesz używać Gemini Nano do tworzenia inteligentnych funkcji na urządzeniu.
Tworzenie inteligentnych funkcji na urządzeniu polega na możliwości przetwarzania promptów i danych bezpośrednio na urządzeniu bez przesyłania danych na serwer. Daje to kilka korzyści:
- Dane użytkownika mogą być przetwarzane lokalnie na urządzeniu, co zapewnia ochronę prywatności użytkownika.
- Funkcjonalność modelu jest niezawodna nawet przy niestabilnym połączeniu z internetem lub jego braku.
- Brak dodatkowych kosztów wnioskowania w chmurze, ponieważ wszystko działa na sprzęcie użytkownika.
Mając na uwadze zalety przetwarzania na urządzeniu, zidentyfikowaliśmy 3 funkcje, które warto dodać do Jetpackera, aby zwiększyć wygodę użytkowników: podsumowywanie planów podróży, zarządzanie wydatkami i nagrywanie notatek głosowych.
Wysokiej jakości podsumowywanie krótkich tekstów dostosowane do potrzeb użytkownika
Ekran planu podróży zapewnia użytkownikom szybki przegląd wszystkich aktywności w ramach danej wycieczki. Ten ekran zawiera wiele informacji, więc może szybko przytłoczyć. Aby pomóc użytkownikom w przygotowaniach bez poczucia przytłoczenia, możemy dodać u góry sekcję „Przygotuj się do podróży”.
Wprowadzając plan podróży i prosząc LLM o jego podsumowanie, możemy wygenerować szybkie podsumowanie wycieczki wraz z poradami dotyczącymi pakowania i przydatnymi lokalnymi zwrotami. Model na urządzeniu sprawdza się w tym przypadku z kilku powodów:
- Skuteczność i jakość: zarówno tekst wejściowy, jak i wyjściowy są stosunkowo krótkie. Dzięki temu możemy oczekiwać, że wydajność i jakość rozwiązania na urządzeniu będą porównywalne z wydajnością i jakością bardziej zaawansowanych modeli w chmurze.
- Skalowalność: przeniesienie wnioskowania na urządzenie pozwala nam skalować tę funkcję od kilku użytkowników do milionów bez obaw o rosnące koszty wnioskowania w chmurze.
- Niskie opóźnienia i niezawodność: wnioskowanie na urządzeniu gwarantuje niskie opóźnienia, zapewniając niezawodne działanie nawet wtedy, gdy użytkownicy są offline.
Do tworzenia aplikacji na urządzeniach używamy Gemini Nano, czyli najbardziej wydajnego modelu Google zoptymalizowanego pod kątem urządzeń mobilnych. Gemini Nano został wprowadzony kilka lat temu i jest obecnie używany na ponad 140 milionach urządzeń. Najnowsza wersja modelu, Gemini Nano 4, jest oparta na architekturze niedawno wydanego modelu Gemma 4 i dodatkowo zoptymalizowana pod kątem maksymalnej wydajności baterii i urządzenia.
Korzystając z interfejsu Prompt API ML Kit, możemy wykorzystać nowe możliwości modelu Gemini Nano 4 do prototypowania funkcji działających na urządzeniu. Utworzymy prompta, który będzie zawierać plan podróży, i poprosimy model o wygenerowanie podsumowania wraz z wskazówkami dotyczącymi przygotowań.
Znalezienie optymalnego promptu zwykle wymaga kilku prób, a aplikacja AICore idealnie nadaje się do tego etapu procesu. Po wybraniu opcji wersji przedpremierowej dla programistów w przypadku AICore możemy pobrać modele w wersji przedpremierowej, takie jak Gemini Nano 4, aby testować prompty i sprawdzać oczekiwane wyniki modelu. Po kilku iteracjach prompta udało nam się skrócić czas odpowiedzi z 13 sekund do mniej niż 2 sekund. Tutaj możesz sprawdzić ostateczną implementację kodu i prompt.
[ASSET HERE - FILE TOO LARGE ATM]
Lokalne przetwarzanie poufnych danych wejściowych użytkownika
Następnie, aby jeszcze bardziej ułatwić użytkownikom korzystanie z wyjazdu, stworzymy prosty menedżer wydatków, który pozwoli uniknąć ręcznego sortowania paragonów i obliczania budżetów.
Paragony mogą zawierać informacje poufne, takie jak numer karty kredytowej i adresy, dlatego jest to kolejny świetny przykład zastosowania rozwiązania na urządzeniu. Dzięki przetwarzaniu na urządzeniu użytkownicy mogą mieć pewność, że informacje prywatne będą przetwarzane lokalnie na urządzeniu bez wysyłania danych do chmury.
Dodatkowo model Gemini Nano 4 ma ulepszone funkcje multimodalne, zwłaszcza w przypadku zadań związanych z rozpoznawaniem obrazów, takich jak OCR i wyodrębnianie danych wizualnych, co czyni go doskonałym rozwiązaniem do zadań takich jak wyodrębnianie informacji z rachunków.
W tym przypadku prompt przeanalizuje obraz paragonu i wygeneruje informacje takie jak tytuł, kwota wydatków i kategoria wydatków. Aby mieć pewność, że model zwraca informacje w preferowanym formacie, możemy użyć interfejsu Structured Output API z ML Kit, aby bezproblemowo zwracać zdefiniowany przez nas obiekt danych Kotlin.
// 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()?.responseWielomodalne wprowadzanie danych
Na koniec, aby pomóc użytkownikom nagrywać notatki głosowe podczas podróży, stwórzmy w pełni działającą na urządzeniu funkcję notatek głosowych. Za pomocą interfejsu Speech Recognition API z ML Kit umożliwimy użytkownikom nagrywanie krótkich notatek głosowych, które będą automatycznie transkrybowane na tekst. Na podstawie transkrypcji tekstu użyjemy interfejsu Prompt API z ML Kit, aby określić, która aktywność podczas podróży jest powiązana z nagraną notatką głosową. Dzięki temu użytkownicy będą mogli łatwo podsumować swoją podróż podczas przeglądania jej planu.
Interfejs ML Kit GenAI Speech Recognition API umożliwia transkrypcję treści audio na tekst w całości na urządzeniu w 2 różnych trybach. Tryb podstawowy korzysta z tradycyjnego modelu rozpoznawania mowy na urządzeniu i jest dostępny na większości urządzeń z Androidem z interfejsem API na poziomie 31 lub wyższym. Tryb zaawansowany korzysta z Gemini Nano, aby zapewnić szerszy zakres języków i lepszą jakość. Jest obecnie obsługiwany na urządzeniach Pixel 10.
W naszej funkcji łączymy interfejs Speech Recognition API z interfejsem 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)
}Podsumowanie
Korzystając z interfejsów GenAI API w ML Kit, mogliśmy wykorzystać Gemini Nano do opracowania w pełni działających na urządzeniu inteligentnych funkcji aplikacji JetPacker i zapewnić lepsze wrażenia użytkownikom bez ponoszenia dodatkowych kosztów związanych z chmurą.
Pełny kod źródłowy Jetpackera znajdziesz na GitHubie. Obejrzyj też film Tworzenie inteligentnych aplikacji na Androida z wykorzystaniem AI od Google, aby dowiedzieć się więcej o integrowaniu inteligentnych funkcji bezpośrednio w aplikacji za pomocą modeli na urządzeniu, rozumowania opartego na chmurze i najnowszych platform agentowych.
Więcej informacji
Zapoznaj się z pozostałymi częściami tej serii postów na blogu:
Część 1. Wprowadzenie do aplikacji i ogólne informacje.
Część 2 (ten post): Inteligentne technologie na urządzeniu. Poznaj szczegółowo interfejsy API generatywnej AI w ML Kit i Gemini Nano, aby tworzyć funkcje skoncentrowane na ochronie prywatności, takie jak podsumowywanie planów podróży, analizowanie paragonów i lokalne przetwarzanie dźwięku.
Część 3. Uzasadnianie w środowiskach hybrydowych i chmurowych. Dowiedz się, jak używać Firebase AI Logic do groundingu odpowiedzi LLM z użyciem danych z rzeczywistego świata, takich jak Mapy Google i kontekst internetowy.
Część 4. Integracja systemów. Integracja z systemem inteligencji Androida za pomocą funkcji aplikacji.
Część 5 (wkrótce): przepływy pracy agentów w aplikacji. Rozszerz aplikację o kompleksowego asystenta rezerwacji opartego na A2UI i ADK.
Chcesz dowiedzieć się więcej o tworzeniu aplikacji na Androida? Obserwuj Android Developers na YouTube lub LinkedIn.
Wszystkie fragmenty kodu w tym poście na blogu są objęte tym powiadomieniem o prawach autorskich:
Copyright 2026 Google LLC. SPDX-License-Identifier: Apache-2.0
-
InstrukcjeWitamy z powrotem w serii postów na blogu „Tworzenie inteligentnych aplikacji na Androida”, w której przekształcamy podstawową aplikację na Androida w spersonalizowane, inteligentne i autonomiczne środowisko.
Thomas Ezan, Jolanda Verhoef, Caren Chang • Czas czytania: 8 minut -
InstrukcjeJetpacker to aplikacja demonstracyjna, którą nasz zespół stworzył od podstaw na tegoroczną konferencję Google I/O (została zbudowana przy użyciu Antigravity). Jetpacker pomaga użytkownikom planować, odkrywać i cieszyć się kolejną wielką przygodą.
Jolanda Verhoef • Czas czytania: 4 min -
InstrukcjeWitamy z powrotem w serii postów na blogu „Tworzenie inteligentnych aplikacji na Androida”, w której przekształcamy podstawową aplikację na Androida w spersonalizowane, inteligentne i autonomiczne środowisko. W poprzednim poście omówiliśmy, jak korzystać z Firebase AI Logic do tworzenia funkcji AI hostowanych w chmurze i hybrydowych.
Ben Weiss • Czas czytania: 6 minut
Otrzymuj co tydzień najnowsze informacje o tworzeniu aplikacji na Androida na swoją skrzynkę odbiorczą.