AlloyDB की मदद से बड़े पैमाने पर एंबेडिंग जनरेट करना: एक मिलियन वेक्टर, ज़ीरो लूप

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

इस कोडलैब में, आपको नॉलेज बेस में खोज करने वाला एक ऐसा ऐप्लिकेशन बनाने का तरीका बताया जाएगा जिसे ज़रूरत के हिसाब से बढ़ाया जा सके. वेक्टर एंबेडिंग जनरेट करने के लिए, Python स्क्रिप्ट और लूप वाली जटिल ईटीएल पाइपलाइन को मैनेज करने के बजाय, AlloyDB AI का इस्तेमाल किया जाएगा. इससे, एक एसक्यूएल कमांड का इस्तेमाल करके, डेटाबेस में ही एंबेडिंग जनरेट की जा सकेगी.

d4324260c68d4a70.png

आपको क्या बनाना होगा

यह एक बेहतरीन "खोजने लायक" नॉलेज बेस डेटाबेस ऐप्लिकेशन है.

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

आपको इनके बारे में जानकारी मिलेगी:

  • AlloyDB क्लस्टर को सेट अप करना और एआई एक्सटेंशन चालू करना.
  • एसक्यूएल का इस्तेमाल करके, सिंथेटिक डेटा (50,000 से ज़्यादा लाइनें) जनरेट करना.
  • बैच प्रोसेसिंग का इस्तेमाल करके, पूरे डेटासेट के लिए वेक्टर एंबेडिंग को बैकफ़िल करें.
  • नए डेटा को अपने-आप एम्बेड करने के लिए, रीयल-टाइम में बढ़ने वाले ट्रिगर सेट अप करें.
  • "कॉन्टेक्स्ट को फ़्लेक्स करना" के लिए, हाइब्रिड सर्च (वेक्टर + एसक्यूएल फ़िल्टर) करें.

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

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

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

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

  1. Google Cloud Console में, प्रोजेक्ट चुनने वाले पेज पर जाकर, Google Cloud प्रोजेक्ट चुनें या बनाएं.
  2. पक्का करें कि आपके Cloud प्रोजेक्ट के लिए बिलिंग की सुविधा चालू हो. किसी प्रोजेक्ट के लिए बिलिंग की सुविधा चालू है या नहीं, यह देखने का तरीका जानें.
  3. आपको 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 config set project <YOUR_PROJECT_ID>
  1. ज़रूरी एपीआई चालू करें: लिंक पर जाएं और एपीआई चालू करें.

इसके अलावा, gcloud कमांड का इस्तेमाल भी किया जा सकता है. gcloud कमांड और उनके इस्तेमाल के बारे में जानने के लिए, यह दस्तावेज़ देखें.

gcloud services enable \
  alloydb.googleapis.com \
  compute.googleapis.com \
  cloudresourcemanager.googleapis.com \
  servicenetworking.googleapis.com \
  aiplatform.googleapis.com

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

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

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

बिलिंग की रुकावट

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

एपीआई प्रोपेगेशन लैग

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

Quota Quags

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

"छिपा हुआ" सर्विस एजेंट

कभी-कभी AlloyDB सेवा एजेंट को aiplatform.user की भूमिका अपने-आप नहीं मिलती. अगर आपकी एसक्यूएल क्वेरी बाद में Gemini के साथ इंटरैक्ट नहीं कर पाती हैं, तो आम तौर पर इसकी वजह यही होती है.

3. डेटाबेस सेटअप

इस लैब में, हम टेस्ट डेटा के डेटाबेस के तौर पर AlloyDB का इस्तेमाल करेंगे. यह डेटाबेस और लॉग जैसे सभी संसाधनों को सेव करने के लिए, क्लस्टर का इस्तेमाल करता है. हर क्लस्टर में एक प्राइमरी इंस्टेंस होता है, जो डेटा का ऐक्सेस पॉइंट उपलब्ध कराता है. टेबल में असल डेटा दिखेगा.

चलिए, एक AlloyDB क्लस्टर, इंस्टेंस, और टेबल बनाते हैं, जिसमें टेस्ट डेटासेट लोड किया जाएगा.

  1. बटन पर क्लिक करें या नीचे दिए गए लिंक को अपने ब्राउज़र में कॉपी करें. इसके बाद, Google Cloud Console में लॉग इन करें.

  1. यह चरण पूरा होने के बाद, रिपॉज़िटरी को आपके लोकल Cloud Shell Editor में क्लोन कर दिया जाएगा. इसके बाद, प्रोजेक्ट फ़ोल्डर से नीचे दिया गया कमांड चलाया जा सकेगा. हालांकि, इसके लिए यह पक्का करना ज़रूरी है कि आप प्रोजेक्ट डायरेक्ट्री में हों:
sh run.sh
  1. अब यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल करें. इसके लिए, टर्मिनल में मौजूद लिंक पर क्लिक करें या टर्मिनल में मौजूद "वेब पर झलक देखें" लिंक पर क्लिक करें.
  2. शुरू करने के लिए, प्रोजेक्ट आईडी, क्लस्टर, और इंस्टेंस के नाम डालें.
  3. जब तक लॉग स्क्रोल हो रहे हैं, तब तक कॉफ़ी पी लें. साथ ही, यहां इस बारे में पढ़ा जा सकता है कि यह पर्दे के पीछे कैसे काम कर रहा है. इसमें करीब 10 से 15 मिनट लग सकते हैं.

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

"धैर्य" की समस्या

डेटाबेस क्लस्टर, भारी इन्फ़्रास्ट्रक्चर होते हैं. अगर आपको लगता है कि Cloud Shell सेशन "अटक गया है" और आपने पेज को रीफ़्रेश कर दिया या Cloud Shell सेशन को बंद कर दिया, तो हो सकता है कि आपको "घोस्ट" इंस्टेंस मिले. यह इंस्टेंस, आंशिक रूप से प्रावधान किया गया होता है और इसे मैन्युअल तरीके से ही मिटाया जा सकता है.

क्षेत्र की जानकारी मेल न खाना

अगर आपने us-central1 में एपीआई चालू किए हैं, लेकिन क्लस्टर को asia-south1 में प्रोविज़न करने की कोशिश की है, तो आपको कोटे से जुड़ी समस्याएं आ सकती हैं. इसके अलावा, सेवा खाते की अनुमति मिलने में देरी हो सकती है. लैब के दौरान, एक ही क्षेत्र में रहें!

Zombie Clusters

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

Cloud Shell का टाइम आउट

अगर आपका कॉफ़ी ब्रेक 30 मिनट का है, तो हो सकता है कि Cloud Shell स्लीप मोड में चला जाए और sh run.sh प्रोसेस को डिसकनेक्ट कर दे. टैब को चालू रखें!

4. स्कीमा प्रोविज़निंग

इस चरण में, हम इन विषयों के बारे में बताएंगे:

879263c907f3cac6.png

AlloyDB क्लस्टर और इंस्टेंस चालू होने के बाद, AlloyDB Studio के एसक्यूएल एडिटर पर जाएं. यहां एआई एक्सटेंशन चालू करें और स्कीमा को प्रोविज़न करें.

1e3ac974b18a8113.png

आपको इंस्टेंस बनने तक इंतज़ार करना पड़ सकता है. इसके बाद, क्लस्टर बनाते समय बनाए गए क्रेडेंशियल का इस्तेमाल करके, AlloyDB में साइन इन करें. PostgreSQL की पुष्टि करने के लिए, इस डेटा का इस्तेमाल करें:

  • उपयोगकर्ता नाम : "postgres"
  • डेटाबेस : "postgres"
  • पासवर्ड : "alloydb" (या वह पासवर्ड जो आपने खाता बनाते समय सेट किया था)

AlloyDB Studio में पुष्टि होने के बाद, एडिटर में एसक्यूएल कमांड डाले जाते हैं. आखिरी विंडो की दाईं ओर मौजूद प्लस के निशान का इस्तेमाल करके, एक से ज़्यादा Editor विंडो जोड़ी जा सकती हैं.

28cb9a8b6aa0789f.png

एडिटर विंडो में AlloyDB के लिए निर्देश डालें. इसके लिए, ज़रूरत के हिसाब से 'चलाएं', 'फ़ॉर्मैट करें', और 'साफ़ करें' विकल्पों का इस्तेमाल करें.

एक्सटेंशन चालू करना

इस ऐप्लिकेशन को बनाने के लिए, हम pgvector और google_ml_integration एक्सटेंशन का इस्तेमाल करेंगे. pgvector एक्सटेंशन की मदद से, वेक्टर एंबेडिंग को सेव किया जा सकता है और खोजा जा सकता है. google_ml_integration एक्सटेंशन ऐसे फ़ंक्शन उपलब्ध कराता है जिनका इस्तेमाल करके, Vertex AI के अनुमान लगाने वाले एंडपॉइंट को ऐक्सेस किया जा सकता है. इससे एसक्यूएल में अनुमान पाए जा सकते हैं. इन एक्सटेंशन को चालू करने के लिए, ये डीडीएल चलाएं:

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;

एक टेबल बनाओ

स्केल दिखाने के लिए, हमें एक डेटासेट की ज़रूरत है. CSV फ़ाइल इंपोर्ट करने के बजाय, हम SQL का इस्तेमाल करके "सहायता लेख" की 50,000 लाइनें तुरंत जनरेट करेंगे.

AlloyDB Studio में, नीचे दिए गए डीडीएल स्टेटमेंट का इस्तेमाल करके टेबल बनाई जा सकती है:

-- 1. Create the table
CREATE TABLE help_articles (
    id SERIAL PRIMARY KEY,
    title TEXT,
    category TEXT,
    product_version TEXT,
    content_body TEXT,
    embedding vector(768) -- Dimension for text-embedding-005
);

-- 2. Generate 50,000 rows of synthetic data
INSERT INTO help_articles (title, category, product_version, content_body)
SELECT
    'Help Article ' || i,
    CASE 
        WHEN i % 3 = 0 THEN 'Billing' 
        WHEN i % 3 = 1 THEN 'Technical' 
        ELSE 'General' 
    END,
    CASE 
        WHEN i % 2 = 0 THEN '2.0' 
        ELSE '1.0' 
    END,
    'This article covers common issues regarding ' || 
    CASE 
        WHEN i % 3 = 0 THEN 'payment failures, invoice disputes, and credit card updates.'
        WHEN i % 3 = 1 THEN 'connection timeouts, latency issues, and API errors.'
        ELSE 'account profile settings, password resets, and user roles.' 
    END
FROM generate_series(1, 50000) AS i;

item_vector कॉलम में, टेक्स्ट की वेक्टर वैल्यू को सेव किया जा सकेगा.

डेटा की पुष्टि करें:

SELECT count(*) FROM help_articles;
-- Output: 50000

डेटाबेस फ़्लैग चालू करना

इंस्टेंस कॉन्फ़िगरेशन कंसोल पर जाएं और "प्राइमरी में बदलाव करें" पर क्लिक करें. इसके बाद, ऐडवांस कॉन्फ़िगरेशन पर जाएं और "डेटाबेस फ़्लैग जोड़ें" पर क्लिक करें.

  1. पुष्टि करें कि google_ml_integration.enable_model_support फ़्लैग, 'चालू है' पर सेट हो:

अगर ऐसा नहीं है, तो फ़्लैग ड्रॉप-डाउन में इसे डालें और "चालू है" पर सेट करें. इसके बाद, इंस्टेंस को अपडेट करें.

  1. पुष्टि करें कि google_ml_integration.enable_faster_embedding_generation फ़्लैग, 'चालू है' पर सेट हो:

अगर ऐसा नहीं है, तो फ़्लैग ड्रॉप-डाउन में इसे डालें और "चालू है" पर सेट करें. इसके बाद, इंस्टेंस को अपडेट करें.

डेटाबेस फ़्लैग कॉन्फ़िगर करने का तरीका:

  1. Google Cloud Console में, क्लस्टर पेज पर जाएं.

क्लस्टर पर जाएं

  1. संसाधन का नाम कॉलम में किसी क्लस्टर पर क्लिक करें.
  2. खास जानकारी पेज पर, अपने क्लस्टर में इंस्टेंस पर जाएं. इसके बाद, कोई इंस्टेंस चुनें और बदलाव करें पर क्लिक करें.
  3. अपने इंस्टेंस से डेटाबेस फ़्लैग जोड़ना, उसमें बदलाव करना या उसे मिटाना:

फ़्लैग जोड़ना

  1. अपने इंस्टेंस में डेटाबेस फ़्लैग जोड़ने के लिए, 'फ़्लैग जोड़ें' पर क्लिक करें.
  2. 'नया डेटाबेस फ़्लैग' सूची से कोई फ़्लैग चुनें.
  3. फ़्लैग के लिए कोई वैल्यू दें.
  4. 'हो गया' पर क्लिक करें.
  5. इंस्टेंस अपडेट करें पर क्लिक करें.
  6. पुष्टि करें कि google_ml_integration एक्सटेंशन का वर्शन 1.5.2 या इसके बाद का हो:

एक्सटेंशन का वर्शन देखने के लिए, यह कमांड इस्तेमाल करें:

SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';

अगर आपको एक्सटेंशन को नए वर्शन पर अपडेट करना है, तो इस कमांड का इस्तेमाल करें:

ALTER EXTENSION google_ml_integration UPDATE;

अनुमति दें

  1. किसी उपयोगकर्ता को एम्बेडिंग अपने-आप जनरेट होने की सुविधा मैनेज करने की अनुमति देने के लिए, google_ml.embed_gen_progress और google_ml.embed_gen_settings टेबल पर INSERT, UPDATE, और DELETE की अनुमतियां दें:
GRANT INSERT, UPDATE, DELETE ON google_ml.embed_gen_progress TO postgres;

‘postgres' वह USER_NAME है जिसके लिए अनुमतियां दी गई हैं.

  1. "एम्बेडिंग" फ़ंक्शन को चलाने की अनुमति देने के लिए, नीचे दिया गया स्टेटमेंट चलाएं:
GRANT EXECUTE ON FUNCTION embedding TO postgres;

AlloyDB सेवा खाते को Vertex AI उपयोगकर्ता की भूमिका असाइन करना

Google Cloud IAM कंसोल में जाकर, AlloyDB सेवा खाते को "Vertex AI उपयोगकर्ता" की भूमिका का ऐक्सेस दें. यह खाता कुछ इस तरह दिखता है: service-<<PROJECT_NUMBER >>@gcp-sa-alloydb.iam.gserviceaccount.com. PROJECT_NUMBER में आपका प्रोजेक्ट नंबर होगा.

इसके अलावा, Cloud Shell टर्मिनल से यह कमांड चलाया जा सकता है:

PROJECT_ID=$(gcloud config get-value project)


gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"

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

"पासवर्ड भूलने" का लूप

अगर आपने "एक क्लिक" सेटअप का इस्तेमाल किया है और आपको अपना पासवर्ड याद नहीं है, तो कंसोल में इंस्टेंस की बुनियादी जानकारी वाले पेज पर जाएं. इसके बाद, postgres पासवर्ड रीसेट करने के लिए, "बदलाव करें" पर क्लिक करें.

"एक्सटेंशन नहीं मिला" गड़बड़ी

अगर CREATE EXTENSION काम नहीं करता है, तो आम तौर पर ऐसा इसलिए होता है, क्योंकि इंस्टेंस अब भी शुरुआती प्रावधान के बाद से "रखरखाव" या "अपडेट किया जा रहा है" स्थिति में है. देखें कि इंस्टेंस बनाने की प्रोसेस पूरी हो गई है या नहीं. अगर ज़रूरत हो, तो कुछ सेकंड इंतज़ार करें.

5. "वन-शॉट" वेक्टर जनरेशन

यह लैब का मुख्य हिस्सा है. इन 50,000 पंक्तियों को प्रोसेस करने के लिए, Python लूप लिखने के बजाय, हम ai.initialize_embeddings फ़ंक्शन का इस्तेमाल करेंगे.

इस एक निर्देश से दो काम होते हैं:

  1. सभी मौजूदा पंक्तियों को बैकफ़िल करता है.
  2. ट्रिगर बनाता है, ताकि आने वाली पंक्तियों को अपने-आप एम्बेड किया जा सके.

AlloyDB क्वेरी एडिटर से, नीचे दिया गया एसक्यूएल स्टेटमेंट चलाएं

CALL ai.initialize_embeddings(
  model_id => 'text-embedding-005',
  table_name => 'help_articles',
  content_column => 'content_body',
  embedding_column => 'embedding',
  incremental_refresh_mode => 'transactional'
);

एंबेडिंग की पुष्टि करना

देखें कि embedding कॉलम में अब डेटा मौजूद है या नहीं:

SELECT id, left(content_body, 30), substring(embedding::text, 1, 30) as vector_partial 
FROM help_articles;

आपको यहां दिए गए नतीजे जैसा नतीजा दिखेगा:

a872b8926a164275.png

यह क्या हुआ?

  1. बड़े पैमाने पर बैकफ़िल: यह सुविधा, आपकी मौजूदा 50,000 पंक्तियों को अपने-आप स्कैन करती है और Vertex AI के ज़रिए एंबेडिंग जनरेट करती है.
  2. ऑटोमेशन: incremental_refresh_mode => 'transactional' सेट करने पर, AlloyDB अपने-आप इंटरनल ट्रिगर सेट अप कर देता है. help_articles में डाली गई किसी भी नई लाइन की एंबेडिंग तुरंत जनरेट हो जाएगी.
  3. आपके पास incremental_refresh_mode => ‘None' सेट करने का विकल्प होता है. इससे आपको सिर्फ़ एक साथ कई अपडेट करने का स्टेटमेंट मिलेगा. साथ ही, सभी पंक्तियों के एंबेडिंग को अपडेट करने के लिए, ai.refresh_embeddings() को मैन्युअल तरीके से कॉल किया जा सकेगा.

आपने SQL की छह लाइनों की मदद से, Kafka सूची, Python वर्कर, और माइग्रेशन स्क्रिप्ट को बदल दिया है. सभी एट्रिब्यूट के बारे में ज़्यादा जानकारी के लिए, आधिकारिक दस्तावेज़ यहां देखें.

रीयल-टाइम ट्रिगर टेस्ट

आइए पुष्टि करें कि "ज़ीरो लूप" ऑटोमेशन, नए डेटा के लिए काम करता है.

  1. नई लाइन शामिल करना:
INSERT INTO help_articles (title, category, product_version, content_body)
VALUES ('New Scaling Guide', 'Technical', '2.0', 'How to scale AlloyDB to millions of transactions.');
  1. तुरंत जांच करें:
SELECT embedding FROM help_articles WHERE title = 'New Scaling Guide';

नतीजा:

आपको जनरेट किया गया वेक्टर तुरंत दिखना चाहिए. इसके लिए, आपको कोई बाहरी स्क्रिप्ट चलाने की ज़रूरत नहीं है.

ट्यूनिंग बैच का साइज़

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

CALL ai.initialize_embeddings(
  model_id => 'text-embedding-005',
  table_name => 'help_articles',
  content_column => 'content_body',
  embedding_column => 'embedding',
  incremental_refresh_mode => 'transactional',
  batch_size => 20
);

हालांकि, उपयोगकर्ताओं को कोटा की सीमाओं के बारे में पता होना चाहिए. इनसे परफ़ॉर्मेंस पर असर पड़ सकता है. AlloyDB के लिए सुझाए गए कोटा की समीक्षा करने के लिए, दस्तावेज़ में मौजूद "शुरू करने से पहले" सेक्शन देखें.

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

आईएएम प्रोपेगेशन गैप

आपने gcloud IAM कमांड चलाया, लेकिन SQL CALL अब भी अनुमति की गड़बड़ी की वजह से काम नहीं कर रहा है. Google के बैकबोन के ज़रिए, IAM में किए गए बदलावों को लागू होने में थोड़ा समय लग सकता है. सांस लें.

वेक्टर डाइमेंशन का मेल न खाना

help_articles टेबल को content_body कॉलम पर VECTOR(768) पर सेट किया गया है. अगर बाद में किसी दूसरे मॉडल (जैसे, 1536-डिम मॉडल) का इस्तेमाल किया जाता है, तो आपके इंसर्ट काम नहीं करेंगे. text-embedding-005 का इस्तेमाल करें.

6. कॉन्टेक्स्ट के हिसाब से खोज की सुविधा को बेहतर बनाना

अब हम हाइब्रिड सर्च करते हैं. हम सिमैंटिक समझ (वेक्टर) को कारोबारी नियम (एसक्यूएल फ़िल्टर) के साथ जोड़ते हैं.

प्रॉडक्ट के वर्शन 2.0 के लिए, बिलिंग से जुड़ी समस्याएं ढूंढने के लिए यह क्वेरी चलाएं:

SELECT
  title,
  left(content_body, 100) as content_snippet,
  1 - (embedding <=> embedding('text-embedding-005', 'Invoice did not go through')::vector) as relevance
FROM help_articles
WHERE category = 'Billing'  -- Hard SQL Filter
  AND product_version = '2.0' -- Hard SQL Filter
ORDER BY relevance DESC
LIMIT 5;

यह Flexing Context है. खोज की सुविधा, उपयोगकर्ता के मकसद ("बिलिंग से जुड़ी समस्याएं") को समझने के लिए "फ़्लेक्स" करती है. साथ ही, कारोबार की सख्त पाबंदियों (वर्शन 2.0) का पालन करती है.

f0fdb50d6195c462.png

स्टार्टअप और माइग्रेशन के लिए यह क्यों फ़ायदेमंद है

  1. ज़ीरो इन्फ़्रास्ट्रक्चर डेट: आपने कोई अलग वेक्टर डीबी (Pinecone/Milvus) नहीं बनाया. आपने अलग से ईटीएल जॉब नहीं लिखा. यह सब Postgres में है.
  2. रीयल-टाइम अपडेट: 'ट्रांज़ैक्शनल' मोड का इस्तेमाल करने पर, आपका Search इंडेक्स हमेशा अप-टू-डेट रहता है. डेटा कमिट होते ही, वह वेक्टर के लिए तैयार हो जाता है.
  3. स्केल: AlloyDB को Google के इंफ़्रास्ट्रक्चर पर बनाया गया है. यह लाखों वेक्टर को एक साथ जनरेट कर सकता है. यह काम, आपकी Python स्क्रिप्ट की तुलना में ज़्यादा तेज़ी से किया जा सकता है.

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

Production Performance Gotcha

समस्या: 50,000 पंक्तियों के लिए तेज़ी से काम करता है. अगर कैटगरी के हिसाब से फ़िल्टर करने की सुविधा का इस्तेमाल सही तरीके से नहीं किया जाता है, तो 10 लाख पंक्तियों के लिए यह प्रोसेस बहुत धीमी हो जाती है.समाधान:वेक्टर इंडेक्स जोड़ें: प्रोडक्शन स्केल के लिए, आपको एक इंडेक्स बनाना होगा:CREATE INDEX ON help_articles USING hnsw (embedding vector_cosine_ops);इंडेक्स के इस्तेमाल की पुष्टि करें: EXPLAIN ANALYZE SELECT ... चलाएं, ताकि यह पक्का किया जा सके कि डेटाबेस, इंडेक्स का इस्तेमाल कर रहा है और क्रम से स्कैन नहीं कर रहा है.

"मॉडल मिसमैच" की समस्या

समस्या: आपने CALL प्रोसीज़र में text-embedding-005 का इस्तेमाल करके कॉलम को शुरू किया. अगर आपने SELECT क्वेरी फ़ंक्शन embedding('model-name', ...) में गलती से किसी दूसरे मॉडल (जैसे, text-embedding-004 या कोई OSS मॉडल) का इस्तेमाल किया है, तो हो सकता है कि डाइमेंशन मैच (768) हो जाएं, लेकिन वेक्टर स्पेस पूरी तरह से अलग होगा. क्वेरी बिना किसी गड़बड़ी के चलती है, लेकिन नतीजे पूरी तरह से काम के नहीं होते (काम के होने का स्कोर खराब होता है).समस्या हल करना:पक्का करें कि ai.initialize_embeddings में मौजूद model_id, आपकी SELECT क्वेरी में मौजूद model_id से पूरी तरह मैच करता हो.

"साइलेंट एम्प्टी" नतीजा (ज़रूरत से ज़्यादा फ़िल्टर करना)

समस्या: हाइब्रिड सर्च, "AND" ऑपरेशन है. इसके लिए, सिमैंटिक मैच और एसक्यूएल मैच की ज़रूरत होती है.अगर कोई उपयोगकर्ता "बिलिंग से जुड़ी मदद" खोजता है, लेकिन product_version कॉलम में ‘2.0' के बजाय ‘2.0.1' है, तो नतीजे में शून्य लाइनें दिखेंगी. भले ही, वेक्टर मैच 99% हो.समस्या हल करना:

  • सबसे पहले, क्वेरी को वेक्टर सॉर्ट के बिना चलाएं. इससे यह पता चलेगा कि एसक्यूएल फ़िल्टर (WHERE category...) असल में डेटा दिखा रहे हैं या नहीं.
  • देखें कि कहीं केस-सेंसिटिविटी (Billing बनाम billing) की वजह से तो गड़बड़ी नहीं हो रही है.

4. अनुमति/कोटा से जुड़ी गड़बड़ियां (गड़बड़ी 500)

समस्या:SELECT क्लॉज़ में मौजूद embedding() फ़ंक्शन, Vertex AI को रीयल-टाइम नेटवर्क कॉल करता है.अगर डेटाबेस सेवा खाते से Vertex AI उपयोगकर्ता की भूमिका हटा दी जाती है या Vertex AI API का कोटा (क्यूपीएम) खत्म हो जाता है, तो पूरी एसक्यूएल क्वेरी काम नहीं करेगी.समस्या हल करना:

  • AlloyDB के लिए Cloud Logging देखें.
  • पक्का करें कि आईएएम की भूमिका अब भी चालू हो.
  • अगर आपको ज़्यादा रिज़िलियंस की ज़रूरत है, तो स्टोर की गई प्रोसीज़र में फ़ंक्शन को TRY/CATCH ब्लॉक में रैप करें.

5. शून्य एंबेडिंग

समस्या:अगर मॉडल के पूरी तरह से शुरू होने से पहले डेटा डाला जाता है या बैकग्राउंड वर्कर काम नहीं करता है, तो कुछ पंक्तियों के embedding कॉलम में NULL हो सकता है.NULL <=> Vector, NULL दिखाता है. ये लाइनें, क्रम से लगाने के विकल्प से हट जाती हैं.समस्या हल करना:

  • 100% कवरेज की पुष्टि करने के लिए, SELECT count(*) FROM help_articles WHERE embedding IS NULL; चलाएं.

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

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

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

8. बधाई हो

आपने नॉलेज बेस में खोज करने वाला एक ऐसा ऐप्लिकेशन बना लिया है जिसे ज़रूरत के हिसाब से बढ़ाया जा सकता है. वेक्टर एंबेडिंग जनरेट करने के लिए, Python स्क्रिप्ट और लूप की मदद से जटिल ईटीएल पाइपलाइन को मैनेज करने के बजाय, आपने AlloyDB AI का इस्तेमाल किया. इससे, एक एसक्यूएल कमांड का इस्तेमाल करके, डेटाबेस में ही एंबेडिंग जनरेट की जा सकी.

हमने क्या कवर किया

  • हमने डेटा प्रोसेसिंग के लिए, "Python For-Loop" का इस्तेमाल बंद कर दिया.
  • हमने एक एसक्यूएल कमांड की मदद से 50,000 वेक्टर जनरेट किए.
  • हमने ट्रिगर की मदद से, आने वाले समय में वेक्टर जनरेट करने की प्रोसेस को ऑटोमेट किया.
  • हमने हाइब्रिड सर्च किया.

अगले चरण