יצירה וחיפוש של הטמעות מולטי-מודאליות

במדריך הזה נסביר איך ליצור הטמעות מולטי-מודאליות לתמונות ולטקסט באמצעות BigQuery ו-Gemini Enterprise Agent Platform, ואז להשתמש בהטמעות האלה כדי לבצע חיפוש סמנטי של תמונות לפי טקסט.

במדריך הזה מוסבר איך לבצע את הפעולות הבאות:

במדריך הזה משתמשים בתמונות של יצירות אומנות בנחלת הכלל ממוזיאון המטרופוליטן לאומנות, שזמינות בקטגוריה הציבורית של Cloud Storage‏ gcs-public-data--met.

התפקידים הנדרשים

כדי להריץ את המדריך הזה, אתם צריכים את התפקידים הבאים בניהול הזהויות והרשאות הגישה (IAM):

  • יצירה ושימוש במערכי נתונים, בחיבורים, במודלים וב-notebooks ב-BigQuery: אדמין ב-BigQuery Studio‏ (roles/bigquery.studioAdmin).
  • נותנים הרשאות לחשבון השירות של החיבור: אדמין IAM של פרויקט (roles/resourcemanager.projectIamAdmin).

התפקידים המוגדרים מראש האלה מכילים את ההרשאות שנדרשות כדי לבצע את המשימות שמפורטות במאמר הזה. כדי לראות את ההרשאות הנדרשות, מרחיבים את הקטע Required Permissions:

ההרשאות הנדרשות

  • יוצרים מערך נתונים: bigquery.datasets.create
  • יצירה, הקצאה ושימוש בחיבור: bigquery.connections.*
  • מגדירים את חיבור ברירת המחדל: bigquery.config.*
  • מגדירים את ההרשאות של חשבון השירות: resourcemanager.projects.getIamPolicy וגם resourcemanager.projects.setIamPolicy
  • יוצרים טבלת אובייקטים: bigquery.tables.create וגם bigquery.tables.update
  • יוצרים מודל ומריצים הסקה:
    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.models.updateMetadata
  • ליצור תיקיות Notebook ולהשתמש בהן:
    • resourcemanager.projects.get
    • resourcemanager.projects.list
    • bigquery.config.get
    • bigquery.jobs.create
    • bigquery.readsessions.create
    • bigquery.readsessions.getData
    • bigquery.readsessions.update
    • dataform.locations.get
    • dataform.locations.list
    • dataform.repositories.create

      .
    • dataform.repositories.list
    • dataform.collections.create
    • dataform.collections.list
    • aiplatform.notebookRuntimeTemplates.apply
    • aiplatform.notebookRuntimeTemplates.get
    • aiplatform.notebookRuntimeTemplates.list
    • aiplatform.notebookRuntimeTemplates.getIamPolicy
    • aiplatform.notebookRuntimes.assign
    • aiplatform.notebookRuntimes.get
    • aiplatform.notebookRuntimes.list
    • aiplatform.operations.list
    • aiplatform.notebookRuntimeTemplates.apply

יכול להיות שתוכלו לקבל את ההרשאות האלה גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Cloud de Confiance by S3NS, והשימוש בהם כרוך בתשלום:

  • BigQuery ML: You incur costs for the data that you process in BigQuery.
  • Gemini Enterprise Agent Platform: You incur costs for calls to the Agent Platform service that's represented by the remote model.

למידע נוסף על התמחור של BigQuery, קראו את המאמר התמחור של BigQuery במרכז העזרה של BigQuery.

למידע נוסף על התמחור של Agent Platform, קראו את המאמר התמחור של Agent Platform.

לפני שמתחילים

  1. בדף לבחירת הפרויקט במסוף Cloud de Confiance , בוחרים פרויקט ב- Cloud de Confiance או יוצרים אותו.

    התפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • בחירת פרויקט: כדי לבחור פרויקט לא נדרש תפקיד IAM ספציפי – אתם יכולים לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד "יצירת פרויקטים" (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים?

    כניסה לדף לבחירת הפרויקט

  2. מוודאים שהחיוב מופעל בפרויקט ב- Cloud de Confiance .

  3. מפעילים את ממשקי ה-API הבאים, אם הם עדיין לא מופעלים: BigQuery,‏ BigQuery Connection ו-Agent Platform API.

    התפקידים שנדרשים כדי להפעיל ממשקי API

    כדי להפעיל ממשקי API, צריך את ההרשאה serviceusage.services.enable. אם אתם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד "בעלים" (roles/owner). אחרת, אתם יכולים לקבל את ההרשאה הזו דרך התפקיד "אדמין בממשק 'שימוש בשירות'" (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים?

    הפעלת ממשקי ה-API

יצירת קבוצת נתונים

כדי ליצור מערך נתונים ב-BigQuery, בוחרים אחת מהאפשרויות הבאות:

המסוף

  1. נכנסים לדף BigQuery במסוף Cloud de Confiance .

    כניסה ל-BigQuery

  2. בחלונית הימנית, לוחצים על Explorer:

    כפתור מודגש לחלונית Explorer.

    אם החלונית הימנית לא מוצגת, לוחצים על Expand left pane כדי לפתוח אותה.

  3. ב-Explorer, מרחיבים את הפרויקט ולוחצים על Datasets.

  4. בדף Datasets, לוחצים על Create dataset.

  5. בחלונית Create dataset:

    • בשדה Dataset ID, מזינים bqml_tutorial.

    • בקטע Data location (מיקום הנתונים), בוחרים באפשרות US (ארה"ב).

    משאירים את שאר הגדרות ברירת המחדל כמו שהן.

  6. לוחצים על Create dataset.

BQ

כדי ליצור קבוצת נתונים חדשה, משתמשים בפקודה bq mk --dataset.

  1. יוצרים מערך נתונים בשם bqml_tutorial ומגדירים את מיקום הנתונים ל-US:

    bq mk --dataset \
      --location=US \
      --description "BigQuery ML tutorial dataset." \
      bqml_tutorial
  2. מוודאים שמערך הנתונים נוצר:

    bq ls

API

מפעילים את השיטה datasets.insert עם משאב של מערך נתונים מוגדר:

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

יצירת טבלת האובייקטים

יוצרים טבלת אובייקטים על תמונות האומנות בקטגוריה הציבורית של gcs-public-data--met Cloud Storage. טבלת האובייקטים מאפשרת לנתח את התמונות בלי להעביר אותן מ-Cloud Storage.

  1. נכנסים לדף BigQuery במסוף Cloud de Confiance .

    כניסה ל-BigQuery

  2. בעורך השאילתות, מריצים את השאילתה הבאה:

    CREATE OR REPLACE EXTERNAL TABLE `bqml_tutorial.met_images`
    WITH CONNECTION DEFAULT
    OPTIONS
      ( object_metadata = 'SIMPLE',
        uris = ['gs://gcs-public-data--met/*']
      );

עיון בנתוני התמונה

יוצרים מסמך Notebook ב-Colab Enterprise ב-BigQuery כדי לחקור את נתוני התמונות.

  1. נכנסים לדף BigQuery במסוף Cloud de Confiance .

    כניסה ל-BigQuery

  2. יצירת notebook באמצעות עורך BigQuery.

  3. מחברים את ה-notebook לסביבת זמן הריצה שמוגדרת כברירת מחדל.

  4. מגדירים את ה-Notebook:

    1. מוסיפים תא קוד ל-notebook.
    2. מעתיקים את הקוד הבא ומדביקים אותו בתא הקוד:

      #@title Set up credentials
      
      from google.colab import auth
      auth.authenticate_user()
      print('Authenticated')
      
      PROJECT_ID='PROJECT_ID'
      from google.cloud import bigquery
      client = bigquery.Client(PROJECT_ID)
      

      מחליפים את PROJECT_ID בשם הפרויקט שבו משתמשים במדריך הזה.

    3. מריצים את תא הקוד.

  5. הפעלת תצוגת טבלה:

    1. מוסיפים תא קוד ל-notebook.
    2. מעתיקים את הקוד הבא ומדביקים אותו בתא הקוד:

      #@title Enable data table display
      %load_ext google.colab.data_table
      
    3. מריצים את תא הקוד.

  6. יוצרים פונקציה להצגת התמונות:

    1. מוסיפים תא קוד ל-notebook.
    2. מעתיקים את הקוד הבא ומדביקים אותו בתא הקוד:

      #@title Util function to display images
      import io
      from PIL import Image
      import matplotlib.pyplot as plt
      import tensorflow as tf
      
      def printImages(results):
       image_results_list = list(results)
       amt_of_images = len(image_results_list)
      
       fig, axes = plt.subplots(nrows=amt_of_images, ncols=2, figsize=(20, 20))
       fig.tight_layout()
       fig.subplots_adjust(hspace=0.5)
       for i in range(amt_of_images):
         gcs_uri = image_results_list[i][0]
         text = image_results_list[i][1]
         f = tf.io.gfile.GFile(gcs_uri, 'rb')
         stream = io.BytesIO(f.read())
         img = Image.open(stream)
         axes[i, 0].axis('off')
         axes[i, 0].imshow(img)
         axes[i, 1].axis('off')
         axes[i, 1].text(0, 0, text, fontsize=10)
       plt.show()
      
    3. מריצים את תא הקוד.

  7. הצגת התמונות:

    1. מוסיפים תא קוד ל-notebook.
    2. מעתיקים את הקוד הבא ומדביקים אותו בתא הקוד:

      #@title Display Met images
      
      inspect_obj_table_query = """
      SELECT uri, content_type
      FROM bqml_tutorial.met_images
      WHERE content_type = 'image/jpeg'
      Order by uri
      LIMIT 10;
      """
      printImages(client.query(inspect_obj_table_query))
      
    3. מריצים את תא הקוד.

      התוצאות אמורות להיראות כך:

      תמונות של פריטים ממוזיאון המטרופוליטן לאמנות.

  8. שומרים את ה-notebook בשם met-image-analysis.

יצירת המודל המרוחק

יוצרים מודל מרוחק שמייצג מודל הטמעה מולטי-מודאלי של Agent Platform:

  1. נכנסים לדף BigQuery במסוף Cloud de Confiance .

    כניסה ל-BigQuery

  2. בעורך השאילתות, מריצים את השאילתה הבאה:

    CREATE OR REPLACE MODEL `bqml_tutorial.multimodal_embedding_model`
      REMOTE WITH CONNECTION DEFAULT
      OPTIONS (ENDPOINT = 'gemini-embedding-2-preview');

    השאילתה מסתיימת תוך כמה שניות, ואז אפשר לגשת למודל multimodal_embedding_model שמופיע במערך הנתונים bqml_tutorial. בגלל שהשאילתה משתמשת בהצהרת CREATE MODEL כדי ליצור מודל, אין תוצאות לשאילתה.

יצירת הטמעות של תמונות

יוצרים הטמעות מהתמונות בטבלת האובייקטים באמצעות הפונקציה AI.GENERATE_EMBEDDING, ואז כותבים אותן בטבלה כדי להשתמש בהן בשלב הבא. יצירת הטמעה היא פעולה יקרה, ולכן השאילתה משתמשת בשאילתת משנה שכוללת את הפסוקית LIMIT כדי להגביל את יצירת ההטמעה ל-10,000 תמונות, במקום להטמיע את קבוצת הנתונים המלאה של 601,294 תמונות. כך גם מספר התמונות לא יעבור את המגבלה של 25,000 לפונקציה AI.GENERATE_EMBEDDING. הרצת השאילתה הזו נמשכת כ-40 דקות.

  1. נכנסים לדף BigQuery במסוף Cloud de Confiance .

    כניסה ל-BigQuery

  2. בעורך השאילתות, מריצים את השאילתה הבאה:

    CREATE OR REPLACE TABLE `bqml_tutorial.met_image_embeddings`
    AS
    SELECT *
    FROM
      AI.GENERATE_EMBEDDING(
        MODEL `bqml_tutorial.multimodal_embedding_model`,
        (SELECT * FROM `bqml_tutorial.met_images` WHERE content_type = 'image/jpeg' LIMIT 10000))

תיקון שגיאות ביצירת הטמעות

בודקים אם יש שגיאות ביצירת ההטמעה ומתקנים אותן. יצירת ההטמעה יכולה להיכשל בגלל מכסות של בינה מלאכותית גנרטיבית ב-Agent Platform או בגלל שהשירות לא זמין.

הפונקציה AI.GENERATE_EMBEDDING מחזירה את פרטי השגיאה בעמודה status. העמודה הזו ריקה אם יצירת ההטמעה הצליחה, או מכילה הודעת שגיאה אם יצירת ההטמעה נכשלה.

  1. נכנסים לדף BigQuery במסוף Cloud de Confiance .

    כניסה ל-BigQuery

  2. בעורך השאילתות, מריצים את השאילתה הבאה כדי לבדוק אם היו כשלים ביצירת ההטמעה:

    SELECT DISTINCT(status),
      COUNT(uri) AS num_rows
    FROM bqml_tutorial.met_image_embeddings
    GROUP BY 1;
  3. אם מוחזרות שורות עם שגיאות, צריך להסיר את השורות שבהן יצירת ההטמעה נכשלה:

    DELETE FROM `bqml_tutorial.met_image_embeddings`
    WHERE status = 'A retryable error occurred: RESOURCE_EXHAUSTED error from remote service/endpoint.';

יצירת אינדקס וקטורי

אפשר להשתמש בהצהרה CREATE VECTOR INDEX כדי ליצור את אינדקס הווקטורים met_images_index בעמודה embedding בטבלה met_images_embeddings. אינדקס וקטורי מאפשר לבצע חיפוש וקטורי מהר יותר, אבל הוא מפחית את יכולת השליפה ולכן מחזיר תוצאות משוערות יותר.

  1. נכנסים לדף BigQuery במסוף Cloud de Confiance .

    כניסה ל-BigQuery

  2. בעורך השאילתות, מריצים את השאילתה הבאה:

    CREATE OR REPLACE
      VECTOR INDEX `met_images_index`
    ON
      bqml_tutorial.met_image_embeddings(embedding)
      OPTIONS (
        index_type = 'IVF',
        distance_type = 'COSINE');
  3. האינדקס הווקטורי נוצר באופן אסינכרוני. כדי לבדוק אם נוצר אינדקס וקטורי, שולחים שאילתה לתצוגה INFORMATION_SCHEMA.VECTOR_INDEXES ומוודאים שהערך של coverage_percentage גדול מ-0, ושהערך של last_refresh_time הוא לא NULL:

    SELECT table_name, index_name, index_status,
      coverage_percentage, last_refresh_time, disable_reason
    FROM bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES
    WHERE index_name = 'met_images_index';

יצירת הטמעה לטקסט החיפוש

כדי לחפש תמונות שתואמות למחרוזת חיפוש טקסט מסוימת, קודם צריך ליצור הטמעת טקסט למחרוזת הזו. משתמשים באותו מודל מרוחק ששימש ליצירת הטמעות התמונות כדי ליצור את הטמעת הטקסט, ואז כותבים את הטמעת הטקסט בטבלה לשימוש בשלב הבא. מחרוזת החיפוש היא pictures of white or cream colored dress from victorian era.

  1. נכנסים לדף BigQuery במסוף Cloud de Confiance .

    כניסה ל-BigQuery

  2. בעורך השאילתות, מריצים את השאילתה הבאה:

    CREATE OR REPLACE TABLE `bqml_tutorial.search_embedding`
    AS
    SELECT * FROM AI.GENERATE_EMBEDDING(
      MODEL `bqml_tutorial.multimodal_embedding_model`,
      (
        SELECT 'pictures of white or cream colored dress from victorian era' AS content
      )
    );

משתמשים בפונקציה VECTOR_SEARCH כדי לבצע חיפוש סמנטי של תמונות שתואמות בצורה הטובה ביותר למחרוזת החיפוש שמיוצגת על ידי הטמעת הטקסט.

  1. נכנסים לדף BigQuery במסוף Cloud de Confiance .

    כניסה ל-BigQuery

  2. בעורך השאילתות, מריצים את השאילתה הבאה כדי לבצע חיפוש סמנטי ולכתוב את התוצאות בטבלה:

    CREATE OR REPLACE TABLE `bqml_tutorial.vector_search_results` AS
    SELECT base.uri AS gcs_uri, distance
    FROM
      VECTOR_SEARCH(
        TABLE `bqml_tutorial.met_image_embeddings`,
        'embedding',
        TABLE `bqml_tutorial.search_embedding`,
        'embedding',
        top_k => 3);

הצגה חזותית של תוצאות החיפוש הסמנטי

הצגת תוצאות החיפוש הסמנטי באמצעות Notebook.

  1. נכנסים לדף BigQuery במסוף Cloud de Confiance .

    כניסה ל-BigQuery

  2. פותחים את ה-notebook‏ met-image-analysis שיצרתם קודם.

  3. הצגת תוצאות החיפוש הווקטורי:

    1. מוסיפים תא קוד ל-notebook.
    2. מעתיקים את הקוד הבא ומדביקים אותו בתא הקוד:

      query = """
        SELECT * FROM `bqml_tutorial.vector_search_results`
        ORDER BY distance;
      """
      
      printImages(client.query(query))
      
    3. מריצים את תא הקוד.

      התוצאות אמורות להיראות כך:

      תמונות שהוחזרו משאילתת חיפוש וקטורי מולטי-מודאלי.

הסרת המשאבים

  1. במסוף Cloud de Confiance , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.