מדריך למתחילים בנושא Vector Search

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

דרישות מוקדמות

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

בחירת סביבת זמן הריצה

אפשר להריץ את המדריך הזה ב-Colab או ב-Gemini Enterprise Agent Platform Workbench.

  • Colab: פתיחת המדריך הזה ב-Colab
  • Gemini Enterprise Agent Platform Workbench: אפשר לפתוח את המדריך הזה ב-Gemini Enterprise Agent Platform Workbench. אם זו הפעם הראשונה שאתם משתמשים ב-Gemini Enterprise Agent Platform Workbench בפרויקט Google Cloud , עוברים לקטע Gemini Enterprise Agent Platform Workbench במסוף Google Cloud ולוחצים על Enable כדי להפעיל את Notebooks API.

כדי לראות את ה-notebook הזה ב-GitHub, אפשר לעיין במאמר בנושא GitHub.

עלות השלמת המדריך למתחילים הזה

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

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

הגדרה

לפני שמתחילים להשתמש ב-Gemini Enterprise Agent Platform, צריך להגדיר את הדברים הבאים:

התקנה של Agent Platform SDK ל-Python

יש כמה דרכים לגשת ל-Gemini Enterprise Agent Platform ולממשקי Cloud Storage API, כולל API בארכיטקטורת REST ו-Agent Platform SDK ל-Python. במדריך הזה נעשה שימוש ב-Agent Platform SDK ל-Python.

!pip install --upgrade --user google-cloud-aiplatform>=1.29.0 google-cloud-storage

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

# Restart kernel after installs so that your environment can access the new packages
import IPython

app = IPython.Application.instance()
app.kernel.do_shutdown(True)

משתני סביבה

מגדירים את משתני הסביבה. אם מופיעה בקשה, מחליפים את your-project-id במזהה הפרויקט ומריצים את התא.

# get project ID
PROJECT_ID = ! gcloud config get-value project
PROJECT_ID = PROJECT_ID[0]
LOCATION = "us-central1"
if PROJECT_ID == "(unset)":
    print(f"Please set the project ID manually below")
# define project information
if PROJECT_ID == "(unset)":
  PROJECT_ID = "[your-project-id]"

# generate a unique id for this session
from datetime import datetime
UID = datetime.now().strftime("%m%d%H%M")

אימות (Colab בלבד)

אם מריצים את המחברת הזו ב-Colab, צריך להריץ את אימות התא. השלב הזה לא נדרש אם משתמשים ב-Gemini Enterprise Agent Platform Workbench, כי הוא מאומת מראש.

import sys

# if it's Colab runtime, authenticate the user with Google Cloud
if 'google.colab' in sys.modules:
    from google.colab import auth
    auth.authenticate_user()

הגדרת הרשאות IAM

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

  1. נכנסים לדף IAM במסוף Google Cloud .
  2. מחפשים את חשבון המשתמש של חשבון השירות שמוגדר כברירת מחדל ב-Compute. הוא אמור להיראות כך: compute@developer.gserviceaccount.com
  3. לוחצים על לחצן העריכה ומקצים לחשבון השירות של Compute את התפקידים הבאים: Gemini Enterprise Agent Platform User,‏ Storage Admin ו-Service Usage Admin.

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

מריצים את הפקודה הבאה כדי להפעיל ממשקי API עבור Compute Engine,‏ Gemini Enterprise Agent Platform ו-Cloud Storage בפרויקט Google Cloud הזה.

! gcloud services enable compute.googleapis.com aiplatform.googleapis.com storage.googleapis.com --project {PROJECT_ID}

הכנת נתונים לדוגמה

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

מערך נתונים לדוגמה

הכנו את הקובץ product-embs.json מהטבלה הזו.

הטמעות של מוצרים לדוגמה

הקובץ הזה הוא בפורמט JSONL, ובכל שורה יש מזהה (ID) למזהה המוצר, שם (name) לשם המוצר, והטמעה (embedding) להטמעה של שם המוצר ב-768 ממדים, שנוצרה קודם באמצעות הטמעות של Gemini Enterprise Agent Platform לטקסט.

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

במאמר Getting Started with Text Embeddings + Gemini Enterprise Agent Platform Vector Search מוסבר איך ליצור הטבעות מהנתונים בטבלה ב-BigQuery ולאחסן אותן בקובץ JSON.

הכנת הנתונים ב-Cloud Storage

כדי ליצור אינדקס באמצעות Gemini Enterprise Agent Platform, צריך למקם את קובץ ההטמעה בקטגוריה של Cloud Storage. הקוד הבא מבצע שתי משימות:

  1. יצירת קטגוריה של Cloud Storage.
  2. מעתיקים את קובץ הדוגמה לקטגוריה שלכם ב-Cloud Storage.
BUCKET_URI = f"gs://{PROJECT_ID}-vs-quickstart-{UID}"
! gcloud storage buckets create $BUCKET_URI --location=$LOCATION --project=$PROJECT_ID
! gcloud storage cp "gs://github-repo/data/vs-quickstart/product-embs.json" $BUCKET_URI

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

! gcloud storage cp "gs://github-repo/data/vs-quickstart/product-embs.json" . # for query tests

יצירה ופריסה של אינדקס חיפוש וקטורי

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

יצירת אינדקס

עכשיו הגיע הזמן לטעון את ההטמעות ל-Vector Search. ממשקי ה-API זמינים בחבילה aiplatform של ערכת ה-SDK.

# init the aiplatform package
from google.cloud import aiplatform
aiplatform.init(project=PROJECT_ID, location=LOCATION)

יוצרים MatchingEngineIndex עם הפונקציה create_tree_ah_index (Matching Engine הוא השם הקודם של Vector Search).

# create Index
my_index = aiplatform.MatchingEngineIndex.create_tree_ah_index(
    display_name = f"vs-quickstart-index-{UID}",
    contents_delta_uri = BUCKET_URI,
    dimensions = 768,
    approximate_neighbors_count = 100,
)

השיטה MatchingEngineIndex.create_tree_ah_index() יוצרת אינדקס. אם מערך הנתונים קטן, התהליך יימשך פחות מ-10 דקות. אם הוא גדול, התהליך יימשך כ-60 דקות או יותר, בהתאם לגודל מערך הנתונים. אפשר לבדוק את הסטטוס של יצירת האינדקס במסוף של Vector Search Google Cloud

לעיון באינדקסים

הפרמטרים ליצירת אינדקס:

  • contents_delta_uri: ה-URI של ספריית Cloud Storage שבה שמרתם את קובצי ה-JSON של ההטמעה
  • dimensions: גודל הממד של כל הטמעה. במקרה הזה, הערך הוא 768 כי אתם משתמשים בהטמעות מ-Text Embeddings API.
  • approximate_neighbors_count: כמה פריטים דומים רוצים לאחזר במקרים רגילים

מידע נוסף על יצירת האינדקס והפרמטרים הזמינים זמין במאמר יצירה וניהול של האינדקס

יצירה של נקודת קצה של אינדקס ופריסת האינדקס

כדי להשתמש באינדקס, צריך ליצור נקודת קצה של האינדקס. היא פועלת כמו מופע שרת שמקבל בקשות שאילתה לאינדקס.

## create `IndexEndpoint`
my_index_endpoint = aiplatform.MatchingEngineIndexEndpoint.create(
    display_name = f"vs-quickstart-index-endpoint-{UID}",
    public_endpoint_enabled = True
)

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

DEPLOYED_INDEX_ID = f"vs_quickstart_deployed_{UID}"
# deploy the Index to the Index Endpoint
my_index_endpoint.deploy_index(
    index = my_index, deployed_index_id = DEPLOYED_INDEX_ID
)

אם זו הפעם הראשונה שפורסים את האינדקס הזה לנקודת קצה של אינדקס, יכול להיות שיחלפו כ-30 דקות עד שהקצה העורפי ייבנה ויופעל באופן אוטומטי. כדי לראות את הסטטוס של פריסת האינדקס, בקטע Agent Platform במסוףGoogle Cloud , עוברים לקטע Deploy and Use (פריסה ושימוש) ובוחרים באפשרות Indexes (אינדקסים).

לעיון במדדים

הרצת שאילתה באמצעות Vector Search

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

קבלת הטמעה להרצת שאילתה

קודם טוענים את קובץ ה-JSON של ההטמעה כדי ליצור dict של שמות מוצרים והטמעות.

import json

# build dicts for product names and embs
product_names = {}
product_embs = {}
with open('product-embs.json') as f:
    for l in f.readlines():
        p = json.loads(l)
        id = p['id']
        product_names[id] = p['name']
        product_embs[id] = p['embedding']

באמצעות מילון product_embs, אפשר לציין מזהה מוצר כדי לקבל הטמעה שלו.

 # Get the embedding for ID 6523 "cloudveil women's excursion short"
 # You can also try with other IDs such as 12711, 18090, 19536 and 11863
query_emb = product_embs['6523']

הרצת שאילתה

מעבירים את ההטמעה לשיטה Endpoint.find_neighbors() כדי למצוא שמות מוצרים דומים.

# run query
response = my_index_endpoint.find_neighbors(
    deployed_index_id = DEPLOYED_INDEX_ID,
    queries = [query_emb],
    num_neighbors = 10
)

# show the results
for idx, neighbor in enumerate(response[0]):
    print(f"{neighbor.distance:.2f} {product_names[neighbor.id]}")

שיטת find_neighbors() מאפשרת לאחזר את הפריטים הדומים תוך אלפיות שנייה, גם אם יש מיליארדי פריטים באינדקס, בזכות אלגוריתם ScaNN. בנוסף, חיפוש וקטורי תומך בהתאמה אוטומטית לעומס (autoscaling), שמאפשרת לשנות באופן אוטומטי את הגודל של מספר הצמתים בהתאם לדרישות של עומסי העבודה.

סידור וארגון

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

אם השתמשתם ב-Workbench, יכול להיות שתצטרכו גם למחוק את המחברות מהמסוף.


# wait for a confirmation
input("Press Enter to delete Index Endpoint, Index and Cloud Storage bucket:")

# delete Index Endpoint
my_index_endpoint.undeploy_all()
my_index_endpoint.delete(force = True)

# delete Index
my_index.delete()

# delete Cloud Storage bucket
! gcloud storage rm {BUCKET_URI} --recursive

שירותים

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

קבלת אינדקס קיים

כדי לקבל אובייקט אינדקס שכבר קיים, מחליפים את your-index-id הבא במזהה האינדקס ומריצים את התא. כדי למצוא את מזהה האינדקס, אפשר לבדוק את מסוף Google Cloud Vector Search. בקטע Agent Platform במסוף Google Cloud , עוברים לקטע Deploy and Use. בוחרים באפשרות אינדקסים.

לעיון במדדים

my_index_id = "[your-index-id]"
my_index = aiplatform.MatchingEngineIndex(my_index_id)

קבלת נקודת קצה קיימת של אינדקס

כדי לקבל אובייקט של נקודת קצה של אינדקס שכבר קיים, מחליפים את your-index-endpoint-id הבא במזהה של נקודת הקצה של האינדקס ומריצים את התא. אפשר למצוא את נקודת הקצה של האינדקס במסוף של Vector Search Google Cloud . בקטע Agent Platform במסוף Google Cloud , עוברים לקטע Deploy and Use. בוחרים באפשרות Index Endpoints.

מידע נוסף על נקודות קצה של אינדקסים

my_index_endpoint_id = "[your-index-endpoint-id]"
my_index_endpoint = aiplatform.MatchingEngineIndexEndpoint(my_index_endpoint_id)