Ç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 göre metin oluşturmasını isteyebilirsiniz. Çok modlu istemler, resimler, PDF'ler, video ve ses gibi birden fazla mod (veya giriş türü) içerebilir.

Girişteki metin olmayan bölümler (medya dosyaları gibi) için isteğe dosya eklemek üzere isteğe bağlı olarak Cloud Storage for Firebase 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? Cloud Storage for Firebase'ü zaten ayarladıysanız ve ç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'ları 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 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 resimleri doğrudan uygulamanızdan bir Cloud Storage for Firebase paketine yüklemesini sağlayabilir ve ardından bu resimleri, dosyanın MIME türünü ve Cloud Storage for Firebase URL'sini (dosyanın tanımlayıcısıdır) belirterek çoklu modal istemlerinize dahil edebilirsiniz.

  • Özellikle ağ kalitesi düşük veya kararsız olan son kullanıcılarınıza resim sağlamaları gerekiyorsa onlara zaman ve bant genişliği kazandırabilirsiniz.

    • 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'ten erişebilirsiniz. Bu sayede, Google Cloud Storage API'lerini kullanarak resim filtreleme veya video kod dönüştürme gibi sunucu tarafı işlemleri 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şebilmesi gerekir). 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 varsa (önemle tavsiye edilir) 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'lerini Vertex AI in Firebase ile kullanma

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

Cloud Storage for Firebase'ü ayarlama ve kullanmayla 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 dosyasını 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: Bir klasöre dosya yükleyin

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

Bir dosyayı bir pakete yüklediğinizde Cloud Storage, dosyaya aşağıdaki iki bilgiyi 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 gruplarında depolanan dosyaların MIME türlerini ve Cloud Storage for Firebase URL'lerini çok modlu bir isteğe dahil edebilirsiniz. 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ı hemen (Depolama alanı referansı aracılığıyla) çok modlu isteğe dahil etmek istiyorsanız bu seçeneği kullanın. Arama için hem MIME türü hem de Cloud Storage for Firebase URL'si gerekir.

Kotlin+KTX

Kotlin için bu SDK'daki yöntemler askıya alma işlevleridir ve koşullu akış kapsamından ç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 koşullu akış kapsamından çağrılmaları 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);