BigQuery SQL এবং Vertex AI এর সাথে জেনারেটিভ ইনসাইট

১. ভূমিকা

এই কোডল্যাবে, আমরা BigQuery SQL কোয়েরি এবং Vertex AI PaLM API ব্যবহার করে একটি মুভির সফলতার রেটিং পূর্বাভাস ও নির্ধারণকারী অ্যাপ তৈরি করব। টেক্সট জেনারেশনের জন্য ব্যবহৃত মডেলটি হলো text-bison এবং এটি BigQuery-তে একটি রিমোট ফাংশন হিসেবে হোস্ট করা আছে।

ব্যবহৃত পরিষেবাগুলোর তালিকা হলো:

  1. বিগকোয়েরি এমএল
  2. ভার্টেক্স এআই পাম এপিআই
  3. ক্লাউড শেল

আপনি যা তৈরি করবেন

আপনি তৈরি করবেন

  • মডেলটি ধারণ করার জন্য একটি BigQuery ডেটাসেট
  • একটি BigQuery ML মডেল যা একটি সিনেমার GENRE এবং RUNTIME অ্যাট্রিবিউটের উপর ভিত্তি করে সেটির সফলতার স্কোর পূর্বাভাস দেয়।
  • একটি BigQuery মডেল যা Vertex AI PaLM API-কে একটি রিমোট ফাংশন হিসেবে হোস্ট করে।
  • BigQuery এবং Vertex AI-এর মধ্যে সংযোগ স্থাপনের জন্য একটি বাহ্যিক সংযোগ।

২. প্রয়োজনীয়তা

শুরু করার আগে

  1. গুগল ক্লাউড কনসোলের প্রজেক্ট সিলেক্টর পেজে, একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন বা তৈরি করুন।
  2. আপনার ক্লাউড প্রোজেক্টের জন্য বিলিং চালু আছে কিনা তা নিশ্চিত করুন। কোনো প্রোজেক্টে বিলিং চালু আছে কিনা তা কীভাবে পরীক্ষা করবেন তা জানুন।
  3. প্রয়োজনীয় সকল এপিআই (BigQuery API, Vertex AI API, BigQuery Connection API) সক্রিয় আছে কিনা তা নিশ্চিত করুন।
  4. আপনি ক্লাউড শেল ব্যবহার করবেন, যা গুগল ক্লাউডে চলমান একটি কমান্ড-লাইন পরিবেশ এবং এতে bq আগে থেকেই লোড করা থাকে। gcloud কমান্ড এবং এর ব্যবহারবিধি জানতে ডকুমেন্টেশন দেখুন।

ক্লাউড কনসোল থেকে, উপরের ডান কোণায় থাকা ‘Activate Cloud Shell’-এ ক্লিক করুন:

51622c00acec2fa.png

আপনার প্রজেক্টটি সেট করা না থাকলে, এটি সেট করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

gcloud config set project <YOUR_PROJECT_ID>
  1. আপনার ব্রাউজারে নিম্নলিখিত URL-টি লিখে সরাসরি BigQuery কনসোলে যান: https://console.cloud.google.com/bigquery

৩. ডেটা প্রস্তুত করা

এই ব্যবহারের ক্ষেত্রে, আমরা মুভিলেন্স উৎস থেকে প্রাপ্ত মুভি ডেটাসেটটি ব্যবহার করব।

  1. একটি ডেটাসেট তৈরি করুন:

BigQuery ডেটাসেট হলো কতগুলো টেবিলের সমষ্টি। একটি ডেটাসেটের সমস্ত টেবিল একই ডেটা লোকেশনে সংরক্ষিত থাকে। আপনি একটি ডেটাসেট এবং এর টেবিলগুলোতে অ্যাক্সেস সীমিত করার জন্য কাস্টম অ্যাক্সেস কন্ট্রোলও যুক্ত করতে পারেন।

ক্লাউড শেলে, "movie_insights" নামে একটি ডেটাসেট তৈরি করতে bq mk কমান্ডটি ব্যবহার করুন।

bq mk --location=us-central1 movie_insights
  1. সোর্স ফাইলটি আপনার ক্লাউড শেল মেশিনে ক্লোন করুন:
git clone https://github.com/AbiramiSukumaran/movie_score_genai_insights
  1. আপনার ক্লাউড শেল মেশিনে তৈরি হওয়া নতুন প্রজেক্ট ডিরেক্টরিতে যান:
cd movie_score_genai_insights
  1. আপনার CSV ফাইলটি BigQuery টেবিলে লোড করতে bq load কমান্ডটি ব্যবহার করুন (অনুগ্রহ করে মনে রাখবেন যে আপনি BigQuery UI থেকেও সরাসরি আপলোড করতে পারেন):
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;

৪. ডেটা থেকে এমএল

চলুন, GENRE এবং RUNTIME অ্যাট্রিবিউটের উপর ভিত্তি করে সিনেমার সফলতার স্কোর ভবিষ্যদ্বাণী করার জন্য একটি ক্লাসিফিকেশন মডেল তৈরি করি। একটি লজিস্টিক রিগ্রেশন মডেল তৈরি ও প্রশিক্ষণের জন্য আমরা 'LOGISTIC_REG' অপশনসহ CREATE MODEL স্টেটমেন্টটি ব্যবহার করব।

BigQuery কনসোলের SQL Workspace QUERY EDITOR বিভাগে নিচের কোয়েরিটি চালান:

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` স্টেটমেন্টের কোন কলামটি লেবেল কলাম হিসেবে ব্যবহৃত হবে। এখানে, লেবেল কলামটি হলো `score`, তাই মডেলটি প্রতিটি সারিতে উপস্থিত অন্যান্য মানের উপর ভিত্তি করে `score`-এর ১০টি মানের মধ্যে কোনটি সবচেয়ে সম্ভাব্য তা শিখবে।
  5. 'auto_class_weights=TRUE' অপশনটি ট্রেনিং ডেটার ক্লাস লেবেলগুলোর মধ্যে ভারসাম্য রক্ষা করে। ডিফল্টভাবে, ট্রেনিং ডেটা ওজনহীন থাকে। যদি ট্রেনিং ডেটার লেবেলগুলো ভারসাম্যহীন হয়, তাহলে মডেলটি সবচেয়ে জনপ্রিয় ক্লাসের লেবেলগুলোকে বেশি গুরুত্ব দিয়ে প্রেডিক্ট করতে শিখতে পারে।
  6. SELECT স্টেটমেন্টটি আমাদের লোড করা csv ডেটাযুক্ত টেবিলটিকে কোয়েরি করে। WHERE ক্লজটি ইনপুট টেবিলের সারিগুলোকে ফিল্টার করে, যাতে এই ধাপে শুধুমাত্র TRAIN ডেটাসেটটি নির্বাচিত হয়।
  7. নিম্নলিখিত গঠনগুলি ঐচ্ছিক, যাতে BigQuery ML এটিকে Vertex AI মডেল রেজিস্ট্রি-তে স্পষ্টভাবে নিবন্ধন করতে পারে। আপনি এই ব্লগে এ সম্পর্কে আরও পড়তে পারেন . model_registry='vertex_ai', vertex_ai_model_version_aliases=['logistic_reg', 'experimental']

একবার তৈরি হয়ে গেলে, BigQuery SQL Workspace-এর SCHEMA বিভাগে নিম্নলিখিত বিষয়গুলো প্রদর্শিত হয়:

2e43087f914aa466.png

আপনার মডেল তৈরি করার পর, ML.EVALUATE ফাংশনটি ব্যবহার করে মডেলটির পারফরম্যান্স মূল্যায়ন করুন। ML.EVALUATE ফাংশনটি প্রকৃত ডেটার সাপেক্ষে পূর্বাভাসিত মানগুলোকে মূল্যায়ন করে।

এছাড়াও আপনি MODEL পৃষ্ঠা থেকে আপনার মডেলের মূল্যায়ন মেট্রিকগুলো দেখতে পারেন:

7f2dc168bac0ac1a.png

এক নজরে মূল মেট্রিকসমূহ:

প্রিসিশন - পজিটিভ শনাক্তকরণের কত শতাংশ আসলে সঠিক ছিল? প্রিসিশন = ট্রু পজিটিভ / (ট্রু পজিটিভ + ফলস পজিটিভ) রিকল - প্রকৃত পজিটিভগুলোর কত শতাংশ সঠিকভাবে শনাক্ত করা হয়েছিল? রিকল = ট্রু পজিটিভ / (ট্রু পজিটিভ + ফলস নেগেটিভ) অ্যাকুরেসি - ক্লাসিফিকেশন মডেল মূল্যায়নের একটি মেট্রিক, এটি হলো আমাদের মডেলের করা সঠিক ভবিষ্যদ্বাণীর ভগ্নাংশ। অ্যাকুরেসি = সঠিক ভবিষ্যদ্বাণীর সংখ্যা / মোট ভবিষ্যদ্বাণীর সংখ্যা

৫. মডেল ব্যবহার করে চলচ্চিত্রের স্কোরের পূর্বাভাস

ভবিষ্যদ্বাণীর সময়!!!! নিম্নলিখিত কোয়েরিটি ডেটাসেটের "টেস্ট" ডেটা হিসাবে শ্রেণীবদ্ধ প্রতিটি মুভির স্কোর ভবিষ্যদ্বাণী করে।

BigQuery কনসোলের SQL Workspace QUERY EDITOR বিভাগে নিচের কোয়েরিটি চালান:

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

ফলাফলটি দেখতে এইরকম:

c719844860ce7c27.png

মডেলের ফলাফলটি ১ থেকে ১০ স্কেলে (শ্রেণিবিন্যাস) সিনেমাটির পূর্বাভাসিত স্কোর দেখায়। আপনি নিশ্চয়ই ভাবছেন যে প্রতিটি সিনেমার বিপরীতে কেন একাধিক পূর্বাভাসের সারি রয়েছে। এর কারণ হলো, মডেলটি সম্ভাব্য পূর্বাভাসিত লেবেলগুলো এবং সেগুলোর প্রত্যেকটির ঘটার সম্ভাবনাকে ক্রমহ্রাসমান ক্রমে ফেরত দিয়েছে।

পূর্বাভাসিত ফলাফল এবং মডেলটি বিশ্লেষণ করুন:

ফলাফল বোঝার জন্য আপনি পূর্বাভাসটি নিয়ে দুটি চমৎকার বিশ্লেষণমূলক পদক্ষেপ নিতে পারেন:

  1. আপনার মডেল কেন এই পূর্বাভাস ফলাফলগুলো তৈরি করছে তা বোঝার জন্য, আপনি ML.EXPLAIN_PREDICT ফাংশনটি ব্যবহার করতে পারেন।
  2. সাধারণভাবে আয়ের স্তর নির্ধারণের জন্য কোন বৈশিষ্ট্যগুলো সবচেয়ে গুরুত্বপূর্ণ, তা জানতে আপনি ML.GLOBAL_EXPLAIN ফাংশনটি ব্যবহার করতে পারেন।

আপনি ডকুমেন্টেশনে এই ধাপগুলো সম্পর্কে বিস্তারিতভাবে পড়তে পারেন।

৬. ডেটা থেকে জেনারেটিভ এআই

চলুন, শুধুমাত্র SQL কোয়েরি ব্যবহার করে Vertex AI-এর text-bison (সর্বশেষ) মডেলের সাহায্যে Generative AI-এর মাধ্যমে LLM (Large Language Model)-কে সেইসব উপাদানের সারসংক্ষেপ জিজ্ঞাসা করে মুভি ডেটাসেটের উপর অন্তর্দৃষ্টি প্রদান করি, যা একটি মুভির স্কোরকে ৫-এর বেশি হতে প্রভাবিত করে।

  1. আমরা যে movie_score টেবিলটি তৈরি করেছি, সেটি এই ধাপের জন্যও ইনপুট হিসেবে ব্যবহৃত হবে।
  2. BigQuery ML এবং Vertex সার্ভিসগুলোর মধ্যে সংযোগ স্থাপনের জন্য একটি বাহ্যিক সংযোগ তৈরি করা হবে।
  3. Vertex AI থেকে দূরবর্তীভাবে PaLM API-কে আহ্বান করার জন্য BigQuery GENERATE_TEXT কনস্ট্রাক্টটি ব্যবহার করা হবে।

৭. একটি বাহ্যিক সংযোগ তৈরি করুন

যদি আগে থেকে করা না থাকে তবে BQ কানেকশন API চালু করুন এবং কানেকশন কনফিগারেশন বিবরণ থেকে সার্ভিস অ্যাকাউন্ট আইডিটি লিখে রাখুন:

  1. BigQuery কনসোলের বাম দিকে থাকা BigQuery Explorer প্যানে +ADD বোতামে ক্লিক করুন এবং তালিকাভুক্ত জনপ্রিয় উৎসগুলো থেকে 'Connection to external data sources'-এ ক্লিক করুন।
  2. কানেকশন টাইপ হিসেবে "বিগলেক অ্যান্ড রিমোট ফাংশনস" নির্বাচন করুন, লোকেশন টাইপ হিসেবে "রিজিওন" এবং ভ্যালু হিসেবে "us-central1 (Iowa)" ও কানেকশন আইডি হিসেবে "bq_llm_connection" প্রদান করুন।

8a87802ab0846a6.png

  1. সংযোগটি তৈরি হয়ে গেলে, সংযোগ কনফিগারেশনের বিবরণ থেকে তৈরি হওয়া সার্ভিস অ্যাকাউন্টটি লিখে রাখুন।

অনুমতি দিন

এই ধাপে আমরা সার্ভিস অ্যাকাউন্টকে ভার্টেক্স এআই সার্ভিস অ্যাক্সেস করার অনুমতি প্রদান করব:

IAM খুলুন এবং এক্সটার্নাল কানেকশন তৈরি করার পর কপি করা সার্ভিস অ্যাকাউন্টটিকে প্রিন্সিপাল হিসেবে যোগ করুন এবং "Vertex AI User" রোলটি সিলেক্ট করুন।

ff8e1d730879f972.png

৮. একটি রিমোট এমএল মডেল তৈরি করুন

হোস্ট করা ভার্টেক্স এআই লার্জ ল্যাঙ্গুয়েজ মডেলের প্রতিনিধিত্বকারী রিমোট মডেলটি তৈরি করুন:

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-কে কাজে লাগায়। এটি সম্পন্ন হতে কয়েক সেকেন্ড সময় লাগবে।

৯. এমএল মডেল ব্যবহার করে টেক্সট তৈরি করুন

মডেলটি তৈরি হয়ে গেলে, টেক্সট তৈরি, সংক্ষিপ্তকরণ বা শ্রেণিবদ্ধ করার জন্য মডেলটি ব্যবহার করুন।

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 ফরম্যাটে টেক্সট জেনারেশন মডেল থেকে প্রাপ্ত রেসপন্স, যাতে কন্টেন্ট এবং সেফটি অ্যাট্রিবিউট উভয়ই থাকে: ক. কন্টেন্ট হলো জেনারেট করা টেক্সট রেজাল্ট। খ. সেফটি অ্যাট্রিবিউট হলো একটি অ্যাডজাস্টেবল থ্রেশহোল্ডসহ বিল্ট-ইন কন্টেন্ট ফিল্টার, যা বৃহৎ ল্যাঙ্গুয়েজ মডেল থেকে যেকোনো অনাকাঙ্ক্ষিত বা অপ্রত্যাশিত রেসপন্স এড়ানোর জন্য Vertex AI Palm API-তে সক্রিয় করা থাকে – যদি রেসপন্সটি সেফটি থ্রেশহোল্ড লঙ্ঘন করে, তবে তা ব্লক করে দেওয়া হয়।

টেক্সট জেনারেশনের কাজ সম্পাদন করার জন্য ভার্টেক্স এআই এলএলএম (Vertex AI LLM) অ্যাক্সেস করতে বিগকোয়েরি (BigQuery)-তে ML.GENERATE_TEXT কনস্ট্রাক্টটি ব্যবহার করা হয়।

CONCAT আপনার PROMPT স্টেটমেন্ট এবং ডাটাবেস রেকর্ড যুক্ত করে।

movie_insights হলো ডেটাসেটের নাম এবং movie_score হলো সেই টেবিলের নাম যেখানে ডেটা রয়েছে, যা আমরা প্রম্পট ডিজাইনে ব্যবহার করব।

প্রতিক্রিয়ার এলোমেলো ভাব নিয়ন্ত্রণের জন্য তাপমাত্রা হলো একটি তাৎক্ষণিক মাপকাঠি – প্রাসঙ্গিকতার দিক থেকে এর মান যত কম হয়, ততই ভালো।

Max_output_tokens হলো উত্তরে আপনি যতগুলো শব্দ চান তার সংখ্যা।

কোয়েরির প্রতিক্রিয়াটি দেখতে এইরকম:

a3691afc0a97e724.png

আপনি দেখতে পাচ্ছেন, প্রতিক্রিয়াটি নেস্টেড এবং অপরিবর্তিত।

১০. কোয়েরির ফলাফলকে সমতল করুন

চলুন ফলাফলটিকে ফ্ল্যাটেন করি, যাতে কোয়েরিতে আমাদের 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** হলো একটি বুলিয়ান, যা `true` সেট করা হলে JSON রেসপন্স থেকে একটি ফ্ল্যাট ও বোধগম্য টেক্সট রিটার্ন করে।

কোয়েরির প্রতিক্রিয়াটি দেখতে এইরকম:

1aaa0c514fccab59.png

১১. পরিষ্কার করুন

এই পোস্টে ব্যবহৃত রিসোর্সগুলির জন্য আপনার গুগল ক্লাউড অ্যাকাউন্টে চার্জ হওয়া এড়াতে, আপনি ভার্টেক্স এআই এন্ডপয়েন্ট পেজে গিয়ে এমএল ধাপের অংশ হিসাবে তৈরি করা ভার্টেক্স এআই এন্ডপয়েন্টটি মুছে ফেলতে পারেন।

১২. অভিনন্দন

অভিনন্দন! আপনি সফলভাবে একটি BQML মডেল তৈরি করেছেন এবং শুধুমাত্র SQL-কোয়েরি ব্যবহার করে Vertex AI API-এর মাধ্যমে আপনার মুভি ডেটাসেটে LLM ভিত্তিক অ্যানালিটিক্স সম্পন্ন করেছেন। উপলব্ধ মডেলগুলো সম্পর্কে আরও জানতে Vertex AI LLM প্রোডাক্ট ডকুমেন্টেশন দেখুন।