תחילת העבודה עם חיפוש Spanner Vector

‫1. מבוא

Spanner הוא שירות מנוהל של מסד נתונים שניתן להתאמה לרוחב, עם אפשרות להפצה גלובלית. שירות מעולה לעומסי עבודה תפעוליים ולא יחסיים.

בעקבות הפרסום של הפונקציונליות המדויקת של השכנה K-הקרוב ביותר, Spanner הוא עכשיו גם מסד נתונים וקטורי עם יכולת התאמה רחבה, שמאפשר לבצע חיפוש דמיון או חיפוש סמנטי ולהטמיע יצירה מורחבת של אחזור (RAG) באפליקציות של AI גנרטיבי בקנה מידה נרחב. שאילתות החיפוש הווקטורי של Spanner מחזירות נתונים עדכניים בזמן אמת ברגע שבוצעו עסקאות, בדיוק כמו כל שאילתה אחרת על נתונים התפעוליים שלכם.

בשיעור ה-Lab הזה תלמדו להגדיר את התכונות הבסיסיות שנדרשות כדי להשתמש ב-Spanner לביצוע חיפוש וקטורים, ולגשת למודלים של הטמעה ו-LLM מגן המודלים של VertexAI באמצעות SQL.

הארכיטקטורה תיראה כך:

d179a760add7adc0.png

מה תפַתחו

במסגרת שיעור ה-Lab הזה:

  • יצירת מכונה של Spanner
  • הגדרת הסכימה של מסד הנתונים ב-Spanner כדי לשלב אותה עם מודלים של הטמעה ו-LLM ב-VertexAI.
  • טעינה של קבוצת נתוני קמעונאות
  • בדיקת שאילתות חיפוש דמיון מול מערך הנתונים
  • מתן הקשר למודל ה-LLM כדי ליצור המלצות ספציפיות למוצרים.

מה תלמדו

  • איך מגדירים מכונת Spanner
  • איך משלבים את VertexAI
  • איך להשתמש ב-Spanner כדי לבצע חיפוש וקטורי כדי למצוא פריטים דומים במערך נתונים קמעונאי

מה הדרישות כדי להצטרף לתוכנית?

  • פרויקט ב-Google Cloud שמחובר לחשבון לחיוב.
  • דפדפן אינטרנט כמו Chrome או Firefox.

‫2. הגדרה ודרישות

יוצרים פרויקט

אם אין לכם עדיין חשבון Google (Gmail או Google Apps), עליכם ליצור חשבון. נכנסים למסוף Google Cloud Platform ( console.cloud.google.com) ויוצרים פרויקט חדש.

אם כבר יש לכם פרויקט, לוחצים על התפריט הנפתח לבחירת פרויקט בפינה השמאלית העליונה של המסוף:

6c9406d9b014760.png

ולוחצים על הלחצן New PROJECT (פרויקט חדש) בתיבת הדו-שיח שמתקבלת כדי ליצור פרויקט חדש:

949d83c8a4ee17d9.png

אם עדיין אין לכם פרויקט, אמורה להופיע תיבת דו-שיח כזו כדי ליצור את הפרויקט הראשון:

870a3cbd6541ee86.png

בתיבת הדו-שיח הבאה ליצירת פרויקט תוכלו להזין את פרטי הפרויקט החדש:

6a92c57d3250a4b3.png

חשוב לזכור את מזהה הפרויקט, שהוא שם ייחודי בכל הפרויקטים ב-Google Cloud (השם שלמעלה כבר תפוס ולא מתאים לכם, סליחה). בהמשך ב-Codelab הזה, המערכת תתייחס אליה בתור PROJECT_ID.

בשלב הבא, אם עדיין לא עשית זאת, יהיה עליך להפעיל את החיוב ב-Developers Console כדי להשתמש במשאבים של Google Cloud ולהפעיל את Spanner API.

15d0ef27a8fbab27.png

ההרצה של קוד ה-Codelab הזה לא אמורה לעלות לך יותר מכמה דולרים, אבל הוא יכול להיות גבוה יותר אם תחליטו להשתמש ביותר משאבים או אם תשאירו אותם פועלים (עיינו בקטע 'ניקוי' בסוף המסמך). התמחור ב-Google Cloud Spanner מופיע כאן.

משתמשים חדשים ב-Google Cloud Platform זכאים לתקופת ניסיון בחינם בשווי 300$, שמאפשרת ל-Codelab הזה להיות בחינם לחלוטין.

הגדרת Google Cloud Shell

אומנם אפשר להפעיל את Google Cloud ואת Spanner מרחוק מהמחשב הנייד, אבל ב-Codelab הזה נשתמש ב-Google Cloud Shell, סביבת שורת הפקודה שפועלת ב-Cloud.

המכונה הווירטואלית הזו שמבוססת על Debian נטענת עם כל הכלים למפתחים שדרושים לכם. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר משמעותית את ביצועי הרשת והאימות. כלומר, כל מה שדרוש ל-Codelab הזה הוא דפדפן (כן, הוא פועל ב-Chromebook).

  1. כדי להפעיל את Cloud Shell ממסוף Cloud, לוחצים על Activate Cloud Shell gcLMt5IuEcJJNnMId-Bcz3sxCd0rZn7IzT_r95C8UZeqML68Y1efBG_B0VRp7hc7qiZTLAF-TXD7SsOadxn8uadgHhaLeASnVS3ZHK39eOlKJOgj9SJua_oeGhMxRrbOg3qigddS2A (ההקצאה וההתחברות של הסביבה אמורות להימשך כמה דקות).

JjEuRXGg0AYYIY6QZ8d-66gx_Mtc-_jDE9ijmbXLJSAXFvJt-qUpNtsBsYjNpv2W6BQSrDc1D-ARINNQ-1EkwUhz-iUK-FUCZhJ-NtjvIEx9pIkE-246DomWuCfiGHK78DgoeWkHRw

צילום מסך מתאריך 2017-06-14 בשעה 22:13.43.png

אחרי ההתחברות ל-Cloud Shell, אתם אמורים לראות שכבר בוצע אימות ושהפרויקט כבר מוגדר לפי הפרויקט PROJECT_ID

gcloud auth list

פלט הפקודה

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

פלט הפקודה

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

רוצה למצוא את ה-PROJECT_ID שלך? אתם יכולים לבדוק באיזה מזהה השתמשתם בשלבי ההגדרה או לחפש אותו במרכז הבקרה של מסוף Cloud:

158fNPfwSxsFqz9YbtJVZes8viTS3d1bV4CVhij3XPxuzVFOtTObnwsphlm6lYGmgdMFwBJtc-FaLrZU7XHAg_ZYoCrgombMRR3h-eolLPcvO351c5iBv506B3ZwghZoiRg6cz23Qw

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

echo $GOOGLE_CLOUD_PROJECT

פלט הפקודה

<PROJECT_ID>

הפעלת Spanner API

gcloud services enable spanner.googleapis.com

סיכום

בשלב הזה הגדרתם את הפרויקט אם עדיין לא עשיתם זאת, הפעלתם Cloud Shell והפעלת את ממשקי ה-API הנדרשים.

השלב הבא

בשלב הבא מגדירים את המכונה ואת מסד הנתונים של Spanner.

3. יצירת מכונה ומסד נתונים של Spanner

יצירת מכונת Spanner

בשלב הזה מגדירים מכונת Spanner ל-Codelab. כדי לעשות את זה, פותחים את Cloud Shell ומריצים את הפקודה הבאה:

export SPANNER_INSTANCE_ID=retail-demo
gcloud spanner instances create $SPANNER_INSTANCE_ID \
--config=regional-us-central1 \
--description="spanner AI retail demo" \
--nodes=1

פלט הפקודה:

$ gcloud spanner instances create $SPANNER_INSTANCE_ID \
--config=regional-us-central1 \
--description="spanner AI retail demo" \
--nodes=1
Creating instance...done.  

יצירת מסד הנתונים

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

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

כדי ליצור את מסד הנתונים, משתמשים שוב בכלי שורת הפקודה של Google Cloud:

export SPANNER_DATABASE=cymbal-bikes
gcloud spanner databases create $SPANNER_DATABASE \
 --instance=$SPANNER_INSTANCE_ID

פלט הפקודה:

$ gcloud spanner databases create $SPANNER_DATABASE \
 --instance=$SPANNER_INSTANCE_ID
Creating database...done.

סיכום

בשלב הזה יצרתם את המכונה ואת מסד הנתונים של Spanner.

השלב הבא

בשלב הבא צריך להגדיר את הסכימה והנתונים של Spanner.

‫4. טעינת הסכימה והנתונים של Cymbal

יצירת הסכימה של Cymbal

כדי להגדיר את הסכימה, צריך לעבור אל Spanner Studio:

3e1a0ified928b33cf.png

הסכימה כוללת שני חלקים. קודם צריך להוסיף את הטבלה products. צריך להעתיק את ההצהרה הזו ולהדביק אותה בכרטיסייה הריקה.

מעתיקים את ה-DDL הזה לסכימה ומדביקים אותו בתיבה:

CREATE TABLE products (
categoryId INT64 NOT NULL,
productId INT64 NOT NULL,
productName STRING(MAX) NOT NULL,
productDescription STRING(MAX) NOT NULL,
productDescriptionEmbedding ARRAY<FLOAT64>,
createTime TIMESTAMP NOT NULL OPTIONS (
allow_commit_timestamp = true
),
inventoryCount INT64 NOT NULL,
priceInCents INT64,
) PRIMARY KEY(categoryId, productId);

לאחר מכן, לוחצים על הלחצן run ומחכים כמה שניות עד שהסכימה תיווצר.

בשלב הבא תיצרו את שני המודלים ותגדירו אותם לנקודות קצה (endpoints) של מודל VertexAI.

המודל הראשון הוא מודל הטמעה שמשמש ליצירת הטמעות מטקסט, והמודל השני הוא מודל LLM ליצירת תשובות על סמך הנתונים ב-Spanner.

מדביקים את הסכימה הבאה בכרטיסייה חדשה ב-Spanner Studio:

CREATE MODEL EmbeddingsModel INPUT(
content STRING(MAX),
) OUTPUT(
embeddings STRUCT<statistics STRUCT<truncated BOOL, token_count FLOAT64>, values ARRAY<FLOAT64>>,
) REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<PROJECT_ID>/locations/us-central1/publishers/google/models/textembedding-gecko@003'
);

CREATE MODEL LLMModel INPUT(
prompt STRING(MAX),
) OUTPUT(
content STRING(MAX),
) REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<PROJECT_ID>/locations/us-central1/publishers/google/models/text-bison@001',
default_batch_size = 1
);

לאחר מכן לוחצים על הלחצן run ומחכים כמה שניות עד שהמודלים ייווצרו.

בחלונית הימנית ב-Spanner Studio אתם אמורים לראות את הטבלאות והמודלים הבאים:

62455aa4b0e839d9.png

טעינת הנתונים

עכשיו תצטרכו להוסיף מוצרים למסד הנתונים שלכם. פותחים כרטיסייה חדשה ב-Spanner Studio, מעתיקים ומדביקים את הצהרות ההוספה הבאות:

INSERT INTO products (categoryId, productId, productName, productDescription, createTime, inventoryCount, priceInCents)
VALUES (1, 1, "Cymbal Helios Helmet", "Safety meets style with the Cymbal children's bike helmet. Its lightweight design, superior ventilation, and adjustable fit ensure comfort and protection on every ride. Stay bright and keep your child safe under the sun with Cymbal Helios!", PENDING_COMMIT_TIMESTAMP(), 100, 10999),
(1, 2, "Cymbal Sprout", "Let their cycling journey begin with the Cymbal Sprout, the ideal balance bike for beginning riders ages 2-4 years. Its lightweight frame, low seat height, and puncture-proof tires promote stability and confidence as little ones learn to balance and steer. Watch them sprout into cycling enthusiasts with Cymbal Sprout!", PENDING_COMMIT_TIMESTAMP(), 10, 13999),
(1, 3, "Cymbal Spark Jr.", "Light, vibrant, and ready for adventure, the Spark Jr. is the perfect first bike for young riders (ages 5-8). Its sturdy frame, easy-to-use brakes, and puncture-resistant tires inspire confidence and endless playtime. Let the spark of cycling ignite with Cymbal!", PENDING_COMMIT_TIMESTAMP(), 34, 13900),
(1, 4, "Cymbal Summit", "Conquering trails is a breeze with the Summit mountain bike. Its lightweight aluminum frame, responsive suspension, and powerful disc brakes provide exceptional control and comfort for experienced bikers navigating rocky climbs or shredding downhill. Reach new heights with Cymbal Summit!", PENDING_COMMIT_TIMESTAMP(), 0, 79999),
(1, 5, "Cymbal Breeze", "Cruise in style and embrace effortless pedaling with the Breeze electric bike. Its whisper-quiet motor and long-lasting battery let you conquer hills and distances with ease. Enjoy scenic rides, commutes, or errands with a boost of confidence from Cymbal Breeze!", PENDING_COMMIT_TIMESTAMP(), 72, 129999),
(1, 6, "Cymbal Trailblazer Backpack", "Carry all your essentials in style with the Trailblazer backpack. Its water-resistant material, multiple compartments, and comfortable straps keep your gear organized and accessible, allowing you to focus on the adventure. Blaze new trails with Cymbal Trailblazer!", PENDING_COMMIT_TIMESTAMP(), 24, 7999),
(1, 7, "Cymbal Phoenix Lights", "See and be seen with the Phoenix bike lights. Powerful LEDs and multiple light modes ensure superior visibility, enhancing your safety and enjoyment during day or night rides. Light up your journey with Cymbal Phoenix!", PENDING_COMMIT_TIMESTAMP(), 87, 3999),
(1, 8, "Cymbal Windstar Pump", "Flat tires are no match for the Windstar pump. Its compact design, lightweight construction, and high-pressure capacity make inflating tires quick and effortless. Get back on the road in no time with Cymbal Windstar!", PENDING_COMMIT_TIMESTAMP(), 36, 24999),
(1, 9,"Cymbal Odyssey Multi-Tool","Be prepared for anything with the Odyssey multi-tool. This handy gadget features essential tools like screwdrivers, hex wrenches, and tire levers, keeping you ready for minor repairs and adjustments on the go. Conquer your journey with Cymbal Odyssey!", PENDING_COMMIT_TIMESTAMP(), 52, 999),
(1, 10,"Cymbal Nomad Water Bottle","Stay hydrated on every ride with the Nomad water bottle. Its sleek design, BPA-free construction, and secure lock lid make it the perfect companion for staying refreshed and motivated throughout your adventures. Hydrate and explore with Cymbal Nomad!", PENDING_COMMIT_TIMESTAMP(), 42, 1299);

כדי להוסיף את הנתונים, לוחצים על הלחצן run.

סיכום

בשלב הזה יצרתם את הסכימה וטענתם נתונים בסיסיים למסד הנתונים cymbal-bikes.

השלב הבא

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

5. עבודה עם הטמעות

יצירת הטמעות וקטורים לתיאורי מוצרים

כדי שחיפוש דמיון עם המוצרים יפעל, צריך ליצור הטמעות לתיאורי המוצרים.

באמצעות ה-EmbeddingsModel שנוצר בסכימה, זוהי הצהרת DML פשוטה UPDATE.

UPDATE products p1
SET productDescriptionEmbedding =
(SELECT embeddings.values from ML.PREDICT(MODEL EmbeddingsModel,
(SELECT productDescription as content FROM products p2 where p2.productId=p1.productId)))
WHERE categoryId=1;

לוחצים על הלחצן run כדי לעדכן את תיאורי המוצרים.

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

-- Use Spanner's vector search, and integration with embedding and LLM models to
-- return items that are semantically relevant and available in inventory based on
-- real-time data.


SELECT productName, productDescription, inventoryCount, COSINE_DISTANCE(
productDescriptionEmbedding,
(   SELECT embeddings.values
FROM ML.PREDICT(
MODEL EmbeddingsModel,
(SELECT "I'd like to buy a starter bike for my 3 year old child" as content)
)
)
) as distance
FROM products
WHERE inventoryCount > 0
ORDER BY distance
LIMIT 5;

כדי למצוא את המוצרים הדומים, לוחצים על הלחצן run. התוצאות אמורות להיראות כך:

672e111753077fcf.png

שימו לב שנעשה שימוש במסננים נוספים בשאילתה, למשל, כשאתם מתעניינים רק במוצרים שנמצאים במלאי (inventoryCount > 0).

סיכום

בשלב הזה יצרתם הטמעות של תיאורי מוצרים והטמעה של בקשת חיפוש באמצעות SQL, תוך מינוף השילוב של Spanner עם מודלים ב-VertexAI. בנוסף, ביצעתם חיפוש וקטורי כדי למצוא מוצרים דומים שתואמים לבקשת החיפוש.

השלבים הבאים

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

6. עבודה עם LLM

בעזרת Spanner קל לשלב את המודלים עם מודלים של LLM שמוצגים מ-VertexAI. כך מפתחים יכולים להשתמש ב-SQL כדי להתממשק ישירות עם מודלים גדולים של שפה, במקום לדרוש מהאפליקציה לבצע את הלוגיקה.

לדוגמה, קיבלנו את התוצאות משאילתת ה-SQL הקודמת מהמשתמש "I'd like to buy a starter bike for my 3 year old child".

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

"Answer with ‘Yes' or ‘No' and explain why: Is this a good fit for me? I'd like to buy a starter bike for my 3 year old child"

זו השאילתה שבה אפשר להשתמש:

-- Use an LLM to analyze this list and provide a recommendation on whether each
-- product is a good fit for the user. We use the vector search and real time
-- inventory data to first filter the products to reduce the size of the prompt to
-- the LLM.
SELECT productName, productDescription, inventoryCount, content AS LLMResponse
FROM ML.PREDICT(
MODEL LLMModel,
(   SELECT
inventoryCount,
productName,
productDescription,
CONCAT(
"Answer with ‘Yes' or ‘No' and explain why: Is this a good fit for me?",
"I'd like to buy a starter bike for my 3 year old child \n",
"Product Name: ", productName, "\n",
"Product Description:", productDescription) AS prompt,
FROM products
WHERE inventoryCount > 0
ORDER by COSINE_DISTANCE(
productDescriptionEmbedding,
(   SELECT embeddings.values
FROM ML.PREDICT(
MODEL EmbeddingsModel,
( SELECT "I'd like to buy a starter bike for my 3 year old child" as content)
)
)
) LIMIT 5
),
STRUCT(256 AS maxOutputTokens)
);

צריך ללחוץ על הלחצן run כדי ליצור את השאילתה. התוצאות אמורות להיראות כך:

35878cd0f88f1470.png

המוצר הראשון מתאים לגיל 3 בגלל טווח הגילאים שמופיע בתיאור המוצר (בני שנתיים עד 4). המוצרים האחרים לא מתאימים במיוחד.

סיכום

השלבים הבאים

עכשיו הגיע הזמן לפנות מקום.

‫7. הסרת המשאבים (אופציונלי)

כדי להסיר את המשאבים, נכנסים לקטע של Cloud Spanner במסוף Cloud ומוחקים את המכונה של 'retail-demo' שיצרנו ב-Codelab.

41cbc1a84b3588d5.png

‫8. כל הכבוד!

כל הכבוד, ביצעת בהצלחה חיפוש דמיון באמצעות חיפוש וקטורים מובנה של Spanner. בנוסף, הבנתם כמה קל לעבוד עם מודלים של הטמעה ו-LLM כדי לספק פונקציונליות של בינה מלאכותית גנרטיבית ישירות באמצעות SQL.

מה השלב הבא?

מידע נוסף על התכונה 'השכנה הקרובה ביותר של Spanner' (חיפוש וקטור של KNN) זמין כאן: https://cloud.google.com/spanner/docs/find-k-nearest-neighbors

מידע נוסף על ביצוע חיזויים אונליין באמצעות SQL באמצעות שילוב Vertex AI של Spanner זמין כאן: https://cloud.google.com/spanner/docs/ml