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

۱. مقدمه

در این آزمایشگاه کد، ما یک برنامه پیش‌بینی رتبه‌بندی موفقیت فیلم و تجویز نسخه با استفاده از کوئری‌های SQL بیگ‌کوئری و رابط برنامه‌نویسی کاربردی Vertex AI PaLM خواهیم ساخت. مدل مورد استفاده برای تولید متن، text-bison است و به عنوان یک تابع از راه دور در بیگ‌کوئری میزبانی می‌شود.

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

  1. بیگ‌کوئری ام‌ال
  2. رابط برنامه‌نویسی کاربردی Vertex AI و PaLM
  3. پوسته ابری

آنچه خواهید ساخت

شما خلق خواهید کرد

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

۲. الزامات

  • یک مرورگر، مانند کروم یا فایرفاکس
  • یک پروژه گوگل کلود با قابلیت پرداخت صورتحساب

قبل از اینکه شروع کنی

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

از کنسول ابری، روی فعال کردن پوسته ابری در گوشه بالا سمت راست کلیک کنید:

51622c00acec2fa.png

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

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

۳. آماده‌سازی داده‌ها

در این مورد استفاده، از مجموعه داده movies که از منبع 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 شما ایجاد شده است، بروید:
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;

۴. داده‌ها به یادگیری ماشینی

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

کوئری زیر را در بخش SQL Workspace QUERY EDITOR کنسول BigQuery اجرا کنید:

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 است، بنابراین مدل یاد می‌گیرد که کدام یک از 10 مقدار 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']

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

2e43087f914aa466.png

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

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

7f2dc168bac0ac1a.png

شاخص‌های کلیدی در یک نگاه:

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

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

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

کوئری زیر را در بخش SQL Workspace QUERY EDITOR کنسول BigQuery اجرا کنید:

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 استفاده کنید.

می‌توانید جزئیات این مراحل را در مستندات مطالعه کنید.

۶. داده‌ها برای هوش مصنوعی مولد

بیایید با پرسیدن خلاصه‌ای از عواملی که بر امتیاز فیلم تأثیر می‌گذارند تا بیشتر از ۵ شود، از LLM (مدل زبان بزرگ) بینش‌هایی در مورد مجموعه داده‌های فیلم‌ها ارائه دهیم، و هوش مصنوعی مولد با استفاده از مدل text-bison (جدیدترین) Vertex AI و تنها با استفاده از پرس‌وجوهای sql، این کار را انجام می‌دهد.

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

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

اگر قبلاً BQ Connection API را فعال نکرده‌اید، آن را فعال کنید و شناسه حساب سرویس (Service Account) را از جزئیات پیکربندی اتصال یادداشت کنید:

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

8a87802ab0846a6.png

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

اعطای مجوزها

در این مرحله، مجوزهایی را به حساب سرویس (Service Account) برای دسترسی به سرویس هوش مصنوعی Vertex اعطا خواهیم کرد:

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

ff8e1d730879f972.png

۸. یک مدل یادگیری ماشین از راه دور ایجاد کنید

مدل راه دور را ایجاد کنید که نشان دهنده یک مدل زبان بزرگ هوش مصنوعی Vertex میزبان باشد:

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 ایجاد می‌کند که از API CLOUD_AI_LARGE_LANGUAGE_MODEL_V1 مربوط به Vertex AI به عنوان یک تابع از راه دور استفاده می‌کند. تکمیل این کار چند ثانیه طول می‌کشد.

۹. تولید متن با استفاده از مدل یادگیری ماشین

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

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

همانطور که می‌بینید، پاسخ به صورت تو در تو و بدون قالب‌بندی است.

۱۰. نتیجه پرس و جو را مسطح کنید

بیایید نتیجه را مسطح کنیم تا مجبور نباشیم 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

۱۱. تمیز کردن

برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این پست، می‌توانید نقطه پایانی Vertex AI را که به عنوان بخشی از مرحله ML ایجاد کرده‌اید، با رفتن به صفحه Vertex AI Endpoint حذف کنید.

۱۲. تبریک

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