ハウツー

インテリジェントな Android アプリを構築する: クラウド推論とハイブリッド推論

8 min read

ブログ投稿シリーズ「インテリジェントな Android アプリを構築する」へようこそ。このシリーズでは、基本的な Android アプリをパーソナライズされたインテリジェントエージェントエクスペリエンスに変換します。前回の投稿では、ML Kit の Prompt API を使用して Gemini Nano でインテリジェントなオンデバイス機能を構築する方法について説明しました。

今回の投稿では、Firebase AI Logic を活用してクラウド ホスト型 AI 機能とハイブリッド AI 機能を構築する方法について説明します。

  • 現実世界のコンテキストに基づいた回答
  • ハイブリッド推論を使用したクラウドとローカル実行間のリクエストの動的ルーティング
  • カスタム ルーティング システムを使用したコンテンツの翻訳

ユースケースによっては、世界に関する知識が豊富で、コンテキスト ウィンドウがはるかに大きく、複雑なクエリを処理できる AI モデルが必要になることがあります。このような場合は、クラウドモデルを活用できます。

また、ハイブリッド推論を使用して、利用可能な場合はオンデバイスで実行してコストを削減し、すべてのデバイスとの互換性を確保するためにクラウドにフォールバックするという、両方のメリットを享受したい場合もあります。

features.png
Jetpacker のクラウド機能とハイブリッド機能: ウェブ グラウンディングを備えた博物館アシスタント、ハイブリッド レストラン レビューの作成、カスタム ルーティングによるライブ翻訳を備えたサポート チャット。

Jetpacker に 3 つのクラウド機能とハイブリッド機能を実装した方法を見てみましょう。

  • ウェブ グラウンディングを備えた博物館アシスタント
  • ハイブリッド レストラン レビューの作成
  • カスタム ルーティングによるライブ翻訳を備えたホテルのサポート チャット。

LLM グラウンディングを使用して最新情報を取得する LLM グラウンディングを備えた博物館アシスタント chatbot

博物館アシスタント は、ユーザーが博物館の訪問を計画するのに役立つように設計されたインタラクティブな chatbot です。特定の展示、現在の開館時間、チケット料金などに関する最新情報を訪問者に提供します。

museum_assistant_upscaled.png
博物館アシスタントは、「ルーブル美術館のチケット割引を受けるにはどうすればよいですか?」などの質問に答える chatbot です。

AI 機能を構築する際に、モデルが最新の正確で具体的な現実世界の情報で回答できるようにすることは、一般的な課題です。クラウドモデルは膨大な量の世界に関する知識を持っていますが、季節限定の展示や当日の開館時間については知らない可能性があります。

grounding.png
グラウンディング データがコンテキスト ウィンドウに追加され、モデルが質問に正しく正確に回答できるようになります。

このギャップを埋めるために、グラウンディング手法を使用して、モデルのコンテキスト ウィンドウに追加のコンテキストを追加できます。Firebase AI Logic SDK は、次の 3 種類のグラウンディングをサポートしています。

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)

すべての AI タスクにクラウドベースのモデルが必要なわけではなく、すべてのデバイスがオンラインであるわけでもありません。デベロッパーがレイテンシ、費用、オフラインでの可用性のバランスを取れるように、Firebase API for Hybrid Inference が最近導入されました。

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: クラウドでの実行のみに厳密に制限します。

レビューが生成されたら、クリップボードにコピーし、インテントを使用して Google マップをレストランのレビューページに直接開き、シームレスなユーザー エクスペリエンスを提供します。

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): ML Kit の Prompt API を使用すると、一般的な言語ペアをデバイス上で直接翻訳できるため、帯域幅とクラウド費用を節約できます。
  • クラウド翻訳(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 キーの不正使用や不正な課金が発生する可能性があります。API 呼び出しを保護するため、Play Integrity(本番環境)とローカル デバッグ プロバイダ(ローカル開発またはエミュレータ用)の両方を使用してFirebase App Check を統合しました。

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: オンデバイス インテリジェンス。ML Kit の生成 AI API と Gemini Nano を詳しく見て、旅程の要約、領収書の解析、ローカル音声処理などのプライバシー重視の機能を構築します。
パート 3(この記事):ハイブリッド推論とクラウド推論。Firebase AI Logic を使用して、Google マップやウェブ コンテキストなどの現実世界のデータで LLM の回答をグラウンディングする方法について説明します。
パート 4: システム統合。AppFunctions を使用して Android インテリジェンス システムと統合します。
パート 5(近日公開): アプリ内エージェント ワークフロー。A2UI と ADK を搭載したエンドツーエンドの予約アシスタントでアプリを拡張します。

Android 開発の詳細に関心をお持ちの場合は、YouTube または LinkedIn で Android デベロッパーをフォローしてください。

このブログ投稿のコード スニペットはすべて、次の著作権に関する通知に従っています。

Copyright 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0
作成者:
続きを見る