「インテリジェントな Android アプリを構築する」ブログ投稿シリーズにようこそ。このシリーズでは、基本的な Android アプリをパーソナライズされ、インテリジェントで、エージェントとしての性質を備えたエクスペリエンスに変革します。前回の投稿では、ML Kit の Prompt API を介して Gemini Nano を使用してインテリジェントなオンデバイス機能を構築する方法について説明しました。
この投稿では、Firebase AI Logic を活用して、クラウドホスト型とハイブリッド型の AI 機能を構築する方法について説明します。
- 実際のコンテキストに基づいて回答する
- ハイブリッド推論を使用してクラウドとローカル実行の間でリクエストを動的にルーティングする
- カスタム ルーティング システムを使用したコンテンツの翻訳
ユースケースによっては、世界に関するより多くの知識、より大きなコンテキスト ウィンドウ、複雑なクエリを処理する能力を備えた AI モデルが必要になることがあります。このようなシナリオでは、クラウド モデルを活用できます。
また、ハイブリッド推論を使用して、利用可能な場合はデバイス上で実行してコストを削減し、すべてのデバイスの互換性を確保するためにクラウドにフォールバックするという、両方のメリットを享受したい場合もあります。
Jetpacker で 3 つのクラウド機能とハイブリッド機能を実装した方法を見てみましょう。
- ウェブ グラウンディングを備えた博物館アシスタント
- ハイブリッド レストラン レビューの作成
- カスタム ルーティングされたリアルタイム翻訳を備えたホテル サポート チャット。
LLM グラウンディングを使用して最新情報を取得する LLM グラウンディングを使用した博物館アシスタント chatbot
博物館アシスタント は、ユーザーが博物館への訪問を計画するのに役立つように設計されたインタラクティブな chatbot です。特定の展示物、現在の開館時間、チケット料金などに関する最新情報を訪問者に提供します。
AI 機能を構築する際に、モデルが最新の正確で具体的な実世界の情報で回答できるようにすることは、一般的な課題です。クラウドモデルは膨大な量の世界知識を持っていますが、季節限定の展示や当日の開館時間については知らない可能性があります。
このギャップを埋めるために、グラウンディング手法を使用して、モデルのコンテキスト ウィンドウに追加のコンテキストを追加できます。Firebase AI Logic SDK は、次の 3 種類のグラウンディングをサポートしています。
- URL グラウンディング: 特定のウェブページのコンテンツ(現在のチケット料金や美術館のルールなど)を使用して回答をグラウンディングします。
- Google 検索のグラウンディング: モデルがリアルタイムの Google 検索インデックスをクエリして最新の詳細情報を取得できるようにします。
- マップのグラウンディング: Google マップの現在地データを使用します。
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 タスクにクラウドベースのモデルが必要なわけではなく、すべてのデバイスがオンラインであるわけでもありません。レイテンシ、費用、オフラインでの利用可能性のバランスを取るために、Google は最近 Firebase API for Hybrid Inference を導入しました。
Jetpacker のレストラン レビュー機能を使用すると、ユーザーは特定のトピックについてレビューし、レビューを自動的に作成できます。すべてのユーザーがこの機能を利用できるように、Gemini Nano を使用したローカル実行を優先し、Gemini Nano をサポートしていないデバイスではクラウドモデルにフォールバックします。
// 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 は、次の 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" )
受付の返信はホテルの現地語(パリの Hotel Le Meurice の場合はフランス語など)で行われるため、メッセージをユーザーの希望する言語に翻訳する必要があります。
ハイブリッド モデルではシンプルなルーティング設定を構成できますが、複雑なシナリオではカスタム ルーティング ロジックが必要です。Jetpacker では、次の点を考慮したカスタム ルーティング スタックを実装しています。
- 言語識別: デバイス上の ML Kit 言語識別 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 によって完全に検証および認証され、バックエンドが保護されると同時に、アプリをローカルでテストできるようになります。
まとめ
クラウドモデルの機能(グラウンディング、システム指示)とオンデバイスの機能(ハイブリッド ルーティング、翻訳、セキュリティ アプリのチェック)を組み合わせることで、スマートで安全なオフラインでも利用可能な旅行アプリを作成しました。
GitHub で Jetpacker のソースコード全体を確認し、Firebase のドキュメントで詳細を確認してください。
Firebase AI Logic のドキュメント
Firebase ハイブリッド推論 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
-
ハウツー「インテリジェントな Android アプリを構築する」ブログ投稿シリーズにようこそ。このシリーズでは、基本的な Android アプリをパーソナライズされたインテリジェントなエージェント エクスペリエンスに変換します。前回の投稿では、このシリーズ全体で使用するデモアプリである Jetpacker を紹介しました。
Caren Chang • 所要時間: 6 分 -
ハウツーJetpacker は、今年の Google I/O 向けにチームがゼロから構築した技術デモアプリです(Antigravity を使用して構築)。Jetpacker は、ユーザーが次の大きな冒険を計画、探索、楽しむためのアプリです。
Jolanda Verhoef • 所要時間: 4 分 -
ハウツー「インテリジェントな Android アプリを構築する」ブログ投稿シリーズにようこそ。このシリーズでは、基本的な Android アプリをパーソナライズされたインテリジェントなエージェント エクスペリエンスに変換します。前回の投稿では、Firebase AI Logic を活用してクラウドホスト型とハイブリッド型の AI 機能を構築する方法について説明しました。
Ben Weiss • 所要時間: 6 分
Android 開発に関する最新の分析情報を毎週メールでお届けします。