שילוב של QueryData עם אפליקציה

במדריך הזה מוסבר איך להגדיר את QueryData ב-Cloud SQL ל-MySQL באמצעות מסוף Google Cloud , להשתמש בו ולשלב אותו באפליקציה. איך יוצרים את קובץ קבוצת ההקשר, יוצרים קבוצת הקשר שמשתמשת בקובץ קבוצת ההקשר, משתמשים ב-MCP Toolbox כדי להפעיל את השיטה QueryData ב-Conversational Analytics API כדי ליצור שאילתות SQL לשאלות בשפה טבעית, ומשלבים אותה באפליקציה.

מידע נוסף זמין במאמר סקירה כללית על QueryData.

מטרות

המדריך הזה עוסק ביעדים הבאים:

  • ליצור מסדי נתונים ולמלא אותם בנתונים.
  • יוצרים קובץ של קבוצת הקשר באמצעות סוכן עם מנוע קבוצת הקשר.
  • יוצרים קבוצת הקשרים ומעלים קובץ של קבוצת הקשרים.
  • בודקים את QueryData ויוצרים שאילתות SQL ב-Cloud SQL Studio.
  • משלבים את QueryData באפליקציה באמצעות הכלי Gemini Data Analytics QueryData ב-MCP Toolbox.
  • הוספת ביסוס לתשובות של מודל שפה גדול (LLM) באמצעות שאילתות חיפוש של ערכים.

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

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

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

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

לפני שמתחילים

לפני שיוצרים קבוצת הקשר, צריך לבצע את הפעולות הבאות.

הפעלת השירותים הנדרשים

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

הכנת מכונה של Cloud SQL

תפקידים והרשאות נדרשים

מתן הרשאה ל-executesql במכונה של Cloud SQL

כדי לתת את ההרשאה executesql למכונה של Cloud SQL ולהפעיל את Cloud SQL Data API, מריצים את הפקודה הבאה:
gcloud config set project PROJECT_ID
gcloud components update
gcloud beta sql instances patch INSTANCE_ID --data-api-access=ALLOW_DATA_API
מחליפים את הערכים הבאים:
  • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
  • ‫INSTANCE_ID: המזהה של מכונת Cloud SQL.
כדי לבצע את השלבים במדריך הזה, נכנסים אל Google Cloud ואז מאמתים את מסד הנתונים באמצעות אימות IAM.

יצירת הסכימה והטבלאות של flights ו-airports

בקטע הזה יוצרים את טבלאות מסד הנתונים flights ו-airports בשביל המדריך הזה.

  1. נכנסים לדף Cloud SQL במסוף Google Cloud .

    כניסה ל-Cloud SQL

  2. בוחרים מכונה מהרשימה.

  3. בתפריט הניווט, לוחצים על Cloud SQL Studio.

  4. נכנסים ל-Studio באמצעות אימות של ניהול זהויות והרשאות גישה (IAM).

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

  6. לוחצים על New SQL editor tab או על New tab כדי לפתוח כרטיסייה חדשה.

  7. כדי ליצור את הטבלה והסכימה של airports, מריצים את הצהרת ה-SQL הבאה:

    CREATE TABLE IF NOT EXISTS airports (
      id INT PRIMARY KEY,
      iata TEXT,
      name TEXT,
      city TEXT,
      country TEXT
      );
    
  8. יוצרים את הטבלה והסכימה של 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 שסופקו.

  1. מאכלסים את הטבלה airports.

  2. מאכלסים את הטבלה flights.

  3. מריצים את השאילתה הבאה כדי לוודא שהטבלאות מכילות נתונים:

    SELECT * FROM flights LIMIT 10;
    SELECT * FROM airports LIMIT 10;
    

הכנת מסד הנתונים לחיפושי ערכים

כדי להשתמש בחיפושים סמנטיים ובחיפושים של ערכי טריגרמות, צריך להגדיר את המכונה של Cloud SQL ל-MySQL כך שתתמוך בהטמעות וקטורים ובאינדקס n-gram.

  1. כדי לאפשר למכונה של Cloud SQL ל-MySQL לבצע חיפושים של ערכים סמנטיים, צריך להפעיל את הדגלים הבאים.

    1. מפעילים את הדגל cloudsql_vector.

      gcloud sql instances patch INSTANCE_NAME --database-flags=cloudsql_vector=on
    2. מפעילים את הדגל enable-google-ml-integration כדי לאפשר למכונה של Cloud SQL ל-MySQL להשתלב עם Vertex AI.

      gcloud sql instances patch INSTANCE_NAME --enable-google-ml-integration
    3. יצירת עמודת וקטור לאחסון הטמעות של ערים

      ALTER TABLE `airports` 
      ADD COLUMN `city_embedding` VECTOR(768);
      
    4. יצירה ואחסון של הטמעות וקטורים לשמות של ערים

      UPDATE `airports` 
      SET `city_embedding` = mysql.ml_embedding('text-embedding-005', `city`) 
      WHERE `city` IS NOT NULL;
      
  2. כדי לאפשר למכונה של Cloud SQL ל-MySQL לבצע חיפושים של ערכי טריגרם, מבצעים את השלבים הבאים.

    1. מפעילים את הדגל ngram_token_size.

      gcloud sql instances patch INSTANCE_NAME --database-flags=ngram_token_size=3
    2. יצירת אינדקס FULLTEXT להתאמת טריגרמות בשם של שדה התעופה

      CREATE FULLTEXT INDEX `idx_ngram_airports_name` 
      ON `airports`(`name`) 
      WITH PARSER ngram;
      

יצירת קבוצת הקשרים ב-Cloud SQL Studio

בקטע הזה, יוצרים קבוצת הקשרים בשם flights-assistant. קבוצת ההקשר הזו לא כוללת קובץ של קבוצת הקשר שהועלה אליה.

  1. נכנסים לדף Cloud SQL במסוף Google Cloud .

    כניסה ל-Cloud SQL

  2. בוחרים מכונה מהרשימה.

  3. בתפריט הניווט, לוחצים על Cloud SQL Studio.

  4. נכנסים ל-Studio באמצעות אימות IAM.

  5. בחלונית Explorer, לצד Context sets, לוחצים על View actions ().

  6. לוחצים על יצירת קבוצת הקשרים.

  7. בשדה Context set name, מזינים flights-assistant.

  8. לוחצים על יצירה.

בדיקת QueryData ב-Studio

בקטע הזה, תשתמשו בקבוצת ההקשר flights-assistant כדי לשאול שאלות בשפה טבעית וליצור שאילתת SQL. מכיוון שלא הועלה קובץ לקבוצת ההקשר, גם אחרי ששואלים שאלה עם הקשר כמו nighttime traffic, הכלי QueryData יוצר שאילתה לא אופטימלית.

  1. בחלונית Explorer, לצד קבוצת ההקשר, לוחצים על View actions ().
  2. לוחצים על קבוצת הקשר לבדיקה.
  3. בעורך השאילתות, לוחצים על Generate SQL using QueryData with: flights-assistant.
  4. כדי ליצור שאילתת SQL, מזינים את השאלה הבאה בשפה טבעית ולוחצים על Generate.

    Find flights from SFO to JFK.
    

    בודקים את שאילתת ה-SQL. שימו לב ש-QueryData יוצר את ה-SQL הנכון לשאלה החד-משמעית הזו.

      SELECT
        *
      FROM
        "flights"
      WHERE
        "departure_airport" = 'SFO' AND "arrival_airport" = 'JFK';
    
  5. בחלון Generate SQL using QueryData with: flights-assistant, לוחצים על Edit.

  6. מזינים את השאלה הבאה בשפה טבעית כדי ליצור שאילתת 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;
    
  7. בחלון Generate SQL using QueryData with: flights-assistant, לוחצים על Edit.

  8. מזינים את השאלה הבאה בשפה טבעית כדי ליצור שאילתת SQL, ולוחצים על Update.

    Find flights heading into Manhattan
    

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

    SELECT
      `skybot`.`flights`.*
    FROM
      `skybot`.`flights`
    JOIN
      `skybot`.`airports`
    ON
      `skybot`.`flights`.`arrival_airport` = `skybot`.`airports`.`iata`
    WHERE
      `skybot`.`airports`.`city` = 'Manhattan';
    

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

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

מגדירים את הסביבה

לפני שמתחילים ליצור הקשר, צריך להכין את הסביבה.

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

  1. מתקינים את Antigravity CLI. מידע נוסף זמין במאמר תחילת העבודה עם Antigravity CLI.
  2. מתקינים את Google Cloud CLI.
  3. הגדרת Application Default Credentials ‏(ADC). מריצים את הפקודות הבאות בטרמינל כדי לאמת ולבחור את הפרויקט:

    gcloud auth application-default login
  4. מתקינים את uv, מנהל פרויקטים וחבילות של Python שנדרש לסוכן הנדסת ההקשר. אם עדיין לא התקנתם את Python במערכת, uv יכול להתקין אותה בשבילכם.

  5. התקנת סוכן הנדסת ההקשר:

    agy plugin install https://github.com/GoogleCloudPlatform/db-context-enrichment/tree/main/plugin
  6. בטרמינל, מפעילים את Antigravity CLI.

    agy
  7. מגדירים חיבור למסד נתונים כדי ליצור הקשר באמצעות MCP Toolbox. החיבור מוגדר בקובץ התצורה tools.yaml.

    כדי ליצור את קובץ התצורה tools.yaml בספרייה הנוכחית, מזינים הנחיה כמו:

    Help me set up a database connection.
    

    פועלים לפי ההוראות של המיומנות. מידע נוסף על הקובץ tools.yaml זמין במאמרי העזרה של MCP Toolbox.

  8. כדי לטעון מחדש את ההגדרות אחרי שיוצרים את הקובץ tools.yaml, מריצים את הפקודה הבאה ב-Antigravity CLI ופועלים לפי ההוראות לטעינה מחדש של שרת ה-MCP של ארגז הכלים:

    /mcp
    1. בוחרים באפשרות db-context-engineering_toolbox.

    2. בוחרים באפשרות Restart.

  9. מוודאים שארגז הכלים של MCP והפלאגין של סוכן הנדסת ההקשר מחוברים ומוכנים לשימוש.

    /mcp

יצירת הקשר לתבנית

בקטע הזה, כדי לטפל בבעיה מהקטע הקודם שבו QueryData לא זיהה את המונח nighttime traffic, מגדירים את המונח בקובץ של קבוצת ההקשר כתנועה שמתרחשת בין 5:00 PM ל-7:00 PM.

כדי ליצור הקשר לתבנית:

  1. מזינים את ההנחיה הבאה ב-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;
    
  2. הסוכן ממיר את הקלט שלכם לפורמט ספציפי שמשפר את הביצועים של קבוצת ההקשר במגוון רחב של שאילתות משתמשים. מידע נוסף זמין במאמר סקירה כללית בנושא קבוצות הקשר.

  3. בודקים את תבנית השאילתה שנוצרה. אתם יכולים לשמור את תבנית השאילתה כקובץ הקשר חדש של הסוכן, או להוסיף אותה לקובץ הקשר קיים של הסוכן.

  4. מבקשים מהסוכן לשמור את התבנית:

    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.

כדי ליצור הקשר לחיפוש ערכים, פועלים לפי השלבים הבאים:

  1. מזינים את ההנחיה הבאה במעטפת האג'נטית.

  2. מזינים mysql כדי לבחור ב-MySQL כמסד הנתונים.

  3. מזינים את הגרסה של MySQL שבה רוצים להשתמש. בוחרים באפשרות default כדי לבחור ב-MySQL 8.0.

    Generate a trigram value search on table "airports" for column "name" with concept "airport name". Then generate a semantic value search on table "airports" for column "city" with concept "airport city" using embedding column "city_embedding".
  4. בודקים את הגדרת החיפוש של הערך שנוצר. אתם יכולים לשמור את הגדרת החיפוש של הערך כקובץ חדש של קבוצת הקשרים, או להוסיף אותה לקובץ קיים של קבוצת הקשרים.

  5. נותנים לסוכן את ההנחיה Append the context to context_set.json. הפעולה הזו מוסיפה את הגדרת החיפוש של הערך לקובץ ההקשר שנוצר בקטע הקודם.

  6. מזינים את המכונה של מסד הנתונים ואת שם מסד הנתונים שעבורו נוצר קובץ קבוצת ההקשר.

    קובץ ההקשר הקיים מתעדכן בהגדרת החיפוש של הערך, עם התוכן הבא:

      {
    "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 ?"
        }
      }
    ],
    "facets": [],
    "value_searches": [
      {
        "query": "SELECT * FROM (  WITH TrigramMetrics AS (    SELECT T.`name` AS original_value,     MATCH(T.`name`) AGAINST($value IN NATURAL LANGUAGE MODE) AS raw_score     FROM `airports` AS T     WHERE MATCH(T.`name`) AGAINST($value IN NATURAL LANGUAGE MODE) > 0     ORDER BY raw_score DESC LIMIT 10  ),   NormalizationParams AS (    SELECT MAX(raw_score) AS max_score     FROM TrigramMetrics  )   SELECT original_value AS value, 'name' AS `columns`,   'airport city' AS concept_type,   (CASE WHEN n.max_score > 0 THEN (1 - (m.raw_score / n.max_score)) ELSE 0 END) AS distance,   JSON_OBJECT() AS context   FROM TrigramMetrics m, NormalizationParams n) AS wrapped_query ",
        "concept_type": "airport city",
        "description": null
      },
      {
        "query": "SELECT * FROM (  WITH search_embedding AS (    SELECT mysql.ml_embedding('text-embedding-005', $value) AS val  )   SELECT T.`city` AS value, 'city' AS `columns`,   'airport name' AS concept_type,   COSINE_DISTANCE(T.`city_embedding`, search_embedding.val) AS distance,   JSON_OBJECT() AS context   FROM `airports` AS T, search_embedding   WHERE T.`city_embedding` IS NOT NULL) AS wrapped_query ",
        "concept_type": "airport name",
        "description": null
      }
    ]
    }
    

העלאת קובץ קבוצת ההקשר ל-QueryData

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

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

  1. נכנסים לדף Cloud SQL במסוף Google Cloud .

    כניסה ל-Cloud SQL

  2. בוחרים מכונה מהרשימה.

  3. בתפריט הניווט, לוחצים על Cloud SQL Studio.

  4. נכנסים ל-Studio באמצעות אימות של ניהול זהויות והרשאות גישה (IAM).

  5. בחלונית Explorer, בקטע Context sets, לוחצים על הסמל View actions () לצד קבוצת ההקשר flights-assistant.

  6. לוחצים על עריכת קבוצת ההקשר.

  7. בקטע Upload context file, לוחצים על Browse ובוחרים את קובץ ההקשר שנוצר קודם.

  8. לוחצים על Save.

יצירת שאילתת SQL באמצעות QueryData

בקטע הזה, תשתמשו בקובץ של קבוצת ההקשר שהעליתם כדי לשאול שאלות בשפה טבעית. כך אתם יכולים לוודא ש-QueryData מבין ומיישם בצורה נכונה הגדרות של מונחים כמו nighttime traffic וביטויים קשורים אחרים.

כדי ליצור שאילתות SQL:

  1. בחלונית Explorer, לצד קבוצת ההקשר, לוחצים על View actions ().
  2. לוחצים על קבוצת הקשר לבדיקה.
  3. בעורך השאילתות, לוחצים על Generate SQL using QueryData with: flights-assistant.
  4. כדי ליצור שאילתת SQL, מזינים את השאלה הבאה בשפה טבעית ולוחצים על Generate.

    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 למגוון רחב של שאלות דומות.

  5. בחלון Generate SQL using QueryData with: flights-assistant, לוחצים על Edit.

  6. כדי ליצור שאילתת 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;
    
  7. בחלון Generate SQL using QueryData with: flights-assistant, לוחצים על Edit.

  8. כדי ליצור שאילתת SQL, מזינים את השאלה הבאה ולוחצים על Update.

    Find flights heading into Manhattan
    

    שאילתת ה-SQL שנוצרת נראית בערך כך:

    SELECT
      *
    FROM `skybot`.`flights` AS t1
    INNER JOIN `skybot`.`airports` AS t2
      ON t1.`arrival_airport` = t2.`iata`
    WHERE t2.`city` = 'New York';
    

    שימו לב ש-QueryData יכול עכשיו לפרש בצורה מדויקת ש "מנהטן" קשורה ל "ניו יורק" במסד הנתונים באמצעות התאמה סמנטית.

שילוב של QueryData באפליקציה

בקטע הזה תיצרו סוכן לאינטראקציה עם נתונים בשביל אפליקציה לחיפוש טיסות. סוכן לאינטראקציה עם נתונים זה מספק ממשק שיחה לטבלאות flights ו-airports שיצרתם קודם. בנוסף, מוסבר איך ליצור ולשלב את הסוכן לאינטראקציה עם נתונים באפליקציה באמצעות הערכה לפיתוח סוכנים (ADK), הכלי QueryData MCP של Gemini Data Analytics וקבוצת הקשר לשיפור איכות התשובות.

  1. מורידים את MCP Toolbox בגרסה 1.14.0 ואילך. ‫MCP Toolbox חושף את הסוכן לאינטראקציה עם נתונים ככלי שאפליקציות יכולות להתחבר אליו. ארגז הכלים של MCP שונה מסוכן הנדסת ההקשר שהתקנתם קודם, שיוצר הקשר.

  2. מגדירים את Application Default Credentials (ADC).

    gcloud auth application-default login
  3. מוצאים את המזהה של קבוצת ההקשר שיצרתם קודם. איך מוצאים את מזהה קבוצת ההקשר

  4. מוסיפים את הטקסט הבא להגדרה של tools.yaml כדי להתחבר לסוכן לאינטראקציה עם נתונים באמצעות MCP Toolbox. מידע נוסף זמין במאמרים מקור הנתונים של 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:
        cloudSqlReference:
          databaseReference:
            engine: "MYSQL"
            projectId: "PROJECT_ID"
            region: "REGION_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: האזור של המכונה ב-Cloud SQL (לדוגמה, us-central1).
    • ‫INSTANCE_ID: המזהה של מכונת Cloud SQL.
    • ‫DATABASE_ID: השם של מסד הנתונים שאליו רוצים להתחבר.
    • ‫CONTEXT_SET_ID: המזהה של קבוצת ההקשרים. איך מוצאים את מזהה קבוצת ההקשר
  5. מפעילים את שרת MCP Toolbox עם הקובץ tools.yaml.

    ./toolbox --config PATH_TO_TOOLS_YAML

    מחליפים את PATH_TO_TOOLS_YAML בנתיב לקובץ tools.yaml שיצרתם קודם.

  6. יוצרים אפליקציית ADK שמפעילה את הכלי QueryData של Gemini Data Analytics באמצעות Python SDK של MCP Toolbox. למידע נוסף על השימוש ב-Python SDK של MCP Toolbox, עיינו במדריך למתחילים של Toolbox, ולמידע על Python ADK, עיינו במדריך למתחילים של ADK.

    1. יוצרים ספרייה לאחסון האפליקציה, לדוגמה flight-assistant-app.
    2. עוברים לספרייה flight-assistant-app.

      mkdir flight-assistant-app
      cd flight-assistant-app
    3. מריצים את הפקודות הבאות בספרייה flight-assistant-app כדי ליצור סביבה וירטואלית ולהתקין את הרכיבים הנדרשים.

      uv init
      uv add google-adk toolbox-core google-genai
    4. מגדירים סוכן ADK.

      1. יוצרים סוכן ADK.

        uv run adk create my_agent
      2. בוחרים את הדגם gemini-2.5-flash או דגם חדש יותר.

      3. בוחרים באפשרות Google AI ומזינים את מפתח ה-API של Gemini. איך מוצאים את מפתח ה-API של Gemini? (לחלופין, אם אתם לא צריכים תקופת ניסיון בחינם, אתם יכולים לבחור באפשרות Vertex AI ולציין פרויקט ב- Google Cloud שהחיוב מופעל בו).

    5. מחליפים את התוכן של הקובץ 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-2.5-flash",  # Or newer.
          name="root_agent",
          instruction=INSTRUCTION,
          tools=cast(list[ToolUnion], [mcp_tool]),
      )
      
  7. כדי להפעיל את האפליקציה, מריצים את הפקודות הבאות בספרייה flight-assistant-app. נכנסים לשרת האינטרנט של ADK בכתובת http://127.0.0.1:8000.

    uv run adk web --port 8000
  8. כדי להתחיל אינטראקציה עם הסוכן, מזינים טקסט כלשהו, למשל hello.

    הסוכן של ADK עונה על שאלות כלליות וקורא לכלי ה-MCP הנדרשים.

  9. מזינים את השאלה הבאה שקשורה לטיסה.

    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?
    
  10. מזינים שאלה שדומה לשאלה בתבנית השאילתה שנוצרה בשביל הסוכן.

    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
    
  11. מזינים שאלה על סמך סוג המושג שהוספתם בהקשר לסוכן.

    Find flights heading into Manhattan
    

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

    There are 6 flights heading into New York City, specifically arriving at JFK airport, which serves Manhattan.
    
    Here are the details for these flights:
    
    AA 24 from SFO, departing 2025-01-01 07:14:00 and arriving 2025-01-01 15:46:00.
    UA 758 from SFO, departing 2025-01-02 07:07:00 and arriving 2025-01-02 15:53:00.
    AA 24 from SFO, departing 2025-01-02 07:06:00 and arriving 2025-01-02 15:29:00.
    DL 2040 from SFO, departing 2025-01-02 15:09:00 and arriving 2025-01-02 23:20:00.
    DL 1370 from SFO, departing 2025-01-02 23:04:00 and arriving 2025-01-03 07:36:00.
    CY 34 from SFO, departing 2025-01-02 23:15:00 and arriving 2025-01-03 07:54:00.
    

שיפור ביצועי הסוכן

ממשק המשתמש של ה-ADK מאפשר לבדוק את הבקשה והתגובה מהכלי QueryData MCP של Gemini Data Analytics. אתם יכולים להשתמש בתשובה הזו כדי לבחון את התשובות של הכלי, כמו שאילתת SQL שנוצרה, קבוצת תוצאות, הסבר על הכוונה, שאלת הפגת עמימות ותשובה בשפה טבעית, כדי לוודא שהתשובות של הסוכן נכונות.

לדוגמה, לוחצים על בועת הסוכן של טקסט הקלט How many flights depart from the west side? שהזנתם קודם. בכרטיסייה Event שבחלונית הניווט הימנית, מרחיבים את 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. מידע נוסף זמין במאמר ניהול קבוצות הקשר ב-Cloud SQL 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.
  • ‫DB_SOURCE: הגדרות המקור של מסד הנתונים.

הסרת המשאבים

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

מחיקת קבוצת ההקשרים

לפני שמוחקים את המכונה, צריך למחוק את קבוצת ההקשר שיצרתם.

  1. נכנסים לדף Cloud SQL במסוף Google Cloud .

    כניסה ל-Cloud SQL

  2. בוחרים מכונה מהרשימה.

  3. בתפריט הניווט, לוחצים על Cloud SQL Studio.

  4. נכנסים ל-Studio באמצעות אימות של ניהול זהויות והרשאות גישה (IAM).

  5. בחלונית Explorer, לצד קבוצת ההקשר, לוחצים על View actions ().

  6. לוחצים על מחיקת קבוצת ההקשר.

  7. בחלון Delete context set, מזינים flights-assistant.

  8. לוחצים על אישור.

מחיקת המכונה

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

  1. נכנסים לדף Cloud SQL במסוף Google Cloud .

    כניסה ל-Cloud SQL

  2. בוחרים מכונה מהרשימה.

  3. לוחצים על Delete.

  4. כדי לאשר שרוצים למחוק את המכונה, מזינים את שם המכונה ולוחצים על Delete.

המאמרים הבאים