आरएमआई एडीके एजेंट को, डोमेन के हिसाब से विशेषज्ञता और कौशल के आधार पर तैयार करना

खास जानकारी

लार्ज लैंग्वेज मॉडल के पास सामान्य जानकारी का भंडार होता है. हालांकि, उन्हें आपके डोमेन की खास मेट्रिक, डेटाबेस स्कीमा या कैलकुलेशन फ़ॉर्मूले के बारे में जानकारी नहीं होती. इस कॉन्टेक्स्ट के बिना, मॉडल अनुमान लगाता है. इससे गलत एसक्यूएल और गलत विश्लेषण होता है.

आरएमआई एडीके एजेंट, स्किल की मदद से इस समस्या को हल करता है. मान लें कि कोई उपयोगकर्ता यह सवाल पूछता है कि "कल स्टॉरो ड्राइव पर कितना ट्रैफ़िक था?". इसका जवाब देने के लिए, एजेंट को यह पता होना चाहिए कि आरएमआई, ट्रैफ़िक को ट्रैवल टाइम इंडेक्स (टीटीआई) के तौर पर दिखाता है. यह लाइव duration_in_seconds और फ़्री-फ़्लो static_duration_in_seconds का रेशियो होता है.historical_travel_time स्किल के बिना कोई एजेंट, average_speed कॉलम बना सकता है. हालांकि, आरएमआई सिर्फ़ कैटगरी के हिसाब से स्पीड की जानकारी देता है, न कि किलोमीटर प्रति घंटा के हिसाब से. इसके अलावा, वह गलत फ़ॉर्मूला भी इस्तेमाल कर सकता है. इससे वह सही जवाब देने का दावा तो करेगा, लेकिन उसका जवाब गलत होगा.

एजेंट को इस डोमेन की जानकारी की ज़रूरत होती है. हालांकि, हर मेट्रिक की परिभाषा, टेबल स्कीमा, और एसक्यूएल से जुड़ी चेतावनी को एक ही सिस्टम प्रॉम्प्ट में डालना सही नहीं है.

बड़े सिस्टम प्रॉम्प्ट की सीमाएं

डोमेन के सभी नियमों और स्कीमा को एक ही सिस्टम प्रॉम्प्ट में डालने से कई समस्याएं होती हैं:

  • ज़्यादा लागत और जवाब मिलने में लगने वाला ज़्यादा समय: हर बार बहुत बड़ा प्रॉम्प्ट भेजने से टोकन बर्बाद होते हैं और जवाब मिलने में लगने वाला समय बढ़ जाता है. ऐसा उन सवालों के लिए भी होता है जिनके लिए उन नियमों की ज़रूरत नहीं होती.
  • निर्देशों का सही तरीके से पालन न करना: जब किसी प्रॉम्प्ट में कई तरह की जानकारी शामिल होती है, तो मॉडल कुछ खास नियमों को अनदेखा या भूल सकता है.
  • रखरखाव में मुश्किल: सभी नियमों को एक ही प्रॉम्प्ट में शामिल करने से, किसी नियम को अपडेट या टेस्ट करना मुश्किल हो जाता है. ऐसा करने पर, दूसरे नियम भी टूट सकते हैं.

स्किल

एजेंट की स्किल , डोमेन की जानकारी को मॉड्यूलर फ़ोल्डर में व्यवस्थित करती हैं. एजेंट, इन फ़ोल्डर को सिर्फ़ तब लोड करता है, जब इनकी ज़रूरत होती है. हर स्किल एक डायरेक्ट्री होती है. इसमें Markdown निर्देशों वाली SKILL.md फ़ाइल और 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 बॉडी

बॉडी में, डोमेन के हिसाब से निर्देश दिए जाते हैं. लोड होने के बाद, मॉडल इन निर्देशों का पालन करता है. आरएमआई मेट्रिक स्किल की बॉडी में, टीटीआई का सटीक फ़ॉर्मूला (duration_in_seconds / static_duration_in_seconds), हर मेट्रिक के लिए पुष्टि किया गया BigQuery एसक्यूएल टेंप्लेट, और ट्रिगर वाक्यांश शामिल होते हैं. ये वाक्यांश, उपयोगकर्ता के मकसद को सही मेट्रिक से मैप करते हैं. पुष्टि किए गए, स्ट्रक्चर्ड निर्देश देने से, मॉडल सही जानकारी देता है. साथ ही, यह स्कीमा या फ़ॉर्मूले की जानकारी का अनुमान नहीं लगाता.

एडीके के साथ स्किल रजिस्टर करना

स्किल को 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 उस डायरेक्ट्री की ओर इशारा करता है जिसमें ट्रैफ़िक मेट्रिक की जानकारी देने वाली स्किल मौजूद है.

स्किल के साथ टूल बंडल करना

स्किल, टेक्स्ट पर आधारित निर्देश होते हैं. इसलिए, जटिल लॉजिक को समझने और उसे लागू करने के लिए सिर्फ़ मॉडल पर भरोसा करने से, गड़बड़ियां हो सकती हैं. किसी स्किल के साथ, एक्ज़ीक्यूट किए जा सकने वाले टूल अटैच करने से, गड़बड़ियों की संभावना कम हो जाती है. ऐसा इसलिए, क्योंकि कोड, सटीक कैलकुलेशन, पुष्टि, और एपीआई इंटरैक्शन को मैनेज करता है. वहीं, स्किल, मॉडल को यह निर्देश देती है कि इनका इस्तेमाल कब और कैसे करना है.

टूल बंडल करने से, ग्लोबल कॉन्टेक्स्ट ब्लोट से भी बचा जा सकता है. हर खास टूल को पहले से दिखाने के बजाय, टूल को सिर्फ़ तब लोड किया जाता है, जब उससे जुड़ी डोमेन स्किल ऐक्टिव होती है.

YAML हेडर में, किसी स्किल के साथ सीधे तौर पर खास टूल अटैच किए जा सकते हैं:

metadata:
  adk_additional_tools:
    - calculate_custom_metric

इससे मॉडल को, टूल स्कीमा और उसके इस्तेमाल के निर्देश, दोनों एक साथ मिलते हैं. साथ ही, बेस टूलसेट को कम रखा जा सकता है.

उदाहरण: ट्रैफ़िक की जानकारी से जुड़ी क्वेरी को ग्राउंड करना

  1. उपयोगकर्ता यह सवाल पूछता है कि "शाम के रश आवर में स्टॉरो ड्राइव पर कितना ट्रैफ़िक होता है?"
  2. बेस सिस्टम प्रॉम्प्ट में, हर स्किल का सिर्फ़ नाम और ब्यौरा दिखता है. इसलिए, एजेंट को पता चलता है कि rmi-traffic-metrics-grounding में "ट्रैफ़िक" की जानकारी शामिल है. इसके बाद, वह इस क्वेरी के लिए पूरे निर्देश पाने के लिए, load_skill को कॉल करता है.
  3. स्किल लोड होने के बाद, एजेंट, टीटीआई की परिभाषा और पुष्टि किए गए एसक्यूएल टेंप्लेट को लागू करता है. साथ ही, फ़ॉर्मूले का अनुमान लगाने के बजाय, historical_travel_time के हिसाब से रेशियो की गणना करता है.

किसी क्वेरी के लिए, स्किल की बॉडी सिर्फ़ तब फ़ेच की जाती है, जब उसकी ज़रूरत होती है. इसलिए, एजेंट जिन स्किल का इस्तेमाल नहीं करता वे कभी भी कॉन्टेक्स्ट में शामिल नहीं होतीं. इससे बेस सिस्टम प्रॉम्प्ट छोटा रहता है.

ज़रूरी बातें

  • डोमेन के दिशा-निर्देशों के हिसाब से जानकारी देना: मॉडल के सामान्य अनुमानों पर भरोसा करने के बजाय, साफ़ तौर पर निर्देश, पाबंदियां, और कारोबारी नियम की जानकारी दें.
  • मॉड्यूलर स्किल का इस्तेमाल करना: टोकन बचाने, जवाब मिलने में लगने वाला समय कम करने, और सटीक जानकारी देने के लिए, जानकारी को एक बड़े सिस्टम प्रॉम्प्ट के बजाय, फ़ोकस वाली स्किल में बांटें.
  • साफ़ तौर पर ब्यौरा लिखना: हर स्किल के ब्यौरे में, ट्रिगर करने वाले खास वाक्यांश और कीवर्ड शामिल करें, ताकि एजेंट उसे भरोसेमंद तरीके से लोड कर सके.
  • ठोस उदाहरण शामिल करना: आउटपुट को एक जैसा और सटीक रखने के लिए, स्किल की बॉडी में पुष्टि किए गए उदाहरण और रेफ़रंस वर्कफ़्लो शामिल करें.
  • गड़बड़ियों की संभावना कम करने के लिए टूल बंडल करना: सटीक पुष्टि और एक्ज़ीक्यूशन को मैनेज करने के लिए, स्किल के साथ एक्ज़ीक्यूट किए जा सकने वाले टूल अटैच करें. साथ ही, बेस टूलसेट को कम रखें.

अगले चरण

योगदानकर्ता

नथानिएल थॉमस | सॉफ़्टवेयर इंजीनियरिंग इंटर्न, Google Maps Platform