Vertex AI in Firebase SDK を使用してアプリから Gemini API を呼び出すと、マルチモーダル入力に基づいてテキストを生成するように Gemini モデルにプロンプトを出すことができます。マルチモーダル プロンプトには、テキスト、画像、PDF、動画、音声など、複数のモダリティ(または入力タイプ)を含めることができます。
入力のテキスト以外の部分(メディア ファイルなど)については、必要に応じて Cloud Storage for Firebase を使用してリクエストにファイルを含めることができます。この機能について知っておくべきことは次のとおりです。
Cloud Storage for Firebase は、任意のマルチモーダル リクエスト(テキスト生成とチャットの両方など)で使用できます。このガイドの例は、基本的なテキストと画像の入力を示しています。
ファイルの MIME タイプと Cloud Storage for Firebase URL(常に
gs://
で始まる)をリクエスト入力で指定します。これらの値は、Cloud Storage バケットにアップロードされたファイルに自動的に割り当てられるメタデータです。サポートされているファイル形式と URL を使用する必要があります。
このソリューション ガイドでは、Cloud Storage for Firebase を設定し、アプリから Cloud Storage for Firebase バケットにファイルをアップロードして、Gemini API へのマルチモーダル リクエストにファイルの MIME タイプと Cloud Storage for Firebase URL を含める方法について説明します。
コードサンプルを確認するには、または、Cloud Storage for Firebase をすでに設定していて、マルチモーダル リクエストで使用できる状態ですか?
アプリで Cloud Storage for Firebase を使用する理由
Cloud Storage for Firebase は、Google Cloud Storage と同じ高速で安全かつスケーラブルなインフラストラクチャを使用して blob とファイルを保存します。そのクライアント SDK は、モバイルアプリとウェブアプリ用に特別に構築されています。
Vertex AI in Firebase SDK の場合、リクエストの最大サイズは 20 MB です。リクエストが大きすぎると、HTTP 413 エラーが発生します。ファイルのサイズによってリクエストの合計サイズが 20 MB を超える場合は、Cloud Storage for Firebase URL を使用してマルチモーダル リクエストにファイルを含めます。ただし、ファイルが小さい場合は、多くの場合、そのファイルをインライン データとして直接渡すことができます(ただし、インライン データとして提供されたファイルは転送中に Base64 にエンコードされるため、リクエストのサイズが大きくなります)。
Cloud Storage for Firebase を使用すると、他にも次のようなメリットがあります。
エンドユーザーにアプリから Cloud Storage for Firebase バケットに画像を直接アップロードするよう指示できます。その後、ファイルの MIME タイプと Cloud Storage for Firebase URL(ファイルの識別子)を指定するだけで、それらの画像をマルチモーダル プロンプトに含めることができます。
エンドユーザーが画像を提供する必要が生じた場合、特にネットワークの品質が低い場合や不安定な場合は、エンドユーザーの時間を節約し、帯域幅を削減できます。
- ファイルのアップロードまたはダウンロードが中断された場合、Cloud Storage for Firebase SDK は中断したところからオペレーションを自動的に再開します。
- アップロードした同じファイルを複数回使用できます。エンドユーザーは、アプリで必要なたびに(新しいマルチモーダル リクエストの場合など)同じファイルをアップロードする必要はありません。
Firebase Security Rules を使用して、Cloud Storage for Firebase に保存されているファイルへのエンドユーザーのアクセスを制限できます。これにより、許可されたユーザーのみがファイルをアップロード、ダウンロード、削除できるようになります。
バケット内のファイルには Firebase または Google Cloud からアクセスできます。これにより、Google Cloud Storage API を使用して、画像のフィルタリングや動画のコード変換などのサーバー側の処理を柔軟に行うことができます。
サポートされているファイルと URL の種類
Vertex AI in Firebase SDK で Cloud Storage for Firebase URL を使用する場合のファイルと URL の要件は次のとおりです。
Vertex AI in Firebase SDK を使用する場合は、ファイルがマルチモーダル リクエストの入力ファイルの要件を満たしている必要があります。これには、MIME タイプやファイルサイズなどの要件が含まれます。
ファイルは Cloud Storage for Firebase バケットに保存する必要があります(つまり、バケットに Firebase Security Rules などの Firebase サービスがアクセスできる必要があります)。Firebase コンソールでバケットを表示できる場合は、Cloud Storage for Firebase バケットです。
Cloud Storage for Firebase バケットは、アプリを登録したのと同じ Firebase プロジェクトに存在する必要があります。
ファイルの Cloud Storage for Firebase URL は
gs://
で始まる必要があります。これは、すべての Google Cloud Storage URL が作成される方法です。ファイルの URL は「ブラウザ」の URL(インターネットで見つかった画像の URL など)にすることはできません。
また、バケットの Firebase Security Rules でファイルへの適切なアクセスを許可する必要があります。例:
公開ルールがある場合、すべてのユーザーまたはクライアントがファイルにアクセスし、Vertex AI in Firebase SDK を使用して呼び出しで URL を指定できます。このようなタイプのルールは、開始時と初期のプロトタイピング中にのみ使用してください(ファイルが実際に一般公開されるファイルである場合を除きます)。
堅牢なルール (強く推奨)がある場合、Firebase は、ログイン中のユーザーまたはクライアントがファイルに十分なアクセス権を持っていることを確認してから、指定された URL で呼び出しを許可します。
Vertex AI in Firebase で Cloud Storage for Firebase URL を使用する
ステップ 1: Cloud Storage for Firebase を設定する
Cloud Storage for Firebase の設定と使用に関する詳細な手順については、スタートガイドをご覧ください。
Cloud Storage for Firebase スタートガイドに移動
必要な大まかなタスクは次のとおりです。
Firebase プロジェクトに Cloud Storage for Firebase バケットを作成します。
Vertex AI in Firebase で使用する Cloud Storage バケットが Google Cloud プロジェクトにすでにある場合は、バケットを Firebase に「インポート」して、Firebase サービス(Vertex AI in Firebase を含む)からアクセスできるようにします。
このバケットに Firebase Security Rules を適用します。Firebase Security Rules は、承認されたエンドユーザーへのアクセスを制限することで、ファイルを保護します。
Cloud Storage for Firebase のクライアント ライブラリをアプリに追加します。
このタスクはスキップできますが、その場合はマルチモーダル リクエストに MIME タイプと Cloud Storage for Firebase URL 値を明示的に含める必要があります。常に
ステップ 2: バケットにファイルをアップロードする
Cloud Storage for Firebase のドキュメントでは、Cloud Storage for Firebase バケットにファイルをアップロードするさまざまな方法について説明しています。たとえば、エンドユーザーのデバイスからローカル ファイル(カメラの写真や動画など)をアップロードできます。
ファイルをバケットにアップロードすると、Cloud Storage は次の 2 つの情報を自動的にファイルに適用します。これらの値は、マルチモーダル リクエストに含める必要があります(このガイドの次のステップを参照)。
MIME タイプ: ファイルのメディアタイプ(
image/png
など)。Cloud Storage for Firebase は、アップロード時に MIME タイプを自動的に検出し、そのメタデータをバケット内のオブジェクトに適用します。ただし、必要に応じてアップロード時に MIME タイプを指定できます。Cloud Storage for Firebase URL: ファイルの一意の識別子。先頭は
gs://
でなければなりません。
ステップ 3: マルチモーダル リクエストにファイルの MIME タイプと URL を含める
ファイルを Cloud Storage for Firebase バケットに保存したら、その MIME タイプと Cloud Storage for Firebase URL をマルチモーダル リクエストに含めることができます。これらの例ではストリーミング以外の generateContent
リクエストを示していますが、ストリーミングとチャットで Cloud Storage for Firebase URL を使用することもできます。
リクエストにファイルを含めるには、次のいずれかのオプションを使用します。
オプション 2: MIME タイプと URL を明示的に含める
方法 1: Storage 参照を使用して MIME タイプと URL を含める
このオプションは、ファイルをバケットにアップロードしたばかりで、すぐに(Storage 参照を介して)マルチモーダル リクエストにファイルを含める場合に使用します。この呼び出しには、MIME タイプと Cloud Storage for Firebase URL の両方が必要です。
Kotlin+KTX
Kotlin の場合、この SDK のメソッドは suspend 関数であり、Coroutine スコープから呼び出す必要があります。// Upload an image file using Cloud Storage for Firebase.
val storageRef = Firebase.storage.reference.child("images/image.jpg")
val fileUri = Uri.fromFile(File("image.jpg"))
try {
val taskSnapshot = storageRef.putFile(fileUri).await()
// Get the MIME type and Cloud Storage for Firebase file path.
val mimeType = taskSnapshot.metadata?.contentType
val bucket = taskSnapshot.metadata?.bucket
val filePath = taskSnapshot.metadata?.path
if (mimeType != null && bucket != null) {
// Construct a URL in the required format.
val storageUrl = "gs://$bucket/$filePath"
// Construct a prompt that includes text, the MIME type, and the URL.
val prompt = content {
fileData(mimeType = mimeType, uri = storageUrl)
text("What's in this picture?")
}
// To generate text output, call generateContent with the prompt.
val response = generativeModel.generateContent(prompt)
println(response.text)
}
} catch (e: StorageException) {
// An error occurred while uploading the file.
} catch (e: GoogleGenerativeAIException) {
// An error occurred while generating text.
}
Java
Java の場合、この SDK のメソッドはListenableFuture
を返します。// Upload an image file using Cloud Storage for Firebase.
StorageReference storage = FirebaseStorage.getInstance().getReference("images/image.jpg");
Uri fileUri = Uri.fromFile(new File("images/image.jpg"));
storage.putFile(fileUri).addOnSuccessListener(taskSnapshot -> {
// Get the MIME type and Cloud Storage for Firebase file path.
String mimeType = taskSnapshot.getMetadata().getContentType();
String bucket = taskSnapshot.getMetadata().getBucket();
String filePath = taskSnapshot.getMetadata().getPath();
if (mimeType != null && bucket != null) {
// Construct a URL in the required format.
String storageUrl = "gs://" + bucket + "/" + filePath;
// Create a prompt that includes text, the MIME type, and the URL.
Content prompt = new Content.Builder()
.addFileData(storageUrl, mimeType)
.addText("What's in this picture?")
.build();
// To generate text output, call generateContent with the prompt.
GenerativeModelFutures modelFutures = GenerativeModelFutures.from(model);
ListenableFuture<GenerateContentResponse> response = modelFutures.generateContent(prompt);
Futures.addCallback(response, new FutureCallback<>() {
@Override
public void onSuccess(GenerateContentResponse result) {
String resultText = result.getText();
System.out.println(resultText);
}
@Override
public void onFailure(@NonNull Throwable t) {
t.printStackTrace();
}
}, executor);
}
}).addOnFailureListener(e -> {
// An error occurred while uploading the file.
e.printStackTrace();
});
オプション 2: MIME タイプと URL を明示的に含める
MIME タイプと Cloud Storage for Firebase URL の値がわかっていて、これらを明示的にマルチモーダル リクエストに含める場合は、このオプションを使用します。この呼び出しには、MIME タイプと URL の両方が必要です。
Kotlin+KTX
Kotlin の場合、この SDK のメソッドは suspend 関数であり、コルーチン スコープから呼び出す必要があります。// Construct a prompt that explicitly includes the MIME type and Cloud Storage for Firebase URL values.
val prompt = content {
fileData(mimeType = "image/jpeg", uri = "gs://bucket-name/path/image.jpg")
text("What's in this picture?")
}
// To generate text output, call generateContent with the prompt.
val response = generativeModel.generateContent(prompt)
println(response.text)
Java
Java の場合、この SDK のメソッドはListenableFuture
を返します。// Construct a prompt that explicitly includes the MIME type and Cloud Storage for Firebase URL values.
Content prompt = new Content.Builder()
.addFilePart("gs://bucket-name/path/image.jpg", "image/jpeg")
.addText("What's in this picture?")
.build();
// To generate text output, call generateContent with the prompt
GenerativeModelFutures modelFutures = GenerativeModelFutures.from(model);
ListenableFuture<GenerateContentResponse> response = modelFutures.generateContent(prompt);
Futures.addCallback(response, new FutureCallback<>() {
@Override
public void onSuccess(GenerateContentResponse result) {
String resultText = result.getText();
System.out.println(resultText);
}
@Override
public void onFailure(@NonNull Throwable t) {
t.printStackTrace();
}
}, executor);