AlloyDB में एचटीएपी की मदद से, अपने एजेंटिक सिस्टम को बेहतर बनाएं

1. खास जानकारी

पहले हिस्से में, हमने Knowledge Catalog और DataScan का इस्तेमाल करके, अव्यवस्थित और अनस्ट्रक्चर्ड पीडीएफ़ को BigQuery में साफ़-सुथरी, स्मार्ट, और स्ट्रक्चर्ड टेबल में बदल दिया. अब हमारे पास एक मज़बूत डेटा वेयरहाउस है. दूसरे हिस्से में, हमने AlloyDB को ट्रांज़ैक्शनल बैकबोन के तौर पर सेट अप किया और उसमें अपनी BigQuery टेबल को फ़ेडरेट किया. इससे, हमने एक बाइट भी डुप्लीकेट किए बिना, डेटा की एक यूनिफ़ाइड लेयर बनाई.

आज हम दिमाग़ बनाएंगे. हम एक मल्टी-एजेंट ऐप्लिकेशन — "FroyoOS Store Manager" बना रहे हैं. यह ऐप्लिकेशन, सवालों के जवाब देने, एलर्जन की जांच करने, और लाइव ऑर्डर प्रोसेस करने के लिए, डेटा की इस लेयर पर काम करता है.

चुनौती: अपने एजेंट से एआई को अलग करना

डेटाबेस से बात करने वाले एआई एजेंट को बनाते समय, सबसे आम एंटी-पैटर्न, डेटा और एआई लॉजिक को सीधे अपने Python ऐप्लिकेशन में डालना है. इससे आपका ऐप्लिकेशन कमज़ोर, असुरक्षित, और बनाए रखने में मुश्किल हो जाता है, क्योंकि आपका डेटा आर्किटेक्चर बढ़ता जाता है.

इसे ठीक करने के लिए, हम मॉडल कॉन्टेक्स्ट प्रोटोकॉल (एमसीपी) टूलबॉक्स का इस्तेमाल कर रहे हैं. एमसीपी टूलबॉक्स, हमारे यूनिफ़ाइड डेटा ऐब्स्ट्रैक्शन लेयर के तौर पर काम करता है. हम डेटाबेस के ऑपरेशन को, tools.yaml नाम की एक आसान फ़ाइल में डिक्लेरेटिव तरीके से तय करते हैं. हम इस टूलबॉक्स को Google Cloud Run पर, सुरक्षित और सर्वरलेस एंडपॉइंट के तौर पर डिप्लॉय करते हैं. हमारा एआई एजेंट, इस एंडपॉइंट से आसानी से कनेक्ट हो जाता है और कहता है, "‘place_order' टूल को एक्ज़ीक्यूट करें."

HTAP की ताकत

एजेंट बनाने से पहले, आइए जानते हैं कि इस पोस्ट के टाइटल में खास तौर पर HTAP (हाइब्रिड ट्रांज़ैक्शनल/ऐनलिटिकल प्रोसेसिंग) का ज़िक्र क्यों किया गया है.

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

हमने AlloyDB को HTAP पावरहाउस में बदल दिया है. इसके लिए, हमने अपने BigQuery डेटा वेयरहाउस को सीधे PostgreSQL में फ़ेडरेट किया है. इस HTAP आर्किटेक्चर की वजह से, हमारे एआई एजेंट को आज सिर्फ़ एक डेटाबेस एंडपॉइंट से बात करनी होती है. यह live_orders टेबल में लाइव ट्रांज़ैक्शन डाल सकता है. साथ ही, फ़ेडरेट किए गए BigQuery froyo_data डेटासेट के ख़िलाफ़, भारी-भरकम ऐनलिटिकल स्कैन चला सकता है. इसके लिए, डेटा की एक बाइट भी डुप्लीकेट नहीं होती. आइए देखते हैं कि हम इस इंजन को अपने एआई के लिए कैसे उपलब्ध कराते हैं.

चलिए, अब ऐप्लिकेशन बनाना शुरू करते हैं!

f372e1ecf65501e4.png

आपको क्या सीखने को मिलेगा

  • एक बटन पर क्लिक करके, AlloyDB क्लस्टर, इंस्टेंस, और नेटवर्किंग सेट अप करने का तरीका
  • फ़ेडरेशन की तैयारी के लिए एक्सटेंशन सेट अप करने का तरीका
  • BigQuery से AlloyDB में फ़ेडरेशन सेट अप करने का तरीका
  • इसे आज़माएं

ज़रूरी शर्तें

  • कोई ब्राउज़र, जैसे कि Chrome या Firefox.
  • बिलिंग की सुविधा वाला Google Cloud प्रोजेक्ट.
  • एसक्यूएल की बुनियादी जानकारी.

2. शुरू करने से पहले

प्रोजेक्ट बनाना

  1. Google Cloud Console में, प्रोजेक्ट चुनने वाले पेज पर, कोई Google Cloud प्रोजेक्ट चुनें या बनाएं.
  2. पक्का करें कि आपके Cloud प्रोजेक्ट के लिए बिलिंग की सुविधा चालू हो. किसी प्रोजेक्ट पर बिलिंग की सुविधा चालू है या नहीं, यह देखने का तरीका जानें .
  1. आपको Cloud Shell का इस्तेमाल करना होगा. यह Google Cloud में चलने वाला कमांड-लाइन एनवायरमेंट है. Google Cloud Console में सबसे ऊपर, Cloud Shell चालू करें पर क्लिक करें.

Cloud Shell बटन की इमेज चालू करें

  1. Cloud Shell से कनेक्ट होने के बाद, यह देखने के लिए कि आपने पहले से ही पुष्टि कर ली है और प्रोजेक्ट को अपने प्रोजेक्ट आईडी पर सेट किया गया है या नहीं, यह कमांड इस्तेमाल करें:
gcloud auth list
  1. Cloud Shell में यह कमांड चलाकर पुष्टि करें कि gcloud कमांड को आपके प्रोजेक्ट के बारे में पता है या नहीं.
gcloud config list project
  1. अगर आपको पुष्टि करनी है
gcloud auth login
  1. अगर आपका प्रोजेक्ट सेट नहीं है, तो इसे सेट करने के लिए यह कमांड इस्तेमाल करें:
export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project <YOUR_PROJECT_ID>
  1. ज़रूरी एपीआई चालू करें: सभी ज़रूरी एपीआई चालू करने के लिए, यह कमांड चलाएं:
gcloud services enable \
  alloydb.googleapis.com \
  bigquery.googleapis.com \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  artifactregistry.googleapis.com \
  iam.googleapis.com \
  secretmanager.googleapis.com \
  compute.googleapis.com \
  servicenetworking.googleapis.com

समस्याएं और उनका हल

"घोस्ट प्रोजेक्ट" सिंड्रोम

आपने gcloud config set project चलाया है, लेकिन आपको कंसोल यूज़र इंटरफ़ेस (यूआई) में कोई दूसरा प्रोजेक्ट दिख रहा है. सबसे ऊपर बाईं ओर मौजूद ड्रॉपडाउन में, प्रोजेक्ट आईडी देखें!

बिलिंग की समस्या

आपने प्रोजेक्ट चालू कर दिया है, लेकिन बिलिंग खाता जोड़ना भूल गए हैं. AlloyDB एक हाई-परफ़ॉर्मेंस इंजन है. अगर "गैस टैंक" (बिलिंग) खाली है, तो यह चालू नहीं होगा.

एपीआई के लागू होने में देरी

आपने "एपीआई चालू करें" पर क्लिक किया है, लेकिन कमांड लाइन में अब भी Service Not Enabled दिख रहा है. 60 सेकंड इंतज़ार करें. क्लाउड को अपने न्यूरॉन को जगाने में थोड़ा समय लगता है.

कोटा की समस्या

अगर आपने नया ट्रायल खाता इस्तेमाल किया है, तो हो सकता है कि आपको AlloyDB इंस्टेंस के लिए, किसी इलाके के कोटा की समस्या आए. अगर us-central1 काम नहीं करता है, तो us-east1 आज़माएं.

3. डेटा तैयार करना

पक्का करें कि अनस्ट्रक्चर्ड पीडीएफ़ से निकाला गया स्ट्रक्चर्ड डेटा, BigQuery में उपलब्ध हो. साथ ही, BigQuery डेटा का AlloyDB फ़ेडरेशन भी सेट अप और टेस्ट किया गया हो. अगर आपने ये चरण पूरे नहीं किए हैं, तो यहां और यहां जाकर, इन आसान चरणों को पूरा करें. ये चरण, क्रमशः पहले और दूसरे हिस्से के लिए हैं.

ध्यान दें:

अगर आप इस कोडलैब को आज़मा रहे हैं, तो आपको दूसरे हिस्से में क्लीनअप करने का चरण (क्लस्टर और इंस्टेंस मिटाने का चरण) पूरा नहीं करना चाहिए. ऐसा इसलिए, क्योंकि हमें यहां दिखाए गए अपने एजेंटिक सिस्टम के लिए, AlloyDB ऑर्केस्ट्रेशन की ज़रूरत है.

दूसरे हिस्से में बनाए गए डेटा के अलावा, हमें AlloyDB इंस्टेंस में एक और टेबल बनानी होगी. इस लिंक का इस्तेमाल करके, AlloyDB Studio पर जाएं:

https://console.cloud.google.com/alloydb/locations/us-central1/clusters/my-alloydb-cluster/studio

अगर किसी दूसरे क्लस्टर का इस्तेमाल किया जा रहा है, तो ऊपर दिए गए लिंक में क्लस्टर का नाम बदलें.

AlloyDB Studio में, क्वेरी एडिटर के नए टैब में, यह स्टेटमेंट चलाएं:

CREATE TABLE live_orders (
    order_id SERIAL PRIMARY KEY,
    customer_name VARCHAR(100),
    product_id VARCHAR(100),
    quantity INT,
    order_status VARCHAR(50) DEFAULT 'Pending',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

इससे आपके डेटाबेस में live_orders टेबल बन जाएगी.

4. ऐब्स्ट्रैक्शन तय करना (tools.yaml)

सबसे पहले, हम डेटाबेस के ऑपरेशन को रजिस्टर करते हैं. हम tools.yaml नाम की एक फ़ाइल बनाते हैं. इसमें यह तय किया जाता है कि हमारा एजेंट, AlloyDB से कैसे इंटरैक्ट करता है. AlloyDB में ट्रांज़ैक्शनल और ऐनलिटिकल, दोनों तरह का डेटा होता है. इसमें, BigQuery फ़ेडरेशन से मिला ऐनलिटिकल डेटा भी शामिल होता है.

  1. अपने Cloud Shell टर्मिनल पर जाएं. एडिटर मोड पर टॉगल करें.
  2. अपनी रूट डायरेक्ट्री में एक नया फ़ोल्डर बनाएं: "froyo-agent"
  3. फ़ोल्डर में, tools.yaml नाम की फ़ाइल बनाएं और इसमें यह कॉन्टेंट चिपकाएं: (प्रोजेक्ट, क्लस्टर, इंस्टेंस, और पासवर्ड के लिए अपनी वैल्यू डालें)
# tools.yaml
sources:
    alloydb-source:
        kind: "alloydb-postgres"
        project: "*******"
        region: "us-central1"
        cluster: "my-alloydb-cluster"
        instance: "my-primary-inst"
        database: "postgres"
        user: "postgres"
        password: "*******"
        ipType: "private"


tools:
  check_allergens:
    kind: postgres-sql
    source: alloydb-source
    description: Queries the federated BigQuery tables to find allergens for a product.
    statement: |
      SELECT a.allergen_name
      FROM consistsof c
      INNER JOIN product p ON c.product_id = p.product_id
      INNER JOIN ingredient i ON c.ingredient_id = i.ingredient_name
      INNER JOIN containsallergen a ON i.ingredient_id = a.ingredient_id
      WHERE UPPER(p.product_name) LIKE UPPER($1)
    parameters:
      - name: product_name
        type: string
        description: The name of the product to check. (e.g., '%Midnight%')


  place_order:
    kind: postgres-sql
    source: alloydb-source
    description: Inserts a new live transaction into the native AlloyDB orders table.
    statement: |
      INSERT INTO live_orders (customer_name, product_id, quantity)
      VALUES ($1, (SELECT product_id FROM product WHERE product_name ILIKE '%' || $2 || '%' LIMIT 1), $3) RETURNING order_id;
    parameters:
      - name: customer_name
        type: string
        description: The name of the customer placing the order.
      - name: product_name
        type: string
        description: The name of the product being ordered.
      - name: quantity
        type: integer
        description: The quantity of the product being ordered.


toolsets:
  alloydb_tools:
    - check_allergens
    - place_order

हमने अपने एजेंट की क्षमताओं को दो टूल तक सीमित रखा है — एलर्जन की जांच करना और ऑर्डर देना.

5. Cloud Run पर टूलबॉक्स डिप्लॉय करना

इसे अपने ऐप्लिकेशन के लिए उपलब्ध कराने के लिए, हम gcloud सीएलआई का इस्तेमाल करके, टूलबॉक्स को सुरक्षित तरीके से डिप्लॉय करते हैं. इससे, हमारा ऐब्स्ट्रैक्शन लेयर एंडपॉइंट बनता है.

  1. Cloud Shell टर्मिनल पर टॉगल करें. इसके बाद, यह कमांड चलाकर वर्किंग डायरेक्ट्री में जाएं:
cd froyo-agent
  1. tools.yaml को "tools-froyo" नाम के सीक्रेट में सेव करें:
gcloud secrets create tools-froyo --data-file=tools.yaml
  1. Cloud Run पर एमसीपी टूलबॉक्स कंटेनर डिप्लॉय करें
export IMAGE=us-central1-docker.pkg.dev/database-toolbox/toolbox/toolbox:latest
gcloud run deploy toolbox-froyo \
    --image $IMAGE \
    --service-account toolbox-identity \
    --region us-central1 \
    --set-secrets "/app/tools.yaml=tools-froyo:latest" \
    --args="--config=/app/tools.yaml","--address=0.0.0.0","--port=8080" \
    --network easy-alloydb-vpc \
    --subnet easy-alloydb-subnet \
    --allow-unauthenticated \
    --vpc-egress private-ranges-only

अगर आपने दूसरे हिस्से के कोडलैब में कॉन्फ़िगर की गई वैल्यू के अलावा कोई दूसरी वैल्यू इस्तेमाल की है, तो "network" और "subnet" की वैल्यू बदलनी होंगी.

  1. Cloud Run का यूआरएल नोट करें. उदाहरण के लिए, https://toolbox-froyo-xxx.run.app.

6. एजेंटिक बैकएंड (app.py)

डेटाबेस को ऐब्स्ट्रैक्ट करने के बाद, हमारा Python कोड पूरी तरह से ऑर्केस्ट्रेशन और रीज़निंग पर फ़ोकस कर सकता है.

हम Flask के साथ एजेंट डेवलपमेंट किट (एडीके) का इस्तेमाल कर रहे हैं. एडीके, एंटरप्राइज़-ग्रेड सेशन मेमोरी (InMemorySessionService) उपलब्ध कराता है. इसका मतलब है कि हमारा एजेंट, बातचीत के कॉन्टेक्स्ट को याद रखता है. यह ToolboxSyncClient के साथ इंटिग्रेट होता है, ताकि Cloud Run से हमारे टूल आसानी से पुल किए जा सकें.

यह रहा आपका app.py:

https://github.com/AbiramiSukumaran/froyo-data/blob/main/app.py

Python Flask का यह आसान ऐप्लिकेशन, एडीके एजेंट को उन टूल से कनेक्ट करता है जिन्हें हमने अपने टूलबॉक्स में तय किया है. ये टूल, AlloyDB (और BigQuery के फ़ेडरेट किए गए डेटा) से इंटरैक्ट करते हैं और उपयोगकर्ता को जवाब देते हैं.

7. यूज़र इंटरफ़ेस (यूआई) और ऐप्लिकेशन चलाना

हमने अपने स्टोर मैनेजर को बेहतर अनुभव देने के लिए, ग्लासमॉर्फिक यूआई (templates/index.html) बनाया है. इसमें, लाइव प्रॉडक्ट कैटलॉग साइडबार और इंटरैक्टिव चैट इंटरफ़ेस शामिल है.

आपको index.html, रेपो फ़ाइल में यहां मिलेगा:

https://github.com/AbiramiSukumaran/froyo-data/blob/main/templates/index.html

ऐप्लिकेशन चलाने से पहले, पक्का करें कि आपने अपनी डिपेंडेंसी इंस्टॉल कर ली हैं. इसके लिए, requirements.txt फ़ाइल बनाएं और उसमें यह कॉन्टेंट शामिल करें:

Flask>=3.0.0
google-genai>=0.1.0
mcp>=1.0.0
google-adk
toolbox-core
toolbox-langchain
python-dotenv

साथ ही, .env फ़ाइल में यह जानकारी डालें:

GOOGLE_API_KEY=***
MCP_TOOLBOX_SERVER_URL=***

Cloud Shell टर्मिनल से, पक्का करें कि आप प्रोजेक्ट फ़ोल्डर में हों. इसके बाद, एक-एक करके ये कमांड चलाएं:

डिपेंडेंसी इंस्टॉल करें:

pip install -r requirements.txt

Python फ़ाइल को एक्ज़ीक्यूट करना:

python app.py

टर्मिनल में दिखने वाले लिंक पर क्लिक करें या http://localhost:8080 खोलें!

84f7f7037d57634a.png

8. अल्टिमेट टेस्ट

एजेंट से सवाल पूछने के लिए, कैटलॉग में मौजूद किसी प्रॉडक्ट पर क्लिक करें:

Does Midnight Swirl have any allergens?

आपको यह जवाब दिखेगा:

f591a86f763a1652.png

बैकग्राउंड में होने वाली प्रोसेस:

  1. एडीके एजेंट को प्रॉम्प्ट मिलता है. इसके बाद, वह check_allergens टूल का इस्तेमाल करने का फ़ैसला लेता है.
  2. यह Cloud Run पर, एमसीपी टूलबॉक्स को सुरक्षित तरीके से कॉल करता है.
  3. टूलबॉक्स, AlloyDB में क्वेरी को एक्ज़ीक्यूट करता है. इसके बाद, यह तुरंत BigQuery से फ़ेडरेट हो जाता है, ताकि पहले हिस्से में बनाए गए जटिल रिलेशनशिप को स्कैन किया जा सके.
  4. डेटाबेस "Soy" दिखाता है. एजेंट, यूज़र इंटरफ़ेस (यूआई) में इसे आसानी से समराइज़ कर देता है.

इसके बाद, हम कहते हैं:

Order 2 Midnight Swirls for Alice.

d0c37690a1375100.png

एजेंट, "Midnight Swirl" स्ट्रिंग को टूलबॉक्स में पास करता है. बैकग्राउंड में मौजूद एसक्यूएल, BigQuery के ज़रिए स्ट्रिंग को डाइनैमिक तरीके से इंटिजर आईडी में बदलता है. इसके बाद, लाइव ऑर्डर को AlloyDB में डालता है और ट्रांज़ैक्शन की पुष्टि करता है.

कोड रेपो

https://github.com/AbiramiSukumaran/froyo-data

9. व्यवस्थित करें

इस लैब को पूरा करने के बाद, AlloyDB क्लस्टर और इंस्टेंस को मिटाना न भूलें.

इससे क्लस्टर और उसके इंस्टेंस मिट जाएंगे.

10. एजेंट मिलने की बधाई!

सोचें कि हमने अभी क्या हासिल किया है:

हमारा अच्छी तरह से ऑर्केस्ट्रेट किया गया एजेंटिक सिस्टम, सिर्फ़ डेटाबेस के लिए एमसीपी टूलबॉक्स से इंटरैक्ट करता है. बैकग्राउंड में, यह हमारे ऐप्लिकेशन के टूल कॉल और एआई लॉजिक के लिए डेटा को मैनेज करता है. इससे फ़्लो आसान बना रहता है:

  1. हमारा ट्रांज़ैक्शनल ऐप्लिकेशन (AlloyDB पर चल रहा है) एक साथ कई उपयोगकर्ता सेशन को मैनेज कर सकता है.
  2. जब इसे भारी-भरकम ऐनलिटिकल डेटा या पुराने कॉन्टेक्स्ट (जैसे कि सप्लायर की जानकारी या जटिल इन्ग्रेडिएंट मैपिंग) की ज़रूरत होती है, तो यह BigQuery froyo_dataschema से क्वेरी करता है.
  3. ईटीएल की ज़रूरत नहीं होती. डेटा पाइपलाइन में कोई समस्या नहीं आती. डेटाबेस सिंक से बाहर नहीं होते. हम डेटा को सिर्फ़ एक बार (BQ में) स्टोर करते हैं और जहां ज़रूरत होती है वहां उसका इस्तेमाल करते हैं.

अब हमारा एजेंट और डेटा फ़ाउंडेशन — ऐनलिटिकल और ट्रांज़ैक्शनल, दोनों — पूरा हो गया है. अब अगले हिस्से पर चलते हैं.

आगे क्या करना है?

हमारा एजेंट, सामान्य तरीके से काम करता है. चौथे हिस्से में, हम एजेंट के आकलन की पाइपलाइन बनाने जा रहे हैं. इससे, हम अपने एजेंटिक सिस्टम की वैधता, ग्राउंडिंग, और परफ़ॉर्मेंस की बारीकी से जांच करेंगे. चलिए, इवेंट में मिलते हैं!