BigQuery SQL और Vertex AI की मदद से, जनरेटिव इनसाइट की सुविधा

1. परिचय

इस कोडलैब में, हम BigQuery SQL क्वेरी और Vertex AI PaLM API की मदद से, किसी फ़िल्म की सफलता की रेटिंग का अनुमान लगाने और सुझाव देने वाला ऐप्लिकेशन बनाएंगे. टेक्स्ट जनरेट करने के लिए, text-bison मॉडल का इस्तेमाल किया जाता है. इसे BigQuery में रिमोट फ़ंक्शन के तौर पर होस्ट किया जाता है.

इस्तेमाल की गई सेवाओं की सूची यहां दी गई है:

  1. BigQuery ML
  2. Vertex AI PaLM API
  3. Cloud Shell

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

आपको

  • मॉडल को शामिल करने के लिए BigQuery डेटासेट
  • BigQuery ML मॉडल, जो किसी फ़िल्म की शैली और अवधि के आधार पर, उसकी सफलता का स्कोर अनुमानित करता है
  • BigQuery मॉडल, जो Vertex AI PaLM API को रिमोट फ़ंक्शन के तौर पर होस्ट करता है
  • BigQuery और Vertex AI के बीच कनेक्शन बनाने के लिए, बाहरी कनेक्शन

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

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

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

  1. Google Cloud Console में, प्रोजेक्ट चुनने वाले पेज पर जाकर, Google Cloud प्रोजेक्ट चुनें या बनाएं
  2. पक्का करें कि आपके Cloud प्रोजेक्ट के लिए बिलिंग चालू हो. किसी प्रोजेक्ट के लिए बिलिंग चालू है या नहीं, यह देखने का तरीका जानें
  3. पक्का करें कि सभी ज़रूरी एपीआई (BigQuery API, Vertex AI API, BigQuery Connection API) चालू हों
  4. आपको Cloud Shell का इस्तेमाल करना होगा. यह Google Cloud में चलने वाला कमांड-लाइन एनवायरमेंट है. इसमें bq पहले से लोड होता है. gcloud कमांड और उनके इस्तेमाल के बारे में जानने के लिए, दस्तावेज़ देखें

Cloud Console में, सबसे ऊपर दाएं कोने में मौजूद, Cloud Shell चालू करें पर क्लिक करें:

51622c00acec2fa.png

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

gcloud config set project <YOUR_PROJECT_ID>
  1. अपने ब्राउज़र में यह यूआरएल डालकर, सीधे BigQuery कंसोल पर जाएं: https://console.cloud.google.com/bigquery

3. डेटा तैयार हो रहा है

इस इस्तेमाल के उदाहरण में, हम movielens सोर्स से मिले movies dataset का इस्तेमाल करेंगे.

  1. डेटासेट बनाएं:

BigQuery डेटासेट, टेबल का कलेक्शन होता है. किसी डेटासेट की सभी टेबल, एक ही डेटा location में सेव की जाती हैं. डेटासेट और उसकी टेबल का ऐक्सेस सीमित करने के लिए, कस्टम ऐक्सेस कंट्रोल भी अटैच किए जा सकते हैं.

Cloud Shell में, bq mk कमांड का इस्तेमाल करके "movie_insights" नाम का डेटासेट बनाएं

bq mk --location=us-central1 movie_insights
  1. सोर्स फ़ाइल को अपनी Cloud Shell मशीन पर क्लोन करें:
git clone https://github.com/AbiramiSukumaran/movie_score_genai_insights
  1. Cloud Shell मशीन में बनाई गई नई प्रोजेक्ट डायरेक्ट्री पर जाएं:
cd movie_score_genai_insights
  1. bq load कमांड का इस्तेमाल करके, अपनी CSV फ़ाइल को BigQuery टेबल में लोड करें. कृपया ध्यान दें कि BigQuery के यूज़र इंटरफ़ेस (यूआई) से भी सीधे तौर पर फ़ाइल अपलोड की जा सकती है:
bq load --source_format=CSV --skip_leading_rows=1 movie_insights.movie_score \
./movies_data.csv \ Id:numeric,name:string,rating:string,genre:string,year:numeric,released:string,score:string,director:string,writer:string,star:string,country:string,budget:numeric,company:string,runtime:numeric,data_cat:string
  1. टेबल movie_score और डेटासेट में डेटा बनाया गया है या नहीं, यह देखने के लिए सैंपल क्वेरी की जा सकती है:
bq query --use_legacy_sql=false \
SELECT name, rating, genre, runtime FROM movie_insights.movie_score limit 3;

4. डेटा को एमएल में

शैली और अवधि एट्रिब्यूट के आधार पर, फ़िल्म की सफलता का स्कोर का अनुमान लगाने के लिए, एक क्लासिफ़िकेशन मॉडल बनाते हैं. लॉजिस्टिक रिग्रेशन मॉडल बनाने और उसे ट्रेन करने के लिए, हम ‘LOGISTIC_REG' विकल्प के साथ CREATE MODEL स्टेटमेंट का इस्तेमाल करेंगे.

BigQuery कंसोल के SQL फ़ाइल फ़ोल्डर के क्वेरी एडिटर सेक्शन में, नीचे दी गई क्वेरी चलाएं:

CREATE OR REPLACE MODEL
  `movie_insights.model_rating_by_runtime_genre`
OPTIONS
  ( model_type='LOGISTIC_REG',
    auto_class_weights=TRUE,
    data_split_method='NO_SPLIT',
    model_registry='vertex_ai',   
    vertex_ai_model_version_aliases=['logistic_reg', 'experimental'],
    input_label_cols=['score']
  ) AS
SELECT name, genre,runtime, score
FROM
  movie_insights.movie_score
WHERE
  data_cat = 'TRAIN';

क्वेरी की जानकारी:

  1. CREATE MODEL स्टेटमेंट, SELECT स्टेटमेंट में मौजूद ट्रेनिंग डेटा का इस्तेमाल करके मॉडल को ट्रेन करता है.
  2. OPTIONS क्लॉज़, मॉडल टाइप और ट्रेनिंग के विकल्प तय करता है. यहां LOGISTIC_REG विकल्प, लॉजिस्टिक रिग्रेशन मॉडल टाइप के बारे में बताता है. बाइनरी लॉजिस्टिक रिग्रेशन मॉडल और मल्टीक्लास लॉजिस्टिक रिग्रेशन मॉडल में से किसी एक को चुनना ज़रूरी नहीं है: BigQuery ML, लेबल कॉलम में मौजूद यूनीक वैल्यू की संख्या के आधार पर यह तय कर सकता है कि किस मॉडल को ट्रेन करना है.
  3. data_split_method=‘NO_SPLIT' का इस्तेमाल करने पर, BQML को क्वेरी की शर्तों (data_cat = ‘TRAIN') के हिसाब से डेटा को ट्रेन करना पड़ता है. यह भी ध्यान दें कि इस विकल्प में ‘AUTO_SPLIT' का इस्तेमाल करना बेहतर होता है, ताकि फ़्रेमवर्क (या इस मामले में सेवा) को ट्रेन/टेस्ट स्प्लिट के पार्टीशन को रैंडमाइज़ करने की अनुमति मिल सके.
  4. input_label_cols विकल्प यह तय करता है कि SELECT स्टेटमेंट में किस कॉलम को लेबल कॉलम के तौर पर इस्तेमाल किया जाए. यहां, लेबल कॉलम स्कोर है. इसलिए, मॉडल यह पता लगाएगा कि हर लाइन में मौजूद अन्य वैल्यू के आधार पर, स्कोर की 10 वैल्यू में से कौनसी वैल्यू सबसे ज़्यादा संभावित है.
  5. ‘auto_class_weights=TRUE' विकल्प, ट्रेनिंग डेटा में क्लास के लेबल को बैलेंस करता है. डिफ़ॉल्ट रूप से, ट्रेनिंग डेटा को कोई वेट नहीं दिया जाता है. अगर ट्रेनिंग डेटा में लेबल का बैलेंस सही नहीं है, तो मॉडल, लेबल की सबसे लोकप्रिय क्लास का अनुमान लगाने के लिए ज़्यादा सीख सकता है.
  6. SELECT स्टेटमेंट, उस टेबल को क्वेरी करता है जिसे हमने CSV डेटा के साथ लोड किया था. WHERE क्लॉज़, इनपुट टेबल में मौजूद लाइनों को फ़िल्टर करता है, ताकि इस चरण में सिर्फ़ TRAIN डेटासेट को चुना जा सके.
  7. यहां दिए गए कंस्ट्रक्ट वैकल्पिक हैं, ताकि BigQuery ML इसे Vertex AI Model Registry में साफ़ तौर पर रजिस्टर कर सके. इस बारे में ज़्यादा जानने के लिए, यह ब्लॉग पढ़ें. model_registry='vertex_ai', vertex_ai_model_version_aliases=['logistic_reg', 'experimental']

बन जाने के बाद, BigQuery SQL वर्कस्पेस के स्कीमा सेक्शन में यह दिखता है:

2e43087f914aa466.png

मॉडल बनाने के बाद, ML.EVALUATE फ़ंक्शन का इस्तेमाल करके, मॉडल की परफ़ॉर्मेंस का आकलन करें. ML.EVALUATE फ़ंक्शन, अनुमानित वैल्यू की तुलना असल डेटा से करता है.

MODEL पेज पर जाकर भी, अपने मॉडल की परफ़ॉर्मेंस का आकलन करने वाली मेट्रिक देखी जा सकती हैं:

7f2dc168bac0ac1a.png

मुख्य मेट्रिक, एक नज़र में:

सटीकता - पॉज़िटिव आइडेंटिफ़िकेशन का कितना हिस्सा सही था? सटीकता = ट्रू पॉज़िटिव / (ट्रू पॉज़िटिव + फ़ॉल्स पॉज़िटिव) रिकॉल - असल पॉज़िटिव का कितना हिस्सा सही तरीके से पहचाना गया? रिकॉल = सही पॉज़िटिव / (सही पॉज़िटिव + गलत नेगेटिव) सटीक अनुमान - यह क्लासिफ़िकेशन मॉडल का आकलन करने वाली मेट्रिक है. यह उन अनुमानों का फ़्रैक्शन है जो हमारे मॉडल ने सही तरीके से लगाए हैं सटीक अनुमान = सही अनुमानों की संख्या / अनुमानों की कुल संख्या

5. मॉडल का इस्तेमाल करके, मूवी के स्कोर का अनुमान लगाना

अनुमान लगाने का समय!!!! नीचे दी गई क्वेरी, डेटासेट में मौजूद हर उस फ़िल्म के स्कोर का अनुमान लगाती है जिसे "TEST" डेटा के तौर पर कैटगरी में रखा गया है.

BigQuery कंसोल के SQL फ़ाइल फ़ोल्डर के क्वेरी एडिटर सेक्शन में, नीचे दी गई क्वेरी चलाएं:

SELECT
  *
FROM
  ML.PREDICT (MODEL movie_insights.model_rating_by_runtime_genre,
    (
    SELECT
      *
    FROM
      movie_insights.movie_score
    WHERE
      data_cat= 'TEST'
     )
  );

नतीजा इस तरह दिखता है:

c719844860ce7c27.png

मॉडल के नतीजे में, फ़िल्म का predicted_score दिखाया गया है. यह स्कोर, 1 से 10 के स्केल पर होता है (क्लासिफ़िकेशन). आपको यह जानकर हैरानी हो सकती है कि हर फ़िल्म के लिए, अनुमानित कमाई की कई लाइनें क्यों दी गई हैं. ऐसा इसलिए है, क्योंकि मॉडल ने अनुमानित लेबल और उनके होने की संभावना को घटते क्रम में दिखाया है.

अनुमानित नतीजों और मॉडल का विश्लेषण करें:

नतीजों को समझने के लिए, अनुमान की मदद से दो बेहतरीन विश्लेषण किए जा सकते हैं:

  1. आपका मॉडल अनुमान के ये नतीजे क्यों जनरेट कर रहा है, यह समझने के लिए ML.EXPLAIN_PREDICT फ़ंक्शन का इस्तेमाल किया जा सकता है.
  2. यह जानने के लिए कि आम तौर पर आय के ब्रैकेट का पता लगाने के लिए, कौनसी सुविधाएं सबसे अहम हैं, ML.GLOBAL_EXPLAIN फ़ंक्शन का इस्तेमाल किया जा सकता है.

इन चरणों के बारे में ज़्यादा जानने के लिए, दस्तावेज़ पढ़ें.

6. जनरेटिव एआई को डेटा देना

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

  1. हमने जो movie_score टेबल बनाई है वह इस चरण के लिए भी इनपुट होगी.
  2. BigQuery ML और Vertex सेवाओं के बीच ऐक्सेस सेट अप करने के लिए, बाहरी कनेक्शन बनाया जाएगा.
  3. BigQuery के GENERATE_TEXT कंस्ट्रक्ट का इस्तेमाल, Vertex AI से PaLM API को रिमोट तरीके से चालू करने के लिए किया जाएगा.

7. बाहरी कनेक्शन बनाना

अगर आपने BQ Connection API को पहले से चालू नहीं किया है, तो उसे चालू करें. साथ ही, कनेक्शन कॉन्फ़िगरेशन की जानकारी से सेवा खाते का आईडी नोट करें:

  1. BigQuery एक्सप्लोरर पैनल (BigQuery कंसोल के बाईं ओर) में, +जोड़ें बटन पर क्लिक करें. इसके बाद, सूची में दिए गए लोकप्रिय सोर्स में "बाहरी डेटा सोर्स से कनेक्शन" पर क्लिक करें
  2. कनेक्शन टाइप के तौर पर "BigLake और रिमोट फ़ंक्शन" चुनें. जगह के टाइप के तौर पर "रीजन" और वैल्यू के तौर पर "us-central1 (Iowa)" डालें. साथ ही, कनेक्शन आईडी के तौर पर "bq_llm_connection" डालें

8a87802ab0846a6.png

  1. कनेक्शन बन जाने के बाद, कनेक्शन कॉन्फ़िगरेशन की जानकारी से जनरेट हुए सेवा खाते को नोट कर लें

अनुमतियां देना

इस चरण में, हम सेवा खाते को Vertex AI सेवा ऐक्सेस करने की अनुमतियां देंगे:

IAM खोलें और बाहरी कनेक्शन बनाने के बाद कॉपी किए गए सेवा खाते को प्रिंसिपल के तौर पर जोड़ें. इसके बाद, "Vertex AI उपयोगकर्ता" की भूमिका चुनें

ff8e1d730879f972.png

8. रिमोट एमएल मॉडल बनाना

होस्ट किए गए Vertex AI लार्ज लैंग्वेज मॉडल को दिखाने वाला रिमोट मॉडल बनाएं:

CREATE OR REPLACE MODEL
  movie_insights.llm_model REMOTE
WITH CONNECTION `us-central1.bq_llm_connection` OPTIONS (remote_service_type = 'CLOUD_AI_LARGE_LANGUAGE_MODEL_V1');

यह movie_insights डेटासेट में llm_model नाम का मॉडल बनाता है. यह रिमोट फ़ंक्शन के तौर पर, Vertex AI के CLOUD_AI_LARGE_LANGUAGE_MODEL_V1 API का इस्तेमाल करता है. इस प्रोसेस को पूरा होने में कुछ सेकंड लगेंगे.

9. एमएल मॉडल का इस्तेमाल करके टेक्स्ट जनरेट करना

मॉडल बन जाने के बाद, इसका इस्तेमाल टेक्स्ट जनरेट करने, उसका सारांश बनाने या उसे कैटगरी में बांटने के लिए करें.

SELECT
  ml_generate_text_result['predictions'][0]['content'] AS generated_text,
  ml_generate_text_result['predictions'][0]['safetyAttributes']
    AS safety_attributes,
  * EXCEPT (ml_generate_text_result)
FROM
  ML.GENERATE_TEXT(
    MODEL `movie_insights.llm_model`,
    (
 SELECT
      CONCAT('FROM THE FOLLOWING TEXT ABOUT MOVIES, WHAT DO YOU THINK ARE THE FACTORS INFLUENCING A MOVIE SCORE TO BE GREATER THAN 5?: ', movie_data) AS prompt
    FROM (
      SELECT
        REPLACE(STRING_AGG( CONCAT('A movie named ',name, ' from the country ', country, ' with a censor rating of ',rating, ' and a budget of ', budget, ' produced by ', company, ' with a runtime of about ', runtime, ' and in the genre ', genre, ' starring ', star, ' has had a success score of ', score, '') ), ',','. ') AS movie_data
      FROM (
        SELECT
          *
        FROM
          `movie_insights.movie_score`
        WHERE
          CAST(SCORE AS INT64) > 5
        LIMIT
          50) ) AS MOVIES
    ),
    STRUCT(
      0.2 AS temperature,
      100 AS max_output_tokens));

**वजह:

ml_generate_text_result** टेक्स्ट जनरेशन मॉडल से मिला जवाब है. यह JSON फ़ॉर्मैट में होता है. इसमें कॉन्टेंट और सुरक्षा से जुड़े एट्रिब्यूट, दोनों शामिल होते हैं: a. कॉन्टेंट, जनरेट किए गए टेक्स्ट के नतीजे b को दिखाता है. सुरक्षा एट्रिब्यूट, कॉन्टेंट फ़िल्टर करने की सुविधा को दिखाते हैं. इसमें थ्रेशोल्ड को अडजस्ट किया जा सकता है. यह सुविधा, Vertex AI Palm API में चालू होती है, ताकि लार्ज लैंग्वेज मॉडल से अनचाहे या अप्रत्याशित जवाब न मिलें. अगर जवाब, सुरक्षा थ्रेशोल्ड का उल्लंघन करता है, तो उसे ब्लॉक कर दिया जाता है

ML.GENERATE_TEXT का इस्तेमाल BigQuery में किया जाता है. इससे Vertex AI LLM को ऐक्सेस किया जा सकता है, ताकि टेक्स्ट जनरेट करने से जुड़े टास्क पूरे किए जा सकें

CONCAT, आपके PROMPT स्टेटमेंट और डेटाबेस रिकॉर्ड को जोड़ता है

movie_insights, डेटासेट का नाम है. साथ ही, movie_score उस टेबल का नाम है जिसमें वह डेटा मौजूद है जिसका इस्तेमाल हम प्रॉम्प्ट डिज़ाइन में करेंगे

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

Max_output_tokens, जवाब में आपको चाहिए शब्दों की संख्या है

क्वेरी का जवाब ऐसा दिखता है:

a3691afc0a97e724.png

जैसा कि आप देख सकते हैं, जवाब नेस्ट किया गया है और इसका फ़ॉर्मैट सही नहीं है.

10. क्वेरी के नतीजे को फ़्लैट करना

आइए, नतीजे को फ़्लैट कर देते हैं, ताकि हमें क्वेरी में JSON को साफ़ तौर पर डिकोड न करना पड़े:

SELECT
  *
FROM
  ML.GENERATE_TEXT( MODEL movie_insights.llm_model,
    (
    SELECT
      CONCAT('FROM THE FOLLOWING TEXT ABOUT MOVIES, WHAT DO YOU THINK ARE THE FACTORS INFLUENCING A MOVIE SCORE TO BE GREATER THAN 5?: ', movie_data) AS prompt
    FROM (
      SELECT
        REPLACE(STRING_AGG( CONCAT('A movie named ',name, ' from the country ', country, ' with a censor rating of ',rating, ' and a budget of ', budget, ' produced by ', company, ' with a runtime of about ', runtime, ' and in the genre ', genre, ' starring ', star, ' has had a success score of ', score, '') ), ',','. ') AS movie_data
      FROM (
        SELECT
          *
        FROM
          `movie_insights.movie_score`
        WHERE
          CAST(SCORE AS INT64) > 5
        LIMIT
          50) ) AS MOVIES),
    STRUCT( 0.2 AS temperature,
      100 AS max_output_tokens,
      TRUE AS flatten_json_output));

**वजह:

Flatten_json_output** बूलियन को दिखाता है. इसे सही पर सेट करने पर, JSON रिस्पॉन्स से निकाला गया ऐसा टेक्स्ट मिलता है जिसे आसानी से समझा जा सकता है.

क्वेरी का जवाब ऐसा दिखता है:

1aaa0c514fccab59.png

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

इस पोस्ट में इस्तेमाल की गई सुविधाओं के लिए, अपने Google Cloud खाते से शुल्क न लिए जाने के लिए, Vertex AI एंडपॉइंट को मिटाया जा सकता है. इसे एमएल चरण के दौरान बनाया गया था. इसके लिए, Vertex AI एंडपॉइंट पेज पर जाएं.

12. बधाई हो

बधाई हो! आपने BQML मॉडल बना लिया है. साथ ही, SQL क्वेरी का इस्तेमाल करके, सिर्फ़ अपनी फ़िल्मों के डेटासेट पर Vertex AI API की मदद से एलएलएम पर आधारित विश्लेषण किया है. उपलब्ध मॉडल के बारे में ज़्यादा जानने के लिए, Vertex AI LLM प्रॉडक्ट का दस्तावेज़ देखें.