Инструкции

Создавайте интеллектуальные приложения для Android: облачные и гибридные вычисления.

8 минут чтения
3 автора
Thomas Ezan, Jolanda Verhoef, Caren Chang

Добро пожаловать обратно в серию статей блога « Создание интеллектуальных приложений для Android », где мы берем обычное приложение для Android и превращаем его в персонализированное , интеллектуальное и управляемое приложение. В нашей предыдущей статье мы рассмотрели, как создавать интеллектуальные функции на устройстве с помощью Gemini Nano через API Prompt от ML Kit.

В этой статье мы рассмотрим, как можно использовать Firebase AI Logic. для создания облачных и гибридных функций искусственного интеллекта:

  • Обоснование ответов в контексте реального мира
  • Динамическая маршрутизация запросов между облачным и локальным выполнением с использованием гибридного вывода.
  • Перевод контента с использованием пользовательских систем маршрутизации

Иногда для решения конкретных задач требуются модели ИИ с более глубокими знаниями об окружающем мире, гораздо большим контекстным окном или способностью обрабатывать сложные запросы. В таких сценариях мы можем использовать облачные модели.

В других случаях вам нужно получить лучшее из обоих миров: использовать гибридный вывод для работы на устройстве, когда это возможно, чтобы снизить затраты, и одновременно переключаться на облако для обеспечения совместимости со всеми устройствами.

features.png
Облачные и гибридные функции Jetpacker: помощник для музеев с веб-подключением, гибридный способ написания обзоров ресторанов и чат поддержки с настраиваемым переводом в режиме реального времени.

Давайте посмотрим, как мы реализовали три облачные и гибридные функции в Jetpacker :

  • помощник музея с опытом работы в интернете
  • составление обзора гибридного ресторана
  • Чат поддержки отеля с возможностью индивидуальной маршрутизации и переводом в режиме реального времени.

Используйте знания, полученные в рамках программы LLM, для получения актуальной информации. Чат-бот-помощник для музея с знаниями, полученными в рамках программы LLM.

Музеевый ассистент — это интерактивный чат-бот, разработанный для того, чтобы помочь пользователям планировать посещение музеев. Он предоставляет посетителям актуальную информацию о конкретных экспозициях, текущем времени работы, ценах на билеты и многом другом.

museum_assistant_upscaled.png
Музеевый ассистент — это чат-бот, который отвечает на вопросы, например: «Как получить скидку на билет в Лувр?»

При создании функций ИИ распространенной проблемой является получение от модели ответов на основе актуальной, точной и конкретной информации из реального мира. Хотя облачные модели обладают огромными массивами знаний о мире, они могут ничего не знать о сезонных выставках или часах работы в текущий день.

grounding.png
В контекстное окно добавляются базовые данные, позволяющие модели правильно и точно отвечать на вопросы.

Чтобы преодолеть этот разрыв, мы можем использовать методы привязки, чтобы добавить дополнительный контекст в контекстное окно модели. SDK Firebase AI Logic поддерживает три типа привязки:

  • Привязка к URL-адресу : Привязка ответов к содержимому конкретной веб-страницы (например, текущим ценам на билеты или правилам музея).
  • Поддержка Google Search : предоставление модели возможности запрашивать актуальную информацию из поискового индекса Google в режиме реального времени.
  • Привязка к картам : использование данных о местоположении Google Maps.

В Jetpacker мы динамически формируем доступные инструменты на основе включенных флагов функций и инициализируем генеративную модель с помощью 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)

Не для каждой задачи ИИ требуется облачная модель, и не каждое устройство подключено к интернету. Чтобы помочь разработчикам найти баланс между задержкой, стоимостью и доступностью в автономном режиме, мы недавно представили API Firebase для гибридного вывода .

В 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
    )
)

API гибридного вывода поддерживает четыре различных режима маршрутизации:

  • 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"
    )

Поскольку ответы администратора поступают на местном языке отеля (например, французский для отеля Le Meurice в Париже), нам необходимо переводить сообщения на предпочитаемый пользователем язык.

translation_upscaled.png
Сообщения в чате службы поддержки отеля автоматически переводятся на предпочитаемый пользователем язык.

В то время как гибридные модели позволяют настраивать простые параметры маршрутизации, сложные сценарии требуют пользовательской логики маршрутизации. В Jetpacker мы реализовали собственный стек маршрутизации, который учитывает:

  • Определение языка: Используя встроенный в ML Kit API определения языка , мы можем определить язык входящего сообщения.
  • Перевод непосредственно на устройстве (Gemini Nano): API Prompt от 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")
            }
        }
    }
}

В этом примере пользовательская логика маршрутизации учитывает только исходный и целевой языки перевода. Однако, в зависимости от сценария использования вашего приложения, вы можете расширить логику маршрутизации, включив в нее другие факторы, такие как версия модели устройства, сетевое подключение, состояние батареи и многое другое.

Обеспечение безопасности конвейеров ИИ: Firebase App Check

Наконец, использование ИИ в облаке открывает возможности для злоупотребления ключами API или несанкционированного выставления счетов. Для защиты вызовов API мы интегрировали Firebase App Check , используя как Play Integrity (в производственной среде), так и локальный Debug Provider (для локальной разработки или эмуляторов).

В файле 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, что защищает наш бэкэнд и позволяет нам тестировать приложение локально.

Заключение

By combining cloud model capabilities (grounding, system instructions) with on-device capabilities (hybrid routing, translation, security app checks), we created a travel app that is smart, secure, and available offline.

Полный исходный код Jetpacker можно найти на GitHub , а для начала работы изучите документацию Firebase:

Документация Firebase AI Logic
API гибридного вывода Firebase

Узнать больше

Ознакомьтесь с другими частями этой серии статей в блоге:

Часть 1 : Введение в приложение и общий обзор.
Часть 2 : Встроенный интеллект. Подробное изучение API GenAI от ML Kit и Gemini Nano для создания функций, ориентированных на конфиденциальность, таких как составление кратких описаний маршрутов, анализ квитанций и локальная обработка звука.
Часть 3 (в этом посте!): Гибридные и облачные методы рассуждений. Узнайте, как использовать Firebase AI Logic для обоснования ответов LLM реальными данными, такими как Google Maps и веб-контекст.
Часть 4: Системная интеграция. Интеграция с интеллектуальной системой Android с использованием AppFunctions.
Часть 5 (скоро): Внутриприложениевые агентские рабочие процессы. Расширьте возможности приложения с помощью комплексного помощника по бронированию на базе A2UI и ADK.

Хотите узнать больше о разработке под Android? Подписывайтесь на Android Developers на YouTube или LinkedIn !

Все фрагменты кода в этой статье блога защищены следующим уведомлением об авторских правах:

Copyright 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0
Автор:
Продолжить чтение