מידע על Codelab זה
1. סקירה כללית
מהו ניהול נתונים ראשי?
המטרה של ניהול נתונים ראשי (MDM) היא ליצור מקור מהימן אחד ואמין של הנתונים הקריטיים ביותר של הארגון. דמיינו ספרייה מאורגנת בקפידה, שבה כל ספר (נקודת נתונים) מסומן בתווית נכונה, מעודכן ושקל למצוא אותו.
נתונים ראשיים מייצגים את הישויות העסקיות הבסיסיות והבסיסיות שחיוניות לפעילות של החברה. אלו הם הרכיבים העיקריים בנתונים במאסטר:
- ישויות עסקיות: ישויות כמו לקוחות, מוצרים, ספקים, מיקומים ועובדים, שהם השמות שעולים בעסק
- מזהים: מזהים ייחודיים שמבטיחים שכל ישות מוצגת בנפרד ושאפשר לעקוב אחריה בכל המערכות
- מאפיינים: המאפיינים שמתארים כל ישות, למשל כתובת הלקוח, מחיר המוצר וכו'.
כדי לעזור לכם להבין את הנתונים במאסטר, נשווה אותם לנתוני עסקאות. בנתוני העסקאות מתועדים אירועים נפרדים (רכישה, משלוח וכו'). לעומת זאת, נתונים ראשיים מספקים את ההקשר לאירועים האלה על ידי הגדרת הישויות המעורבות. לדוגמה, עסקת מכירה כוללת קישור לנתונים ראשיים של הלקוח, המוצר ואיש המכירות.
הטמעה של MDM (ניהול מכשירים ניידים) היא הכרחית לקבלת החלטות אסטרטגיות, אבל היא יכולה להיות מורכבת ולגזול הרבה משאבים. כאן נכנסים לתמונה הכוח המהפכני של בינה מלאכותית גנרטיבית, ובמיוחד דגמים כמו Gemini 1.0 Pro, Gemini 1.0 Pro Vision, Gemini 1.5 Pro.
2. מטרה
בשיעור ה-Codelab הזה, נדגים איך Gemini 1.0 Pro מפשט אפליקציות ראשיות לניהול נתונים, כמו העשרה וביטול כפילויות, בנתוני citibike_stations שזמינים במערך הנתונים הציבורי ב-BigQuery.
מה צריך להשתמש
- מערך הנתונים הציבורי של BigQuery
bigquery-public-data.new_york_citibike
. - קריאה לפונקציה של Gemini (פונקציה של Java Cloud Functions שמקבלת את פרטי הכתובת באמצעות reverse Geocoding API לקואורדינטות הזמינות עם נתוני citibike_stations).
- Vertex AI Embeddings API וחיפוש Vector ב-BigQuery לזיהוי כפילויות.
מה תפַתחו
- יוצרים מערך נתונים ב-BigQuery לתרחיש לדוגמה. במערך הנתונים הזה יוצרים טבלת נחיתה עם נתונים מהטבלה
bigquery-public-data.new_york_citibike.citibike_stations
של מערך הנתונים הציבורי. - תתבצע פריסה של הפונקציה של Cloud Functions שכוללת קריאה לפונקציה של Gemini כדי ליצור סטנדרטיזציה של כתובות.
- נתוני הכתובת העשירים יאוחסנו בטבלאות הנחיתה (משני המקורות שסופקו בהדגמה הזו).
- תתבצע הפעלה של Vertex AI Embeddings API מ-BigQuery בנתוני הכתובת.
- כדי לזהות רשומות כפולות תשתמשו ב-BigQuery Vector Search.
התרשים הבא מייצג את זרימת הנתונים והשלבים הכרוכים בהטמעה.
4. לפני שמתחילים
- במסוף Google Cloud, בדף בורר הפרויקטים, בוחרים או יוצרים פרויקט ב-Google Cloud.
- הקפידו לוודא שהחיוב מופעל בפרויקט שלכם ב-Cloud. איך בודקים אם החיוב מופעל בפרויקט
- משתמשים ב-Cloud Shell, סביבת שורת הפקודה שפועלת ב-Google Cloud וכוללת טעינה מראש של bq. לוחצים על Activate Cloud Shell בחלק העליון של מסוף Google Cloud.
- אחרי ההתחברות ל-Cloud Shell, בודקים שהאימות כבר בוצע ושהפרויקט מוגדר למזהה הפרויקט שלכם, באמצעות הפקודה הבאה:
gcloud auth list
- מריצים את הפקודה הבאה ב-Cloud Shell כדי לוודא שהפקודה של gcloud יודעת על הפרויקט שלכם.
gcloud config list project
- אם הפרויקט לא מוגדר, מגדירים אותו באמצעות הפקודה הבאה:
gcloud config set project <YOUR_PROJECT_ID>
- מפעילים את ה-API דרך Gemini ל-Google Cloud Marketplace. אפשר גם להשתמש בפקודה הבאה בטרמינל של Cloud Shell:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
- ודאו שממשקי ה-API של BigQuery, BigQuery Connection, Cloud Functions, Cloud Run, Vertex AI ו-Cloud Build מופעלים. החלופה לפקודה ב-gcloud היא דרך המסוף באמצעות הקישור הזה.
עיינו במאמרי העזרה לפקודות ולשימוש ב-gcloud.
5. יצירת מערך נתונים ב-BigQuery וחיבור חיצוני
נתחיל ביצירת מערך נתונים וחיבור משאבים ב-Cloud.
מערך נתונים ב-BigQuery הוא קונטיינר לכל הטבלאות והאובייקטים של האפליקציה.
כדי ליצור מערך נתונים:
- נכנסים אל הדף ב-BigQuery במסוף Google Cloud.
- בחלונית Explorer בוחרים את הפרויקט שבו רוצים ליצור את מערך הנתונים.
- מרחיבים את האפשרות פעולות (סמל שלוש הנקודות האנכיות) ולוחצים על Create dataset.
- מזינים את הערך
mdm_gemini
בשדה Dataset ID. - עליך להגדיר את סוג המיקום שלך בתור
Multi-region
ולאשר את ערך ברירת המחדל, שהואUS(multiple regions in United States.
- לוחצים על Create dataset.
- בודקים שמערך הנתונים נוצר ומופיע עם מזהה הפרויקט בחלונית Explorer.
כדי לבצע אינטראקציה עם הפונקציה של Cloud Functions, צריך חיבור של BigQuery. כדי ליצור פונקציה מרוחקת, צריך ליצור חיבור ל-BigQuery. ב-Codelab הזה, נשתמש בחיבור BigLake כדי לגשת למודל מ-BigQuery דרך הפונקציה של Cloud Functions. חיבורי BigLake עוזרים לחבר את מקור הנתונים החיצוני תוך שמירה על אבטחה ובקרת גישה פרטנית ל-BigQuery, שבמקרה שלנו הוא Vertex AI Gemini Pro API.
כדי ליצור את החיבור ל-BigLake:
- לוחצים על Add בחלונית Explorer בדף BigQuery.
- לוחצים על חיבורים למקורות נתונים חיצוניים.
- ברשימת סוגי החיבור, בוחרים באפשרות מודלים מרוחקים של Vertex AI, פונקציות מרחוק ו-BigLake (Cloud Resource).
- בשדה Connection ID (מזהה החיבור), מזינים את שם החיבור בתור
gemini-bq-conn
. - עליך להגדיר את סוג המיקום שלך בתור
Multi-region
ולאשר את ערך ברירת המחדל, שהואUS(multiple regions in United States.
- לוחצים על יצירת חיבור.
- לוחצים על מעבר לחיבור ומעתיקים את מזהה חשבון השירות בחלונית פרטי החיבור.
- נכנסים אל IAM & ניהול ולוחצים על הענקת גישה.
- מדביקים את מזהה חשבון השירות בשדה New principles (עקרונות חדשים).
- בוחרים את התפקיד
Vertex AI user
מרשימת התפקידים ולוחצים על Save.
סיימתם ליצור את מערך הנתונים ואת החיבור ל-BigQuery.
6. פריסת קריאה לפונקציה של Gemini (פונקציה של Java Cloud)
כדי לפרוס את הפונקציה של Java Cloud Functions שכוללת קריאה לפונקציות של Gemini, צריך לפעול לפי השלבים הבאים.
- משכפלים את המאגר של github מהטרמינל של Cloud Shell באמצעות הפקודה הבאה:
git clone https://github.com/AbiramiSukumaran/GeminiFunctionCalling
- מחליפים את ערכי ה-placeholder
YOUR_API_KEY
ו-YOUR_PROJECT_ID
בערכים שלכם.
אם תקראו את הבלוג כאן, חשוב לדעת שההטמעות של קריאות לפונקציות משתמשות ב-Reverse Geocoding API. תוכלו ליצור API_KEY משלכם לפי ההוראות שמפורטות כאן.
- בטרמינל של Cloud Shell, נכנסים לספריית הפרויקט המשוכפלת GeminiFunctionCalling ומריצים את ההצהרה הבאה כדי ליצור ולפרוס את הפונקציה של Cloud Functions:
gcloud functions deploy gemini-fn-calling --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http
אפשר להגיד "y" כשתופיע ההודעה 'לאפשר הפעלות לא מאומתות' שאלות. במצב אידיאלי כדאי להגדיר אימות לאפליקציות הארגוניות, לפי המלצה. אבל מאחר שזו אפליקציית הדגמה, נמשיך ללא אימות.
הפלט הוא כתובת URL ל-REST בפורמט הבא:
https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/gemini-fn-calling
- כדי לבדוק את הפונקציה של Cloud Functions, מריצים את הפקודה הבאה מהטרמינל:
gcloud functions call gemini-fn-calling --region=us-central1 --gen2 --data '{"calls":[["40.714224,-73.961452"]]}'
תשובה להנחיה לדוגמה אקראית:
'{"replies":["{ \"DOOR_NUMBER\": \"277\", \"STREET_ADDRESS\": \"Bedford Ave\", \"AREA\":
null, \"CITY\": \"Brooklyn\", \"TOWN\": null, \"COUNTY\": \"Kings County\", \"STATE\":
\"NY\", \"COUNTRY\": \"USA\", \"ZIPCODE\": \"11211\", \"LANDMARK\": null}}```"]}'
הפרמטרים של הבקשה והתשובה של הפונקציה הזו של Cloud Functions מוטמעים באופן שתואם להפעלת הפונקציה המרוחקת של BigQuery. אפשר לצרוך אותו ישירות מנתוני BigQuery באופן מקומי. כלומר, אם קלט הנתונים (נתונים ארוכים וקו רוחב) נמצאים ב-BigQuery, תוכלו להפעיל את הפונקציה המרוחקת על הנתונים ולקבל את התשובה של הפונקציה שאותה ניתן לאחסן או לעבד ישירות ב-BigQuery.
- מריצים את ה-DDL הבא מ-BigQuery כדי ליצור פונקציה מרוחקת שמפעילה את הפונקציה של Cloud Functions שנפרסה:
CREATE OR REPLACE FUNCTION
`mdm_gemini.MDM_GEMINI` (latlng STRING) RETURNS STRING
REMOTE WITH CONNECTION `us.gemini-bq-conn`
OPTIONS (
endpoint = 'https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/gemini-fn-calling', max_batching_rows = 1
);
שאילתת בדיקה לשימוש בפונקציה המרוחקת החדשה שנוצרה:
SELECT mdm_gemini.MDM_GEMINI
(latlong) מתוך mdm_gemini.CITIBIKE_ מצייניםS הגבלה 1;
אם שאילתת הבדיקה שמשתמשת בפונקציה המרוחקת החדשה שנוצרה ב-BigQuery נכשלת בגלל בעיה בהרשאות של Cloud Functions, עוברים אל Cloud Functions ממסוף Google Cloud ומאתרים את הפונקציה של Cloud Functions שנפרסה בשם "gemini-fn-calling". עוברים לכרטיסיית ההרשאות ומוסיפים את חשבון המשתמש בתור allUsers. ולהקצות את התפקיד Cloud Functions Invoker כדי לוודא ש-Cloud Functions זמין לכל המשתמשים (רק כי זוהי אפליקציית הדגמה).
7. פתרון הבעיה
אם אין לכם את ה-API_KEY הנדרש לקריאת הפונקציה Reverse Geocoding, או אם הפונקציה של Cloud Functions לא פרוסה מסיבה כלשהי, תוכלו לבצע את הפעולות הבאות במקום זאת:
- מורידים את הקובץ CITIBIKE_STATIONS.csv מהמאגר repository לתיקיית הפרויקט ב-Cloud Shell, ומנווטים לתיקייה הזו.
- מייצאים את הנתונים מה-CSV למערך הנתונים החדש ב-BigQuery
mdm_gemini
, באמצעות הפקודה הבאה בטרמינל של Cloud Shell:
bq load --source_format=CSV --skip_leading_rows=1 mdm_gemini.CITIBIKE_STATIONS ./CITIBIKE_STATIONS.csv \ name:string,latlng:string,capacity:numeric,num_bikes_available:numeric,num_docks_available:numeric,last_reported:timestamp,full_address_string:string
8. יצירת טבלה והעשרת נתוני הכתובת
שלב 1: יצירת הטבלה
Imp: דלגו על השלב הזה אם השתמשתם בפתרון החלופי כי כנראה כבר יצרתם את הטבלה.
אם עוד לא השתמשתם בפתרון החלופי, מריצים את ה-DDL הבא ב-BigQuery SQL Editor:
CREATE TABLE mdm_gemini.CITIBIKE_STATIONS as (
select name, latitude || ',' || longitude as latlong, capacity, num_bikes_available, num_docks_available,last_reported,
'' as full_address_string
from bigquery-public-data.new_york_citibike.citibike_stations) ;
עכשיו נעשיר את נתוני הכתובת על-ידי הפעלת הפונקציה המרוחקת בקואורדינטות של קווי האורך והרוחב שזמינות בטבלה. מגדירים את התנאים הבאים לנתונים:
- דווח בשנת 2024
- מספר האופניים הזמינים > 0
- קיבולת > 100
מריצים את השאילתה הבאה:
update `mdm_gemini.CITIBIKE_STATIONS`
set full_address_string = `mdm_gemini.MDM_GEMINI`(latlong)
where EXTRACT(YEAR FROM last_reported) = 2024 and num_bikes_available > 0 and capacity > 100;
שלב 2: יוצרים מקור שני לנתוני המיקום של תחנת האופניים
אל תדלגו על השלב הזה גם אם השתמשתם בגישה לעקוף את הטבלה ליצירת הטבלה.
בשלב הזה יוצרים מקור שני לנתוני המיקום של תחנות האופניים לצורך ה-Codelab הזה. המטרה היא להראות ש-MDM (ניהול מכשירים ניידים) משלב נתונים מכמה מקורות ומזהה את האמת המוזהבת.
מריצים את ה-DDL הבאות ב-BigQuery SQL Editor כדי ליצור את המקור השני של נתוני המיקום שיש בו שתי רשומות. נותנים לטבלה הזו את השם mdm_gemini.CITIBIKE_STATIONS_SOURCE2
ונוסיף אליה שתי רשומות.
CREATE TABLE mdm_gemini.CITIBIKE_STATIONS_SOURCE2 (name STRING(55), address STRING(1000), embeddings_src ARRAY<FLOAT64>);
insert into mdm_gemini.CITIBIKE_STATIONS_SOURCE2 VALUES ('Location broadway and 29','{ "DOOR_NUMBER": "1593", "STREET_ADDRESS": "Broadway", "AREA": null, "CITY": "New York", "TOWN": null, "COUNTY": "New York County", "STATE": "NY", "COUNTRY": "USA", "ZIPCODE": "10019", "LANDMARK": null}', null);
insert into mdm_gemini.CITIBIKE_STATIONS_SOURCE2 VALUES ('Allen St & Hester','{ "DOOR_NUMBER": "36", "STREET_ADDRESS": "Allen St", "AREA": null, "CITY": "New York", "TOWN": null, "COUNTY": "New York County", "STATE": "NY", "COUNTRY": "USA", "ZIPCODE": "10002", "LANDMARK": null}', null);
9. יצירת הטמעות לנתוני כתובת
הטמעות הן וקטורים מספריים עם מידות גבוהות שמייצגים ישות נתונה, כמו קטע טקסט או קובץ אודיו. מודלים של למידת מכונה (ML) משתמשים בהטמעות כדי לקודד סמנטיקה לגבי ישויות כאלה, וכך קל יותר לחשוב עליהן ולהשוות ביניהן. לדוגמה, פעולה נפוצה במודלים של קיבוץ, סיווג והמלצות היא למדוד את המרחק בין וקטורים במרחב הטמעה כדי למצוא פריטים דומים מבחינה סמנטית. Vertex AI text-embeddings API מאפשר ליצור הטמעת טקסט באמצעות בינה מלאכותית גנרטיבית ב-Vertex AI. הטמעות טקסט הן ייצוגים מספריים של טקסט שמתארים קשרים בין מילים וביטויים. כאן אפשר לקרוא מידע נוסף על הטמעת טקסט של Vertex AI.
- מריצים את ה-DDL הבא כדי ליצור מודל מרוחק ל-API של הטמעות טקסט של Vertex AI:
CREATE OR REPLACE MODEL `mdm_gemini.CITIBIKE_STATIONS_ADDRESS_EMB`
REMOTE WITH CONNECTION `us.gemini-bq-conn`
OPTIONS (ENDPOINT = 'textembedding-gecko@latest');
- עכשיו, אחרי שמודל ההטמעות מרחוק מוכן, ניצור הטמעות למקור הראשון ונאחסן אותו בטבלה באמצעות השאילתה הבאה:
CREATE TABLE `mdm_gemini.CITIBIKE_STATIONS_SOURCE1` AS (
SELECT *
FROM ML.GENERATE_EMBEDDING(
MODEL `mdm_gemini.CITIBIKE_STATIONS_ADDRESS_EMB`,
( select name, full_address_string as content from `mdm_gemini.CITIBIKE_STATIONS`
where full_address_string is not null )
)
);
במקום ליצור טבלה חדשה, אפשר גם לאחסן את השדה של תוצאת ההטמעות באותה טבלה בשם mdm_gemini.CITIBIKE_STATIONS שיצרתם קודם.
- כדי ליצור הטמעות של נתוני כתובת בטבלה CITIBIKE_ מצייניםS_SOURCE2,מריצים את השאילתה הבאה:
update `mdm_gemini.CITIBIKE_STATIONS_SOURCE2` a set embeddings_src =
(
SELECT ml_generate_embedding_result
FROM ML.GENERATE_EMBEDDING(
MODEL `mdm_gemini.CITIBIKE_STATIONS_ADDRESS_EMB`,
( select name, address as content from `mdm_gemini.CITIBIKE_STATIONS_SOURCE2` ))
where name = a.name) where name is not null;
הפעולה הזו אמורה ליצור הטמעות עבור המקור השני. שימו לב שיצרנו את שדה ההטמעות באותה טבלה CITIBIKE_STATIONS_SOURCE2.
- כדי להמחיש את ההטמעות שנוצרות לטבלאות נתוני המקור 1 ו-2, מריצים את השאילתה הבאה:
select name,address,embeddings_src from `mdm_gemini.CITIBIKE_STATIONS_SOURCE2`;
select name,content,ml_generate_embedding_result from `mdm_gemini.CITIBIKE_STATIONS_SOURCE1`;
עכשיו נבצע חיפוש וקטורי כדי לזהות כפילויות.
10. הרצת חיפוש וקטורי לסימון כתובות כפולות
בשלב הזה תחפשו בעמודה ml_generate_embedding_result של הטבלה mdm_gemini.CITIBIKE_ מצייניםS_SOURCE1 את שתי ההטמעות המובילות שתואמות לכל שורת נתונים בעמודה embeddings_src של הטבלה mdm_gemini.CIBIKE_ שעוסק בתחנה
כדי לעשות זאת, מריצים את השאילתה הבאה:
select query.name name1,base.name name2,
/* (select address from mdm_gemini.CITIBIKE_STATIONS_SOURCE2 where name = query.name) content1, base.content content2, */
distance
from VECTOR_SEARCH(
TABLE mdm_gemini.CITIBIKE_STATIONS_SOURCE1,
'ml_generate_embedding_result',
(SELECT * FROM mdm_gemini.CITIBIKE_STATIONS_SOURCE2),
'embeddings_src',
top_k => 2
) where query.name <> base.name
order by distance desc;
הטבלה שאליה אנחנו שולחים שאילתות: mdm_gemini.CITIBIKE_STATIONS_SOURCE1
בשדה ml_generate_embedding_result
טבלה שאנחנו משתמשים בה כבסיס: mdm_gemini.CITIBIKE_STATIONS_SOURCE2
בשדה embeddings_src
top_k: מציין את מספר השכנים הקרובים ביותר שצריך להחזיר. ערך ברירת המחדל הוא 10. ערך שלילי נחשב לאינסוף – כלומר, כל הערכים נספרים כשכנים ומוחזרים.
distance_type: מציין את סוג המדד שישמש לחישוב המרחק בין שני וקטורים. סוגי המרחקים הנתמכים הם אוקלידית וקוסינוס. ברירת המחדל היא אוקלידית.
התוצאה של השאילתה תהיה כזו:
כמו שאפשר לראות, כאן רשומים שני השכנים הקרובים ביותר (כלומר, הכפילויות הקרובות ביותר) לשתי השורות ב-CITIBIKE_STATIONS_SOURCE2
מתוך CITIBIKE_STATIONS_SOURCE1
. מכיוון שלא צוין distance_type
, המערכת מניחה שהמשמעות היא אוקלידית והמרחק נמדד בערכי TEXT של הכתובת בין שני המקורות. הערך הנמוך ביותר הוא הטקסטים הדומים ביותר לכתובת.
נגדיר את distance_type
ל-Cosine באמצעות השאילתה הבאה:
select query.name name1,base.name name2,
/* (select address from mdm_gemini.CITIBIKE_STATIONS_SOURCE2 where name = query.name) content1, base.content content2, */
distance
from VECTOR_SEARCH(
TABLE mdm_gemini.CITIBIKE_STATIONS_SOURCE1,
'ml_generate_embedding_result',
(SELECT * FROM mdm_gemini.CITIBIKE_STATIONS_SOURCE2),
'embeddings_src',
top_k => 2,distance_type => 'COSINE'
) where query.name <> base.name
order by distance desc;
התוצאה של השאילתה תהיה כזו:
שתי השאילתות (משני סוגי המרחקים) מסודרות לפי מרחק תאר, ופירוש הדבר שאנחנו רוצים לרשום את התוצאות לפי סדר הקטנת המרחק. עם זאת, תבחינו שסדר המרחק של השאילתה השנייה הפוך. יודע מה הסיבה?
כן! כל הכבוד! בדמיון עם קוסינוס, מספר גדול יותר פירושו דמיון גדול יותר ומרחק קטן יותר. במרחק אוקלדית, מספר גדול יותר פירושו מרחק גדול יותר בין הערכים.
לקבלת מידע נוסף על הבנת MDM (ניהול מכשירים ניידים), וטיפים להבנת ההבדל בין אאוקלידית וקוסינוס, כדאי לקרוא את הבלוג.
11. הסרת המשאבים
כדי לא לצבור חיובים לחשבון Google Cloud עבור המשאבים שבהם השתמשתם בפוסט הזה:
- במסוף Google Cloud, נכנסים לדף Manage resources:
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.
- אם רוצים לשמור את הפרויקט, מדלגים אל Cloud Functions ומוחקים את הפונקציה של Cloud Functions. ברשימת הפונקציות, מסמנים את הפונקציה שרוצים למחוק ולוחצים על Delete.
12. מזל טוב
מעולה! הפגנתם את יכולת השימוש ב-Gemini 1.0 Pro ובקריאות לפונקציות להפוך כמה פעילויות MDM (ניהול מכשירים ניידים) ליכולות פשוטות, עוצמתיות, דטרמיניסטיות ואמינות של AI גנרטיבי. עכשיו, אחרי שהסברנו, אתם מוזמנים להכיר דרכים אחרות להטמעת אותו תרחיש לדוגמה או פונקציות אחרות של MDM (ניהול מכשירים ניידים). האם יש מערכי נתונים שאפשר לאמת, פערי מידע שאפשר למלא או משימות שאפשר לבצע באופן אוטומטי באמצעות שיחות מובְנות שמוטמעות בתשובות של ה-AI הגנרטיבי? להנחיה מפורטת יותר, אפשר לעיין במסמכי התיעוד של Vertex AI, ב-BigQuery Remote Functions, ב-Cloud Functions, בהטמעה וב-Vector Search. זהו המאגר github של הפרויקט הזה. ספרו לנו מה פיתוחכם על הלמידה הזו.