Große Dateien in multimodale Anfragen einbeziehen und Dateien mit Cloud Storage for Firebase verwalten

Wenn Sie die Gemini API über ein Vertex AI in Firebase SDK aus Ihrer App aufrufen, können Sie das Gemini-Modell auffordern, Text basierend auf einer multimodalen Eingabe zu generieren. Multimodale Prompts können mehrere Modalitäten (oder Eingabetypen) umfassen, z. B. Text sowie Bilder, PDFs, Video und Audio.

Für die nicht textbasierten Teile der Eingabe (z. B. Mediendateien) können Sie optional Cloud Storage for Firebase verwenden, um Dateien in die Anfrage aufzunehmen. Im Folgenden finden Sie eine allgemeine Übersicht über diese Funktion:

  • Sie können Cloud Storage for Firebase mit jeder multimodalen Anfrage verwenden, z. B. für die Textgenerierung und den Chat. Die Beispiele in diesem Leitfaden zeigen eine einfache Text- und Bildeingabe.

  • Geben Sie in der Anfrageeingabe den MIME-Typ der Datei und die Cloud Storage for Firebase-URL (die immer mit gs:// beginnt) an. Diese Werte sind Metadaten, die jeder Datei automatisch zugewiesen werden, die in einen Cloud Storage-Bucket hochgeladen wird.

  • Sie müssen einen unterstützten Dateityp und eine unterstützte URL verwenden.


In dieser Lösungsanleitung wird beschrieben, wie Sie Cloud Storage for Firebase einrichten, eine Datei aus Ihrer App in einen Cloud Storage for Firebase-Bucket hochladen und dann den MIME-Typ der Datei und die Cloud Storage for Firebase-URL in Ihre multimodale Anfrage an die Gemini API einfügen.

Möchten Sie sich die Codebeispiele ansehen? Oder haben Sie Cloud Storage for Firebase bereits eingerichtet und können es jetzt für Ihre multimodalen Anfragen verwenden?

Zu den Codebeispielen springen

Warum sollten Sie Cloud Storage for Firebase in Ihrer App verwenden?

Cloud Storage for Firebase verwendet dieselbe schnelle, sichere und skalierbare Infrastruktur wie Google Cloud Storage zum Speichern von Blobs und Dateien. Die Client-SDKs sind speziell für mobile und Webanwendungen entwickelt.

Für Vertex AI in Firebase-SDKs beträgt die maximale Anfragegröße 20 MB. Wenn eine Anfrage zu groß ist, erhalten Sie den HTTP-Fehler 413. Wenn die Größe einer Datei die Gesamtgröße der Anfrage auf über 20 MB ansteigen lässt, verwenden Sie eine Cloud Storage for Firebase-URL, um die Datei in Ihre multimodale Anfrage aufzunehmen. Wenn eine Datei jedoch klein ist, können Sie sie oft direkt als Inline-Daten übergeben. Beachten Sie jedoch, dass eine Datei, die als Inline-Daten bereitgestellt wird, während der Übertragung in Base64 codiert wird, was die Größe der Anfrage erhöht.

Weitere Vorteile von Cloud Storage for Firebase:

  • Sie können Endnutzer bitten, Bilder direkt über Ihre App in einen Cloud Storage for Firebase-Bucket hochzuladen. Anschließend können Sie diese Bilder in Ihre multimodalen Prompts einbinden, indem Sie einfach den MIME-Typ der Datei und die Cloud Storage for Firebase-URL (eine Kennung für die Datei) angeben.

  • Sie können Ihren Endnutzern Zeit und Bandbreite sparen, wenn sie Bilder zur Verfügung stellen müssen, insbesondere wenn die Netzwerkqualität schlecht oder unzuverlässig ist.

    • Wenn ein Dateiupload oder -download unterbrochen wird, starten die Cloud Storage for Firebase-SDKs den Vorgang automatisch an der Stelle fort, an der er unterbrochen wurde.
    • Die gleiche hochgeladene Datei kann mehrmals verwendet werden, ohne dass der Endnutzer sie jedes Mal hochladen muss, wenn sie in Ihrer App benötigt wird (z. B. bei einer neuen multimodalen Anfrage).
  • Sie können den Zugriff von Endnutzern auf in Cloud Storage for Firebase gespeicherte Dateien mithilfe von Firebase Security Rules einschränken. So kann nur ein autorisierter Nutzer Dateien hochladen, herunterladen oder löschen.

  • Sie können über Firebase oder Google Cloud auf die Dateien in Ihrem Bucket zugreifen. So haben Sie die Flexibilität, serverseitige Verarbeitungen wie Bildfilterung oder Videotranscodierung mithilfe der Google Cloud Storage APIs durchzuführen.

Welche Dateitypen und URLs werden unterstützt?

Hier sind die Anforderungen an Dateien und URLs, wenn du Cloud Storage for Firebase-URLs mit den Vertex AI in Firebase-SDKs verwenden möchtest:

  • Die Datei muss die Anforderungen an Eingabedateien für multimodale Anfragen erfüllen, wenn Sie die Vertex AI in Firebase SDKs verwenden. Dazu gehören Anforderungen wie MIME-Typ und Dateigröße.

  • Die Datei muss in einem Cloud Storage for Firebase-Bucket gespeichert sein. Das bedeutet, dass auf den Bucket von Firebase-Diensten wie Firebase Security Rules zugegriffen werden kann. Wenn Sie Ihren Bucket in der Firebase-Konsole sehen können, ist es ein Cloud Storage for Firebase-Bucket.

  • Der Cloud Storage for Firebase-Bucket muss sich im selben Firebase-Projekt befinden, in dem Sie Ihre App registriert haben.

  • Die Cloud Storage for Firebase-URL der Datei muss mit gs:// beginnen. So werden alle Google Cloud Storage-URLs aufgebaut.

  • Die URL der Datei darf keine Browser-URL sein, z. B. die URL eines Bildes, das Sie im Internet gefunden haben.

Außerdem muss die Firebase Security Rules für Ihren Bucket den entsprechenden Zugriff auf die Datei zulassen. Beispiel:

  • Wenn du öffentliche Regeln hast, kann jeder Nutzer oder Kunde auf die Datei zugreifen und die URL in einem Aufruf mit einem Vertex AI in Firebase SDK angeben. Diese Arten von Regeln sollten nur zu Beginn und während des frühen Prototyping verwendet werden, es sei denn, die Dateien sollen tatsächlich vollständig öffentlich zugänglich sein.

  • Wenn Sie robuste Regeln (dringend empfohlen) haben, prüft Firebase, ob der angemeldete Nutzer oder Client ausreichenden Zugriff auf die Datei hat, bevor der Aufruf über die angegebene URL zugelassen wird.

Cloud Storage for Firebase-URLs mit Vertex AI in Firebase verwenden

Schritt 1: Cloud Storage for Firebase einrichten

Eine ausführliche Anleitung zum Einrichten und Verwenden von Cloud Storage for Firebase finden Sie im Startleitfaden.

Cloud Storage for Firebase Startleitfaden

Hier sind die wichtigsten Aufgaben, die Sie erledigen müssen:

  1. Erstellen Sie einen Cloud Storage for Firebase-Bucket in Ihrem Firebase-Projekt.

    Wenn Sie in Ihrem Google Cloud-Projekt bereits einen Cloud Storage-Bucket haben, den Sie mit Vertex AI in Firebase verwenden möchten, können Sie ihn für Firebase-Dienste (einschließlich Vertex AI in Firebase) zugänglich machen, indem Sie den Bucket in Firebase importieren.

  2. Wenden Sie Firebase Security Rules auf diesen Bucket an. Firebase Security Rules können Sie Ihre Dateien schützen, indem Sie den Zugriff auf autorisierte Endnutzer beschränken.

  3. Fügen Sie Ihrer App die Clientbibliothek für Cloud Storage for Firebase hinzu.

    Sie können diese Aufgabe überspringen, müssen dann aber immer den MIME-Typ und die Cloud Storage for Firebase-URL-Werte in Ihre multimodalen Anfragen aufnehmen.

Schritt 2: Datei in einen Bucket hochladen

In der Cloud Storage for Firebase-Dokumentation erfahren Sie, wie Sie Dateien in einen Cloud Storage for Firebase-Bucket hochladen. Sie können beispielsweise lokale Dateien vom Gerät des Endnutzers hochladen, z. B. Fotos und Videos von der Kamera.

Wenn Sie eine Datei in einen Bucket hochladen, wendet Cloud Storage automatisch die folgenden beiden Informationen auf die Datei an. Sie müssen diese Werte in die multimodale Anfrage aufnehmen (wie im nächsten Schritt dieses Leitfadens gezeigt).

  • MIME-Typ: Dies ist der Medientyp der Datei (z. B. image/png). Cloud Storage for Firebase versucht beim Hochladen automatisch, den MIME-Typ zu ermitteln und diese Metadaten auf das Objekt im Bucket anzuwenden. Sie können den MIME-Typ jedoch optional während des Uploads angeben.

  • Cloud Storage for Firebase-URL: Eine eindeutige Kennung für die Datei. Die URL muss mit gs:// beginnen.

Schritt 3: MIME-Typ und URL der Datei in eine multimodale Anfrage aufnehmen

Sobald Sie eine Datei in einem Cloud Storage for Firebase-Bucket gespeichert haben, können Sie den MIME-Typ und die Cloud Storage for Firebase-URL in eine multimodale Anfrage aufnehmen. In diesen Beispielen wird eine generateContent-Anfrage ohne Streaming gezeigt. Du kannst Cloud Storage for Firebase-URLs aber auch für Streaming und Chat verwenden.

Sie haben folgende Möglichkeiten, die Datei in die Anfrage aufzunehmen:

Option 1: MIME-Typ und URL mit einem Speicherbezug angeben

Verwenden Sie diese Option, wenn Sie die Datei gerade in den Bucket hochgeladen haben und sie sofort (über eine Speicherreferenz) in die multimodale Anfrage aufnehmen möchten. Für den Aufruf sind sowohl der MIME-Typ als auch die Cloud Storage for Firebase-URL erforderlich.

Kotlin

In Kotlin sind die Methoden in diesem SDK Suspend-Funktionen und müssen aus einem Coroutine-Kontext aufgerufen werden.
// 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

Bei Java geben die Methoden in diesem SDK eine ListenableFuture zurück.
// 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();
});

Option 2: MIME-Typ und URL explizit angeben

Verwenden Sie diese Option, wenn Sie die Werte für den MIME-Typ und die Cloud Storage for Firebase-URL kennen und sie explizit in die multimodale Anfrage aufnehmen möchten. Für den Aufruf sind sowohl der MIME-Typ als auch die URL erforderlich.

Kotlin

In Kotlin sind die Methoden in diesem SDK Suspend-Funktionen und müssen aus einem Coroutine-Kontext aufgerufen werden.
// 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

Bei Java geben die Methoden in diesem SDK eine ListenableFuture zurück.
// 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);