פיתוח אפליקציות בעידן ה-AI

1. סקירה כללית

בשיעור ה-Lab הזה תלמדו איך להשתמש במוצרי ה-AI הגנרטיבי של Google כדי לבנות תשתית ב-Google Cloud בעזרת Gemini Cloud Assist, לשלוח שאילתות על נתוני BigQuery באמצעות שפה טבעית לתכונות SQL של Data Canvas, לכתוב קוד במסמכי Jupyter ב-Colab Enterprise וב-Eclipse Theia‏ (Visual Studio Code) בעזרת Gemini Code Assist, ולשלב תכונות חיפוש וצ'אט מבוססות-AI שמבוססות על מקורות מידע של Cloud Storage ו-BigQuery ב-Vertex AI Agent Builder.

המטרה שלנו היא ליצור אתר מתכונים ובישול שנקרא AI Recipe Haven. האתר יבנה ב-Python וב-Streamlit ויכלול שני דפים עיקריים. ב-Cooking Advice יתארח צ'אטבוט שיצרנו באמצעות Gemini ומקור מבוסס של Vertex AI Agent Builder שמקושר לקבוצה של ספרי בישול. הצ'אטבוט יציע עצות בישול ויענה על שאלות שקשורות לבישול. חיפוש המתכונים יהיה מנוע חיפוש שמקבל נתונים מ-Gemini, והפעם הוא מבוסס על מסד נתונים של מתכונים ב-BigQuery.

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

מטרות

בשיעור ה-Lab הזה תלמדו איך לבצע את המשימות הבאות:

  • הפעלה של Gemini Cloud Assist ושימוש בו
  • יצירת אפליקציית חיפוש ב-Vertex AI Agent Builder ל-chatbot של ייעוץ בישול
  • איך מעמיסים ומנקים נתונים במחברת ב-Colab Enterprise בעזרת Gemini Code Assist
  • יצירת אפליקציית חיפוש ב-Vertex AI Agent Builder ליצירת המתכונים
  • יצירת מסגרת לאפליקציית האינטרנט המרכזית ב-Python וב-Streamlit, עם קצת עזרה מ-Gemini
  • פריסת אפליקציית האינטרנט ב-Cloud Run
  • קישור הדף 'טיפים לבישול' לאפליקציית ה-Agent Builder לחיפוש ספרי בישול
  • (אופציונלי) חיבור דף החיפוש של המתכונים לאפליקציית ה-Agent Builder לחיפוש מתכונים
  • (אופציונלי) בדיקת האפליקציה הסופית

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

לפני שלוחצים על הלחצן Start Lab

עליכם לקרוא את ההוראות האלו. שיעורי Lab מוגבלים בזמן ואי אפשר להשהות אותם. הטיימר מתחיל כשלוחצים על Start Lab ומראה למשך כמה זמן תוכלו להשתמש במשאבים ב-Google Cloud.

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

מה צריך?

כדי להשלים את המעבדה, תצטרכו:

  • גישה לדפדפן אינטרנט סטנדרטי (מומלץ להשתמש בדפדפן Chrome).
  • זמן להשלמת המעבדה.

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

הערה: אם אתם משתמשים ב-Pixelbook, עליכם לפתוח חלון פרטי כדי להריץ את שיעור ה-Lab הזה.

איך מתחילים שיעור Lab ונכנסים למסוף Google Cloud

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

52e0878388c0d9ed.png

  1. מעתיקים את שם המשתמש ואז לוחצים על 'פתיחת Google Console'. תתחיל הרצה של משאבים בשיעור ה-Lab, ואז ייפתח הדף Sign in בכרטיסייה נפרדת.

2a4b7165afebf5ab.png

טיפ: כדאי לפתוח את הכרטיסיות בחלונות נפרדים, זה לצד זה.

אם מופיע הדף 'בחירת חשבון', לוחצים על 'שימוש בחשבון אחר'.

6463aa9b492a3b60.png

  1. בדף Sign in (כניסה), מדביקים את שם המשתמש שהעתקתם מהחלונית Connection Details (פרטי התחברות). אחר כך מעתיקים ומדביקים את הסיסמה.

חשוב: צריך להשתמש בפרטי הכניסה מהחלונית Connection Details. אין להשתמש בפרטי הכניסה של Qwiklabs. אם יש לכם חשבון Google Cloud משלכם, אל תשתמשו בו בשיעור המעשי הזה (כך תימנעו מחיוב בתשלום). 4. לוחצים כדי לעבור על הדפים הבאים:

  1. מסכימים לתנאים ולהגבלות.
  2. אין להוסיף אפשרויות שחזור או אימות דו-שלבי (כי החשבון הזה זמני).
  3. אין להירשם לתקופות ניסיון בחינם.

אחרי כמה דקות מסוף Cloud ייפתח בכרטיסייה הזו.

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

bbdc8ea800bf0adc.png

3. משימה 0. בדיקת האשכולות של Workstation

בהמשך הסדנה הזו תשתמשו ב-Google Cloud Workstation כדי לבצע עבודות פיתוח. תהליך ההפעלה של המעבדה הזו אמור היה להתחיל את יצירת האשכולות של Workstation. לפני שנמשיך, חשוב לוודא שהאשכול נוצר.

  1. במסוף Google Cloud, משתמשים בתיבת החיפוש כדי לנווט אל Cloud Workstations.
  2. בתפריט הניווט הימני, לוחצים על ניהול אשכולות.
  3. אם יש לכם אשכולות בסטטוס 'מתעדכן', אתם יכולים להמשיך למשימה 1. אם לא מופיעים אשכולות במצב כלשהו, צריך לרענן את הדף. אם עדיין לא מופיע אשכול בסטטוס Updating (building), צריך לסגור את הסדנה באמצעות הלחצן בפינה הימנית העליונה של ההוראות האלה ולהתחיל אותה מחדש.

4. משימה 1: הפעלה של Gemini Cloud Assist ושימוש בו

במשימה הזו נתאר איך מפעילים את Gemini Cloud Assist ואיך משתמשים בו. כשעובדים במסוף Google Cloud, Gemini Cloud Assist יכול להציע עצות, לעזור בתהליך היצירה, ההגדרה והמעקב אחרי התשתית של Google Cloud, ואפילו להציע פקודות gcloud ולכתוב סקריפטים של Terraform.

  1. כדי להפעיל את Cloud Assist לשימוש, לוחצים על תיבת החיפוש בחלק העליון של ממשק המשתמש של מסוף Cloud ובוחרים באפשרות Ask Gemini (או Ask Gemini for Cloud console).
  2. גוללים לקטע Required API (API נדרש) בדף ומפעילים את Gemini for Google Cloud API.
  3. אם ממשק הצ'אט לא מופיע מייד, לוחצים על התחלת צ'אט. כדי להתחיל, אפשר לבקש מ-Gemini להסביר על חלק מהיתרונות של שימוש ב-Cloud Workstations. כדאי להקדיש כמה דקות כדי לבדוק את התשובה שנוצרה.
  4. בשלב הבא, כדאי לשאול על היתרונות של הכלי ליצירת סוכני תמיכה ואיך הוא יכול לעזור לכם ליצור תשובות גנרטיביות.
  5. לסיום, נציג השוואה. בחלון הצ'אט של Gemini במסוף Google Cloud, שואלים את השאלה הבאה:
What are the major steps to creating a search app grounded in a
GCS data source using Vertex AI Agent builder?
  1. עכשיו, בחלון שאינו פרטי, עוברים לאתר הציבורי של Gemini כאן, נכנסים לחשבון אם צריך ושואלים את אותה שאלה. האם התשובות זהות או לפחות דומות? מהם השלבים הספציפיים? האם יש הבדל משמעותי בין שתי השיטות? עם זאת, חשוב לזכור את התשובות שלך כשנעבור על השלבים הבאים.

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

5. משימה 2: יצירת אפליקציית חיפוש ב-Vertex AI Agent Builder ל-chatbot של ייעוץ בישול

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

  1. משתמשים בתיבת החיפוש של מסוף Cloud כדי לנווט אל Vertex AI. בלוח הבקרה, לוחצים על Enable All Recommended APIs (הפעלת כל ממשקי ה-API המומלצים). אם מופיעה תיבת קופץ עם בקשה להפעיל את Vertex AI API, צריך להפעיל אותו גם כן.
  2. משתמשים בחיפוש כדי לנווט אל Agent Builder ואז לוחצים על Continue and Activate the API.
  3. כפי שציין Gemini בבקשת העזרה הקודמת שלנו, כדי ליצור אפליקציית חיפוש ב-Agent Builder, צריך קודם ליצור מקור נתונים מהימן. כשהמשתמש מבצע חיפוש, Gemini מבין את השאלה ואת האופן שבו צריך לכתוב תשובות חכמות, אבל הוא יבדוק את המקור המהימן כדי למצוא את המידע שמשמש בתשובה הזו, במקום להסתמך על הידע הטבעי שלו.

בתפריט שמימין, עוברים אל 'מאגרי נתונים' ואז לוחצים על 'יצירת מאגר נתונים'. 4. ספרי הבישול בתחום הציבורי שבהם אנחנו משתמשים כדי להציג את העצות שלנו בנושא בישול נמצאים כרגע בקטגוריה של Cloud Storage בפרויקט חיצוני. בוחרים את סוג המקור ב-Cloud Storage. 5. בודקים את אפשרויות ברירת המחדל שקשורות לסוג המידע שאנחנו מייבאים, אבל לא משנים אותן. משאירים את סוג הייבוא מוגדר בתור 'תיקייה', ובנתיב הקטגוריה משתמשים ב-labs.roitraining.com/labs/old-cookbooks, ואז לוחצים על המשך. 6. נותנים שם למאגר הנתונים: old-cookbooks. עורכים את המזהה ומחליפים אותו ל-old-cookbooks-id, ואז יוצרים את מאגר הנתונים.

Vertex AI Agent Builder תומך במספר סוגים של אפליקציות, ו-Data Store משמש כמקור האמין של כל אחת מהן. אפליקציות חיפוש מתאימות לשימוש כללי ולחיפוש. אפליקציות צ'אט מיועדות לתהליכים גנרטיביים באפליקציות של צ'אטבוט או קולבוט שמבוססות על Dataflow. אפליקציות המלצות עוזרות ליצור מנועי המלצות טובים יותר. אפליקציות נציגים משמשות ליצירת נציגים מבוססי בינה מלאכותית גנרטיבית. בסופו של דבר, סביר להניח ש-Agent יעזור לנו להשיג את מה שאנחנו רוצים, אבל מכיוון שהמוצר נמצא כרגע בתצוגה מקדימה, נמשיך להשתמש בסוג 'אפליקציית חיפוש'. 7. בתפריט השמאלי, עוברים אל אפליקציות ולוחצים על יצירת אפליקציה. 8. בוחרים את סוג אפליקציית החיפוש. בודקים את האפשרויות השונות אבל לא משנים אותן. נותנים שם לאפליקציה: cookbook-search. עורכים ומגדירים את מזהה האפליקציה כ-cookbook-search-id. מגדירים את החברה כ-Google ולוחצים על המשך. 9. בודקים את מאגר הנתונים old-cookbooks שיצרתם לפני כמה שלבים ויוצרים את אפליקציית החיפוש.

אם תבדקו בכרטיסייה פעילות, סביר להניח שתראו שהספרים עדיין מיובאים ומתווספים לאינדקס. תהליך ההוספה של אלפי הדפים שמכילים 70 ספרי הבישול שסיפקנו ל-Agent Builder לאינדקס יימשך יותר מ-5 דקות. בזמן שהיא פועלת, נטען וננקה נתונים מסוימים ממסד הנתונים של המתכונים לצורך היצירה של המתכונים.

6. משימה 3: איך מעמיסים ומנקים נתונים במחברת ב-Colab Enterprise בעזרת Gemini Code Assist

ב-Google Cloud יש כמה דרכים עיקריות לעבוד עם מסמכי Jupiter. נשתמש במוצר החדש ביותר של Google, Colab Enterprise. יכול להיות שחלק מכם מכירים את המוצר Colab של Google, שאנשים פרטיים וארגונים משתמשים בו כדי להתנסות במסמכי Jupiter בסביבה חופשית. Colab Enterprise הוא חבילת שירות מסחרית של Google Cloud, שמשולבת באופן מלא עם שאר מוצרי הענן של Google ומאפשרת ליהנות מכל היתרונות של יכולות האבטחה והתאימות של סביבת GCP.

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

  1. משתמשים בחיפוש כדי לעבור אל Colab Enterprise ואל יצירת notebook. אם תקבלו הצעה להתנסות בתכונות חדשות של Colab, סגרו אותה. כדי להפעיל את סביבת זמן הריצה, כלומר את כוח המחשוב שמאחורי המחברת, לוחצים על התחברות בפינה השמאלית העליונה של המחברת החדשה.

386577c713522b4d.png

  1. משנים את השם שליו ל-Data Wrangling באמצעות תפריט שלוש הנקודות שליד שם המחברות הנוכחי בחלונית 'קבצים' ב-Colab Enterprise.

4cb787f255bac415.png

  1. יוצרים תיבה חדשה של + טקסט ומזיזים אותה באמצעות החץ למעלה כך שהיא תהיה התא הראשון בדף.

6a08b3ccc9c2174b.png

  1. עורכים את תיבת הטקסט ומזינים את הפרטים הבאים:
# Data Wrangling

Import the Pandas library
  1. בבלוק הקוד שמתחת לבלוק הטקסט שיצרתם, מתחילים להקליד imp, וההצעה של Gemini Code Assist לשאר הייבוא אמורה להופיע באפור. כדי לקבל את ההצעה, מקישים על Tab.
import pandas as pd
  1. מתחת לתיבת קוד הייבוא, יוצרים תיבת טקסט נוספת ומזינים:
Create a Pandas DataFrame from: gs://labs.roitraining.com/labs/recipes/recipe_dataset.csv. View the first few records.
  1. יוצרים ועורכים עוד בלוק קוד. שוב, מתחילים להקליד df ובודקים את הקוד שנוצר על ידי Gemini Code Assistant. אם מופיעה רשימת נפתחת של השלמה אוטומטית של מילות מפתח ב-Python מעל ההצעה שנוצרה, מקישים על Esc כדי להציג את הקוד המוצע באפור בהיר. מקישים שוב על Tab כדי לאשר את ההצעה. אם ההצעה לא הכילה את קריאת הפונקציה head(), מוסיפים אותה.
df = pd.read_csv('gs://labs.roitraining.com/labs/recipes/recipe_dataset.csv')
df.head()
  1. לוחצים על תא הקוד הראשון שבו ייבאת את Pandas, ומשתמשים בתפריט Commands או במקלדת כדי להריץ את התא שנבחר. במקלדת, הקשה על shift+enter תפעיל את התא ותעביר את המיקוד לתא הבא, ותצור תא חדש אם יש צורך. צריך להמתין עד שהתא יבוצע לפני שממשיכים.

הערה: אם תא לא בוצע, יופיע [ ] ממש משמאל לו. בזמן שהתא פועל, תוצג אנימציה של ספין. בסיום הטעינה של התא יופיע מספר, למשל [13]. 9. מריצים את התא שמטעין את קובץ ה-CSV ל-DataFrame. ממתינים שהקובץ ייטען ובודקים את חמש השורות הראשונות של הנתונים. אלה נתוני המתכונים שנטען ל-BigQuery, ובסופו של דבר נשתמש בהם כדי לבסס את הכלי ליצירת מתכונים. 10. יוצרים בלוק קוד חדש ומזינים את התגובה הבאה. אחרי שמקלידים את התגובה, עוברים לשורת הקוד הבאה וצריך להופיע ההצעה df.columns. מאשרים את ההודעה ומריצים את התא.

# List the current DataFrame column names

הראינו שיש לכם שתי אפשרויות לקבלת עזרה מ-Gemini Code Assist ב-Jupyter Notebook: תאי טקסט מעל תאי קוד או תגובות בתוך תא הקוד עצמו. תגובות בתוך תאי קוד פועלות היטב במסמכי Jupyter, אבל הגישה הזו תפעל גם בכל סביבת פיתוח משולבת (IDE) אחרת שתומכת בתכונה Gemini Code assist של Google.

  1. ננקה קצת את העמודות. משנים את שם העמודה Unnamed: 0 ל-id ואת שם העמודה link ל-uri. משתמשים בהנחיה ובשיטות הקוד שבוחרים כדי ליצור את הקוד, ואז מריצים את התא כשמרוצים.
# Rename the column 'Unnamed: 0' to 'id' and 'link' to 'uri'
df.rename(columns={'Unnamed: 0': 'id', 'link': 'uri'}, inplace=True)
  1. מסירים את העמודות source ו-NER ומשתמשים ב-head() כדי להציג את השורות הראשונות. שוב, אפשר לבקש עזרה מ-Gemini. מריצים את שתי השורות האחרונות ובודקים את התוצאות.
# Remove the source and NER columns
df.drop(columns=['source', 'NER'], inplace=True)
df.head()
  1. נבדוק כמה רשומות יש במערך הנתונים שלנו. שוב, מתחילים עם שיטת ההנחיה שבחרתם ובודקים אם Gemini יכולה לעזור לכם ליצור את הקוד.
# Count the records in the DataFrame
df.shape # count() will also work
  1. 2.23 מיליון רשומות הן כנראה יותר מתכונים ממה שיש לנו זמן להכין. תהליך ההוספה לאינדקס ב-Agent Builder כנראה יימשך יותר מדי זמן בשביל התרגיל שלנו היום. כפשרה, נבחר 150,000 מתכונים ונעבוד עם הנתונים האלה. משתמשים בשיטה של הנחיה > קוד כדי לבחור את הדגימה ולאחסן אותה ב-DataFrame חדש בשם dfs (s עבור קטן).
# Sample out 150,000 records into a DataFrame named dfs
dfs = df.sample(n=150000)
  1. נתוני המקור של המתכונים מוכנים לטעינה ב-BigQuery. לפני שנטען את הנתונים, נעבור ל-BigQuery ונכין מערך נתונים שיאכלס את הטבלה שלנו. במסוף Google Cloud, משתמשים בתיבת החיפוש כדי לנווט אל BigQuery. אפשר ללחוץ לחיצה ימנית על BigQuery ולפתוח אותו בכרטיסייה חדשה בדפדפן.
  2. אם היא עדיין לא מוצגת, פותחים את החלונית של Gemini AI Chat באמצעות הלוגו של Gemini בפינה הימנית העליונה של מסוף Cloud. אם תתבקשו להפעיל את ה-API שוב, תוכלו להקיש על 'הפעלה' או לרענן את הדף. מריצים את ההנחיה: What is a dataset used for in BigQuery? אחרי שבודקים את התגובה, שואלים: How can I create a dataset named recipe_data using the Cloud Console? משווים את התוצאות לשלבים הבאים.

3c38e5975c5c519.png

  1. בחלונית BigQuery Explorer, לוחצים על התפריט View actions (הצגת פעולות) עם שלוש הנקודות לצד מזהה הפרויקט. לאחר מכן בוחרים באפשרות Create dataset.

e28c2fc55a04c694.png

  1. נותנים את מערך הנתונים והמזהה של recipe_data. משאירים את סוג המיקום כ-US ולוחצים על Create Dataset. אם מופיעה הודעת שגיאה על כך שמערך הנתונים כבר קיים, פשוט ממשיכים הלאה.

אחרי שיוצרים את מערך הנתונים ב-BigQuery, חוזרים ל-Jupyter Notebook ומבצעים את ההוספה. 19. חוזרים לקובץ ה-notebook של עיבוד הנתונים ב-Colab Enterprise. בתא קוד חדש, יוצרים משתנה בשם project_id ומשתמשים בו כדי לאחסן את מזהה הפרויקט הנוכחי. מזהה הפרויקט הנוכחי מופיע בפינה הימנית העליונה של ההוראות האלה, מתחת ללחצן 'סיום הסדנה'. אפשר למצוא אותו גם בדף הבית של מסוף Cloud. מקצים את הערך למשתנה project_id ומריצים את התא.

# Create a variable to hold the current project_id
project_id='YOUR_PROJECT_ID'
  1. משתמשים בשיטה של הנחיה > קוד כדי ליצור בלוק קוד שיוסיף את DataFrame‏ dfs לטבלה בשם recipes במערך הנתונים שיצרנו עכשיו recipe_data. מפעילים את התא.
dfs.to_gbq(destination_table='recipe_data.recipes', project_id=project_id, if_exists='replace')

7. משימה 4: יצירת אפליקציית חיפוש ב-Vertex AI Agent Builder ליצירת המתכונים

מעולה, עכשיו כשטבלת נתוני המתכונים שלנו נוצרה, נשתמש בה כדי ליצור מקור נתונים מבוסס ליצירת המתכונים. הגישה שלנו תהיה דומה לזו שבה השתמשנו ב-chatbot שלנו לבישול. נשתמש ב-Vertex AI Agent Builder כדי ליצור מאגר נתונים, ולאחר מכן נשתמש בו כמקור האמיתי של אפליקציית חיפוש.

אם רוצים, אפשר לבקש מ-Gemini במסוף Google Cloud להזכיר את השלבים ליצירת אפליקציית חיפוש של Agent Builder, או לפעול לפי השלבים שמפורטים בהמשך.

  1. משתמשים בחיפוש כדי לנווט אל Agent Builder. פותחים את מאגרי הנתונים ואת יצירת מאגר נתונים. הפעם, בוחרים את הסוג BigQuery Data Store.
  2. בתא הבחירה בטבלה, לוחצים על Browse ומחפשים את recipes. לוחצים על לחצן הבחירה לצד הטבלה. אם מופיעים מתכונים מפרויקטים אחרים מסוג qwiklabs-gcp-‎..., חשוב לבחור את המתכון ששייך לכם.

הערה: אם לוחצים על recipes במקום לסמן את לחצן הבחירה שלצידו, נפתחת כרטיסייה חדשה בדפדפן ומובילים לדף הסקירה הכללית של הטבלה ב-BigQuery. פשוט סוגרים את הכרטיסייה בדפדפן ובוחרים בלחצן האפשרויות ב-Agent Builder. 3. בודקים את שאר אפשרויות ברירת המחדל, אבל לא משנים אותן, ואז לוחצים על המשך. 4. בדף בדיקת הסכימה, בודקים את הגדרות ברירת המחדל הראשוניות אבל לא משנים דבר. המשך 5. נותנים שם למאגר הנתונים recipe-data. עורכים את מזהה מאגר הנתונים ומגדירים אותו כ-recipe-data-id. יוצרים את מאגר הנתונים. 6. עוברים אל Apps (אפליקציות) בתפריט הניווט הימני ואז אל Create App (יצירת אפליקציה). 7. בוחרים שוב באפליקציית החיפוש. נותנים לאפליקציה את השם recipe-search ומגדירים את המזהה כ-recipe-search-id. מגדירים את שם החברה כ-Google ולוחצים על המשך. 8. הפעם, בודקים את מקורות הנתונים recipe-data. יוצרים את האפליקציה.

תהליך ההוספה של טבלת מסד הנתונים שלנו לאינדקס יימשך זמן מה. בזמן שהיא פועלת, ננסה את קנבס הנתונים החדש של BigQuery ונראה אם נוכל למצוא מתכון או שניים מעניינים. 9. משתמשים בתיבת החיפוש כדי לנווט אל BigQuery. בחלק העליון של BigQuery Studio, לוחצים על החץ למטה לצד הכרטיסייה השמאלית ביותר ובוחרים באפשרות Data canvas. מגדירים את האזור כ-us-central1.

5d562cddb1717c32.png

  1. בתיבה לחיפוש ב'לוח הנתונים', מחפשים את recipes ומוסיפים את הטבלה ללוח.
  2. יטען לוח ציור של נתוני BigQuery עם ייצוג חזותי של טבלת המתכונים. אפשר לבחון את הסכימה של הטבלה, להציג תצוגה מקדימה של הנתונים בטבלה ולבדוק פרטים נוספים. מתחת לייצוג הטבלה, לוחצים על שאילתה.
  3. בקנבס יופיע תיבת דו-שיח של שאילתה ב-BigQuery, עם תוספת אחת: מעל חלון השאילתה מופיעה תיבת טקסט שבה אפשר לבקש עזרה מ-Gemini. ננסה למצוא מתכונים לעוגות בדוגמה שלנו. מריצים את ההנחיה הבאה (מקלידים את הטקסט ומקישים על Enter/Return כדי להפעיל את יצירת ה-SQL):
Please select the title and ingredients for all the recipes with a title that contains the word cake.
  1. בודקים את ה-SQL שנוצר. כשמרוצים מהתוצאה, מריצים את השאילתה.
  2. לא רע! לפני שממשיכים, אפשר להתנסות בכמה הנחיות ושאילתות אחרות. כשאתם עורכים ניסויים, נסו להשתמש בהנחיות פחות ספציפיות כדי לראות מה עובד ומה לא. לדוגמה, ההנחיה הבאה:
Do I have any chili recipes?

(לא לשכוח להריץ את השאילתה החדשה) החזירה רשימה של מתכונים לצ'ילי, אבל לא כללה את המרכיבים עד ששיניתי אותה כך:

Do I have any chili recipes?  Please include their title and ingredients.

(כן, אני אומרת 'בבקשה' כשאני מבקשת משהו. אמא שלי הייתה גאה מאוד.)

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

Do I have any chili recipes?  Please include their title and ingredients, and ignore any recipes with mushrooms as an ingredient.

8. משימה 5: יצירת מסגרת לאפליקציית האינטרנט המרכזית ב-Python וב-Streamlit, עם קצת עזרה מ-Gemini

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

אנחנו נשתמש ב-Gemini Code Assist במהלך העבודה. מידע נוסף על השימוש ב-Gemini Code Assist ב-Visual Studio Code זמין כאן

נבצע את הפיתוח ב-Google Cloud Workstation – סביבת פיתוח מבוססת-ענן, שבמקרה שלנו נטענת מראש עם Eclipse Theia (Visual Studio Code בקוד פתוח). סקריפט אוטומטי בתרגיל הזה יצר בשבילנו את האשכולות וההגדרות של Cloud Workstation, אבל עדיין צריך ליצור את Cloud Workstation עצמו. אם ברצונך לקבל מידע נוסף על Cloud Workstations ועל השימוש בהם, עליך לפנות אל Gemini Cloud Assist :-)

  1. משתמשים בחיפוש כדי לעבור אל Cloud Workstations ואז אל Create Workstation. נותנים שם למכונה dev-env ומשתמשים בתצורה my-config. יוצרים את תחנת העבודה.
  2. אחרי כמה דקות, תחנת העבודה החדשה תופיע ברשימה 'תחנות העבודה שלי'. מפעילים את dev-env, ואחרי שהוא פועל, מריצים את סביבת הפיתוח.
  3. עורך תחנת העבודה ייפתח בכרטיסייה חדשה בדפדפן, ובעוד כמה רגעים אמור להופיע ממשק מוכר של Theia‏ (Visual Studio Code). בצד ימין של הממשק, מרחיבים את הכרטיסייה Source Control (בקרת מקורות) ולוחצים על Clone Repository (שכפול מאגר).

c03d05b42d28a518.png

  1. מזינים את כתובת ה-URL של המאגר https://github.com/haggman/recipe-app. מעתיקים את המאגר לתיקייה user, ואז פותחים את המאגר שהועתק כדי לערוך אותו.
  2. לפני שנבדוק את התיקייה המשוכפלת ונתחיל לעבוד על אפליקציית האינטרנט, נצטרך להתחבר ל-Google Cloud דרך הפלאגין של Cloud Code ב-Visual Studio Code ולהפעיל את Gemini. עכשיו נבצע את הפעולה הזו. בפינה הימנית התחתונה של העורך, לוחצים על Cloud Code – Sign in. אם הקישור לא מופיע, ממתינים רגע ובודקים שוב.

f4ebfbd96026c0d8.png

  1. בחלון הטרמינל תוצג כתובת URL ארוכה. פותחים את כתובת ה-URL בדפדפן ומבצעים את השלבים כדי להעניק ל-Cloud Code גישה לסביבת Google Cloud. חשוב לוודא שאתם משתמשים בחשבון הזמני student-... לתרגיל ולא בחשבון Google Cloud האישי שלכם בזמן האימות. בתיבת הדו-שיח האחרונה, מעתיקים את קוד האימות ומדביקים אותו בחזרה בחלון הטרמינל שממתין בכרטיסייה של Cloud Workstation בדפדפן.
  2. אחרי כמה רגעים, הקישור ל-Cloud Code בפינה הימנית התחתונה של העורך ישתנה ל-Cloud Code – No Project. לוחצים על הקישור החדש כדי לבחור פרויקט. לוח הפקודות אמור להיפתח בחלק העליון של העורך. לוחצים על Select a Google Cloud project ובוחרים את הפרויקט qwiklabs-gcp-…. אחרי כמה רגעים, הקישור בפינה השמאלית התחתונה של הכלי יעודכן ויציג את מזהה הפרויקט. זה אומר ש-Cloud Code צורף בהצלחה לפרויקט העבודה שלכם.
  3. עכשיו, כש-Cloud Code מחובר לפרויקט, אפשר להפעיל את Gemini Code Assist. בפינה השמאלית התחתונה של ממשק העריכה, לוחצים על הלוגו של Gemini עם הקו החוצה. חלונית Gemini Chat תיפתח בצד ימין של העורך. לוחצים על Select a Google Cloud Project. כשלוח הפקודות נפתח, בוחרים את הפרויקט qwiklabs-gcp-‎. אם פעלתם לפי השלבים בצורה נכונה (ו-Google לא שינתה שום דבר), עכשיו אמורה להופיע חלון צ'אט פעיל של Gemini.

70e4e06ed6565329.png

  1. לסיום, נגדיר את חלון הטרמינל של העורך באופן זהה. כדי לפתוח את חלון הטרמינל, לוחצים על תפריט שלושת הקווים > תצוגה > Terminal. מריצים את gcloud init. שוב, משתמשים בקישור כדי לאפשר לטרמינל של Cloud Shell לפעול בפרויקט qwiklabs-gcp-.... כשמתבקשים, בוחרים באפשרות המספרי של פרויקט qwiklabs-gcp-....
  2. מעולה, עכשיו כשהגדרתם את מסוף Cloud, את צ'אט Gemini ואת Cloud Code, תוכלו לפתוח את הכרטיסייה Explorer ולהקדיש כמה דקות כדי לעיין בקבצים בפרויקט הנוכחי.

3b2dc3820ed643e2.png

  1. פותחים את הקובץ requirements.txt ב-Explorer לעריכה. עוברים לחלונית הצ'אט של Gemini ושואלים:
From the dependencies specified in the requirements.txt file, what type of application are we building?
  1. אנחנו מפתחים אפליקציית אינטרנט אינטראקטיבית באמצעות Python ו-Streamlit, שמקיימת אינטראקציה עם Vertex AI ו-Discovery Engine. בשלב הזה, נתמקד ברכיבים של אפליקציית האינטרנט. לפי Gemini, Streamlit היא מסגרת ליצירת אפליקציות אינטרנט מבוססות-נתונים ב-Python. עכשיו שואלים:
Does the current project's folder structure seem appropriate for a Streamlit app?s

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

Given the below, does the current project's file and folder structure seem appropriate for a Streamlit app?

- build.sh
- Home.py
- requirements.txt
- pages
-- Cooking_Advice.py
-- Recipe_Search.py

רוצים לקבל תשובה טובה יותר?

  1. הנה מידע נוסף על Streamlit:
What can you tell me about Streamlit?

מצוין, אנחנו רואים ש-Gemini מציע סקירה כללית טובה, כולל יתרונות וחסרונות.

  1. אם תרצו לבדוק את החסרונות, תוכלו לשאול:
What are the major downsides or shortcomings?

שימו לב שלא היינו צריכים לומר "של Streamlit", כי Gemini Chat הוא צ'אט שיחה (עם כמה תשובות). Gemini יודע על מה דיברנו כי אנחנו נמצאים בשיחת צ'אט. אם תרצו למחוק את היסטוריית השיחות עם Gemini בשלב כלשהו, תוכלו להשתמש בסמל של פח האשפה בחלק העליון של חלון הצ'אט עם הקוד של Gemini.

9. משימה 6: פריסת אפליקציית האינטרנט ב-Cloud Run

מצוין, סיימנו ליצור את מבנה הליבה של האפליקציה, אבל האם הכל יפעל? עדיף, איפה כדאי לארח אותו ב-Google Cloud?

  1. בחלון הצ'אט של Gemini, שואלים:
If I containerize this application, what compute technologies
in Google Cloud would be best for hosting it?
  1. חשוב לזכור: אם עדיין לא עבדו בסביבת הפיתוח המשולבת, אפשר גם להשתמש ב-Google Cloud Assist. פותחים את מסוף Google Cloud ואז פותחים את Gemini Cloud Assist ושואלים:
If I have a containerized web application, where would be the
best place to run it in Google Cloud?

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

  1. Cloud Run הוא פתרון מצוין לאפליקציית אינטרנט לטווח קצר בקונטיינרים ללא שמירת מצב. בחלון הצ'אט של Gemini בכלי לעריכת קוד, מנסים את ההנחיה הבאה:
What steps would be required to run this application in
Cloud Run?
  1. נראה שהדבר הראשון שצריך לעשות הוא ליצור קובץ Dockerfile. באמצעות העורך, יוצרים קובץ בשם Dockerfile ברמה הבסיסית של תיקיית הפרויקט. חשוב לוודא שלא תעבירו אותו בטעות לתיקיית הדפים. פותחים את הקובץ לצורך עריכה.
  2. נשתמש בחלונית הצ'אט הצדדית של Gemini כדי ליצור את Dockerfile. משתמשים בהנחיה כמו זו שבהמשך. כשהתוצאות מוצגות בצ'אט, משתמשים בסמל הפלוס (+) לצד סמל ההעתקה שמעל קובץ Dockerfile המוצע כדי להוסיף את הקוד המוצע לקובץ Dockerfile.
Create a Dockerfile for the application in the current folder.
The dependencies are defined in requirements.txt and I want you
to use the Python 3 slim bookworm base image.

‫Gemini לא תמיד מחזיר את אותה תשובה לאותה הנחיה. בפעם הראשונה שביקשתי מ-Gemini קובץ Dockerfile, קיבלתי את הקובץ המדויק שאני רוצה להציע לכם להשתמש בו. קיבלתי עכשיו את ההצעה הבאה:

```docker
# Base image
FROM python:3-bookworm-slim

# Set working directory
WORKDIR /app

# Install dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    libpq-dev \
    gcc \
    python3-dev \
    && rm -rf /var/lib/apt/lists/*

# Install pip and virtualenv
RUN pip install --upgrade pip virtualenv

# Create virtual environment
RUN python3 -m venv venv

# Activate virtual environment
WORKDIR /app/venv/bin
RUN . activate

# Install Streamlit and libraries from requirements.txt
RUN pip install -r requirements.txt

# Copy application files
COPY . /app

# Expose port 8501 for Streamlit
EXPOSE 8501

# Start Streamlit app
CMD ["streamlit", "run", "main.py"]
That's a heck of a Dockerfile. I'd simplify it a bit. We don't need the apt-get section as anything needed for Python is already in our base image. Also, using a virtual environment in a Python container is a waste of space, so I'd remove that. The expose command isn't strictly necessary, but it's fine. Also, it's trying to start main.py which I don't have.

6. Tweak the Dockerfile so it resembles the following:


FROM python:3.11-slim-bookworm

WORKDIR /app

COPY requirements.txt . RUN pip install –no-cache-dir –upgrade pip &&
pip install –no-cache-dir -r requirements.txt

העתקה . .

CMD‏ ["streamlit", "run", "Home.py"]

7. We need a place in Google cloud where we can store our container image. Let's get a little help from Gemini. In the Google Cloud Console Gemini Cloud Assist ask:

איפה המקום הטוב ביותר ב-Google Cloud לאחסון קובצי אימג' של Docker?

8. If one of the answers you received is the Google Container Registry, then I guess Gemini hasn't gotten word that GCR is deprecated. Again, just like human assistants, you may get out of date or simply wrong answers (hallucinations). Always make sure to consider your choices carefully, even when Gemini is recommending something.

Let's go with Artifact Registry. Ask Gemini Cloud Assist how to create a docker registry in Artifact Registry named cooking-images.

איך משתמשים ב-gcloud כדי ליצור מאגר Docker ב-Artifact Registry?

9. Now ask Gemini how you could use Cloud Build to build a new image named `recipe-web-app` from the Dockerfile in the current folder.

איך אפשר להשתמש ב-gcloud כדי ליצור שירות חדש של Cloud Run בשם recipe-web-app מקובץ אימג' באותו שם מהמאגר של Artifact Registry שיצרנו עכשיו?

10. To save you a little time, I've created a script that will create the Artifact Registry repo (if needed), use Cloud Build to build and push the image to the repo, and finally to deploy the application to Cloud Run. In your code editor use the **Explorer** view to open `build.sh` and explore the file.
11. Gemini can operate via the chat window, but it can also work directly in your code file using comments, like we used in the Data Wrangling notebook, and it also may be invoked using Control+i on Windows or Command+i on Mac. Click somewhere in the build.sh script file, activate Gemini using the appropriate Command+i / Control+i command.

<img src="img/61ac2c9a245a3695.png" alt="61ac2c9a245a3695.png"  width="624.00" />

12. At the prompt enter the below. Examine and **Accept** the change.

יש לכתוב תגובה בקובץ הנוכחי.

How cool is that?! How many times have you had to work with someone elses code, only to have to waste time gaining a base understanding of their commentless work before you can even start making your changes. Gemini to the rescue!

13. Let's build and deploy our application. In the terminal window execute the `build.sh` file.

‎. build.sh

14. If you watch the build process, first it will build the Artifact Registry docker repo. Then, it uses Cloud Build to create the container image from the Dockerfile in the local folder (since we didn't supply a `cloudbuild.yaml`). Lastly, the docker image will be deployed into a new Cloud Run service. At the end of the script you'll get a Cloud Run test URL to use.

Open the returned link in a new tab of your browser. Take a moment and explore the application's structure and pages. Nice, now we need a hook in our generative AI functionality.


## Task 7: Connect the Cooking Advice page to our cookbook-search Agent Builder app



We have the framework for the web application running, but we need to connect the two work pages to our two Vertex AI Agent Builder search apps. Let's start with Cooking Advice.

1. In the Google Cloud console use search to navigate to **Chat** in Vertex AI.
2. In the right hand settings page pane set the model to **gemini-1.5-flash-002**. Slide the output token limit up to the max so the model can return longer answers if needed. Open the **Safety Filter Settings**. Set Hate speech, Sexually explicit content, and Harassment content to **Block some**. Set Dangerous content to **Block few** and **Save**. We're setting Dangerous Content a bit lower because talking about knives and cutting can be misinterpreted by Gemini as violence.
3. Slide on the toggle to enable **Grounding** then click **Customize**. Set the grounding source to **Vertex AI search** and for the datastore path use the following. Change YOUR_PROJECT_ID to the project ID found up near the End Lab button in these instructions, then **Save** the grounding settings

projects/YOUR_PROJECT_ID/locations/global/collections/default_collection/dataStores/old-cookbooks-id

**Note:** If you get an error then you either didn't change the project ID to your actual project ID, or you may have missed the step where you changed the old-cookbooks Agent Builder Data Store ID. Check your Agent Builder &gt; Data Stores &gt; old-cookbooks for its actual Data store ID.

4. Test a couple of chat messages. Perhaps start with the below. Try a few others if you like.


איך אפשר לדעת אם עגבנייה בשלה?

5. The model works, now let's experiment with the code. Click **Clear Conversation** so our conversations don't become part of the code then click **Get Code**.

<img src="img/dce8ad7ee006cca1.png" alt="dce8ad7ee006cca1.png"  width="624.00" />

6. At the top of the code window, press Open Notebook so we can experiment and perfect the code in Colab Enterprise before integrating it into our app.
7. Take a few minutes to familiarize yourself with the code. Let's make a couple of changes to adapt it to what we want. Before we start, run the first code cell to connect to the compute and install the AI Platform SDK. After the block runs you will be prompted to restart the session. Go ahead and do that.
8. Move to the code we pulled out of Vertex AI Studio. Change the name of the method *multiturn_generate_content* to `start_chat_session`.
9. Scroll to the `model = GenerativeModel(` method call. The existing code defines the `generation_config` and `safety_settings` but doesn't actually use them. Modify the creation of the `GenerativeModel` so it resembles:

model = GenerativeModel( "gemini-1.5-flash-002", tools=tools, generation_config=generation_config, safety_settings=safety_settings, )

10. Lastly, add a final line to the method, just below `chat = model.start_chat()`, so the function returns the `chat` object. The finished function should look like the below.

**Note:** DO NOT COPY this code into your notebook. It is simply here as a sanity check.

def start_chat_session(): vertexai.init(project="qwiklabs-gcp-02-9a7298ceaaec", location="us-central1") tools = [ Tool.from_retrieval( retrieval=grounding.Retrieval( source=grounding.VertexAISearch(datastore="projects/qwiklabs-gcp-02-9a7298ceaaec/locations/global/collections/default_collection/dataStores/old-cookbooks-id"), ) ), ] model = GenerativeModel( "gemini-1.5-flash-002", tools=tools, generation_config=generation_config, safety_settings=safety_settings, ) chat = model.start_chat() return chat

11. Scroll to the bottom of the code cell and change the final line calling the old function so it calls the new function name and stores the returned object in a variable `chat`. Once you are satisfied with your changes, run the cell.

chat = start_chat_session()

12. Create a new code cell and add the comment `# Use chat to invoke Gemini and print out the response`. Move to the next line and type resp and Gemini should auto complete the block for you. Update the prompt to `How can I tell if a tomato is ripe?`. Run the cell

response = chat.send_message("How can I tell if a tomato is ripe?") print(response)

13. That's the response alright, but the part we really want is that nested text field. Modify the codeblock to print just that section, like:


response = chat.send_message("How can I tell if a tomato is ripe?") print(response.candidates[0].content.parts[0].text)

14. Good, now that we have working chat code, let's integrate it into our web application. Copy all the contents of the code cell that creates the `start_chat_session` function (we won't need the test cell). If you click into the cell you can click the triple dot menu in the upper right corner and copy from there

<img src="img/17bf8d947393d4b.png" alt="17bf8d947393d4b.png"  width="326.00" />

15. Switch to your Cloud Workstation editor and open pages\Cooking_Advice.py for editing.
16. Locate the comment:


מוסיפים את הקוד שהעתקתם מהמחברות מתחת להודעה הזו

17. Paste your copied code just below the above comment. Nice, now we have the section which drives the chat engine via a grounded call to Gemini. Now let's integrate it into Streamlit.
18. Locate section of commented code directly below the comment:

זהו הקוד להגדרת משתני הסשן

מבטלים את ההערה על הבלוק הזה לפי ההוראות

19. Uncomment this section of code (Up till the next `Setup done, let's build the page UI` section) and explore it. It creates or retrieves the chat and history session variables.
20. Next, we need to integrate the history and chat functionality into the UI. Scroll in the code until you locate the below comment.

זהו הקוד ליצירת ממשק הצ'אט

מסירים את ההערה מהקוד שבהמשך לפי ההוראות

21. Uncomment the rest of the code below the comment and take a moment to explore it. If you like, highlight it and get Gemini to explain its functionality.
22. Excellent, now let's build the application and deploy it. When the URL comes back, launch the application and give the Cooking Advisor page a try. Perhaps ask it about ripe tomatoes, or the bot knows a good way to prepare brussels sprouts.

‎. build.sh

How cool is that! Your own personal AI cooking advisor :-)


## Task 8: (Optional) Connect the Recipe Search page to the recipe-search Agent Builder app



When we connected the Cooking Advice page to its grounded source, we did so using the Gemini API directly. For Recipe Search, let's connect to the Vertex AI Agent Builder search app directly.

1. In your Cloud Workstation editor, open the `pages/Recipe_Search.py` page for editing. Investigate the structure of the page.
2. Towards the top of the file, set your project ID.
3. Examine the `search_sample` function. This code more or less comes directly from the Discovery Engine documentation  [here](https://cloud.google.com/generative-ai-app-builder/docs/preview-search-results#genappbuilder_search-python). You can find a working copy in this notebook  [here](https://github.com/GoogleCloudPlatform/generative-ai/blob/main/search/create_datastore_and_search.ipynb).
4. The only change I made was to return the `response.results` instead of just the results. Without this, the return type is an object designed to page through results, and that's something we don't need for our basic application.
5. Scroll to the very end of the file and uncomment the entire section below `Here are the first 5 recipes I found`.
6. Highlight the whole section you just uncommented and open Gemini Code chat. Ask, `Explain the highlighted code`. If you don't have something selected, Gemini can explain the whole file. If you highlight a section and ask Gemini to explain, or comment, or improve it, Gemini will.

Take a moment and read through the explanation. For what it's worth, using a Colab Enterprise notebook is a great way to explore the Gemini APIs before you integrate them into your application. It's especially helpful at exploring some of the newer APIs which may not be documented as well as they could be.
7. At your editor terminal window, run `build.sh` to deploy the final application. Wait until the new version is deployed before moving to the next step.


## Task 9: (Optional) Explore the final application



Take a few minutes to explore the final application.

1. In the Google Cloud console, use search to navigate to **Cloud Run**, then click into your **recipe-web-app**.
2. Locate the application test URL (towards the top) and open it in a new browser tab.
3. The application home page should appear. Note the basic layout and navigation provided by Streamlit, with the python files from the `pages` folder displayed as navigational choices, and the `Home.py` loaded as the home page. Navigate to the **Cooking Advice** page.
4. After a few moments the chat interface will appear. Again, note the nice core layout provided by Streamlit.
5. Try a few cooking related questions and see how the bot functions. Something like:

יש לך עצות להכנת ברוקולי?

רוצים לנסות מתכון קלאסי למרק עוף?

Tell me about meringue.

6. Now let's find a recipe or two. Navigate to the Recipe Search page and try a few searches. Something like:

צ'ילי קון קרנה

צ'ילי, תירס, אורז

עוגת לימון עם מרנג

קינוח שמכיל תותים

## Congratulations!



You have created an application leveraging Vertex AI Agent Builder applications. Along the way you've explored Gemini Cloud Assist, Gemini Code Assist, and the natural language to SQL features of BigQuery's Data Canvas. Fantastic job!