Çok modlu isteklere büyük dosyaları dahil edin ve dosyaları Firebase için Cloud Storage'ı kullanarak yönetin

Vertex AI in Firebase SDK'sını kullanarak uygulamanızdan Gemini API'ü çağırırken Gemini modelinden çok modlu girişe dayalı metin oluşturmasını isteyebilirsiniz. Çok modlu istemler; resimlerle birlikte metin, PDF, video ve ses gibi birden fazla modaliteyi (veya giriş türlerini) içerebilir.

Girişin metin olmayan kısımlarında (ör. medya dosyaları) isteğe dosya eklemek için Cloud Storage for Firebase aracını kullanabilirsiniz. Bu özellik hakkında bilmeniz gerekenleri özetlemek gerekirse:

  • Cloud Storage for Firebase'ü her türlü çok modlu istekle (ör. metin oluşturma ve sohbet) kullanabilirsiniz. Bu kılavuzun örneklerinde temel bir metin ve resim girişi gösterilmektedir.

  • İstekte, dosyanın MIME türünü ve Cloud Storage for Firebase URL'sini (her zaman gs:// ile başlar) belirtirsiniz. Bu değerler, Cloud Storage paketine yüklenen tüm dosyalara otomatik olarak atanan meta verilerdir.

  • Desteklenen bir dosya türü ve URL kullanmanız gerekir.


Bu çözüm kılavuzunda, Cloud Storage for Firebase'yi nasıl ayarlayacağınız, uygulamanızdan bir Cloud Storage for Firebase paketine dosya yükleyeceğiniz ve ardından dosyanın MIME türünü ve Cloud Storage for Firebase URL'sini Gemini API'a göndereceğiniz çoklu modlu isteğinize nasıl ekleyeceğiniz açıklanmaktadır.

Kod örneklerini görmek ister misiniz? Yoksa Cloud Storage for Firebase kurulumunu yaptınız ve bunu çok modlu isteklerinizle kullanmaya hazır mısınız?

Kod örneklerine atlama

Uygulamanızla neden Cloud Storage for Firebase kullanmalısınız?

Cloud Storage for Firebase, blob'ları ve dosyaları depolamak için Google Cloud Storage ile aynı hızlı, güvenli ve ölçeklenebilir altyapıyı kullanır. Ayrıca istemci SDK'ları, mobil ve web uygulamaları için özel olarak tasarlanmıştır.

Vertex AI in Firebase SDK için maksimum istek boyutu 20 MB'tır. İstek çok büyükse HTTP 413 hatası alırsınız. Bir dosyanın boyutu, toplam istek boyutunu 20 MB'ı aşacaksa dosyayı çok modlu isteğinize dahil etmek için bir Cloud Storage for Firebase URL'si kullanın. Ancak dosya küçükse genellikle doğrudan satır içi veri olarak iletebilirsiniz (satır içi veri olarak sağlanan bir dosyanın aktarma sırasında base64 olarak kodlandığını ve bu nedenle isteğin boyutunun arttığını unutmayın).

Cloud Storage for Firebase kullanmanın bazı ek avantajları:

  • Son kullanıcıların doğrudan uygulamanızdan bir Cloud Storage for Firebase paketine resim yüklemesini sağlayabilirsiniz. Ardından dosyanın MIME türünü ve Cloud Storage for Firebase URL'sini (dosya için tanımlayıcı) belirterek bu resimleri çok modlu istemlerinize dahil edebilirsiniz.

  • Özellikle ağ kalitesi kötü veya kesintiliyse son kullanıcılarınıza, resim sağlamaları gerekiyorsa zaman ve bant genişliğinden tasarruf edebilirsiniz.

    • Dosya yükleme veya indirme işlemi kesintiye uğrarsa Cloud Storage for Firebase SDK'lar işlemi tam bıraktığı yerden otomatik olarak yeniden başlatır.
    • Yüklenen aynı dosya, son kullanıcının uygulamanızda her ihtiyaç duyduğunda (ör. yeni bir çok modlu istekte) aynı dosyayı yüklemesi gerekmeden birden çok kez kullanılabilir.
  • Yalnızca yetkili kullanıcıların dosya yüklemesine, indirmesine veya silmesine izin veren Firebase Security Rules özelliğini kullanarak son kullanıcıların Cloud Storage for Firebase'te depolanan dosyalara erişimini kısıtlayabilirsiniz.

  • Paketinizdeki dosyalara Firebase'den veya Google Cloud üzerinden erişebilirsiniz. Bu sayede, Google Cloud Storage API'lerini kullanarak görüntü filtreleme veya video kod dönüştürme gibi sunucu tarafı işlemler yapma esnekliğine sahip olursunuz.

Hangi dosya ve URL türleri desteklenir?

Cloud Storage for Firebase URL'lerini Vertex AI in Firebase SDK'larıyla kullanmak istediğinizde dosya ve URL'lerle ilgili gereksinimler şunlardır:

  • Dosya, Vertex AI in Firebase SDK'ları kullanılırken çoklu modlu istekler için giriş dosyalarının şartlarını karşılamalıdır. Buna MIME türü ve dosya boyutu gibi şartlar dahildir.

  • Dosya, Cloud Storage for Firebase paketinde depolanmalıdır (yani pakete Firebase Security Rules gibi Firebase hizmetlerinin erişebildiği anlamına gelir). Paketinizi Firebase konsolunda görüntüleyebiliyorsanız Cloud Storage for Firebase paketidir.

  • Cloud Storage for Firebase paketi, uygulamanızı kaydettiğiniz Firebase projesinde olmalıdır.

  • Dosyanın Cloud Storage for Firebase URL'si gs:// ile başlamalıdır. Tüm Google Cloud Storage URL'leri bu şekilde oluşturulur.

  • Dosyanın URL'si "tarayıcı" URL'si (ör. internette bulduğunuz bir resmin URL'si) olamaz.

Ayrıca, paketiniz için Firebase Security Rules, dosyaya uygun erişime izin vermelidir. Örneğin:

  • Herkese açık kurallarınız varsa herhangi bir kullanıcı veya istemci dosyaya erişebilir ve Vertex AI in Firebase SDK'sını kullanarak bir çağrıda dosyanın URL'sini sağlayabilir. Bu tür kurallar yalnızca başlangıçta ve erken prototip aşamasında kullanılmalıdır (dosyalar gerçekten herkese açık olarak erişilebilir dosyalar olmamalıdır).

  • Sağlam kurallarınız (önemle tavsiye edilir) varsa Firebase, sağlanan URL ile çağrının yapılmasına izin vermeden önce oturum açmış kullanıcının veya istemcinin dosyaya yeterli erişimi olup olmadığını kontrol eder.

Cloud Storage for Firebase URL'leri Vertex AI in Firebase ile kullan

1. adım: Cloud Storage for Firebase'yi ayarlayın

Cloud Storage for Firebase uygulamasının kurulumu ve kullanımıyla ilgili ayrıntılı talimatları başlangıç kılavuzunda bulabilirsiniz.

Cloud Storage for Firebase başlangıç kılavuzuna gidin

Yapmanız gereken üst düzey görevler şunlardır:

  1. Firebase projenizde bir Cloud Storage for Firebase paketi oluşturun.

    Google Cloud projenizde Vertex AI in Firebase ile kullanmak istediğiniz bir Cloud Storage paketiniz varsa paketi Firebase'e "içe aktararak" Firebase hizmetlerine (Vertex AI in Firebase dahil) erişilebilir hale getirebilirsiniz.

  2. Firebase Security Rules'yi bu pakete uygulayın. Firebase Security Rules, yetkilendirilmiş son kullanıcılara erişimi kısıtlayarak dosyalarınızın güvenliğini sağlamanıza yardımcı olur.

    .
  3. Cloud Storage for Firebase istemci kitaplığını uygulamanıza ekleyin.

    Bu görevi atlayabilirsiniz ancak bu durumda her zaman MIME türünü ve Cloud Storage for Firebase URL değerlerini çoklu modal isteklerinize açıkça eklemeniz gerekir.

2. Adım: Pakete dosya yükleyin

Cloud Storage for Firebase grubuna dosya yüklemenin tüm farklı yollarını Cloud Storage for Firebase dokümanlarında bulabilirsiniz. Örneğin, son kullanıcının cihazındaki yerel dosyaları (ör. kameradaki fotoğraf ve videolar) yükleyebilirsiniz.

Pakete dosya yüklediğinizde Cloud Storage, aşağıdaki iki bilgiyi dosyaya otomatik olarak uygular. Bu değerleri çok modlu isteğe eklemeniz gerekir (bu kılavuzun sonraki adımında gösterildiği gibi).

  • MIME türü: Dosyanın medya türüdür (örneğin, image/png). Cloud Storage for Firebase, yükleme sırasında MIME türünü otomatik olarak algılamaya çalışır ve bu meta verileri paketteki nesneye uygular. Ancak isteğe bağlı olarak yükleme sırasında MIME türünü belirtebilirsiniz.

  • Cloud Storage for Firebase URL'si: Dosyanın benzersiz tanımlayıcısıdır. URL, gs:// ile başlamalıdır.

3. adım: Dosyanın MIME türünü ve URL'sini çok modlu bir isteğe ekleyin

Cloud Storage for Firebase paketinde depolanan bir dosyanız olduğunda, çok modlu isteğe bu dosyanın MIME türünü ve Cloud Storage for Firebase URL'sini ekleyebilirsiniz. Bu örneklerde yayın yapmayan bir generateContent isteği gösterildiğini, ancak Cloud Storage for Firebase URL'lerini yayın ve sohbet için de kullanabileceğinizi unutmayın.

Dosyayı isteğe eklemek için aşağıdaki seçeneklerden birini kullanabilirsiniz:

1. Seçenek: Depolama alanı referansı kullanarak MIME türünü ve URL'yi ekleme

Dosyayı pakete yeni yüklediyseniz ve dosyayı çok modlu isteğe hemen dahil etmek istiyorsanız (Depolama referansıyla) bu seçeneği kullanın. Çağrı hem MIME türünü hem de Cloud Storage for Firebase URL'sini gerektirir.

Kotlin+KTX

Kotlin için bu SDK'daki yöntemler askıya alma işlevleridir ve Komut dizisi kapsamında çağrılmaları gerekir.
// 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 için bu SDK'daki yöntemler ListenableFuture döndürür.
// 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. Seçenek: MIME türünü ve URL'yi açıkça ekleyin

MIME türü ve Cloud Storage for Firebase URL'sinin değerlerini biliyor ve bunları çok modlu isteğe açıkça dahil etmek istiyorsanız bu seçeneği kullanın. Çağrıda hem MIME türü hem de URL gerekir.

Kotlin+KTX

Kotlin için bu SDK'daki yöntemler, askıya alma işlevleridir ve Kotlin kapsamında çağrılması gerekir.
// 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 için bu SDK'daki yöntemler ListenableFuture döndürür.
// 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);