Memperkirakan permintaan dari masukan pelanggan menggunakan Lakehouse dan AI

Tutorial ini menunjukkan cara menganalisis masukan pelanggan berupa teks bebas tidak terstruktur dengan data penjualan terstruktur di Lakehouse untuk mengevaluasi peluncuran produk baru.

Bayangkan Anda adalah seorang ilmuwan data di Froyo, sebuah perusahaan yogurt beku fiktif yang berencana meluncurkan rasa baru bernama Midnight Swirl. Sebelum berkomitmen untuk peluncuran global, bisnis perlu menjawab tiga pertanyaan:

  • Alergen dan masalah masukan pelanggan apa yang berlaku untuk rasa baru ini?
  • Seberapa besar permintaan yang harus diantisipasi perusahaan untuk rasa yang sudah ada selama 12 bulan ke depan?
  • Bagaimana perbandingan sentimen pelanggan dan niat pembelian berulang dengan perkiraan permintaan?

Tutorial ini ditujukan untuk analis data, ilmuwan data, dan data engineer yang sudah memahami BigQuery dan SQL dasar. Anda menyelesaikan setiap langkah menggunakan Cloud Shell dan Google Cloud konsol.

Tujuan

  • Buat katalog di katalog runtime Lakehouse, lalu buat tabel Apache Iceberg yang menyimpan data produk, penjualan, dan masukan pelanggan di Lakehouse Anda.
  • Gunakan fungsi AI BigQuery AI.CLASSIFY dan AI.IF untuk mengekstrak sentimen, topik, dan niat pembelian dari teks tidak terstruktur yang disimpan dalam tabel Iceberg.
  • Gunakan analisis percakapan di BigQuery Studio untuk memperkirakan permintaan selama 12 bulan dengan AI.FORECAST dan gabungkan perkiraan dengan insight produk dan masukan.

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.

Pengguna Google Cloud baru mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, baca bagian Pembersihan.

Sebelum memulai

  1. Di konsol Google Cloud , pada halaman pemilih project, pilih atau buat Google Cloud project.

    Buka pemilih project

  2. Verifikasi bahwa penagihan diaktifkan untuk project Google Cloud Anda.

Peran yang diperlukan

Untuk mendapatkan izin yang Anda perlukan untuk menyelesaikan tugas dalam tutorial ini, minta administrator Anda untuk memberi Anda peran IAM berikut di project Anda:

Untuk mengetahui informasi selengkapnya tentang pemberian peran, lihat Mengelola akses ke project, folder, dan organisasi.

Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

Menyiapkan lingkungan Anda

Aktifkan Cloud Shell, tetapkan variabel lingkungan untuk resource Anda, dan aktifkan API yang diperlukan:

  1. Di konsol Google Cloud , aktifkan Cloud Shell. Jika Anda diminta, klik Authorize.

    Aktifkan Cloud Shell

  2. Di Cloud Shell, tetapkan variabel lingkungan untuk project ID, region, nama bucket, ID katalog, dan namespace Anda agar Anda dapat menggunakannya kembali di seluruh tutorial ini:

    export PROJECT_ID=$(gcloud config get-value project)
    export REGION="us-central1"
    export BUCKET_NAME="${PROJECT_ID}-froyo-lakehouse"
    export CATALOG_ID="froyo_catalog"
    export NAMESPACE_ID="froyo_lakehouse"
  3. Aktifkan API yang diperlukan untuk project Anda:

    • BigQuery API (bigquery.googleapis.com)
    • BigLake API (biglake.googleapis.com), yang menyediakan akses ke katalog runtime Lakehouse
    • Cloud Storage API (storage.googleapis.com)
    • Agent Platform API (aiplatform.googleapis.com)
    • Conversational Analytics API (geminidataanalytics.googleapis.com)
    • Gemini for Google Cloud API (cloudaicompanion.googleapis.com)

    Aktifkan API ini di Cloud Shell:

    gcloud services enable \
        bigquery.googleapis.com \
        biglake.googleapis.com \
        storage.googleapis.com \
        aiplatform.googleapis.com \
        geminidataanalytics.googleapis.com \
        cloudaicompanion.googleapis.com \
        --project=${PROJECT_ID}

Membuat bucket Cloud Storage

Di Cloud Shell, buat bucket Cloud Storage untuk menyimpan file tabel Iceberg Anda:

gcloud storage buckets create gs://${BUCKET_NAME} \
    --project=${PROJECT_ID} \
    --location=${REGION}

Membuat katalog di katalog runtime Lakehouse

Dengan menggunakan endpoint katalog REST Iceberg, buat katalog dalam mode penyediaan kredensial sehingga katalog menggunakan akun layanan yang disediakan otomatis untuk mengakses bucket Anda, dan Anda tidak perlu membuat koneksi BigQuery:

  1. Di Cloud Shell, buat katalog multi-bucket dalam mode penyediaan kredensial:

    gcloud biglake iceberg catalogs create ${CATALOG_ID} \
        --project=${PROJECT_ID} \
        --catalog-type=biglake \
        --default-location=gs://${BUCKET_NAME} \
        --primary-location=${REGION} \
        --credential-mode=vended-credentials
  2. Berikan peran Storage Object User (roles/storage.objectUser) kepada akun layanan yang disediakan otomatis oleh katalog di bucket Anda:

    CATALOG_SA=$(gcloud biglake iceberg catalogs describe ${CATALOG_ID} \
        --project=${PROJECT_ID} \
        --format='value(biglake-service-account)')
    
    gcloud storage buckets add-iam-policy-binding gs://${BUCKET_NAME} \
        --member="serviceAccount:${CATALOG_SA}" \
        --role="roles/storage.objectUser"
  3. Buat namespace untuk tabel Anda dalam katalog:

    gcloud biglake iceberg namespaces create ${NAMESPACE_ID} \
        --project=${PROJECT_ID} \
        --catalog=${CATALOG_ID}

Membuat tabel Iceberg

Buat tiga tabel Iceberg dalam katalog Anda dan muat tabel tersebut dengan data sampel:

  • products: Menyimpan daftar produk, termasuk rasa Midnight Swirl baru dan rasa yang sudah ada yang menjadi dasarnya.
  • sales_history: Menyimpan data penjualan unit bulanan selama 24 bulan untuk varian yang ada, menurut wilayah.
  • customer_feedback: Menyimpan catatan masukan. Setiap baris memasangkan metadata terstruktur (feedback_id, submitted_date, flavor_name, dan channel) dengan kolom comment STRING yang menyimpan teks bebas tidak terstruktur.

Di BigQuery, Anda mereferensikan tabel Lakehouse menggunakan struktur penamaan empat bagian P.C.N.T. (Project.Catalog.Namespace.Table).

  1. Di Cloud Shell, buat tabel products, sales_history, dan customer_feedback, lalu isi dengan data sampel. Skrip menjalankan setiap pernyataan secara berurutan dan memerlukan waktu sekitar satu menit untuk diselesaikan:

    bq query --project_id=${PROJECT_ID} --location=${REGION} --use_legacy_sql=false << EOF
    -- Product list.
    CREATE TABLE \`${PROJECT_ID}.${CATALOG_ID}.${NAMESPACE_ID}.products\` (
      product_name STRING,
      base_flavor STRING,
      status STRING,
      allergens STRING,
      target_regions STRING);
    
    INSERT INTO \`${PROJECT_ID}.${CATALOG_ID}.${NAMESPACE_ID}.products\` VALUES
      ('Midnight Swirl', 'Classic Chocolate', 'Planned launch',
       'Milk, Soy', 'North America, Europe'),
      ('Classic Chocolate', 'Classic Chocolate', 'In market',
       'Milk, Soy', 'North America, Europe, Asia Pacific'),
      ('Vanilla Bean', 'Vanilla Bean', 'In market',
       'Milk', 'North America, Europe, Asia Pacific'),
      ('Strawberry Swirl', 'Strawberry Swirl', 'In market',
       'Milk', 'North America, Europe, Asia Pacific');
    
    -- Monthly sales history for the flavors that are in market.
    CREATE TABLE \`${PROJECT_ID}.${CATALOG_ID}.${NAMESPACE_ID}.sales_history\` (
      sale_month DATE,
      flavor_name STRING,
      region STRING,
      units_sold INT64);
    
    INSERT INTO \`${PROJECT_ID}.${CATALOG_ID}.${NAMESPACE_ID}.sales_history\`
    WITH
      months AS (
        SELECT sale_month
        FROM UNNEST(GENERATE_DATE_ARRAY(
          '2024-01-01', '2025-12-01', INTERVAL 1 MONTH)) AS sale_month
      ),
      flavors AS (
        SELECT * FROM UNNEST([
          STRUCT('Classic Chocolate' AS flavor_name, 1200 AS base_units),
          ('Vanilla Bean', 1000),
          ('Strawberry Swirl', 800)])
      ),
      regions AS (
        SELECT * FROM UNNEST([
          STRUCT('North America' AS region, 1.0 AS region_factor),
          ('Europe', 0.8),
          ('Asia Pacific', 0.6)])
      )
    SELECT
      m.sale_month,
      f.flavor_name,
      r.region,
      CAST(
        f.base_units * r.region_factor
        -- Two percent month-over-month growth.
        * (1 + 0.02 * DATE_DIFF(m.sale_month, DATE '2024-01-01', MONTH))
        -- Seasonal peak in July.
        * (1 + 0.25 * SIN(2 * ACOS(-1)
            * (EXTRACT(MONTH FROM m.sale_month) - 4) / 12))
        AS INT64) AS units_sold
    FROM months AS m
    CROSS JOIN flavors AS f
    CROSS JOIN regions AS r;
    
    -- Customer feedback records with unstructured text in the comment column.
    CREATE TABLE \`${PROJECT_ID}.${CATALOG_ID}.${NAMESPACE_ID}.customer_feedback\` (
      feedback_id INT64,
      submitted_date DATE,
      flavor_name STRING,
      channel STRING,
      comment STRING);
    
    INSERT INTO \`${PROJECT_ID}.${CATALOG_ID}.${NAMESPACE_ID}.customer_feedback\` VALUES
      (1, '2025-11-03', 'Midnight Swirl', 'Taste panel',
       "Rich, deep chocolate with a hint of salt. Honestly better than the classic chocolate. I'd order this every week."),
      (2, '2025-11-03', 'Midnight Swirl', 'Taste panel',
       "Loved the dark chocolate swirl, but it was a bit too bitter for my kids."),
      (3, '2025-11-04', 'Midnight Swirl', 'Taste panel',
       "Best froyo I've tried this year. Smooth texture and not too sweet."),
      (4, '2025-11-04', 'Midnight Swirl', 'Taste panel',
       "Great taste. I'd definitely buy it again if it's priced like the other flavors."),
      (5, '2025-11-05', 'Midnight Swirl', 'Taste panel',
       "Does this contain soy? I have a soy allergy so I skipped it. Please label it clearly."),
      (6, '2025-11-05', 'Midnight Swirl', 'Taste panel',
       "Tastes like a premium dessert. The sea salt really makes it."),
      (7, '2025-06-12', 'Classic Chocolate', 'App review',
       "Solid chocolate flavor, my go-to order."),
      (8, '2025-07-02', 'Classic Chocolate', 'App review',
       "It's fine, but a little too sweet compared to other brands."),
      (9, '2025-08-19', 'Classic Chocolate', 'Support email',
       "Consistently good. I wish the cups were bigger for the price."),
      (10, '2025-09-07', 'Classic Chocolate', 'Support email',
       "My chocolate froyo was icy this time and the texture was off."),
      (11, '2025-10-21', 'Classic Chocolate', 'App review',
       "Classic for a reason. Always creamy. I'll keep ordering it."),
      (12, '2025-11-05', 'Classic Chocolate', 'Taste panel',
       "Good but forgettable next to the new dark chocolate sample."),
      (13, '2025-05-14', 'Vanilla Bean', 'App review',
       "Real vanilla flavor, you can see the specks. Love it."),
      (14, '2025-06-30', 'Vanilla Bean', 'App review',
       "Pretty plain. I only order it as a base for toppings."),
      (15, '2025-08-02', 'Vanilla Bean', 'App review',
       "Creamy and simple, perfect for my toddler."),
      (16, '2025-09-15', 'Vanilla Bean', 'Support email',
       "The store was out of vanilla bean two weekends in a row."),
      (17, '2025-06-08', 'Strawberry Swirl', 'App review',
       "Tastes like fresh strawberries. Great in the summer."),
      (18, '2025-07-26', 'Strawberry Swirl', 'App review',
       "Too artificial tasting. Not a fan."),
      (19, '2025-08-11', 'Strawberry Swirl', 'Support email',
       "My favorite flavor. Please never discontinue it."),
      (20, '2025-10-03', 'Strawberry Swirl', 'App review',
       "The price went up, but it's still worth it.");
    EOF
  2. Pastikan katalog Anda mencantumkan tabel products, sales_history, dan customer_feedback:

    gcloud biglake iceberg tables list \
        --project=${PROJECT_ID} \
        --catalog=${CATALOG_ID} \
        --namespace=${NAMESPACE_ID}

Menganalisis masukan dengan fungsi AI

Kolom comment dalam tabel customer_feedback berisi teks tidak terstruktur yang tidak dapat Anda gabungkan atau gabungkan secara langsung. Gunakan fungsi AI BigQuery untuk mengekstrak nilai terstruktur dari setiap komentar dan membuat tabel feedback_insights baru:

  • AI.CLASSIFY menetapkan sentimen (positive, neutral, atau negative) dan topik utama (seperti taste, texture, price, atau allergens) untuk setiap komentar dari daftar kategori yang Anda tentukan.
  • AI.IF mengevaluasi kondisi bahasa alami untuk setiap komentar dan menampilkan nilai BOOL. Dalam hal ini, nilai menunjukkan apakah pelanggan bermaksud membeli produk lagi.

Fungsi AI terkelola ini menggunakan kredensial pengguna Anda untuk memanggil Gemini, sehingga Anda tidak perlu membuat model atau koneksi jarak jauh.

  1. Di Cloud Shell, buat dan isi tabel feedback_insights:

    bq query --project_id=${PROJECT_ID} --location=${REGION} --use_legacy_sql=false << EOF
    CREATE TABLE \`${PROJECT_ID}.${CATALOG_ID}.${NAMESPACE_ID}.feedback_insights\` (
      feedback_id INT64,
      flavor_name STRING,
      channel STRING,
      comment STRING,
      sentiment STRING,
      topic STRING,
      would_buy_again BOOL);
    
    INSERT INTO \`${PROJECT_ID}.${CATALOG_ID}.${NAMESPACE_ID}.feedback_insights\`
    SELECT
      feedback_id,
      flavor_name,
      channel,
      comment,
      AI.CLASSIFY(
        comment,
        categories => ['positive', 'neutral', 'negative']) AS sentiment,
      AI.CLASSIFY(
        comment,
        categories => ['taste', 'texture', 'price', 'allergens',
                       'availability', 'other']) AS topic,
      AI.IF(
        ('This customer says or implies that they would buy the product ',
         'again. Comment: ', comment)) AS would_buy_again
    FROM \`${PROJECT_ID}.${CATALOG_ID}.${NAMESPACE_ID}.customer_feedback\`;
    EOF
  2. Meringkas metrik masukan untuk setiap varian:

    bq query --project_id=${PROJECT_ID} --location=${REGION} --use_legacy_sql=false << EOF
    SELECT
      flavor_name,
      COUNT(*) AS comments,
      COUNTIF(sentiment = 'positive') AS positive,
      COUNTIF(would_buy_again) AS would_buy_again,
      ROUND(COUNTIF(sentiment = 'positive') / COUNT(*), 2) AS positive_share
    FROM \`${PROJECT_ID}.${CATALOG_ID}.${NAMESPACE_ID}.feedback_insights\`
    GROUP BY flavor_name
    ORDER BY positive_share DESC;
    EOF

    Outputnya mirip dengan hal berikut ini:

    +-------------------+----------+----------+-----------------+----------------+
    |    flavor_name    | comments | positive | would_buy_again | positive_share |
    +-------------------+----------+----------+-----------------+----------------+
    | Strawberry Swirl  |        4 |        3 |               2 |           0.75 |
    | Midnight Swirl    |        6 |        4 |               3 |           0.67 |
    | Vanilla Bean      |        4 |        2 |               2 |            0.5 |
    | Classic Chocolate |        6 |        2 |               3 |           0.33 |
    +-------------------+----------+----------+-----------------+----------------+
    

Memperkirakan permintaan dengan analisis percakapan

Analisis percakapan di BigQuery Studio memungkinkan Anda menganalisis tabel Iceberg menggunakan bahasa natural. Fitur ini mengambil skema tabel dari katalog runtime Lakehouse, membuat dan menjalankan SQL BigQuery (termasuk fungsi AI seperti AI.FORECAST), serta menampilkan tabel dan diagram langsung dalam chat.

Memulai percakapan dengan tabel Anda

  1. Di konsol Google Cloud , buka halaman Agen BigQuery.

    Buka Agen

  2. Di panel editor BigQuery Studio, klik tab Agen untuk membuka panel percakapan, lalu klik Chat baru.

  3. Di panel Chat dengan data Anda, klik tab Sumber pengetahuan. Di kolom Search for sources, telusuri dan pilih tiga tabel Iceberg Anda menggunakan nilai berikut. Ganti PROJECT_ID dengan project ID Anda:

    • PROJECT_ID.froyo_catalog.froyo_lakehouse.products
    • PROJECT_ID.froyo_catalog.froyo_lakehouse.feedback_insights
    • PROJECT_ID.froyo_catalog.froyo_lakehouse.sales_history
  4. Klik Chat.

Ajukan pertanyaan untuk memperkirakan permintaan dan mengevaluasi peluncuran

Ajukan serangkaian pertanyaan dalam bahasa alami untuk menjawab tiga pertanyaan bisnis untuk peluncuran Midnight Swirl:

  1. Di kolom Ask a question, masukkan perintah berikut untuk memeriksa detail produk dan masukan pelanggan Midnight Swirl, lalu klik send_spark Send:

    Using products and feedback_insights, what are Midnight Swirl's allergens,
    base flavor, positive sentiment share, would_buy_again count, and customer
    concerns from negative or neutral comments?
    

    Agen mengkueri kedua tabel dan melaporkan bahwa Midnight Swirl didasarkan pada Classic Chocolate dan mengandung susu dan kedelai. Laporan ini juga menunjukkan pangsa sentimen positif sebesar 0,67, dengan tiga dari enam pelanggan berniat membelinya lagi, dan menyoroti kekhawatiran tentang pelabelan alergen kedelai dan rasa pahit cokelat hitam.

  2. Masukkan perintah berikut untuk memperkirakan permintaan selama 12 bulan di seluruh varian yang ada, lalu klik send_spark Kirim:

    Forecast monthly sales by flavor for the next 12 months, plotting only the
    trend lines without confidence intervals.
    

    Analisis percakapan menjalankan kueri dengan AI.FORECAST, yang menggunakan model TimesFM bawaan di BigQuery ML tanpa melatih model terpisah, dan menampilkan diagram perkiraan 12 bulan untuk setiap rasa.

  3. Masukkan perintah berikut untuk menggabungkan perkiraan permintaan dengan masukan pelanggan dan mendapatkan rekomendasi peluncuran, lalu klik send_spark Kirim:

    Join the total 12-month forecasted units_sold for each flavor with its
    positive sentiment share, would_buy_again count, and top complaint topics
    from feedback_insights, and recommend next steps for the Midnight Swirl
    launch.
    
  4. Opsional: Untuk memeriksa kueri SQL yang dihasilkan atau melihat langkah-langkah penalaran agen, luaskan Tampilkan pemikiran.

Dari sini, Anda dapat mengajukan pertanyaan lanjutan dalam percakapan (seperti mengelompokkan perkiraan menurut wilayah) atau mengklik Buat Agen di panel Detail untuk menyimpan dan membagikan agen data yang dapat digunakan kembali kepada tim Anda.

Pembersihan

Agar akun Google Cloud Anda tidak dikenai biaya untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.

Menghapus project

  1. Di konsol Google Cloud , buka halaman Manage resources.

    Buka Kelola resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Menghapus resource satu per satu

Jika ingin mempertahankan project, hapus resource individual yang Anda buat.

  1. Untuk menghapus percakapan Anda, di panel editor BigQuery Studio, pilih tab Agen. Di panel navigasi kiri, yang mungkin perlu Anda perluas, temukan percakapan Anda di bagian Percakapan terbaru, lalu klik more_vert Lihat tindakan > Hapus.

  2. Di Cloud Shell, hapus empat tabel, namespace, katalog, dan bucket Cloud Storage:

    for TABLE in products sales_history customer_feedback feedback_insights; do
      gcloud biglake iceberg tables delete ${TABLE} \
          --project=${PROJECT_ID} \
          --catalog=${CATALOG_ID} \
          --namespace=${NAMESPACE_ID} \
          --quiet
    done
    
    gcloud biglake iceberg namespaces delete ${NAMESPACE_ID} \
        --project=${PROJECT_ID} \
        --catalog=${CATALOG_ID} \
        --quiet
    
    gcloud biglake iceberg catalogs delete ${CATALOG_ID} \
        --project=${PROJECT_ID} \
        --quiet
    
    gcloud storage rm -r gs://${BUCKET_NAME}

Langkah berikutnya

Untuk mempelajari lebih lanjut cara bekerja dengan data Lakehouse, lihat referensi berikut: