הוספת קבצים גדולים לבקשות עם מודלים מרובים לזיהוי (multimodal) וניהול קבצים באמצעות Cloud Storage for Firebase

כשאתם קוראים ל-Gemini API מהאפליקציה באמצעות SDK של Vertex AI in Firebase, אתם יכולים להנחות את מודל Gemini ליצור טקסט על סמך קלט רב-מודלי. הנחיות מרובה-מצבים יכולות לכלול כמה מודלים (או סוגי קלט), כמו טקסט עם תמונות, קובצי PDF, וידאו ואודיו.

בחלקים של הקלט שאינם טקסט (כמו קובצי מדיה), אפשר להשתמש ב-Cloud Storage for Firebase כדי לכלול קבצים בבקשה. באופן כללי, זה מה שצריך לדעת על התכונה הזו:

  • אפשר להשתמש ב-Cloud Storage for Firebase בכל בקשה עם כמה מודלים (כמו יצירת טקסט וצ'אט). בדוגמאות במדריך הזה מוצגת קלט בסיסי של טקסט ותמונה.

  • צריך לציין את סוג ה-MIME של הקובץ ואת כתובת ה-URL‏ Cloud Storage for Firebase שלו (שתמיד מתחילה ב-gs://) בקלט הבקשה. הערכים האלה מוקצים באופן אוטומטי לכל קובץ שהועלה לקטגוריית Cloud Storage.

  • צריך להשתמש בסוג קובץ וכתובת URL נתמכים.


במדריך הפתרון הזה מוסבר איך להגדיר את Cloud Storage for Firebase, להעלות קובץ לקטגוריה (bucket) Cloud Storage for Firebase מהאפליקציה ואז לכלול את סוג ה-MIME של הקובץ וכתובת ה-URL של Cloud Storage for Firebase בבקשה הרב-מודאלית ל-Gemini API.

רוצה לראות את דוגמאות הקוד? או שאולי כבר הגדרתם את Cloud Storage for Firebase ואתם מוכנים להתחיל להשתמש בו בבקשות שלכם עם מגוון מודלים?

מעבר לדוגמאות הקוד

למה כדאי להשתמש ב-Cloud Storage for Firebase באפליקציה?

Cloud Storage for Firebase משתמש באותה תשתית מהירה, מאובטחת וניתנת להתאמה כמו Google Cloud Storage לאחסון blobs וקובצי, וערכות ה-SDK של הלקוח שלו מיועדות במיוחד לאפליקציות לנייד ולאינטרנט.

ב-SDK של Vertex AI in Firebase, גודל הבקשה המקסימלי הוא 20MB. אם הבקשה גדולה מדי, תקבלו שגיאת HTTP 413. אם גודל הקובץ יגרום לגודל הבקשה הכולל לחרוג מ-20MB, צריך להשתמש בכתובת URL מסוג Cloud Storage for Firebase כדי לכלול את הקובץ בבקשה הרב-מודאלית. עם זאת, אם הקובץ קטן, בדרך כלל אפשר להעביר אותו ישירות כנתונים בקוד (עם זאת, חשוב לזכור שקובץ שסופק כנתונים בקוד מקודד ל-base64 במעבר, וכך גדל גודל הבקשה).

אלה כמה יתרונות נוספים של השימוש ב-Cloud Storage for Firebase:

  • אפשר לבקש ממשתמשי הקצה להעלות תמונות ישירות מהאפליקציה לקטגוריה של Cloud Storage for Firebase, ואז לכלול את התמונות האלה בהנחיות שנשלחות במגוון שיטות פשוט על ידי ציון סוג ה-MIME של הקובץ וכתובת ה-URL של Cloud Storage for Firebase (שהן מזהה של הקובץ).

  • אם לקוחות הקצה צריכים לספק תמונות, תוכלו לחסוך להם זמן ורוחבי פס, במיוחד אם איכות הרשת שלהם נמוכה או לא יציבה.

    • אם העלאה או הורדה של קובץ מופסקות, ערכות ה-SDK של Cloud Storage for Firebase מתחילות מחדש את הפעולה באופן אוטומטי מהמקום שבו היא הופסקה.
    • אפשר להשתמש באותו קובץ שהועלו כמה פעמים, בלי שמשתמש הקצה יצטרך להעלות את אותו קובץ בכל פעם שהוא נדרש באפליקציה (למשל, בבקשה חדשה עם כמה שיטות להזנת נתונים).
  • אפשר להגביל את הגישה של משתמשי הקצה לקבצים שמאוחסנים ב-Cloud Storage for Firebase באמצעות Firebase Security Rules, שמאפשרת רק למשתמש מורשה להעלות, להוריד או למחוק קבצים.

  • אפשר לגשת לקבצים שבקטגוריה מ-Firebase או מ-Google Cloud, וכך לבצע עיבוד בצד השרת, כמו סינון תמונות או המרת קידוד של סרטונים, באמצעות ממשקי ה-API של Google Cloud Storage.

אילו סוגי קבצים וכתובות URL נתמכים?

אלה הדרישות לגבי קבצים וכתובות URL כשרוצים להשתמש בכתובות URL מסוג Cloud Storage for Firebase עם ערכות ה-SDK של Vertex AI in Firebase:

  • כשמשתמשים ב-SDKs של Vertex AI in Firebase, הקובץ צריך לעמוד בדרישות של קובצי קלט לבקשות עם כמה מודלים. הדרישות האלה כוללות, למשל, סוג MIME וגודל הקובץ.

  • הקובץ צריך להיות מאוחסן בקטגוריה (bucket) מסוג Cloud Storage for Firebase (כלומר, הקטגוריה צריכה להיות נגישה לשירותי Firebase, כמו Firebase Security Rules). אם אתם יכולים לראות את הקטגוריה במסוף Firebase, סימן שמדובר בקטגוריה מסוג Cloud Storage for Firebase.

  • הקטגוריה Cloud Storage for Firebase צריכה להיות באותו פרויקט Firebase שבו רשמתם את האפליקציה.

  • כתובת ה-URL Cloud Storage for Firebase של הקובץ חייבת להתחיל ב-gs://, כי כך נוצרות כל כתובות ה-URL מסוג Google Cloud Storage.

  • כתובת ה-URL של הקובץ לא יכולה להיות כתובת URL של 'דפדפן' (לדוגמה, כתובת ה-URL של תמונה שנמצאת באינטרנט).

בנוסף, ה-Firebase Security Rules של הקטגוריה צריך לאפשר גישה מתאימה לקובץ. לדוגמה:

  • אם יש לכם כללים ציבוריים, כל משתמש או לקוח יכול לגשת לקובץ ולספק את כתובת ה-URL שלו בקריאה באמצעות Vertex AI in Firebase SDK. יש להשתמש בסוגים האלה של כללים רק כדי להתחיל לעבוד ובשלבי האב-טיפוס המוקדמים (אלא אם הקבצים מיועדים להיות קבצים שיהיו נגישים לכולם).

  • אם יש לכם כללים חזקים (מומלץ מאוד), מערכת Firebase תבדוק שלמשתמש או ללקוח שמחוברים לחשבון יש גישה מספקת לקובץ לפני שתאפשר את העברת הקריאה עם כתובת ה-URL שצוינה.

שימוש בכתובות URL מסוג Cloud Storage for Firebase עם Vertex AI in Firebase

שלב 1: מגדירים את Cloud Storage for Firebase

במדריך לתחילת העבודה תוכלו למצוא הוראות מפורטות להגדרה של Cloud Storage for Firebase ולשימוש בו.

למדריך לתחילת העבודה ב-Cloud Storage for Firebase

אלה המשימות ברמה גבוהה שצריך לבצע:

  1. יוצרים קטגוריה Cloud Storage for Firebase בפרויקט Firebase.

    אם כבר יש לכם קטגוריה Cloud Storage בפרויקט Google Cloud שבה אתם רוצים להשתמש עם Vertex AI in Firebase, תוכלו להפוך אותה לנגישה לשירותי Firebase (כולל Vertex AI in Firebase) על ידי "ייבוא" של הקטגוריה ל-Firebase.

  2. מחילים את Firebase Security Rules על הקטגוריה הזו. Firebase Security Rules עוזרים לכם לאבטח את הקבצים על ידי הגבלת הגישה של משתמשי קצה מורשים.

  3. מוסיפים לאפליקציה את ספריית הלקוח של Cloud Storage for Firebase.

    שימו לב שאפשר לדלג על המשימה הזו, אבל אם תעשו זאת, תצטרכו תמיד לכלול במפורש את סוג ה-MIME ואת ערכי כתובת ה-URL של Cloud Storage for Firebase בבקשות הרב-מודליות.

שלב 2: מעלים קובץ לקטגוריה

במסמכי העזרה של Cloud Storage for Firebase מפורטות כל הדרכים השונות להעלאת קבצים לקטגוריה של Cloud Storage for Firebase. לדוגמה, אפשר להעלות קבצים מקומיים מהמכשיר של משתמש הקצה, כמו תמונות וסרטונים מהמצלמה.

כשמעלים קובץ לקטגוריה, Cloud Storage מחיל על הקובץ באופן אוטומטי את שני פרטי המידע הבאים. תצטרכו לכלול את הערכים האלה בבקשה הרב-מודאלית (כפי שמתואר בשלב הבא במדריך הזה).

  • סוג MIME: זהו סוג המדיה של הקובץ (לדוגמה, image/png). Cloud Storage for Firebase ינסה לזהות את סוג ה-MIME באופן אוטומטי במהלך ההעלאה ולהחיל את המטא-נתונים האלה על האובייקט בקטגוריה. עם זאת, אפשר לציין את סוג ה-MIME במהלך ההעלאה.

  • כתובת ה-URL של Cloud Storage for Firebase: זהו מזהה ייחודי של הקובץ. כתובת ה-URL חייבת להתחיל במחרוזת gs://.

שלב 3: כוללים את סוג ה-MIME ואת כתובת ה-URL של הקובץ בבקשה רב-מודאלית

אחרי שמאחסנים קובץ בקטגוריה Cloud Storage for Firebase, אפשר לכלול את סוג ה-MIME ואת כתובת ה-URL של Cloud Storage for Firebase בבקשה עם כמה מודלים. חשוב לזכור שבדוגמאות האלה מוצגת בקשת generateContent ללא סטרימינג, אבל אפשר להשתמש גם בכתובות URL מסוג Cloud Storage for Firebase עם סטרימינג וצ'אט.

כדי לכלול את הקובץ בבקשה, אפשר להשתמש באחת מהאפשרויות הבאות:

אפשרות 1: כוללים את סוג ה-MIME ואת כתובת ה-URL באמצעות קובץ עזר של אחסון

האפשרות הזו מתאימה אם העליתם לאחרונה את הקובץ לקטגוריה ואתם רוצים לכלול אותו באופן מיידי (דרך הפניה של Storage) בבקשה לכמה מצבים. בקריאה נדרשים גם סוג ה-MIME וגם כתובת ה-URL של Cloud Storage for Firebase.

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 וכתובת ה-URL‏ Cloud Storage for Firebase, ואתם רוצים לכלול אותם במפורש בבקשה הרב-מודאלית. בקריאה נדרשים גם סוג ה-MIME וגם כתובת ה-URL.

Kotlin+KTX

ב-Kotlin, השיטות ב-SDK הזה הן פונקציות השהיה (suspend), וצריך לקרוא להן מהיקף של פונקציית אירוע (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

ב-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);