במדריך לתחילת העבודה עם חיפוש וקטורים ב-Vertex AI, מוסבר איך ליצור אינדקס ממערך נתונים לדוגמה של אתר פיקטיבי למכירת בגדים באינטרנט. לצורך המדריך למתחילים הזה, ההטמעות כבר נוצרו. המדריך הזה למתחילים נועד לעזור לכם להתחיל ליצור ולפרוס אינדקס תוך פחות מ-30 דקות.
דרישות מוקדמות
כדי לבצע את ההוראות במדריך הזה, צריך Google Cloud פרויקט שמקושר לחשבון לחיוב. כדי ליצור פרויקט חדש, אפשר לעיין במאמר הגדרת פרויקט וסביבת פיתוח. צריך ליצור פרויקט ולהגדיר את החשבון לחיוב.
בחירת סביבת זמן הריצה
אפשר להריץ את המדריך הזה ב-Colab או ב-Vertex AI Workbench.
- Colab: פתיחת המדריך הזה ב-Colab
- Vertex AI Workbench: פתיחת המדריך הזה ב-Vertex AI Workbench. אם זו הפעם הראשונה שאתם משתמשים ב-Vertex AI Workbench בפרויקט Google Cloud שלכם, עוברים לקטע Vertex AI Workbench במסוף ולוחצים על הפעלה כדי להפעיל את Notebooks API. Google Cloud
כדי לראות את ה-notebook הזה ב-GitHub, אפשר לעיין במאמר בנושא GitHub.
עלות השלמת המדריך למתחילים הזה
העלות המשוערת של השלמת המדריך הזה היא כמה דולרים אמריקאיים. המחירים של Google Cloud השירותים שבהם נעשה שימוש במדריך הזה מפורטים בדפים הבאים:
אפשר גם להשתמש במחשבון התמחור כדי ליצור הערכת עלויות בהתאם לשימוש החזוי.
הגדרה
לפני שמתחילים להשתמש ב-Vertex AI, צריך להגדיר את הדברים הבאים:
- התקנת Vertex AI SDK ל-Python
- הגדרה של משתני סביבה
- אימות (ב-Colab בלבד)
- הגדרת הרשאות IAM
- הפעלת ממשקי API
התקנה של Vertex AI SDK ל-Python
יש כמה דרכים לגשת לממשקי ה-API של Vertex AI ו-Cloud Storage, כולל API בארכיטקטורת REST ו-Vertex AI SDK ל-Python. במדריך הזה נעשה שימוש ב-Vertex AI 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 בלבד)
אם אתם מריצים את ה-notebook הזה ב-Colab, אתם צריכים להריץ את אימות התא. אם אתם משתמשים ב-Vertex AI 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
צריך להוסיף הרשאות גישה לחשבון השירות שמוגדר כברירת מחדל כדי להשתמש בשירותים.
- נכנסים לדף IAM במסוף Google Cloud .
- מחפשים את הישות המורשית של חשבון השירות שמוגדר כברירת מחדל ב-Compute.
הוא אמור להיראות כך:
compute@developer.gserviceaccount.com - לוחצים על לחצן העריכה ומעניקים לחשבון השירות של Compute את התפקידים הבאים: משתמש ב-Vertex AI, אדמין של Storage ואדמין של Service Usage.
הפעלת ממשקי ה-API
מריצים את הפקודה הבאה כדי להפעיל את ממשקי ה-API של Compute Engine, Vertex AI ו-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, ובכל שורה יש מזהה של מזהה המוצר, שם של שם המוצר והטמעה של הטמעת שם המוצר ב-768 מימדים, שנוצרה קודם באמצעות הטמעות טקסט ב-Vertex AI.
הטמעות הטקסט מייצגות את המשמעות של שמות מוצרי הביגוד. במדריך הזה, אנחנו משתמשים ב-Vector Search כדי לבצע חיפוש סמנטי של הפריטים. אפשר להשתמש בקוד לדוגמה הזה כבסיס למערכות המלצות מהירות אחרות, שבהן אפשר למצוא במהירות 'מוצרים אחרים שדומים למוצר הזה'.
למידע נוסף על יצירת ההטמעות מהנתונים בטבלת BigQuery ואחסונן בקובץ JSON, ראו Getting Started with Text Embeddings + Vertex AI Vector Search.
הכנת הנתונים ב-Cloud Storage
כדי ליצור אינדקס באמצעות Vertex AI, צריך למקם את קובץ ההטמעה בקטגוריית Cloud Storage. הקוד הבא מבצע שתי משימות:
- יצירת קטגוריה של Cloud Storage.
- מעתיקים את קובץ הדוגמה לקטגוריה שלכם ב-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 דקות עד שהקצה העורפי ייבנה ויופעל באופן אוטומטי. כדי לראות את הסטטוס של פריסת האינדקס, עוברים לקטע Deploy and Use (פריסה ושימוש) בקטע Vertex AI שלGoogle Cloud המסוף. בוחרים באפשרות אינדקסים.
הרצת שאילתה באמצעות חיפוש וקטורי
בדוגמת הקוד הבאה, המערכת מוצאת הטמעה של שם מוצר ספציפי, ומוצאת שמות מוצרים דומים באמצעות חיפוש וקטורי.
קבלת הטמעה להרצת שאילתה
קודם טוענים את קובץ ה-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 Vector Search ולהשתמש באינדקסים הקיימים כדי להמשיך.
קבלת אינדקס קיים
כדי לקבל אובייקט אינדקס שכבר קיים, מחליפים את your-index-id הבא במזהה האינדקס ומריצים את התא. כדי למצוא את מזהה האינדקס, אפשר לבדוק את המסוף של Vector Search Google Cloud . בקטע Vertex AI במסוף 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 .
בקטע Vertex AI במסוף Google Cloud , עוברים אל Deploy and Use. בוחרים באפשרות Index Endpoints.
למידע נוסף על נקודות קצה של אינדקסים
my_index_endpoint_id = "[your-index-endpoint-id]"
my_index_endpoint = aiplatform.MatchingEngineIndexEndpoint(my_index_endpoint_id)