במדריך הזה מוסבר איך להגדיר את QueryData ב-AlloyDB ל-PostgreSQL ולהשתמש בו באמצעות מסוף Google Cloud , ואיך לשלב אותו באפליקציה. איך יוצרים את קובץ קבוצת ההקשר, יוצרים קבוצת הקשר שמשתמשת בקובץ קבוצת ההקשר, משתמשים ב-MCP Toolbox כדי להפעיל את ה-method QueryData ב-Conversational Analytics API כדי ליצור שאילתות SQL לשאלות בשפה טבעית, ומשלבים את זה באפליקציה.
מידע נוסף זמין במאמר סקירה כללית על QueryData.
מטרות
- ליצור מסדי נתונים ולאכלס אותם בנתונים.
- יוצרים קובץ של קבוצת הקשר באמצעות סוכן עם מנוע הקשר.
- יוצרים קבוצה של הקשרים ומעלים קובץ של קבוצת הקשרים.
- בודקים את QueryData ויוצרים שאילתות SQL ב-AlloyDB Studio.
- משלבים את QueryData באפליקציה באמצעות הכלי Gemini Data Analytics QueryData ב-MCP Toolbox.
- הוספת ביסוס לתשובות של מודלים גדולים של שפה (LLM) באמצעות שאילתות לחיפוש ערכים.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
כדי להעריך את העלויות בהתאם לשימוש הצפוי, אתם יכולים להיעזר במחשבון העלויות.
משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.
כדי להימנע מחיובים נוספים, מחקו את המשאבים שיצרתם אחרי שסיימתם את המשימות שבמסמך הזה. מידע נוסף זמין במאמר בנושא הסרת המשאבים.
לפני שמתחילים
לפני שיוצרים קבוצת הקשר, צריך לבצע את הפעולות הבאות.
הפעלת השירותים הנדרשים
מפעילים את השירותים הבאים בפרויקט:הכנת אשכול, מכונה ומסד נתונים של AlloyDB ל-PostgreSQL
מוודאים שיש לכם גישה לאשכול ולמכונה קיימים של AlloyDB, או יוצרים חדשים.כדי לבצע את ההדרכה הזו, צריך מסד נתונים במופע AlloyDB. מידע נוסף זמין במאמר יצירת מסד נתונים.
תפקידים והרשאות נדרשים
- מוסיפים לאשכול משתמש או חשבון שירות של ניהול זהויות והרשאות גישה (IAM) ברמת מסד הנתונים. מידע נוסף זמין במאמר בנושא ניהול משתמשי מסד נתונים.
- מקצים למשתמש IAM את התפקידים
alloydb.databaseUser,serviceusage.serviceUsageConsumerו-geminidataanalytics.queryDataUserברמת הפרויקט. למידע נוסף, קראו את המאמר הוספת קישור למדיניות IAM בפרויקט. - כדי ליצור, להעלות ולנהל קבוצות של הקשרים, צריך להקצות למשתמש IAM את התפקיד 'עריכת קטלוג Dataplex' (
roles/dataplex.catalogEditor) או 'אדמין קטלוג Dataplex' (roles/dataplex.catalogAdmin) ברמת הפרויקט. מידע נוסף זמין במאמר הרשאות לקבוצות של הגדרות הקשר.
מתן הרשאה ל-executesql למכונת AlloyDB ל-PostgreSQL
כדי להעניק את ההרשאה executesql למכונת AlloyDB ל-PostgreSQL ולהגדיר את הגדרת המכונה data_api_access לערך ALLOW_DATA_API, משתמשים בפקודה curl הבאה:
curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" \
https://alloydb.googleapis.com/v1alpha/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_ID/instances/INSTANCE_ID?updateMask=dataApiAccess \
-d '{
"dataApiAccess": "ENABLED",
}'
-
PROJECT_ID: מזהה הפרויקט ב- Google Cloud . -
LOCATION: האזור שבו נמצא אשכול AlloyDB. -
CLUSTER_ID: המזהה של אשכול AlloyDB. -
INSTANCE_ID: המזהה של מכונת AlloyDB.
יצירת הסכימה והטבלאות של flights ו-airports
בקטע הזה יוצרים את טבלאות מסד הנתונים flights ו-airports למדריך הזה.
נכנסים לדף AlloyDB במסוף Google Cloud .
בוחרים אשכול מהרשימה.
בתפריט הניווט, לוחצים על AlloyDB Studio.
נכנסים ל-Studio באמצעות אימות של ניהול זהויות והרשאות גישה (IAM).
לוחצים על אימות. בחלונית Explorer מוצגת רשימה של האובייקטים במסד הנתונים.
לוחצים על New SQL editor tab או על New tab כדי לפתוח כרטיסייה חדשה.
כדי ליצור את הטבלה והסכימה של
airports, מריצים את הצהרת ה-SQL הבאה:CREATE TABLE IF NOT EXISTS airports ( id INT PRIMARY KEY, iata TEXT, name TEXT, city TEXT, country TEXT );יוצרים את הטבלה והסכימה של
flights:CREATE TABLE IF NOT EXISTS flights ( id INT PRIMARY KEY, airline VARCHAR(10), flight_number INT, departure_airport VARCHAR(5), arrival_airport VARCHAR(5), departure_time TIMESTAMP, arrival_time TIMESTAMP, departure_gate VARCHAR(10), arrival_gate VARCHAR(10) );
אכלוס הטבלאות flights ו-airports
בקטע הזה מאכלסים את הטבלאות flights ו-airports באמצעות סקריפטים של SQL שסופקו.
מאכלסים את הטבלה
airports.מאכלסים את הטבלה
flights.מריצים את השאילתה הבאה כדי לוודא שהטבלאות מכילות נתונים:
SELECT * FROM "public"."flights" LIMIT 10; SELECT * FROM "public"."airports" LIMIT 10;
יצירת קבוצת הקשרים ב-AlloyDB Studio
בקטע הזה, יוצרים קבוצה של הקשרים בשם flights-assistant. לא הועלה קובץ לקבוצת ההקשר הזו.
נכנסים לדף AlloyDB במסוף Google Cloud .
בוחרים אשכול מהרשימה.
בתפריט הניווט, לוחצים על AlloyDB Studio.
נכנסים ל-Studio באמצעות אימות IAM.
בחלונית הסייר, לצד ערכות הקשר, לוחצים על סמל האפשרויות הנוספות ().
לוחצים על יצירת קבוצת הקשר.
בשדה Context set name, מזינים
flights-assistant.לוחצים על יצירה.
בדיקת QueryData ב-Studio
בקטע הזה, תשתמשו בקבוצת ההקשר flights-assistant כדי לשאול שאלות בשפה טבעית וליצור שאילתת SQL. מכיוון שלא הועלה לקבוצת ההקשר קובץ של קבוצת הקשר, גם אחרי ששואלים שאלה עם הקשר כמו nighttime traffic, הכלי QueryData יוצר שאילתה לא אופטימלית.
flights-assistant שאלה כמו 'טיסה לדיסני וורלד' כדי לבדוק אם הוא יכול להסיק מהי עיר ההגעה הנכונה.
- בחלונית הסייר, לצד קבוצת ההקשר, לוחצים על סמל האפשרויות הנוספות ().
- לוחצים על הגדרת הקשר של הבדיקה.
- בעורך השאילתות, לוחצים על יצירת SQL באמצעות QueryData עם: flights-assistant.
מזינים את השאלה הבאה בשפה טבעית כדי ליצור שאילתת SQL, ולוחצים על יצירה.
Find flights from SFO to JFK.בודקים את שאילתת ה-SQL. שימו לב ש-QueryData יוצר את ה-SQL הנכון לשאלה החד-משמעית הזו.
SELECT * FROM "flights" WHERE "departure_airport" = 'SFO' AND "arrival_airport" = 'JFK';בחלון Generate SQL using QueryData with: flights-assistant (יצירת SQL באמצעות QueryData עם: flights-assistant), לוחצים על Edit (עריכה).
מזינים את השאלה הבאה בשפה טבעית כדי ליצור שאילתת SQL, ולוחצים על Update.
Tell me flights that can help me beat nighttime traffic if traveling from New Yorkמסד הנתונים לא מבין את המונח
nighttimeתנועה. יכול להיות שהמערכת לא תיצור שאילתת SQL או תיצור שאילתה שמתעלמת מהמונח, כמו בשאילתה הבאה.-- The database schema does not contain information about traffic. -- Returning all flights departing from New York airports. SELECT f.airline, f.flight_number, a.name AS departure_airport_name, f.departure_time, b.name AS arrival_airport_name, f.arrival_time FROM flights AS f JOIN airports AS a ON f.departure_airport = a.iata JOIN airports AS b ON f.arrival_airport = b.iata WHERE a.city = 'New York' ORDER BY f.departure_time;בחלון Generate SQL using QueryData with: flights-assistant (יצירת SQL באמצעות QueryData עם: flights-assistant), לוחצים על Edit (עריכה).
מזינים את השאלה הבאה בשפה טבעית כדי ליצור שאילתת SQL ולוחצים על עדכון.
flight to disney worldהלוגיקה של הגדרת ההקשר יוצרת שאילתה כדי למצוא שדה תעופה שהשם שלו כולל את המילים 'דיסני וורלד'. מכיוון שאין נמל תעופה או עיר כאלה במסד הנתונים, השאילתה לא תחזיר שורות.
SELECT "flights"."id", "flights"."airline", "flights"."flight_number", "flights"."departure_airport", "flights"."arrival_airport", "flights"."departure_time", "flights"."arrival_time", "flights"."departure_gate", "flights"."arrival_gate" FROM "flights" INNER JOIN "airports" ON "flights"."arrival_airport" = "airports"."iata" WHERE "airports"."name" ILIKE '%Disney World%';
יצירת הקשר לקבוצת ההקשרים
בקטע הזה תכינו את הסביבה ותיצרו קובץ הקשר שיעזור לשפר את יכולות השאילתות של קבוצת ההקשר.
מגדירים את הסביבה
לפני שמתחילים ליצור הקשר, צריך להכין את הסביבה.
כדי להגדיר את הסביבה, פועלים לפי השלבים הבאים:
- מתקינים את Antigravity CLI. מידע נוסף זמין במאמר תחילת העבודה עם Antigravity CLI.
- מתקינים את Google Cloud CLI.
הגדרת Application Default Credentials (ADC). מריצים את הפקודות הבאות בטרמינל כדי לאמת ולבחור את הפרויקט:
gcloud auth application-default loginמתקינים את
uv, חבילת Python ומנהל פרויקטים שנדרשים לסוכן הנדסת ההקשר. אם עדיין לא התקנתם את Python במערכת,uvיכול להתקין אותה בשבילכם.-
agy plugin install https://github.com/GoogleCloudPlatform/db-context-enrichment/tree/main/plugin בטרמינל, מפעילים את Antigravity CLI.
agyמגדירים חיבור למסד נתונים ליצירת הקשר באמצעות MCP Toolbox. החיבור מוגדר בקובץ התצורה
tools.yaml.כדי ליצור את קובץ התצורה
tools.yamlבספרייה הנוכחית, מזינים הנחיה כמו:Help me set up a database connection.פועלים לפי ההוראות של המיומנות. מידע נוסף על הקובץ
tools.yamlזמין במאמרי העזרה של MCP Toolbox.כדי לטעון מחדש את ההגדרות אחרי שיוצרים את הקובץ
tools.yaml, מריצים את הפקודה הבאה ב-Antigravity CLI ופועלים לפי ההוראות לטעינה מחדש של שרת ה-MCP של ארגז הכלים:/mcpלוחצים על
db-context-engineering_toolbox.לוחצים על
Restart.
מוודאים שערכת הכלים של MCP והתוסף של סוכן הנדסת ההקשר מחוברים ומוכנים לשימוש.
/mcp
יצירת הקשר של התבנית
בקטע הזה, כדי לטפל בבעיה מהקטע הקודם שבו QueryData לא זיהה את המונח nighttime traffic, מגדירים את המונח בקובץ של קבוצת ההקשר כתנועה שמתרחשת בין 5:00 PM ל-7:00 PM.
כדי ליצור הקשר לתבנית:
מזינים את ההנחיה הבאה ב-Antigravity CLI:
Generate a template for the question: "Tell me flights that can help me beat nighttime traffic if traveling from New York" with the following SQL query: SELECT f.airline, f.flight_number, a.name AS airport_name, f.departure_time FROM flights f JOIN airports a ON f.departure_airport = a.iata WHERE a.city = 'New York' AND ( EXTRACT(HOUR FROM f.departure_time) < 17 OR EXTRACT(HOUR FROM f.departure_time) >= 19 ) ORDER BY f.departure_time;הנציג ממיר את הקלט שלכם לפורמט ספציפי שמשפר את הביצועים של קבוצת ההקשר במגוון רחב של שאילתות משתמשים. מידע נוסף זמין במאמר סקירה כללית בנושא קבוצות הקשר.
בודקים את תבנית השאילתה שנוצרה. אתם יכולים לשמור את תבנית השאילתה כקובץ הקשר חדש של הסוכן, או להוסיף אותה לקובץ הקשר קיים של הסוכן.
מבקשים מהסוכן לשמור את התבנית:
Save it to context_set.json.ה-agent יוצר את הקובץ באותה ספרייה, עם התוכן הבא:
{ "templates": [ { "nl_query": "Tell me flights that can help me beat nighttime traffic if traveling from New York", "sql": "SELECT f.airline, f.flight_number, a.name AS airport_name, f.departure_time FROM flights f JOIN airports a ON f.departure_airport = a.iata WHERE a.city = 'New York' AND (EXTRACT(HOUR FROM f.departure_time) < 17 OR EXTRACT(HOUR FROM f.departure_time) >= 19) ORDER BY f.departure_time;", "intent": "Tell me flights that can help me beat nighttime traffic if traveling from New York", "manifest": "Tell me flights that can help me beat nighttime traffic if traveling from a given city", "parameterized": { "parameterized_sql": "SELECT f.airline, f.flight_number, a.name AS airport_name, f.departure_time FROM flights f JOIN airports a ON f.departure_airport = a.iata WHERE a.city = ? AND (EXTRACT(HOUR FROM f.departure_time) < 17 OR EXTRACT(HOUR FROM f.departure_time) >= 19) ORDER BY f.departure_time;", "parameterized_intent": "Tell me flights that can help me beat nighttime traffic if traveling from ?" } } ] }
יצירת הקשר לחיפוש ערכים
בקטע הזה, אתם יוצרים הקשר לחיפוש ערכים כדי לעזור ללוגיקה של הגדרת ההקשר למפות ביטויים של ערכים לערכים ספציפיים שמאוחסנים בעמודות של מסד הנתונים. לדוגמה, אם משתמש מחפש "טיסות לדיסני וורלד", חיפוש ערכים יכול למפות את זה לדיסני וורלד בעיר "אורלנדו" על סמך סוג הקונספט שמתאים לעמודה airports.city במסד הנתונים.
כדי ליצור הקשר לחיפוש ערכים, פועלים לפי השלבים הבאים:
מזינים את ההנחיה הבאה במעטפת האג'נטית:
מזינים
postgresqlכדי לבחור ב-AlloyDB כמנוע מסד הנתונים.מזינים את הגדרת החיפוש של הערך באופן הבא:
Generate a value search on table "airports" for column "city" with concept "Airport City" using match function "SEMANTIC_SIMILARITY_MATCH".בודקים את הגדרת החיפוש של הערך שנוצר. אפשר לשמור את הגדרת החיפוש של הערך כקובץ חדש של הגדרות הקשר, או לצרף אותה לקובץ קיים של הגדרות הקשר.
נותנים לסוכן את ההנחיה
Append the context to context_set.json. הפעולה הזו מוסיפה את הגדרת החיפוש של הערך לקובץ ההקשר שנוצר בקטע הקודם.מזינים את מופע מסד הנתונים ואת שם מסד הנתונים שעבורם נוצר קובץ הגדרת ההקשר.
קובץ ההקשר הקיים מתעדכן בהגדרת החיפוש של הערך, עם התוכן הבא:
{ "templates": [ { "nl_query": "Tell me flights that can help me beat nighttime traffic if traveling from New York", "sql": "SELECT f.airline, f.flight_number, a.name AS airport_name, f.departure_time FROM flights f JOIN airports a ON f.departure_airport = a.iata WHERE a.city = 'New York' AND (EXTRACT(HOUR FROM f.departure_time) < 17 OR EXTRACT(HOUR FROM f.departure_time) >= 19) ORDER BY f.departure_time;", "intent": "Tell me flights that can help me beat nighttime traffic if traveling from New York", "manifest": "Tell me flights that can help me beat nighttime traffic if traveling from a given city", "parameterized": { "parameterized_sql": "SELECT f.airline, f.flight_number, a.name AS airport_name, f.departure_time FROM flights f JOIN airports a ON f.departure_airport = a.iata WHERE a.city = $1 AND (EXTRACT(HOUR FROM f.departure_time) < 17 OR EXTRACT(HOUR FROM f.departure_time) >= 19) ORDER BY f.departure_time;", "parameterized_intent": "Tell me flights that can help me beat nighttime traffic if traveling from $1" } } ], "value_searches": [ { "query": "/* Requires extensions: vector, google_ml_integration */ WITH SemanticMetrics AS ( SELECT T.city AS original_value, ( (google_ml.embedding('gemini-embedding-001', $value)::vector <=> google_ml.embedding('gemini-embedding-001', T.city)::vector) / 2.0 ) AS normalized_dist FROM airports T WHERE T.city IS NOT NULL) SELECT original_value AS value, 'airports.city' AS columns, 'Airport City' AS concept_type, normalized_dist AS distance, ''::text AS context FROM SemanticMetrics", "concept_type": "Airport City", "description": "Semantic search for airport city name" } ] }
העלאה של קובץ קבוצת ההקשר אל QueryData
בקטע הזה תעלו את קובץ קבוצת ההקשר ל-QueryData, כדי לשפר את יכולות יצירת ה-SQL של QueryData במסד הנתונים שלכם.
כדי להעלות את ההקשר, מבצעים את השלבים הבאים:
נכנסים לדף AlloyDB במסוף Google Cloud .
בוחרים אשכול מהרשימה.
בתפריט הניווט, לוחצים על AlloyDB Studio.
נכנסים ל-Studio באמצעות אימות של ניהול זהויות והרשאות גישה (IAM).
בחלונית הסייר, לצד Context sets (קבוצות הקשר), לוחצים על סמל הפעולות ().
לוחצים על עריכת קבוצת ההקשר.
בקטע העלאת קובץ של קבוצת הקשר, לוחצים על עיון ובוחרים את הקובץ של קבוצת ההקשר שנוצר קודם.
לוחצים על Save.
יצירת שאילתת SQL באמצעות QueryData
בקטע הזה, תשתמשו בקובץ של קבוצת ההקשר שהעליתם כדי לשאול שאלות בשפה טבעית. כך אפשר לוודא ש-QueryData מבין ומיישם בצורה נכונה הגדרות של מונחים כמו nighttime traffic וביטויים קשורים אחרים, ושהחיפוש לפי ערך ממפה ביטויי ערך לערכים ספציפיים שמאוחסנים בעמודות של מסד הנתונים (לדוגמה, מיפוי של "דיסני וורלד" ל "אורלנדו").
כדי ליצור שאילתות SQL:
- בחלונית Explorer, לצד קבוצת ההקשר, לוחצים על סמל האפשרויות הנוספות ().
- לוחצים על קבוצת הקשר לבדיקה.
- בעורך השאילתות, לוחצים על יצירת SQL באמצעות QueryData עם: flights-assistant.
מזינים את השאלה הבאה בשפה טבעית כדי ליצור שאילתת SQL, ולוחצים על יצירה.
Tell me flights that can help me beat nighttime traffic if traveling from New Yorkשאילתת ה-SQL שנוצרת נראית כך:
SELECT f.airline, f.flight_number, a.name AS airport_name, f.departure_time FROM flights f JOIN airports a ON f.departure_airport = a.iata WHERE a.city = 'New York' AND ( EXTRACT(HOUR FROM f.departure_time) < 17 OR EXTRACT(HOUR FROM f.departure_time) >= 19 ) ORDER BY f.departure_time;זו אותה שאלה שהוספתם להקשר של QueryData. שימו לב ש-QueryData יכול עכשיו לפרש בצורה מדויקת את המונח
nighttime traffic.למרות שההקשר מגיע משאלה ספציפית אחת, QueryData משתמש בו כדי לשפר את יצירת ה-SQL למגוון רחב של שאלות דומות.
בחלון Generate SQL using QueryData with: flights-assistant (יצירת SQL באמצעות QueryData עם: flights-assistant), לוחצים על Edit (עריכה).
כדי ליצור שאילתת SQL, מזינים את השאלה הבאה ולוחצים על Update.
What are the flights that can help me avoid evening traffic if departing from Bostonמכיוון שהשאלה מחליפה את המונח
nighttime trafficבמונח דומה,evening traffic, QueryData מספקת תשובה עקבית לשאלה הזו על ידי יישום אותו פירוש.שאילתת ה-SQL שנוצרת נראית כך:
-- What are the flights that can help me avoid evening traffic if departing from Boston SELECT f.airline, f.flight_number, a.name AS airport_name, f.departure_time FROM flights f JOIN airports a ON f.departure_airport = a.iata WHERE a.city = 'Boston' AND ( EXTRACT(HOUR FROM f.departure_time) < 17 OR EXTRACT(HOUR FROM f.departure_time) >= 19 ) ORDER BY f.departure_time;בחלון Generate SQL using QueryData with: flights-assistant, לוחצים על Edit.
כדי ליצור שאילתת SQL, מזינים את השאלה הבאה ולוחצים על Update.
flights to disney worldשאילתת ה-SQL שנוצרת נראית כך:
SELECT "flights"."id", "flights"."airline", "flights"."flight_number", "flights"."departure_airport", "flights"."arrival_airport", "flights"."departure_time", "flights"."arrival_time", "flights"."departure_gate", "flights"."arrival_gate" FROM "flights" JOIN "airports" ON "flights"."arrival_airport" = "airports"."iata" WHERE "airports"."city" = 'Orlando';שימו לב שעכשיו QueryData יכול לפרש בצורה מדויקת ש-"disney world" קשור לעיר "Orlando".
שילוב של QueryData עם האפליקציה
בקטע הזה תיצרו סוכן נתונים לאפליקציה לחיפוש טיסות. סוכן הנתונים הזה מספק ממשק שיחה לטבלאות flights ו-airports שיצרתם קודם. בנוסף, מוסבר איך ליצור ולשלב את סוכן הנתונים הזה באפליקציה באמצעות הערכה לפיתוח סוכנים (ADK), הכלי QueryData MCP של Gemini Data Analytics וקבוצת הקשר לשיפור איכות התשובות.
מורידים את MCP Toolbox בגרסה 1.14.0 ואילך. MCP Toolbox חושף את סוכן הנתונים ככלי שאפליקציות יכולות להתחבר אליו. ה-MCP Toolbox שונה מהסוכן להנדסת הקשר שהתקנתם קודם, שמייצר הקשר.
מגדירים Application Default Credentials (ADC).
gcloud auth application-default loginמוצאים את המזהה של קבוצת ההקשר שיצרתם קודם. איך מוצאים את מזהה קבוצת ההקשר
כדי להתחבר לסוכן הנתונים באמצעות MCP Toolbox, מוסיפים את הטקסט הבא להגדרה של
tools.yaml. מידע נוסף זמין במאמרים מקור הנתונים של Gemini Data Analytics והכלי QueryData של Gemini Data Analytics.--- kind: source name: gda-api-source type: cloud-gemini-data-analytics projectId: "PROJECT_ID" --- kind: tool name: cloud_gda_query_tool type: cloud-gemini-data-analytics-query source: gda-api-source description: Use this tool to send natural language queries to the Gemini Data Analytics API and receive SQL, natural language answers, and explanations. location: "REGION_ID" context: datasourceReferences: alloydb: databaseReference: projectId: "PROJECT_ID" region: "REGION_ID" clusterId: "CLUSTER_ID" instanceId: "INSTANCE_ID" databaseId: "DATABASE_ID" agentContextReference: contextSetId: "CONTEXT_SET_ID" generationOptions: generateQueryResult: true generateNaturalLanguageAnswer: true generateExplanation: true generateDisambiguationQuestion: trueמחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: מזהה הפרויקט ב- Google Cloud . -
REGION_ID: האזור של אשכול AlloyDB (לדוגמהus-central1). -
CLUSTER_ID: המזהה של אשכול AlloyDB. -
INSTANCE_ID: המזהה של המופע הראשי של AlloyDB. -
DATABASE_ID: השם של מסד הנתונים שאליו רוצים להתחבר. -
CONTEXT_SET_ID: מזהה קבוצת ההקשר. מידע נוסף על מציאת מזהה קבוצת ההקשר
-
מפעילים את שרת MCP Toolbox עם הקובץ
tools.yaml../toolbox --config autoctx/tools.yamlיוצרים אפליקציית ADK שמפעילה את הכלי QueryData של Gemini Data Analytics באמצעות Python SDK של MCP Toolbox. מידע נוסף על השימוש ב-Python SDK של MCP Toolbox זמין במדריך למתחילים בנושא Toolbox. מידע נוסף על השימוש ב-Python ADK זמין במדריך למתחילים בנושא ADK.
- יוצרים ספרייה לאחסון האפליקציה, לדוגמה
flight-assistant-app. משנים את הספרייה לספרייה
flight-assistant-app.mkdir flight-assistant-appcd flight-assistant-appמריצים את הפקודות הבאות בספרייה
flight-assistant-appכדי ליצור סביבה וירטואלית ולהתקין את הרכיבים הנדרשים.uv inituv add google-adk toolbox-core google-genaiמגדירים סוכן ADK.
יוצרים סוכן ADK.
uv run adk create my_agentבוחרים במודל
gemini-3.8-flashאו במודל חדש יותר.בוחרים באפשרות Google AI ומזינים את מפתח ה-API של Gemini. מידע נוסף על איתור מפתח API זמין במאמר שימוש במפתחות API של Gemini. (לחלופין, אם אתם לא צריכים תקופת ניסיון בחינם, אתם יכולים לבחור באפשרות Vertex AI ולציין פרויקט ב- Google Cloud שהחיוב מופעל בו).
מחליפים את התוכן של הקובץ
agent.pyבקוד אפליקציה לדוגמה של Flight Data Assistant שמופיע בהמשך.from typing import cast from google.adk.agents.llm_agent import Agent from google.adk.agents.llm_agent import ToolUnion from toolbox_core import ToolboxSyncClient TOOLBOX_URL = "http://127.0.0.1:5000" INSTRUCTION = """ # ROLE You are a friendly and factual flight data assistant. Your goal is to help users find the best flights for their needs by providing accurate information with a helpful, professional tone. - use the Query Data Tool to answer the user's question, if the tool fails to generate a valid query, ask the user to clarify their question. # OPERATIONAL CONSTRAINTS - TOOL LIMITATION: You only have access to the Query Data Tool. Do not claim to have capabilities beyond what this tool provides. - TRANSPARENCY POLICY: Maintain a seamless user experience. Never mention that you are using a tool, querying a database, or generating SQL. Frame all responses as your own direct assistance. - SCOPE MANAGEMENT: If a user asks for something beyond your capabilities, politely state that you cannot perform that specific task. Guide the user towards what you can help with. # COMMUNICATION STYLE - Be concise and scannable when listing answers. - Maintain a helpful, professional persona. ===== # QUERY DATA TOOL Inputs: 1. query: A natural language formulation of a database query. Outputs: (all optional) 1. disambiguation_question: Clarification questions or comments where the tool needs the users' input. 2. generated_query: The generated query for the user query. 3. intent_explanation: An explanation for why the tool produced `generated_query`. 4. query_result: The result of executing `generated_query`. 5. natural_language_answer: The natural language answer that summarizes the `query` and `query_result`. Usage guidance: 1. If `disambiguation_question` is produced, then solicit the needed inputs from the user and try the tool with a new `query` that has the needed clarification. 2. If `natural_language_answer` is produced, use `intent_explanation` and `generated_query` to see if you need to clarify any assumptions for the user. 3. If the tool output indicates failure or empty results, explain that clearly using the provided reasoning. """ client = ToolboxSyncClient(TOOLBOX_URL) mcp_tool = client.load_tool("cloud_gda_query_tool") root_agent = Agent( model="gemini-3.8-flash", # Or newer. name="root_agent", instruction=INSTRUCTION, tools=cast(list[ToolUnion], [mcp_tool]), )
- יוצרים ספרייה לאחסון האפליקציה, לדוגמה
מריצים את הפקודות הבאות בספרייה
flight-assistant-appכדי להפעיל את האפליקציה ולגשת לשרת האינטרנט של ADK בכתובתhttp://127.0.0.1:8000.uv run adk web --port 8000כדי להתחיל אינטראקציה עם הסוכן, מזינים טקסט כלשהו, למשל
hello.סוכן ה-ADK עונה על שאלות כלליות ומפעיל את כלי ה-MCP הנדרשים.
מזינים את השאלה הבאה שקשורה לטיסה.
How many flights depart from the west side?כלי ה-MCP מופעל כדי לענות על השאלה הזו. עם זאת, המונח
the westהוא דו-משמעי ולא מציין שדות תעופה ספציפיים, ולכן הכלי MCP מחזיר שאלה להסרת דו-משמעות, והסוכן משתמש בה כדי ליצור תשובה.I cannot determine how many flights depart from the 'west side' as the database does not contain information about which airports are considered to be on the 'west side'. However, I can help you with questions like: 1. How many flights depart from a specific airport? 2. What are the departure airports for all flights? 3. How many flights depart from each airport? Would you like to rephrase your question based on these options?מזינים שאלה שדומה לשאלה בתבנית השאילתה שנוצרה בשביל הנציג.
Help me find flights from San Francisco that avoid the evening rush hour.על סמך ההקשר של QueryData שנוסף קודם, כלי ה-MCP מבין ש-
evening trafficמתרחש בין 17:00 ל-19:00. הכלי MCP מחזיר את הנתונים המשויכים לסוכן כדי שישתמש בהם ליצירת התשובה.Here are the flights departing from San Francisco that avoid the evening rush hour (defined as 5 PM to 7 PM): * UA 1532 departing at 05:50:00 * UA 1158 departing at 05:57:00 * CY 922 departing at 06:38:00 * OO 5441 departing at 07:08:00 * UA 616 departing at 07:14:00 * AA 24 departing at 07:14:00 * B6 434 departing at 08:00:00 * AA 242 departing at 08:18:00 * UA 1739 departing at 08:22:00 * OO 6336 departing at 08:32:00 * US 1784 departing at 08:47:00 * DL 1631 departing at 09:00:00 * DL 1106 departing at 09:06:00 * OO 5427 departing at 09:06:00 * CY 352 departing at 09:25:00מזינים שאלה על סמך סוג המושג שהוספתם בהקשר של סוכן QueryData.
Get me flights to disney worldעל סמך הקשר של חיפוש הערכים שנוסף קודם לכן, סוכן QueryData מבין שהמונח 'דיסני וורלד' מתייחס לעיר 'אורלנדו' ומחזיר את הנתונים המשויכים כדי שסוכן QueryData יוכל להשתמש בהם ליצירת התשובה.
Here are the flights heading to Orlando, which is the location of Disney World: * Flight UA 1249 departs from SFO and arrives at MCO on 2025-01-02 at 18:15:00Z. * Flight UA 698 departs from SFO and arrives at MCO on 2025-01-02 at 22:33:00Z. * Flight UA 292 departs from SFO and arrives at MCO on 2025-01-03 at 06:37:00Z.
שיפור הביצועים של הסוכן
ממשק המשתמש של ה-ADK בדפדפן מאפשר לבדוק את הבקשה והתשובה מהכלי QueryData MCP של Gemini Data Analytics. אתם יכולים להשתמש בתשובה הזו כדי לבחון את התשובות של הכלי, כמו שאילתת SQL שנוצרה, קבוצת תוצאות, הסבר על הכוונה, שאלה להסרת דו-משמעות ותשובה בשפה טבעית, כדי לוודא שהתשובות של הסוכן נכונות.
לדוגמה, לוחצים על בועת הסוכן של טקסט הקלט How many flights depart from the west side? שהזנתם קודם. בכרטיסייה אירוע בחלונית הניווט שמימין, מרחיבים את functionResponse כדי לראות את התשובה הבאה.
"{"disambiguationQuestion": ["[NOT_ENOUGH_INFO] The database schema does not
contain information about which airports are on the 'west side'. Therefore, I
cannot determine how many flights depart from the west side.Possible alternative
questions: 1. How many flights depart from a specific airport? 2. What are the
departure airports for all flights? 3. How many flights depart from each
airport?"]}"
שיפור הדיוק של התשובות
אתם יכולים להוסיף הקשר כדי לשפר את הדיוק של התשובות שאתם מקבלים מהכלי QueryData לניתוח נתונים ב-Gemini. משתמשים בסוכן עם מנוע תלוי הקשר כדי ליצור הקשר, ואז מעלים את קובץ קבוצת ההקשר המעודכן לסוכן הנתונים הקיים flights-assistant. מידע נוסף זמין במאמר ניהול של ערכות הקשר ב-AlloyDB Studio. אחרי שמעלים הקשר חדש, הממשק מעבד אותו באופן מיידי, כך שאפשר לשפר את הדיוק של הסוכן בלי שהאפליקציה תושבת.
כמה נציגים
בסביבת הפיתוח, אתם יכולים לבצע בדיקות A/B בכמה הקשרים של סוכני נתונים. כדי לעשות את זה, אתם צריכים להקצות שמות נפרדים לכלים בקובץ tools.yaml. לדוגמה, אפשר ליצור הגדרות ייחודיות של tools.yaml על ידי הגדרה של שני כלים של cloud-gemini-data-analytics-query עם שמות שונים, כמו cloud_gda_query_tool_v1 ו-cloud_gda_query_tool_v2. ההגדרה הזו מאפשרת לכם להטמיע לוגיקה של אפליקציה שבוחרת באופן פרוגרמטי את גרסת ההקשר הנדרשת על ידי בחירת שם הכלי המתאים.
בדוגמה הבאה של tools.yaml מוסבר איך להגדיר כמה סוכני נתונים למקור של מסד נתונים:
kind: source
name: gda-api-source
type: cloud-gemini-data-analytics
projectId: PROJECT_ID
---
kind: tool
name: cloud_gda_query_tool_v1
type: cloud-gemini-data-analytics-query
source: gda-api-source
context:
datasourceReferences:
DB_SOURCE:
databaseReference: ...
agentContextReference:
contextSetId: "V1_YOUR_CONTEXT_SET_ID"
generationOptions: ...
---
kind: tool
name: cloud_gda_query_tool_v2
type: cloud-gemini-data-analytics-query
source: gda-api-source
context:
datasourceReferences:
DB_SOURCE:
databaseReference: ...
agentContextReference:
contextSetId: "V2_YOUR_CONTEXT_SET_ID"
generationOptions: ...
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: מזהה הפרויקט ב- Google Cloud . -
V1_YOUR_CONTEXT_SET_ID: המזהה של קבוצת ההקשרים של גרסה 1. -
V2_YOUR_CONTEXT_SET_ID: מזהה קבוצת ההקשרים של גרסה 2.
הוספת שכבת גישה מאובטחת באמצעות תצוגות SQL
כשמשלבים את QueryData באפליקציה, QueryData יוצר שאילתות SQL על סמך קלט בשפה טבעית. כדי למנוע מהשאילתות שנוצרו לגשת לנתונים מחוץ להיקף של משתמש ספציפי, צריך להטמיע תצוגות מאובטחות עם פרמטרים (PSV). מידע נוסף על PSV זמין במאמר סקירה כללית על תצוגות מאובטחות עם פרמטרים.
ה-PSV מספקים שכבת אבטחה שמוודאת שסוכן QueryData יכול לשלוח שאילתות רק לשורות שלמשתמש הנוכחי באפליקציה יש הרשאת גישה אליהן.
שכבת האבטחה הזו כוללת את הפעולות הבאות:
- יצירת תצוגה מאובטחת עם פרמטרים. ההגדרה הזו מגבילה את הגישה ברמת השורה על סמך זהויות שסופקו על ידי האפליקציה.
- הגדרת אבטחה לאפליקציה. הפעולה הזו מעניקה למשתמשים מורשים במסד הנתונים הרשאות
SELECTבתצוגה והרשאותUSAGEבסכימה הבסיסית. - שאילתה של תצוגה מאובטחת שמכילה פרמטרים. בדוגמה הבאה מוסבר איך לשלוח שאילתה לתצוגה מאובטחת עם פרמטרים באמצעות תחביר SQL ובקשת QueryData עם פרמטרים של PSV.
במאמר סוכני נתונים מאובטחים עם תצוגות מאובטחות עם פרמטרים מוסבר איך להשתמש ב-PSV עם קבוצות הקשרים.
הסרת המשאבים
כשתסיימו את המדריך, מחקו את המשאבים שיצרתם כדי שלא תחויבו בעלויות שוטפות. בקטעים הבאים מוסבר איך למחוק את המשאבים האלה.
מחיקת קבוצת ההקשרים
לפני שמוחקים את האשכול, צריך למחוק את קבוצת ההקשר שיצרתם.
נכנסים לדף AlloyDB במסוף Google Cloud .
בוחרים אשכול מהרשימה.
בתפריט הניווט, לוחצים על AlloyDB Studio.
נכנסים ל-Studio באמצעות אימות של ניהול זהויות והרשאות גישה (IAM).
בחלונית הסייר, לצד קבוצת ההקשר, לוחצים על סמל האפשרויות הנוספות ().
בחלון Delete context set, מזינים
flight-assistantבתיבת האישור.לוחצים על אישור.
מחיקת האשכול
כשמוחקים את האשכול שיצרתם בקטע לפני שמתחילים, נמחקים גם כל האובייקטים שיצרתם.
נכנסים לדף AlloyDB במסוף Google Cloud .
בוחרים אשכול מהרשימה.
לוחצים על מחיקת האשכול.
בקטע Delete cluster (מחיקת אשכול), מזינים את שם האשכול כדי לאשר שרוצים למחוק אותו.