オンデバイス モデルとクラウドホスト モデルを使用して Android アプリでハイブリッド エクスペリエンスを構築する


ハイブリッド推論を使用して AI を活用した Android アプリや機能を作成できます Firebase AI Logic。ハイブリッド推論では、オンデバイス モデルが利用可能な場合はそれを使用して推論を実行し、利用できない場合はクラウド ホスト型モデルにシームレスにフォールバックします(逆も同様です)。

このページでは、クライアント SDK の使用を開始する方法と、Temperature などの追加の構成オプションと機能について説明します。

Firebase AI Logic を介したオンデバイス推論は、特定のデバイスで実行されている Android アプリでサポートされており、 ML Kit の規約と、 ML Kit の Gen AI 関連の規約に準拠しています。

おすすめのユースケースとサポートされている機能

おすすめのユースケース

  • 推論にオンデバイス モデルを使用する と、次のメリットがあります。

    • プライバシーの強化
    • ローカル コンテキスト
    • 推論を無料で使用できる
    • オフライン機能
  • ハイブリッド 機能を使用すると、次のメリットがあります。

    • オンデバイス モデルの可用性とインターネット接続に対応することで、より多くのユーザーにリーチできる

オンデバイス推論でサポートされている機能

オンデバイス推論では、ストリーミング出力または非ストリーミング出力で、シングルターン テキスト生成(チャットではない) のみがサポートされます。 次のテキスト生成機能がサポートされています。

このページの下部にある、 オンデバイス推論でまだ利用できない機能の一覧 をご確認ください。

始める前に

次の点に注目してください。

  • サポートされている API:

    • クラウド推論では、選択した Gemini API プロバイダ( Gemini Developer API または Vertex AI Gemini API)を使用します。

    • オンデバイス推論では、ML Kit の Prompt APIを使用します。これはベータ版であり、 特定のデバイスでのみ使用できます。

  • このページでは、使用を開始する方法 について説明します。

    この標準設定が完了したら、 追加の構成オプションと機能 (温度の設定など)をご確認ください。

サポートされている Android デバイスとそのオンデバイス モデル

オンデバイス推論(ML Kit の Prompt API を使用)の場合、サポートされているデバイスとそのオンデバイス モデルの一覧は ML Kit のドキュメントに記載されています。

始める

以下の手順では、送信するサポート対象のプロンプト リクエストに必要な一般的な設定について説明します。

ステップ 1: Firebase プロジェクトを設定し、アプリを Firebase に接続する

  1. Firebase コンソールにログインし Firebase プロジェクトを選択します。

  2. Firebase コンソールで、[AI サービス] > [AI Logic] に移動します。

  3. [使ってみる] をクリックして、プロジェクトに必要な API とリソースを設定するガイド付きワークフローを起動します。

  4. Gemini API」プロバイダを使用するようにプロジェクトを設定します。

    から始めることをおすすめします。 Gemini Developer APIVertex AI Gemini API はいつでも設定できますVertex AI Gemini API (とその請求要件)。

    Gemini Developer API の場合、コンソールで必要な API が有効になり、プロジェクトに Gemini API キーが作成されます。
    この Gemini API キーをアプリのコードベースに追加しないでください 詳細

  5. コンソールのワークフローでプロンプトが表示されたら、画面上の手順に沿ってアプリを登録し、Firebase に接続します。

  6. このガイドの次のステップに進んで、アプリに SDK を追加します。

ステップ 2: 必要な SDK を追加する

Android 用 Firebase AI Logic SDK(firebase-ai)と SDK(firebase-ai-ondevice)を使用すると、生成モデルとやり取りするための API にアクセスできます。Firebase AI Logic On-Device

モジュール(アプリレベル)の Gradle ファイル<project>/<app-module>/build.gradle.kts など)に、Android 用の Firebase AI Logic ライブラリの依存関係を追加します。

Kotlin

dependencies {
  // ... other androidx dependencies

  // Add the dependencies for the Firebase AI Logic libraries
  // Note that the on-device SDK is not yet included in the Firebase Android BoM
  implementation("com.google.firebase:firebase-ai:17.11.0")
  implementation("com.google.firebase:firebase-ai-ondevice:16.0.0-beta01")
}

Java

Java の場合は、2 つのライブラリを追加する必要があります。

dependencies {
  // ... other androidx dependencies

  // Add the dependencies for the Firebase AI Logic libraries
  // Note that the on-device SDK is not yet included in the Firebase Android BoM
  implementation("com.google.firebase:firebase-ai:17.11.0")
  implementation("com.google.firebase:firebase-ai-ondevice:16.0.0-beta01")

  // Required for one-shot operations (to use `ListenableFuture` from Guava Android)
  implementation("com.google.guava:guava:31.0.1-android")

  // Required for streaming operations (to use `Publisher` from Reactive Streams)
  implementation("org.reactivestreams:reactive-streams:1.0.4")
}

ステップ 3: オンデバイス モデルが利用可能かどうかを確認する

FirebaseAIOnDevice を使用して、オンデバイス モデルが利用可能かどうかを確認し、利用できない場合はモデルをダウンロードします。

ダウンロードすると、AICore によってモデルが自動的に最新の状態に保たれます。AICore とオンデバイス モデルのダウンロードの管理について詳しくは、スニペットの後のメモをご覧ください。

Kotlin

val status = FirebaseAIOnDevice.checkStatus()
when (status) {
  OnDeviceModelStatus.UNAVAILABLE -> {
    Log.w(TAG, "On-device model is unavailable")
  }

  OnDeviceModelStatus.DOWNLOADABLE -> {
    FirebaseAIOnDevice.download().collect { status ->
      when (status) {
        is DownloadStatus.DownloadStarted ->
          Log.w(TAG, "Starting download - ${status.bytesToDownload}")

        is DownloadStatus.DownloadInProgress ->
          Log.w(TAG, "Download in progress ${status.totalBytesDownloaded} bytes downloaded")

        is DownloadStatus.DownloadCompleted ->
          Log.w(TAG, "On-device model download complete")

        is DownloadStatus.DownloadFailed ->
          Log.e(TAG, "Download failed ${status}")
      }
    }
  }
  OnDeviceModelStatus.DOWNLOADING -> {
    Log.w(TAG, "On-device model is being downloaded")
  }

  OnDeviceModelStatus.AVAILABLE -> {
    Log.w(TAG, "On-device model is available")
  }
}

Java

Checking for and downloading the model is not yet available for Java.

However, all other APIs and interactions in this guide are available for Java.

オンデバイス モデルのダウンロードについては、次の点に注意してください。

  • オンデバイス モデルのダウンロードにかかる時間は、ネットワークなど、多くの要因によって異なります。

  • コードでプライマリ推論またはフォールバック推論にオンデバイス モデルを使用する場合は、アプリのライフサイクルの早い段階でモデルがダウンロードされるようにしてください。これにより、エンドユーザーがアプリでコードを使用する前にオンデバイス モデルが利用可能になります。

  • オンデバイス推論リクエストが行われたときにオンデバイス モデルが利用できない場合、SDK はオンデバイス モデルのダウンロードを自動的にトリガーしません。SDK はクラウド ホスト型モデルにフォールバックするか、 例外をスローします( 推論モードの動作の詳細をご覧ください)。

  • AICore (Android システム サービス)は、ダウンロードするモデルとバージョンを 管理し、モデルを最新の状態に保ちます。デバイスにダウンロードされるモデルは 1 つだけです。デバイス上の別のアプリがオンデバイス モデルを以前に 正常にダウンロードしている場合、このチェックではモデルが利用可能であることが返されます。

レイテンシの最適化

最初の推論呼び出しを最適化するには、アプリで warmup()を呼び出すことができます。 これにより、オンデバイス モデルがメモリに読み込まれ、ランタイム コンポーネントが初期化されます。

ステップ 4: サービスを初期化してモデル インスタンスを作成する

Gemini API プロバイダをクリックして、このページでプロバイダ固有のコンテンツとコードを表示します。

モデルにプロンプト リクエストを送信する前に、次の設定を行います。

  1. 選択した API プロバイダのサービスを初期化します。

  2. GenerativeModel インスタンスを作成し、mode を次のいずれかに設定します。ここでは概要のみを説明しますが、これらのモードの動作の詳細については、 推論モードを設定する をご覧ください。

    • PREFER_ON_DEVICE: オンデバイス モデルを使用しようとします。使用できない場合は、クラウド ホスト型モデルにフォールバックします。

    • ONLY_ON_DEVICE: オンデバイス モデルを使用しようとします。使用できない場合は、例外をスローします。

    • PREFER_IN_CLOUD: クラウド ホスト型モデルを使用しようとします。使用できない場合は、オンデバイス モデルにフォールバックします。

    • ONLY_IN_CLOUD: クラウド ホスト型モデルを使用しようとします。使用できない場合は、例外をスローします。

Kotlin

// Using this SDK to access on-device inference is an Experimental release and requires opt-in
@OptIn(PublicPreviewAPI::class)

// ...

// Initialize the Gemini Developer API backend service
// Create a GenerativeModel instance with a model that supports your use case
// Set the inference mode (like PREFER_ON_DEVICE to use the on-device model if available)
val model = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "MODEL_NAME",
        onDeviceConfig = OnDeviceConfig(mode = InferenceMode.PREFER_ON_DEVICE)
    )

Java

// Initialize the Gemini Developer API backend service
// Create a GenerativeModel instance with a model that supports your use case
// Set the inference mode (like PREFER_ON_DEVICE to use the on-device model if available)
GenerativeModel ai = FirebaseAI.getInstance(GenerativeBackend.googleAI())
    .generativeModel(
        "MODEL_NAME",
        new OnDeviceConfig(InferenceMode.PREFER_ON_DEVICE)
    );

// Use the GenerativeModelFutures Java compatibility layer which offers
// support for ListenableFuture and Publisher APIs
GenerativeModelFutures model = GenerativeModelFutures.from(ai);

ステップ 5: モデルにプロンプト リクエストを送信する

このセクションでは、さまざまな種類の入力を送信して、次のようなさまざまな種類の出力を生成する方法について説明します。

テキストのみの入力からテキストを生成する

このサンプルを試す前に、このガイドの 「始める」セクションを完了していることを確認してください。

generateContent() を使用すると、テキストを含むプロンプトからテキストを生成できます。

Kotlin

// Imports + initialization of Gemini API backend service + creation of model instance

// Provide a prompt that contains text
val prompt = "Write a story about a magic backpack."

// To generate text output, call generateContent with the text input
val response = model.generateContent(prompt)
print(response.text)

Java

// Imports + initialization of Gemini API backend service + creation of model instance

// Provide a prompt that contains text
Content prompt = new Content.Builder()
    .addText("Write a story about a magic backpack.")
    .build();

// To generate text output, call generateContent with the text input
ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        String resultText = result.getText();
        System.out.println(resultText);
    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
    }
}, executor);

Firebase AI Logic は、 generateContentStream の代わりに を使用したテキスト レスポンスのストリーミングもサポートしています。generateContent

テキストと画像(マルチモーダル)の入力からテキストを生成する

このサンプルを試す前に、このガイドの 「始める」セクションを完了していることを確認してください。

generateContent() を使用すると、テキストと1 つの画像ファイル (Bitmap のみ)を含むプロンプトからテキストを生成できます。各入力ファイルのmimeTypeとファイル自体を指定します。

Kotlin

// Imports + initialization of Gemini API backend service + creation of model instance

// Loads an image from the app/res/drawable/ directory
val bitmap: Bitmap = BitmapFactory.decodeResource(resources, R.drawable.sparky)

// Provide a prompt that includes the image specified above and text
val prompt = content {
  image(bitmap)
  text("What developer tool is this mascot from?")
}

// To generate text output, call generateContent with the prompt
val response = model.generateContent(prompt)
print(response.text)

Java

// Imports + initialization of Gemini API backend service + creation of model instance

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sparky);

// Provide a prompt that includes the image specified above and text
Content content = new Content.Builder()
        .addImage(bitmap)
        .addText("What developer tool is this mascot from?")
        .build();

// To generate text output, call generateContent with the prompt
ListenableFuture<GenerateContentResponse> response = model.generateContent(content);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        String resultText = result.getText();
        System.out.println(resultText);
    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
    }
}, executor);

Firebase AI Logic は、 generateContentStream の代わりに を使用したテキスト レスポンスのストリーミングもサポートしています。generateContent

その他の機能

ハイブリッド エクスペリエンスでは、さまざまな追加の構成オプションと機能を使用できます。

オンデバイス推論でまだ利用できない機能

試験運用版リリースでは、クラウドモデルのすべての機能がオンデバイス推論で使用できるわけではありません。

このセクションに記載されている機能は、オンデバイス推論ではまだ利用できません。 これらの機能を使用する場合は、ONLY_IN_CLOUD 推論モードを使用することをおすすめします。

  • 構造化出力(JSON や enum など)の生成

  • Bitmap 以外の画像ファイル入力タイプ(メモリに読み込まれた画像)からテキストを生成する

  • 複数の画像ファイルからテキストを生成する

  • 音声、動画、ドキュメント(PDF など)の入力からテキストを生成する

  • Gemini または Imagen モデルを使用して画像を生成する

  • マルチモーダル リクエストで URL を使用してファイルを提供する。オンデバイス モデルには、インライン データとしてファイルを提供する必要があります。

  • 4,000 トークン(または約 3,000 語)を超えるリクエストを送信する。

  • マルチターン チャット

  • モデルがレスポンスを生成するのに役立つツール(関数呼び出し、コード実行、URL コンテキスト、Google 検索によるグラウンディングなど)を提供する。

Firebase コンソールの AI モニタリングには、オンデバイス推論(オンデバイス ログを含む)のデータは表示されません。ただし、クラウド ホスト型モデルを使用する推論は、 Firebase AI Logic を介した他の推論と同様にモニタリングできます。 Firebase AI Logic

その他の制限

上記に加えて、オンデバイス推論には次の 制限があります (詳しくは、 ML Kit のドキュメントをご覧ください)。

  • アプリのエンドユーザーは、オンデバイス推論で サポートされているデバイス を使用する必要があります。

  • アプリは、フォアグラウンドでのみオンデバイス推論を実行できます。

  • オンデバイス推論で検証されているのは英語と韓国語のみです。

  • オンデバイス推論リクエスト全体のトークン数の上限は 4,000 トークンです。リクエストがこの上限を超える可能性がある場合は、クラウド ホスト型モデルを使用できる推論モードを構成してください。

  • 長い出力(256 トークン以上)が必要なオンデバイス推論のユースケースは避けることをおすすめします。

  • AICore (オンデバイス モデルを管理する Android システム サービス)は、 推論割り当てをアプリごとに適用します。短期間に API リクエストを送信しすぎると、 ErrorCode.BUSY レスポンスが返されます。このエラーが表示された場合は、指数バックオフを使用してリクエストを再試行することを検討してください。また、アプリが長期間の割り当て(1 日の割り当てなど)を超過すると、ErrorCode.PER_APP_BATTERY_USE_QUOTA_EXCEEDED が返されることがあります。


フィードバックを送信する Firebase AI Logicの使用に関する