بینش تولیدی با BigQuery SQL و Vertex AI

1. مقدمه

در این نرم‌افزار، ما یک برنامه پیش‌بینی و تجویز رتبه موفقیت فیلم با جستارهای BigQuery SQL و Vertex AI PalM API می‌سازیم. مدلی که برای تولید متن استفاده می‌شود، text-bison است و به عنوان یک تابع از راه دور در BigQuery میزبانی می‌شود.

لیست خدمات مورد استفاده عبارتند از:

  1. BigQuery ML
  2. Vertex AI PalM API
  3. پوسته ابری

چیزی که خواهی ساخت

شما ایجاد خواهید کرد

  • یک مجموعه داده BigQuery که شامل مدل است
  • یک مدل BigQuery ML که امتیاز موفقیت یک فیلم را بر اساس ویژگی‌های GENRE و RUNTIME فیلم پیش‌بینی می‌کند.
  • یک مدل BigQuery که میزبان Vertex AI PalM API به عنوان یک تابع راه دور است
  • یک اتصال خارجی برای برقراری ارتباط بین BigQuery و Vertex AI

2. الزامات

  • مرورگری مانند کروم یا فایرفاکس
  • یک پروژه Google Cloud با فعال کردن صورت‌حساب

قبل از شروع

  1. در Google Cloud Console ، در صفحه انتخاب پروژه، یک پروژه Google Cloud را انتخاب یا ایجاد کنید
  2. مطمئن شوید که صورتحساب برای پروژه Cloud شما فعال است. با نحوه بررسی فعال بودن صورت‌حساب در پروژه آشنا شوید
  3. مطمئن شوید که همه APIهای لازم (BigQuery API، Vertex AI API، BigQuery Connection API) فعال هستند.
  4. شما از Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان که در Google Cloud اجرا می شود و با bq از قبل بارگذاری شده است. برای دستورات و استفاده از gcloud به اسناد مراجعه کنید

از Cloud Console، روی Activate Cloud Shell در گوشه سمت راست بالا کلیک کنید:

51622c00acec2fa.png

اگر پروژه شما تنظیم نشده است، از دستور زیر برای تنظیم آن استفاده کنید:

gcloud config set project <YOUR_PROJECT_ID>
  1. با وارد کردن URL زیر در مرورگر خود مستقیماً به کنسول BigQuery بروید: https://console.cloud.google.com/bigquery

3. آماده سازی داده ها

در این مورد، از مجموعه داده فیلم ها که از منبع movielens مشتق شده است استفاده خواهیم کرد.

  1. ایجاد یک مجموعه داده:

مجموعه داده BigQuery مجموعه ای از جداول است. همه جداول در یک مجموعه داده در یک مکان داده ذخیره می شوند. همچنین می‌توانید کنترل‌های دسترسی سفارشی را برای محدود کردن دسترسی به مجموعه داده و جداول آن ضمیمه کنید.

در Cloud Shell از دستور bq mk برای ایجاد مجموعه داده ای به نام "movie_insights" استفاده کنید.

bq mk --location=us-central1 movie_insights
  1. فایل منبع را برای Cloud Shell Machine خود کلون کنید:
git clone https://github.com/AbiramiSukumaran/movie_score_genai_insights
  1. به دایرکتوری پروژه جدیدی که در Cloud Shell Machine شما ایجاد شده است بروید:
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. داده ها به ML

بیایید یک مدل طبقه بندی برای پیش بینی امتیاز موفقیت فیلم بر اساس ویژگی های GENRE و RUNTIME ایجاد کنیم. ما از دستور CREATE MODEL با گزینه "LOGISTIC_REG" برای ایجاد و آموزش یک مدل رگرسیون لجستیک استفاده خواهیم کرد.

عبارت زیر را در بخش 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 به عنوان ستون برچسب استفاده شود. در اینجا، ستون برچسب امتیاز است، بنابراین مدل یاد خواهد گرفت که کدام یک از 10 مقدار امتیاز به احتمال زیاد بر اساس سایر مقادیر موجود در هر ردیف است.
  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']

پس از ایجاد، موارد زیر در بخش SCHEMA فضای کاری BigQuery SQL ظاهر می شود:

2e43087f914aa466.png

پس از ایجاد مدل خود، عملکرد مدل را با استفاده از تابع ML.EVALUATE ارزیابی کنید. تابع ML.EVALUATE مقادیر پیش بینی شده را در مقابل داده های واقعی ارزیابی می کند.

همچنین می توانید معیارهای ارزیابی مدل خود را از صفحه MODEL مشاهده کنید:

7f2dc168bac0ac1a.png

معیارهای کلیدی در یک نگاه:

دقت - چه نسبتی از شناسایی‌های مثبت واقعاً درست بود؟ دقت = مثبت واقعی / (مثبت واقعی + مثبت کاذب) یادآوری - چه نسبتی از موارد مثبت واقعی به درستی شناسایی شد؟ Recall = True Positive / (True Positive + False Negative) دقت - معیاری برای ارزیابی مدل‌های طبقه‌بندی، این کسری از پیش‌بینی‌ها است که مدل ما واقعاً درست انجام داده است دقت = تعداد پیش‌بینی‌های صحیح / تعداد کل پیش‌بینی‌ها

5. پیش بینی امتیاز فیلم با استفاده از مدل

زمان پیش بینی!!!! پرس و جو زیر امتیاز هر فیلم را در مجموعه داده ای که به عنوان داده های "TEST" طبقه بندی می شود، پیش بینی می کند.

عبارت زیر را در بخش 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 تا 10 (طبقه بندی) نشان می دهد. حتما تعجب می کنید که چرا برای هر فیلم چندین ردیف پیش بینی وجود دارد. به این دلیل که مدل برچسب های احتمالی پیش بینی شده و احتمال وقوع هر یک را به ترتیب کاهشی برگردانده است.

تجزیه و تحلیل نتایج پیش بینی شده و مدل:

برای درک نتایج می توانید دو مرحله تجزیه و تحلیل عالی را با پیش بینی انجام دهید:

  1. برای درک اینکه چرا مدل شما این نتایج پیش‌بینی را ایجاد می‌کند، می‌توانید از تابع ML.EXPLAIN_PREDICT استفاده کنید.
  2. برای اینکه بدانید کدام ویژگی ها برای تعیین گروه درآمد به طور کلی مهم هستند، می توانید از تابع ML.GLOBAL_EXPLAIN استفاده کنید.

شما می توانید جزئیات این مراحل را در مستندات بخوانید.

6. داده ها به هوش مصنوعی مولد

بیایید با درخواست از LLM (مدل زبان بزرگ) خلاصه عواملی که بر امتیاز فیلم بیشتر از 5 باشد، با استفاده از هوش مصنوعی Generative از مدل متن-بایسون (آخرین) Vertex AI تنها با استفاده از پرس و جوهای sql اطلاعاتی را در مورد مجموعه داده فیلم ها ارائه کنیم.

  1. جدولی که فیلم_score ایجاد کردیم ورودی این مرحله نیز خواهد بود.
  2. اتصال خارجی برای ایجاد دسترسی بین BigQuery ML و خدمات Vertex ایجاد خواهد شد.
  3. ساختار BigQuery GENERATE_TEXT برای فراخوانی API PalM از راه دور از Vertex AI استفاده خواهد شد.

7. یک اتصال خارجی ایجاد کنید

اگر قبلاً انجام نشده است BQ Connection API را فعال کنید و شناسه حساب سرویس را از جزئیات پیکربندی اتصال یادداشت کنید:

  1. روی دکمه +ADD در صفحه BigQuery Explorer (در سمت چپ کنسول BigQuery) کلیک کنید و روی "اتصال به منابع داده خارجی" در منابع محبوب لیست شده کلیک کنید.
  2. نوع اتصال را به عنوان "BigLake و توابع راه دور" انتخاب کنید، نوع مکان را به عنوان "Region" و مقدار را به عنوان "us-central1 (Iowa)" و "bq_llm_connection" را به عنوان شناسه اتصال ارائه کنید.

8a87802ab0846a6.png

  1. پس از ایجاد اتصال، حساب سرویس ایجاد شده از جزئیات پیکربندی اتصال را یادداشت کنید

اعطای مجوز

در این مرحله ما مجوزهایی را به حساب سرویس برای دسترسی به سرویس Vertex AI اعطا می کنیم:

IAM را باز کنید و حساب سرویسی را که پس از ایجاد اتصال خارجی کپی کرده اید به عنوان اصلی اضافه کنید و نقش "کاربر Vertex AI" را انتخاب کنید.

ff8e1d730879f972.png

8. یک مدل ML راه دور ایجاد کنید

مدل راه دور را ایجاد کنید که نشان دهنده یک مدل زبان بزرگ 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');

مدلی به نام llm_model در مجموعه داده movie_insights ایجاد می کند که از CLOUD_AI_LARGE_LANGUAGE_MODEL_V1 API Vertex AI به عنوان یک تابع راه دور استفاده می کند. چند ثانیه طول می کشد تا کامل شود.

9. با استفاده از مدل ML متن تولید کنید

پس از ایجاد مدل، از مدل برای تولید، خلاصه یا دسته بندی متن استفاده کنید.

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 فعال است تا از هر گونه پاسخ ناخواسته یا پیش‌بینی نشده از مدل زبان بزرگ جلوگیری کند - اگر آستانه ایمنی را نقض کند، پاسخ مسدود می‌شود.

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 را که به عنوان بخشی از مرحله ML ایجاد کرده اید، با رفتن به صفحه Vertex AI Endpoint حذف کنید.

12. تبریک می گویم

تبریک می گویم! شما با موفقیت یک مدل BQML ایجاد کرده‌اید و تجزیه و تحلیل‌های مبتنی بر LLM را با استفاده از Vertex AI API روی مجموعه داده فیلم‌های خود فقط با استفاده از SQL-queries انجام داده‌اید. برای کسب اطلاعات بیشتر در مورد مدل های موجود ، مستندات محصول Vertex AI LLM را بررسی کنید.