התבססות של סוכני RMI ADK על ידע בתחום באמצעות מיומנויות

סקירה כללית

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

הסוכן RMI ADK פותר את הבעיה הזו באמצעות מיומנויות. נניח שמשתמש שואל "מה היה עומס התנועה אתמול ב-Storrow Drive?". כדי לענות, הסוכן צריך לדעת ש-RMI מבטא עומס כאינדקס זמן הנסיעה (TTI), היחס בין duration_in_seconds בזמן אמת לבין static_duration_in_seconds בתנאים של זרימה חופשית בטבלה historical_travel_time. סוכן ללא כישורים עשוי להמציא עמודה average_speed (דוחות RMI מציגים רק מהירות קטגורית, אף פעם לא קמ"ש) או להשתמש בנוסחה שגויה, ולייצר תשובה שנראית בטוחה אבל היא שגויה.

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

מגבלות של הנחיות מערכת גדולות

הכנסת כל הכללים והסכימות של הדומיין להנחיית מערכת אחת גורמת לכמה בעיות:

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

מיומנויות

מיומנויות של סוכנים מארגנות ידע על תחום מסוים בתיקיות מודולריות שהסוכן טוען רק כשצריך. כל מיומנות היא ספרייה שמכילה קובץ SKILL.md עם הוראות ב-Markdown וכותרת YAML.

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

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

המבנה של סקיל

קובץ SKILL.md מורכב משני חלקים: כותרת YAML לניתוב וגוף Markdown להוראות.

1. כותרת YAML

---
name: rmi-traffic-metrics-grounding
description: >
  Standard traffic performance metrics computable from RMI BigQuery
  tables. Covers congestion severity (TTI), delay, travel time
  reliability (LOTTR, BTI, PTI, CoV), congestion frequency, speed
  breakdowns, and network-wide congestion rates. Use when the user asks
  about traffic conditions, congestion, reliability, delay, or network
  health.
---

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

2. גוף ההודעה ב-Markdown

גוף ההודעה מספק את ההנחיות הספציפיות לדומיין שהמודל פועל לפיהן אחרי הטעינה. הידע של ה-RMI כולל את הנוסחה המדויקת לחישוב TTI ‏(duration_in_seconds / static_duration_in_seconds), תבנית SQL מאומתת של BigQuery לכל מדד וביטויי הפעלה שממפים את כוונת המשתמש למדד הנכון. הוראות מובְנות ומאומתות עוזרות למודל להישאר מבוסס על המציאות ומונעות ממנו לנחש פרטים של סכימה או נוסחה.

רישום מיומנויות באמצעות ADK

מקבצים את הכישורים בSkillToolset ומוסיפים אותם לרשימת הכלים של הסוכן:

from google.adk import skills
from google.adk.tools import skill_toolset

rmi_skill_toolset = skill_toolset.SkillToolset(
    skills=[
        # TRAFFIC_METRICS_SKILL_DIR points to the skill's SKILL.md folder.
        skills.load_skill_from_dir(TRAFFIC_METRICS_SKILL_DIR),
    ],
)

# root_agent = llm_agent.Agent(..., tools=[*bq_tools, rmi_skill_toolset])

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

חבילת כלים עם מיומנויות

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

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

אפשר לצרף כלים ספציפיים ישירות לסקיל בכותרת ה-YAML שלו:

metadata:
  adk_additional_tools:
    - calculate_custom_metric

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

דוגמה: ביסוס של שאילתה לגבי עומס

  1. המשתמש שואל "How congested is Storrow Drive during evening rush?"
  2. ההנחיה הבסיסית למערכת מפרסמת רק את השם והתיאור של כל מיומנות, כך שהסוכן רואה ש-rmi-traffic-metrics-grounding עוסק ב'פקקים' וקורא ל-load_skill כדי לקבל את ההוראות המלאות שלו לשאילתה הזו.
  3. אחרי שהמיומנות נטענת, הסוכן מחיל את הגדרת ה-TTI ואת תבנית ה-SQL המאומתת שהוא מספק, ומחשב את היחס ביחס ל-historical_travel_time במקום לנחש נוסחה.

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

מסקנות עיקריות

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

השלבים הבאים

תורמים

Nathaniel Thomas | Software Engineering Intern, Google Maps Platform