با استفاده از بسته BigQuery DataFrames دارای قابلیت هوش مصنوعی، بینش را از داده‌های ساختاریافته و بدون ساختار با استفاده از بسته BigQuery DataFrames با قابلیت هوش مصنوعی دریافت کنید.

1. بررسی اجمالی

در این آزمایشگاه، از BigQuery DataFrames از یک نوت بوک پایتون در BigQuery Studio استفاده خواهید کرد تا از داده ها با استفاده از Python بینش به دست آورید. از هوش مصنوعی مولد گوگل برای تجزیه و تحلیل و تجسم داده های متنی بدون ساختار استفاده کنید.

شما یک نوت بوک پایتون برای دسته بندی و خلاصه کردن یک پایگاه داده عمومی شکایات مشتریان ایجاد خواهید کرد. این را می توان برای کار بر روی هر داده متنی بدون ساختار تطبیق داد.

اهداف

در این آزمایشگاه می آموزید که چگونه وظایف زیر را انجام دهید:

  • نوت بوک های پایتون را در BigQuery Studio فعال و استفاده کنید
  • با استفاده از بسته BigQuery DataFrames به BigQuery متصل شوید
  • ایجاد جاسازی از داده های متنی بدون ساختار با استفاده از BigQuery ML و اتصال به نقطه پایانی جاسازی متن در Vertex AI
  • تعبیه‌های خوشه‌ای با استفاده از BigQuery ML
  • خوشه ها را با یک LLM از طریق BigQuery ML خلاصه کنید

2. الزامات

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

قبل از شروع

برای پیروی از دستورالعمل‌های این لبه کد، به یک پروژه Google Cloud با فعال BigQuery Studio و یک حساب صورت‌حساب متصل نیاز دارید.

  1. در Google Cloud Console ، در صفحه انتخاب پروژه، یک پروژه Google Cloud را انتخاب یا ایجاد کنید
  2. مطمئن شوید که صورتحساب برای پروژه Google Cloud شما فعال است. با نحوه بررسی فعال بودن صورت‌حساب در پروژه آشنا شوید
  3. دستورالعمل‌های فعال کردن BigQuery Studio را برای مدیریت دارایی دنبال کنید.

BigQuery Studio را آماده کنید

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

  1. در Google Cloud Console به BigQuery Studio بروید.
  2. روی در کنار دکمه + کلیک کنید.
  3. نوت بوک پایتون را انتخاب کنید.
  4. انتخابگر قالب را ببندید.
  5. برای ایجاد یک سلول کد جدید، + Code را انتخاب کنید.
  6. آخرین نسخه بسته BigQuery DataFrames را از سلول کد نصب کنید. دستور زیر را تایپ کنید.
    %pip install --upgrade bigframes --quiet
    
    روی دکمه 🞂 کلیک کنید یا Shift + Enter را فشار دهید تا سلول کد اجرا شود.

3. یک مجموعه داده عمومی را بخوانید

بسته BigQuery DataFrames را با اجرای موارد زیر در یک سلول کد جدید راه اندازی کنید:

import bigframes.pandas as bpd

bpd.options.bigquery.ordering_mode = "partial"

توجه: در این آموزش، ما از "حالت سفارش جزئی" آزمایشی استفاده می‌کنیم که در صورت استفاده از فیلتر پاندا مانند، درخواست‌های کارآمدتر را امکان‌پذیر می‌کند. برخی از ویژگی‌های پاندا که نیاز به سفارش یا فهرست دقیق دارند ممکن است کار نکنند.

پایگاه داده شکایات مصرف کننده

پایگاه داده شکایات مصرف کننده در BigQuery از طریق برنامه داده عمومی Google Cloud ارائه می شود. این مجموعه ای از شکایات در مورد محصولات و خدمات مالی مصرف کننده است و داده ها توسط اداره حمایت از مصرف کنندگان ایالات متحده جمع آوری شده است.

در BigQuery، جدول bigquery-public-data.cfbp_complaints.complaint_database را پرس و جو کنید. برای تجزیه و تحلیل پایگاه داده شکایات مصرف کننده. از متد bigframes.pandas.read_gbq() برای ایجاد یک DataFrame از رشته کوئری یا شناسه جدول استفاده کنید.

موارد زیر را در یک سلول کد جدید برای ایجاد یک DataFrame به نام "بازخورد" اجرا کنید:

feedback = bpd.read_gbq(
    "bigquery-public-data.cfpb_complaints.complaint_database"
)

اطلاعات اولیه در مورد DataFrame را کشف کنید

از متد DataFrame.peek() برای دانلود نمونه کوچکی از داده ها استفاده کنید.

این سلول را اجرا کنید:

feedback.peek()

خروجی مورد انتظار:

  date_received                  product ... timely_response  consumer_disputed complaint_id  
0    2014-03-05  Bank account or service ...            True              False       743665   
1    2014-01-21  Bank account or service ...            True              False       678608   
2    2020-12-31          Debt collection ...            True               <NA>      4041190   
3    2014-02-12          Debt collection ...            True              False       714350   
4    2015-02-23          Debt collection ...            True              False      1251358   

توجه: اگر می‌خواهید نمونه‌ای از داده‌ها را تجسم کنید، head() نیاز به سفارش دارد و معمولاً کارایی کمتری نسبت به peek() دارد.

درست مانند پانداها، از ویژگی DataFrame.dtypes برای مشاهده تمام ستون های موجود و انواع داده های مربوط به آنها استفاده کنید. اینها به روشی سازگار با پانداها در معرض دید قرار می گیرند.

این سلول را اجرا کنید:

feedback.dtypes

خروجی مورد انتظار:

date_received                   date32[day][pyarrow]
product                              string[pyarrow]
subproduct                           string[pyarrow]
issue                                string[pyarrow]
subissue                             string[pyarrow]
consumer_complaint_narrative         string[pyarrow]
company_public_response              string[pyarrow]
company_name                         string[pyarrow]
state                                string[pyarrow]
zip_code                             string[pyarrow]
tags                                 string[pyarrow]
consumer_consent_provided            string[pyarrow]
submitted_via                        string[pyarrow]
date_sent_to_company            date32[day][pyarrow]
company_response_to_consumer         string[pyarrow]
timely_response                              boolean
consumer_disputed                            boolean
complaint_id                         string[pyarrow]
dtype: object

متد DataFrame.describe() برخی از آمارهای اولیه را از DataFrame پرس و جو می کند. از آنجایی که این DataFrame حاوی هیچ ستون عددی نیست، خلاصه‌ای از تعداد مقادیر غیر تهی و تعداد مقادیر متمایز را نشان می‌دهد.

این سلول را اجرا کنید:

# Exclude some of the larger columns to make the query more efficient.
feedback.drop(columns=[
  "consumer_complaint_narrative",
  "company_public_response",
  "company_response_to_consumer",
]).describe()

خروجی مورد انتظار:

         product  subproduct    issue  subissue  company_name    state ... timely_response  consumer_disputed  complaint_id
count    3458906     3223615  3458906   2759004       3458906  3417792 ...         3458906             768399       3458906
nunique       18          76      165       221          6694       63 ...               2                  2       3458906

4. کاوش در داده ها

قبل از غواصی برای بررسی شکایات واقعی، از روش‌های پاندا مانند در DataFrame برای تجسم داده‌ها استفاده کنید.

DataFrame را تجسم کنید

چندین روش تجسم داخلی مانند DataFrame.plot.hist() وجود دارد. از آنجایی که این DataFrame بیشتر شامل داده‌های رشته‌ای و بولی است، ابتدا می‌توانیم مقداری تجمیع انجام دهیم تا درباره ستون‌های مختلف اطلاعات بیشتری کسب کنیم.

شمارش کنید که چه تعداد شکایت از هر ایالت دریافت شده است.

complaints_by_state = (
  feedback.groupby(
    "state", as_index=False,
  ).size()
  .rename(columns={"size": "total_complaints"})
  .sort_values(by="total_complaints", ascending=False)
)

با استفاده از متد DataFrame.to_pandas() این را به DataFrame pandas تبدیل کنید.

complaints_pd = complaints_by_state.head(10).to_pandas()

از روش های تجسم پانداها در این DataFrame دانلود شده استفاده کنید.

complaints_pd.plot.bar(x="state", y="total_complaints")

نمودار میله ای که کالیفرنیا را به عنوان ایالتی با بیشترین شکایات نشان می دهد

به مجموعه داده های دیگر بپیوندید

قبلاً به شکایات در هر ایالت نگاه می‌کردید، اما این زمینه مهم را از دست می‌دهد. برخی از ایالت ها جمعیت بیشتری نسبت به سایرین دارند. با مجموعه داده جمعیتی مانند بررسی جامعه آمریکایی اداره سرشماری ایالات متحده و جدول bigquery-public-data.geo_us_boundaries.states بپیوندید.

us_states = bpd.read_gbq("bigquery-public-data.geo_us_boundaries.states")
us_survey = bpd.read_gbq("bigquery-public-data.census_bureau_acs.state_2020_5yr")

# Ensure there are leading 0s on GEOIDs for consistency across tables.
us_states = us_states.assign(
    geo_id=us_states["geo_id"].str.pad(2, fillchar="0")
)

us_survey = us_survey.assign(
    geo_id=us_survey["geo_id"].str.pad(2, fillchar="0")
)

بررسی جامعه آمریکایی ایالت ها را توسط GEOID شناسایی می کند. با جدول ایالت ها بپیوندید تا جمعیت را با کد ایالت دو حرفی بدست آورید.

pops = us_states.set_index("geo_id")[["state"]].join(
  us_survey.set_index("geo_id")[["total_pop"]]
)

اکنون این را به پایگاه شکایات بپیوندید تا جمعیت را با تعداد شکایات مقایسه کنید.

complaints_and_pops = complaints_by_state.set_index("state").join(
    pops.set_index("state")
)

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

(
  complaints_and_pops
  .to_pandas()
  .plot.scatter(x="total_pop", y="total_complaints")
)

یک نمودار پراکنده مقایسه جمعیت با شکایات

به نظر می رسد چند ایالت در مقایسه جمعیت با تعداد شکایات پرت هستند. به عنوان تمرینی برای خواننده باقی می‌ماند که با برچسب‌های نقطه‌ای ترسیم کند تا این موارد را شناسایی کند. به همین ترتیب، فرضیه هایی برای این که چرا ممکن است چنین باشد (مثلاً جمعیت شناسی مختلف، تعداد شرکت های خدمات مالی متفاوت، و غیره) ارائه دهید و آنها را آزمایش کنید.

5. تعبیه ها را محاسبه کنید

اغلب، اطلاعات مهم در داده های بدون ساختار، مانند متن، صدا، یا تصاویر پنهان می شود. در این مثال، بسیاری از اطلاعات مفید در پایگاه شکایات در محتوای متنی شکایت موجود است.

هوش مصنوعی و تکنیک‌های سنتی، مانند تجزیه و تحلیل احساسات، "کیف کلمات" و word2vec می‌توانند برخی از اطلاعات کمی داده‌های بدون ساختار را استخراج کنند. اخیراً، مدل‌های «جاسازی برداری» که ارتباط نزدیکی با LLM دارند، می‌توانند دنباله‌ای از اعداد ممیز شناور که اطلاعات معنایی متن را نشان می‌دهند، ایجاد کنند.

زیر مجموعه ای از پایگاه داده را انتخاب کنید

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

import bigframes.pandas as bpd

bpd.options.bigquery.ordering_mode = "partial"

feedback = bpd.read_gbq(
    "bigquery-public-data.cfpb_complaints.complaint_database"
)

# Note: if not using ordering_mode = "partial", you must specify these in read_gbq
# for these to affect query efficiency.
# feedback = bpd.read_gbq(
#    "bigquery-public-data.cfpb_complaints.complaint_database",
#     columns=["consumer_complaint_narrative"],
#     filters= [
#         ("consumer_complaint_narrative", "!=", ""),
#         ("date_received", "==", "2022-12-01")])

feedback.shape

حدود 1000 شکایت ارسال شده در 01-12-2022 در مقایسه با نزدیک به 3.5 میلیون ردیف در کل پایگاه داده (با feedback.shape بررسی کنید).

فقط داده های مربوط به 01-12-2022 و فقط ستون consumer_complaint_narrative را انتخاب کنید.

import datetime

feedback = feedback[
    # Filter rows by passing in a boolean Series.
    (feedback["date_received"] == datetime.date(2022, 12, 1))
    & ~(feedback["date_received"].isnull())
    & ~(feedback["consumer_complaint_narrative"].isnull())
    & (feedback["consumer_complaint_narrative"] != "")
    & (feedback["state"] == "CA")

    # Uncomment the following if using free credits for a workshop.
    # Billing accounts with free credits have limited Vertex AI quota.
    # & (feedback["product"] == "Mortgage")
][
    # Filter columns by passing in a list of strings.
    ["consumer_complaint_narrative"]
]

feedback.shape

متد drop_duplicates از پانداها به ترتیب کلی ردیف‌ها نیاز دارد زیرا سعی می‌کند اولین یا آخرین ردیف منطبق را انتخاب کند و فهرست مرتبط با آن را حفظ کند.

درعوض، با فراخوانی متد groupby جمع آوری کنید تا ردیف ها را حذف کنید.

feedback = (
  feedback.groupby("consumer_complaint_narrative", as_index=False)
  .size()
)[["consumer_complaint_narrative"]]

feedback.shape

جاسازی ها را ایجاد کنید

BigQuery DataFrames بردارهای جاسازی را از طریق کلاس TextEmbeddingGenerator تولید می کند. این بر اساس روش ML.GENERATE_EMBEDDING ، در BigQuery ML است که مدل‌های جاسازی متن ارائه شده توسط Vertex AI را فراخوانی می‌کند.

from bigframes.ml.llm import TextEmbeddingGenerator

embedding_model = TextEmbeddingGenerator(
    model_name="text-embedding-004"
)
feedback_embeddings = embedding_model.predict(feedback)

به شکل ظاهری جاسازی ها نگاه کنید. این بردارها معنای معنایی متن را آنگونه که با مدل تعبیه متن درک می شود، نشان می دهند.

feedback_embeddings.peek()

خروجی مورد انتظار:

                        ml_generate_embedding_result  \
0  [ 7.36380890e-02  2.11779331e-03  2.54309829e-...   
1  [-1.10935252e-02 -5.53950183e-02  2.01338865e-...   
2  [-7.85628427e-03 -5.39347418e-02  4.51385677e-...   
3  [ 0.02013054 -0.0224789  -0.00164843  0.011354...   
4  [-1.51684484e-03 -5.02693094e-03  1.72322839e-...   

این بردارها ابعاد زیادی دارند. نگاهی به بردار جاسازی واحد بیندازید:

feedback_embeddings["ml_generate_embedding_result"].peek().iloc[0]

تولید جاسازی ها تحت یک قرارداد "موفقیت جزئی" عمل می کند. این بدان معنی است که برخی از ردیف ها ممکن است دارای خطا باشند و جاسازی ایجاد نکنند. پیام های خطا توسط ستون 'ml_generate_embedding_status' نمایش داده می شوند. خالی یعنی بدون خطا.

جاسازی‌ها را فیلتر کنید تا فقط ردیف‌هایی را که در آنها خطایی رخ نداده باشد شامل شود.

mask = feedback_embeddings["ml_generate_embedding_status"] == ""
valid_embeddings = feedback_embeddings[mask]
valid_embeddings.shape

6. خوشه با استفاده از جاسازی متن

اکنون، جاسازی‌ها را با استفاده از k-means خوشه‌بندی کنید. برای این دمو، از تعداد دلخواه گروه (معروف به centroids) استفاده کنید. یک راه حل با کیفیت تولید باید تعداد سانتروئیدها را با استفاده از تکنیکی مانند روش Silhouette تنظیم کند.

from bigframes.ml.cluster import KMeans

num_clusters = 5
cluster_model = KMeans(n_clusters=num_clusters)
cluster_model.fit(valid_embeddings["ml_generate_embedding_result"])
clusters = cluster_model.predict(valid_embeddings)
clusters.peek()

هر گونه خرابی تعبیه را حذف کنید.

mask = clusters["ml_generate_embedding_status"] == ""
clusters = clusters[mask]

زیرچشمی نگاه کنید و توزیع نظرات را در هر مرکز مشاهده کنید.

clusters.groupby("CENTROID_ID").size()

7. خوشه ها را خلاصه کنید

برخی از نظرات مرتبط با هر مرکز را وارد کنید و از Gemini بخواهید شکایات را خلاصه کند. مهندسی سریع یک حوزه در حال ظهور است، اما نمونه های خوبی در اینترنت وجود دارد، مانند https://www.promptingguide.ai/.

from bigframes.ml.llm import GeminiTextGenerator

preamble = "What is the main concern in this list of user complaints:"
suffix = "Write the main issue using a formal tone."

# Now let's sample the raw comments and get the LLM to summarize them.
prompts = []
for centroid_id in range(1, num_clusters + 1):
  cluster = clusters[clusters["CENTROID_ID"] == centroid_id]
  comments = "\n".join(["- {0}".format(x) for x in cluster.content.peek(40)])
  prompts.append("{}:\n{}\n{}".format(preamble, comments, suffix))

prompt_df = bpd.DataFrame(prompts)
gemini = GeminiTextGenerator(model_name="gemini-1.5-flash-001")
issues = gemini.predict(X=prompt_df, temperature=0.0)
issues.peek()

از Gemini برای نوشتن گزارش از خلاصه ها استفاده کنید.

from IPython.display import display, Markdown

prompt = "Turn this list of issues into a short, concise report:"
for value in issues["ml_generate_text_llm_result"]:
  prompt += "- {}".format(value)
prompt += "Using a formal tone, write a markdown text format report."

summary_df = bpd.DataFrame(([prompt]))
summary = gemini.predict(X=summary_df, temperature=0.0)

report = (summary["ml_generate_text_llm_result"].values[0])
display(Markdown(report))

8. پاکسازی کنید

اگر پروژه Google Cloud جدیدی برای این آموزش ایجاد کرده‌اید، می‌توانید آن را حذف کنید تا از هزینه‌های اضافی برای جداول یا سایر منابع ایجاد شده جلوگیری کنید.

9. تبریک!

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

مراحل بعدی