Uwzględniaj duże pliki w żądaniach multimodalnych i zarządzaj plikami za pomocą Cloud Storage dla Firebase

Gdy wywołujesz Gemini API z aplikacji za pomocą pakietu SDK Vertex AI in Firebase, możesz poprosić model Gemini o wygenerowanie tekstu na podstawie danych wejściowych multimodalnych. Prompty multimodalne mogą zawierać wiele modalności (lub rodzajów danych wejściowych), np. tekst wraz z obrazami, plikami PDF, wideo i dźwiękowymi.

W przypadku części danych wejściowych innych niż tekst (np. plików multimedialnych) możesz opcjonalnie użyć znaku Cloud Storage for Firebase, aby uwzględnić pliki w żądaniu. Oto najważniejsze informacje o tej funkcji:

  • Możesz używać Cloud Storage for Firebase do obsługi dowolnych multimodalnych żądań (takich jak generowanie tekstu i czat). Przykłady w tym przewodniku pokazują podstawowe dane wejściowe w postaci tekstu i obrazu.

  • W danych wejściowych żądania określasz typ MIME pliku i jego adres URL Cloud Storage for Firebase (który zawsze zaczyna się od gs://). Te wartości to metadane automatycznie przypisywane do dowolnego pliku przesłanego do zasobnika Cloud Storage.

  • Musisz użyć obsługiwanego typu pliku i adresu URL.


Z tego przewodnika dowiesz się, jak skonfigurować Cloud Storage for Firebase, przesłać plik do zasobnika Cloud Storage for Firebase z aplikacji, a potem dołączyć typ MIME pliku i adres URL Cloud Storage for Firebase do żądania multimodalnego do Gemini API.

Czy chcesz zobaczyć przykłady kodu? A może masz już skonfigurowane Cloud Storage for Firebase i chcesz zacząć używać go do obsługi żądań multimodalnych?

Przejdź do przykładów kodu

Dlaczego warto używać Cloud Storage for Firebase w aplikacji?

Cloud Storage for Firebase korzysta z tej samej szybkiej, bezpiecznej i skalowalnej infrastruktury co Google Cloud Storage do przechowywania blobów i plików. Pakiety SDK klienta są tworzone specjalnie na potrzeby aplikacji mobilnych i internetowych.

W przypadku pakietów SDK Vertex AI in Firebase maksymalny rozmiar żądania to 20 MB. Jeśli żądanie jest zbyt duże, otrzymasz błąd HTTP 413. Jeśli rozmiar pliku spowoduje, że łączny rozmiar żądania przekroczy 20 MB, użyj adresu URL Cloud Storage for Firebase, aby uwzględnić plik w żądaniu multimodalnym. Jednak jeśli plik jest mały, często można go przekazać bezpośrednio jako dane wbudowane (pamiętaj jednak, że plik udostępniony jako dane wbudowane jest podczas przesyłania kodowany w formacie base64, co zwiększa rozmiar żądania).

Oto dodatkowe korzyści płynące z użycia Cloud Storage for Firebase:

  • Możesz umożliwić użytkownikom przesyłanie obrazów bezpośrednio z aplikacji do zasobnika Cloud Storage for Firebase, a potem dołączać je do swoich multimodalnych promptów, określając typ MIME pliku i adres URL zasobnika Cloud Storage for Firebase (który jest identyfikatorem pliku).

  • Jeśli użytkownicy muszą przesłać obrazy, możesz zaoszczędzić im czasu i przepustowości, zwłaszcza jeśli mają problemy z jakością połączenia.

    • Jeśli przesyłanie lub pobieranie pliku zostanie przerwane, Cloud Storage for Firebase SDK automatycznie wznowi działanie w miejscu, w którym zostało przerwane.
    • Przesłany plik może być używany wielokrotnie bez konieczności przesyłania go za każdym razem, gdy jest potrzebny w aplikacji (np. w przypadku nowego żądania multimodalnego).
  • Aby ograniczyć dostęp użytkowników do plików przechowywanych w usłudze Cloud Storage for Firebase, użyj funkcji Firebase Security Rules, która umożliwia przesyłanie, pobieranie i usuwanie plików tylko uprawnionym użytkownikom.

  • Do plików w Twoim zbiorniku możesz uzyskać dostęp z Firebase lub z poziomu Google Cloud, co daje Ci elastyczność w przetwarzaniu po stronie serwera, np. filtrowaniu obrazów czy transkodowaniu filmów za pomocą interfejsów API Google Cloud Storage.

Jakie typy plików i adresów URL są obsługiwane?

Oto wymagania dotyczące plików i adresów URL, które musisz spełnić, aby używać adresów URL Cloud Storage for Firebase z pakietami SDK Vertex AI in Firebase:

  • Podczas korzystania z pakietów SDK Vertex AI in Firebase plik musi spełniać wymagania dotyczące plików wejściowych w przypadku żądań multimodalnych. Dotyczy to wymagań takich jak typ MIME i rozmiar pliku.

  • Plik musi być przechowywany w zasobniku Cloud Storage for Firebase (co oznacza, że jest on dostępny dla usług Firebase, takich jak Firebase Security Rules). Jeśli możesz wyświetlić swój zasób w konsoli Firebase, oznacza to, że jest to zasób Cloud Storage for Firebase.

  • Zasobnik Cloud Storage for Firebase musi znajdować się w tym samym projekcie Firebase, w którym zarejestrowano aplikację.

  • Adres URL pliku Cloud Storage for Firebase musi zaczynać się od gs://, ponieważ w taki sposób budowane są wszystkie adresy URL Google Cloud Storage.

  • Adres URL pliku nie może być adresem „przeglądarki” (np. adresem URL obrazu znalezionego w internecie).

Dodatkowo Firebase Security Rules zasobnika musi zapewniać odpowiedni dostęp do pliku. Przykład:

  • Jeśli masz reguły publiczne, każdy użytkownik lub klient może uzyskać dostęp do pliku i podać jego adres URL w wywołaniu za pomocą pakietu SDK Vertex AI in Firebase. Tego typu reguł należy używać tylko na początku i podczas wczesnego prototypowania (chyba że pliki mają być całkowicie dostępne publicznie).

  • Jeśli masz solidne reguły (bardzo zalecane), Firebase sprawdzi, czy zalogowany użytkownik lub klient ma wystarczający dostęp do pliku, zanim zezwoli na wywołanie z podanym adresem URL.

Korzystanie z adresów URL Cloud Storage for Firebase w przypadku Vertex AI in Firebase

Krok 1. Skonfiguruj Cloud Storage for Firebase

Szczegółowe instrukcje konfigurowania i używania usługi Cloud Storage for Firebase znajdziesz w przewodniku dla początkujących.

Otwórz Cloud Storage for Firebase – przewodnik dla początkujących

Oto ogólne czynności, które musisz wykonać:

  1. Utwórz zasobnik Cloud Storage for Firebase w projekcie Firebase.

    Jeśli w projekcie Google Cloud masz już folder Cloud Storage, którego chcesz używać w ramach usługi Vertex AI in Firebase, możesz udostępnić go usługom Firebase (w tym Vertex AI in Firebase), „importując” go do Firebase.

  2. Zastosuj Firebase Security Rules do tego zasobnika. Firebase Security Rules ułatwiają zabezpieczanie plików przez ograniczanie dostępu do nich autoryzowanym użytkownikom.

  3. Dodaj do aplikacji bibliotekę klienta Cloud Storage for Firebase.

    Pamiętaj, że możesz pominąć to zadanie, ale wtedy zawsze musisz wyraźnie uwzględniać w multimodalnych żądaniach wartości typu MIME i adresu URL Cloud Storage for Firebase.

Krok 2. Prześlij plik do zasobnika

W dokumentacji Cloud Storage for Firebase znajdziesz wszystkie sposoby przesyłania plików do segmentu Cloud Storage for Firebase. Możesz na przykład przesyłać z urządzenia użytkownika pliki lokalne, takie jak zdjęcia i filmy z aparatu.

Gdy przesyłasz plik do zasobnika, Cloud Storage automatycznie stosuje do pliku te 2 rodzaje informacji. Musisz uwzględnić te wartości w żądaniu multimodalnym (jak pokazano w następnym kroku tego przewodnika).

  • Typ MIME: to typ nośnika pliku (np. image/png). Cloud Storage for Firebase spróbuje automatycznie wykryć typ MIME podczas przesyłania i zastosować te metadane do obiektu w zasobniku. Opcjonalnie możesz jednak podać typ MIME podczas przesyłania.

  • Cloud Storage for Firebase URL: unikalny identyfikator pliku. Adres URL musi zaczynać się od gs://.

Krok 3. Uwzględnij typ MIME i adres URL pliku w żądaniu multimodalnym

Po zapisaniu pliku w zasośniku Cloud Storage for Firebase możesz uwzględnić jego typ MIME i adres URL Cloud Storage for Firebase w żądaniu multimodalnym. Pamiętaj, że te przykłady pokazują żądanie generateContent bez strumieniowego przesyłania danych, ale możesz też używać adresów URL Cloud Storage for Firebase z czatem i strumieniowym przesyłaniem danych.

Aby dołączyć plik do żądania, możesz użyć jednej z tych opcji:

Opcja 1. Uwzględnij typ MIME i adres URL za pomocą odwołania do Storage

Użyj tej opcji, jeśli plik został właśnie przesłany do zasobnika i chcesz go od razu uwzględnić (za pomocą odwołania do Storage) w prośbie multimodalnej. Wywołanie wymaga podania typu MIME i adresu URL Cloud Storage for Firebase.

Kotlin+KTX

W przypadku Kotlina metody w tym pakiecie SDK są funkcjami zawieszającymi i muszą być wywoływane z zakresu współbieżności.
// 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

W przypadku Javy metody w tym pakiecie SDK zwracają 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();
});

Opcja 2. Wyraźnie podaj typ MIME i adres URL

Użyj tej opcji, jeśli znasz wartości typu MIME i adresu URL Cloud Storage for Firebase i chcesz je wyraźnie uwzględnić w prośbie multimodalnej. Wywołanie wymaga podania zarówno typu MIME, jak i adresu URL.

Kotlin+KTX

W przypadku Kotlin metody w tym pakiecie SDK są funkcjami zawieszania i trzeba je wywoływać z zakresu Coroutine.
// 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

W przypadku Javy metody w tym pakiecie SDK zwracają 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);