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

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

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

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

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

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

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

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

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

  • יצירת מערך נתונים: 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
  • ליצור מחברות ולעבוד איתן:
    • 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 או יוצרים אותו.

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

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

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

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

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

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

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

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

יצירת מערך נתונים

יוצרים מערך נתונים ב-BigQuery לאחסון מודל ה-ML.

המסוף

  1. במסוף Cloud de Confiance , עוברים לדף BigQuery.

    לדף BigQuery

  2. בחלונית Explorer, לוחצים על שם הפרויקט.

  3. לוחצים על הצגת פעולות > יצירת מערך נתונים.

  4. בדף Create dataset, מבצעים את הפעולות הבאות:

    • בשדה Dataset ID (מזהה מערך הנתונים), מזינים bqml_tutorial.

    • בקטע Location type, בוחרים באפשרות Multi-region ואז בוחרים באפשרות US.

    • משאירים את הגדרות ברירת המחדל שנותרו כמו שהן ולוחצים על 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. במסוף Cloud de Confiance , עוברים לדף BigQuery.

    כניסה ל-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. במסוף Cloud de Confiance , עוברים לדף BigQuery.

    כניסה ל-BigQuery

  2. יצירת מחברת באמצעות עורך 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. במסוף Cloud de Confiance , עוברים לדף BigQuery.

    כניסה ל-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. במסוף Cloud de Confiance , עוברים לדף BigQuery.

    כניסה ל-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))

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

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

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

  1. במסוף Cloud de Confiance , עוברים לדף BigQuery.

    כניסה ל-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. במסוף Cloud de Confiance , עוברים לדף BigQuery.

    כניסה ל-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. במסוף Cloud de Confiance , עוברים לדף BigQuery.

    כניסה ל-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. במסוף Cloud de Confiance , עוברים לדף BigQuery.

    כניסה ל-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);

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

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

  1. במסוף Cloud de Confiance , עוברים לדף BigQuery.

    כניסה ל-BigQuery

  2. פותחים את הנוטבוק 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.