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


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

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

オンデバイス推論は、デスクトップ版 Chrome で実行されるウェブアプリでサポートされています。

コード例に移動

推奨されるユースケースとサポートされている機能

推奨されるユースケース:

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

    • プライバシーの強化
    • ローカル コンテキスト
    • 無料の推論
    • オフライン機能
  • ハイブリッド機能の特典を利用する:

    • デバイス上のモデルの可用性やインターネット接続に関係なく、オーディエンスの 100% にリーチ

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

始める前に

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

  • オンデバイス モデルを使用する推論では Chrome の Prompt API が使用されます。一方、クラウドホスト型モデルを使用する推論では、選択した Gemini API プロバイダ(Gemini Developer API または Vertex AI Gemini API)が使用されます。

  • このページでは、localhost を使用して開発を開始する方法について説明します(localhost で API を使用する方法については、Chrome のドキュメントをご覧ください)。また、このページの後半にあるその他の構成オプションと機能(構造化出力など)もご覧ください。

  • 機能を実装したら、実際のアプリでエンドユーザーが機能を試せるようにすることができます。

localhost で始める

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

ステップ 1: デバイス上の推論用に Chrome と Prompt API を設定する

  1. 最新バージョンの Chrome を使用していることを確認します。chrome://settings/help で更新します。
    オンデバイス推論は Chrome v139 以降で利用できます。

  2. 次のフラグを [有効] に設定して、オンデバイス マルチモーダル モデルを有効にします。

    • chrome://flags/#prompt-api-for-gemini-nano-multimodal-input
  3. Chrome を再起動します。

  4. (省略可)初回リクエストの前にオンデバイス モデルをダウンロードします。

    Prompt API は Chrome に組み込まれていますが、オンデバイス モデルはデフォルトでは利用できません。オンデバイス推論の初回リクエストの前にモデルをまだダウンロードしていない場合、リクエストによってバックグラウンドでモデルのダウンロードが自動的に開始されます。

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

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

  2. Firebase コンソールで、[Firebase AI Logic] ページに移動します。

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

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

    Gemini Developer API を使用して始めることをおすすめします。いつでも Vertex AI Gemini API を設定できます(お支払いに関する要件も同様です)。

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

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

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

ステップ 3: SDK を追加する

Firebase ライブラリは、生成モデルを操作するための API へのアクセスを提供します。このライブラリは、Firebase JavaScript SDK for Web の一部として含まれています。

  1. npm を使用してウェブ用の Firebase JS SDK をインストールします。

    npm install firebase
    
  2. アプリで Firebase を初期化します。

    import { initializeApp } from "firebase/app";
    
    // TODO(developer) Replace the following with your app's Firebase configuration
    // See: https://firebase.google.com/docs/web/learn-more#config-object
    const firebaseConfig = {
      // ...
    };
    
    // Initialize FirebaseApp
    const firebaseApp = initializeApp(firebaseConfig);
    

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

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

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

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

  2. GenerativeModel インスタンスを作成します。次のことを行ってください。

    1. getGenerativeModel は、エンドユーザーの操作後または操作時(ボタンのクリックなど)に呼び出します。これは inferenceMode の前提条件です。

    2. mode を次のいずれかに設定します。

      • PREFER_ON_DEVICE: オンデバイス モデルが使用可能な場合はそれを使用します。それ以外の場合は、クラウドホスト型モデルにフォールバックします。

      • ONLY_ON_DEVICE: オンデバイス モデルが使用可能な場合はそれを使用します。使用可能でない場合は、例外をスローします。

      • PREFER_IN_CLOUD: クラウドホスト型モデルが使用可能な場合はそれを使用します。それ以外の場合は、オンデバイス モデルにフォールバックします。

      • ONLY_IN_CLOUD: クラウドホスト型モデルが使用可能な場合はそれを使用します。使用可能でない場合は、例外をスローします。

import { initializeApp } from "firebase/app";
import { getAI, getGenerativeModel, GoogleAIBackend, InferenceMode } from "firebase/ai";

// TODO(developer) Replace the following with your app's Firebase configuration
// See: https://firebase.google.com/docs/web/learn-more#config-object
const firebaseConfig = {
  // ...
};

// Initialize FirebaseApp
const firebaseApp = initializeApp(firebaseConfig);

// Initialize the Gemini Developer API backend service
const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });

// Create a `GenerativeModel` instance
// Call `getGenerativeModel` after or on an end-user interaction
// Set the mode (for example, use the on-device model if it's available)
const model = getGenerativeModel(ai, { mode: InferenceMode.PREFER_ON_DEVICE });

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

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

構造化された出力(JSON や列挙型など)を生成する場合は、次の「テキストの生成」の例のいずれかを使用し、さらに指定されたスキーマに従って応答するようにモデルを構成します。

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

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

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

// Imports + initialization of FirebaseApp and backend service + creation of model instance

// Wrap in an async function so you can use await
async function run() {
  // Provide a prompt that contains text
  const prompt = "Write a story about a magic backpack."

  // To generate text output, call `generateContent` with the text input
  const result = await model.generateContent(prompt);

  const response = result.response;
  const text = response.text();
  console.log(text);
}

run();

なお、Firebase AI LogicgenerateContentStreamgenerateContent ではなく)を使用したテキスト レスポンスのストリーミングもサポートしています。

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

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

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

オンデバイス推論でサポートされている入力画像タイプは PNG と JPEG です。

// Imports + initialization of FirebaseApp and backend service + creation of model instance

// Converts a File object to a Part object.
async function fileToGenerativePart(file) {
  const base64EncodedDataPromise = new Promise((resolve) => {
    const reader = new FileReader();
    reader.onloadend = () => resolve(reader.result.split(',')[1]);
    reader.readAsDataURL(file);
  });
  return {
    inlineData: { data: await base64EncodedDataPromise, mimeType: file.type },
  };
}

async function run() {
  // Provide a text prompt to include with the image
  const prompt = "Write a poem about this picture:";

  const fileInputEl = document.querySelector("input[type=file]");
  const imagePart = await fileToGenerativePart(fileInputEl.files[0]);

  // To generate text output, call `generateContent` with the text and image
  const result = await model.generateContent([prompt, imagePart]);

  const response = result.response;
  const text = response.text();
  console.log(text);
}

run();

なお、Firebase AI LogicgenerateContentStreamgenerateContent ではなく)を使用したテキスト レスポンスのストリーミングもサポートしています。

エンドユーザーが機能を試せるようにする

アプリでエンドユーザーが機能を試すには、Chrome オリジン トライアルに登録する必要があります。なお、これらのトライアルには期間と使用量の制限があります。

  1. Prompt API Chrome オリジン トライアルに登録します。トークンが発行されます。

  2. トライアル機能を有効にする各ウェブページでトークンを指定します。以下のいずれかの方法を選択します。

    • <head> タグのメタタグとしてトークンを指定します。 <meta http-equiv="origin-trial" content="TOKEN">

    • トークンを HTTP ヘッダーとして指定します。 Origin-Trial: TOKEN

    • トークンをプログラムで指定します。

Google アシスタントの機能

このセクションでは、推論モードを設定する方法、デフォルトのクラウドホスト型フォールバック モデルをオーバーライドする方法、モデル構成を使用してレスポンスを制御する方法(構造化された出力を生成するなど)について説明します。

推論モードを設定する

一般的な設定の例では PREFER_ON_DEVICE モードを使用していますが、これは使用可能な 4 つの推論モードの 1 つにすぎません。

  • PREFER_ON_DEVICE: オンデバイス モデルが使用可能な場合はそれを使用します。それ以外の場合は、クラウドホスト型モデルにフォールバックします。

    const model = getGenerativeModel(ai, { mode: InferenceMode.PREFER_ON_DEVICE });
    
  • ONLY_ON_DEVICE: オンデバイス モデルが使用可能な場合はそれを使用します。使用可能でない場合は、例外をスローします。

    const model = getGenerativeModel(ai, { mode: InferenceMode.ONLY_ON_DEVICE });
    
  • PREFER_IN_CLOUD: クラウドホスト型モデルが使用可能な場合はそれを使用します。それ以外の場合は、オンデバイス モデルにフォールバックします。

    const model = getGenerativeModel(ai, { mode: InferenceMode.PREFER_IN_CLOUD });
    
  • ONLY_IN_CLOUD: クラウドホスト型モデルが使用可能な場合はそれを使用します。使用可能でない場合は、例外をスローします。

    const model = getGenerativeModel(ai, { mode: InferenceMode.ONLY_IN_CLOUD });
    

デバイス上の推論とクラウド内の推論のどちらが使用されたかを判断する

PREFER_ON_DEVICE または PREFER_IN_CLOUD 推論モードを使用する場合は、特定のリクエストにどのモードが使用されたかを知っておくと便利です。この情報は、各レスポンスの inferenceSource プロパティによって提供されます(JS SDK v12.5.0 以降で使用可能)。

このプロパティにアクセスすると、ON_DEVICE または IN_CLOUD のいずれかの値が返されます。

// ...

console.log('You used: ' + result.response.inferenceSource);

console.log(result.response.text());

デフォルトのフォールバック モデルをオーバーライドする

デフォルトのクラウドホスト型モデルは gemini-2.5-flash-lite です(JS SDK v12.8.0 以降)。

このモデルは、PREFER_ON_DEVICE モードを使用する場合のフォールバック クラウドホスト モデルです。ONLY_IN_CLOUD モードまたは PREFER_IN_CLOUD モードを使用する場合のデフォルト モデルでもあります。

inCloudParams 構成オプションを使用して、代替のデフォルトのクラウドホスト型モデルを指定できます。

const model = getGenerativeModel(ai, {
  mode: InferenceMode.INFERENCE_MODE,
  inCloudParams: {
    model: "GEMINI_MODEL_NAME"
  }
});

サポートされているすべての Gemini モデルのモデル名を確認します。

モデル構成を使用してレスポンスを制御する

モデルへのリクエストごとに、モデルがどのようにレスポンスを生成するかを制御するモデル構成を送信できます。クラウドホスト型モデルとオンデバイス モデルでは、構成オプションが異なります。

構成はインスタンスの存続期間中維持されます。別の構成を使用する場合は、その構成で新しい GenerativeModel インスタンスを作成します。

クラウドホスト型モデルの構成を設定する

inCloudParams オプションを使用して、クラウドでホストされる Gemini モデルを構成します。使用可能なパラメータについて学習する。

const model = getGenerativeModel(ai, {
  mode: InferenceMode.INFERENCE_MODE,
  inCloudParams: {
    model: "GEMINI_MODEL_NAME"
    temperature: 0.8,
    topK: 10
  }
});

オンデバイス モデルの構成を設定する

オンデバイス モデルを使用した推論では、Chrome の Prompt API が使用されます。

onDeviceParams オプションを使用して、デバイス上のモデルを構成します。使用可能なパラメータについて学習する。

const model = getGenerativeModel(ai, {
  mode: InferenceMode.INFERENCE_MODE,
  onDeviceParams: {
    createOptions: {
      temperature: 0.8,
      topK: 8
    }
  }
});

構造化出力(JSON など)の構成を設定する

クラウドホスト型モデルとオンデバイス モデルの両方を使用した推論で、構造化出力(JSON や列挙型など)の生成がサポートされています。

ハイブリッド推論では、inCloudParamsonDeviceParams の両方を使用して、構造化された出力を返すようにモデルを構成します。他のモードでは、該当する構成のみを使用します。

  • inCloudParams の場合: 適切な responseMimeType(この例では application/json)と、モデルで使用する responseSchema を指定します。

  • onDeviceParams の場合: モデルで使用する responseConstraint を指定します。

JSON 出力

次の例では、ハイブリッド推論用に一般的な JSON 出力の例を調整しています。

import {
  getAI,
  getGenerativeModel,
  Schema
} from "firebase/ai";

const jsonSchema = Schema.object({
 properties: {
    characters: Schema.array({
      items: Schema.object({
        properties: {
          name: Schema.string(),
          accessory: Schema.string(),
          age: Schema.number(),
          species: Schema.string(),
        },
        optionalProperties: ["accessory"],
      }),
    }),
  }
});

const model = getGenerativeModel(ai, {
  mode: InferenceMode.INFERENCE_MODE,
  inCloudParams: {
    model: "gemini-2.5-flash"
    generationConfig: {
      responseMimeType: "application/json",
      responseSchema: jsonSchema
    },
  }
  onDeviceParams: {
    promptOptions: {
      responseConstraint: jsonSchema
    }
  }
});
列挙型の出力

上記と同様ですが、ハイブリッド推論用に列挙型出力に関するドキュメントを適応させます。

// ...

const enumSchema = Schema.enumString({
  enum: ["drama", "comedy", "documentary"],
});

const model = getGenerativeModel(ai, {

// ...

    generationConfig: {
      responseMimeType: "text/x.enum",
      responseSchema: enumSchema
    },

// ...
});

// ...

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

試験運用版として、Web SDK のすべての機能がオンデバイス推論で利用できるわけではありません。次の機能は、オンデバイス推論ではまだサポートされていません(通常はクラウドベースの推論で利用できます)。

  • JPEG と PNG 以外の画像ファイル入力タイプからテキストを生成する

    • クラウドホスト型モデルにフォールバックできますが、ONLY_ON_DEVICE モードではエラーがスローされます。
  • 音声、動画、ドキュメント(PDF など)の入力からテキストを生成する

    • クラウドホスト型モデルにフォールバックできますが、ONLY_ON_DEVICE モードではエラーがスローされます。
  • Gemini モデルまたは Imagen モデルを使用して画像を生成する

    • クラウドホスト型モデルにフォールバックできますが、ONLY_ON_DEVICE モードではエラーがスローされます。
  • マルチモーダル リクエストで URL を使用してファイルを提供する。ファイルは、オンデバイス モデルへのインライン データとして指定する必要があります。

  • マルチターン チャット

    • クラウドホスト型モデルにフォールバックできますが、ONLY_ON_DEVICE モードではエラーがスローされます。
  • Gemini Live API を使用した双方向ストリーミング

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

  • トークンのカウント

    • 常にエラーをスローします。クラウドホスト型モデルとオンデバイス モデルではカウントが異なるため、直感的なフォールバックはありません。
  • オンデバイス推論用の Firebase コンソールでの AI モニタリング。

    • クラウドホスト型モデルを使用する推論は、Firebase AI Logic クライアント SDK for Web を使用する他の推論と同様にモニタリングできます。


Firebase AI Logic の使用感についてフィードバックを送信する