สร้างตลาดกลางยานพาหนะที่ทำงานด้วยระบบ AI ด้วยโมเดล BigQuery และ Gemini

1. บทนำ

ใน Codelab นี้ คุณจะได้สร้างแบ็กเอนด์และติดตั้งใช้งานฟรอนท์เอนด์สำหรับ "Cymbal Autos" ซึ่งเป็นมาร์เก็ตเพลสยานพาหนะออนไลน์ คุณจะใช้ BigQuery และโมเดล Gemini ในแพลตฟอร์มเอเจนต์ Gemini Enterprise เพื่อตรวจสอบรูปภาพยานพาหนะ คาดการณ์ราคาโดยใช้ BigQuery ML ตรวจหาข้อมูลที่น่าสงสัยโดยใช้การฝังเวกเตอร์ และคำนวณคะแนนข้อตกลงแบบผสม สุดท้าย คุณจะแสดงข้อมูลเชิงลึกเหล่านี้ในส่วนหน้าของ Next.js ที่ติดตั้งใช้งานใน Cloud Run

แผนภาพสถาปัตยกรรมที่แสดง BigQuery สื่อสารกับแพลตฟอร์ม Agent และแสดงผลส่วนหน้าของ Next.js Cloud Run

สิ่งที่คุณต้องดำเนินการ

  • เชื่อมต่อ BigQuery กับรูปภาพที่ไม่มีโครงสร้างใน Cloud Storage โดยใช้ ObjectRef
  • แยกแอตทริบิวต์ของยานพาหนะจากรูปภาพโดยใช้ BigQuery กับโมเดล Gemini
  • คาดการณ์ราคาตลาดที่ยุติธรรมโดยการฝึกโมเดลการถดถอย XGBoost ด้วย BigQuery ML
  • ระบุข้อมูลที่อาจเป็นสแกมและข้อมูลที่เชื่อถือได้ด้วยการฝังคำอธิบายยานพาหนะและดำเนินการ VECTOR_SEARCH
  • คำนวณคะแนนดีลที่ครอบคลุมสำหรับข้อมูลแต่ละรายการ ขณะเดียวกันก็รวมสัญญาณสภาพจากคำอธิบายของผู้ขายโดยใช้ AI.SCORE
  • ส่งออกข้อมูลและติดตั้งใช้งานแอปพลิเคชันมาร์เก็ตเพลส Next.js ใน Google Cloud Run

สิ่งที่คุณต้องมี

  • เว็บเบราว์เซอร์ เช่น Chrome
  • โปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงิน
  • มีความรู้พื้นฐานเกี่ยวกับ SQL, Python และ Google Cloud
  • สิทธิ์ IAM ที่เพียงพอในการเปิดใช้ API, สร้างทรัพยากร และมอบหมายสิทธิ์ (เช่น เจ้าของโปรเจ็กต์)

Codelab นี้มีไว้สำหรับนักพัฒนาแอประดับกลาง

ทรัพยากรที่สร้างในโค้ดแล็บนี้ควรมีค่าใช้จ่ายน้อยกว่า $5

2. ก่อนเริ่มต้น

สร้างโปรเจ็กต์ Google Cloud

  1. ในคอนโซล Google Cloud ในหน้าตัวเลือกโปรเจ็กต์ ให้เลือกหรือสร้างโปรเจ็กต์ Google Cloud
  2. ตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์ที่อยู่ในระบบคลาวด์แล้ว ดูวิธีตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินในโปรเจ็กต์แล้วหรือไม่

เริ่มต้น Cloud Shell

คุณจะใช้ Google Cloud Shell เพื่อดาวน์โหลดโค้ด เรียกใช้สคริปต์การตั้งค่า และทำให้แอปพลิเคชันใช้งานได้

  1. คลิกเปิดใช้งาน Cloud Shell ที่ด้านบนของ คอนโซล Google Cloud

เปิด Cloud Shell

  1. เมื่อเชื่อมต่อกับ Cloud Shell แล้ว ให้ตรวจสอบสิทธิ์เซสชันเพื่อให้แน่ใจว่าแอปพลิเคชันของคุณเข้าถึง Google Cloud APIs ได้ ทำตามข้อความแจ้งเพื่อให้สิทธิ์ Cloud Shell
gcloud auth application-default login
  1. ตั้งค่ารหัสโปรเจ็กต์ Google Cloud และชื่อที่ไม่ซ้ำกันสำหรับที่เก็บข้อมูล Google Cloud Storage (ตำแหน่งที่จะจัดเก็บข้อมูลดิบ) ดังนี้
export PROJECT_ID=$(gcloud config get-value project)
export USER_BUCKET="cymbal-autos-${PROJECT_ID}"

gcloud config set project $PROJECT_ID

คุณควรเห็นข้อความที่คล้ายกับข้อความด้านล่าง

Your active configuration is: [cloudshell-####]
Updated property [core/project]

เปิดใช้ API

เรียกใช้คำสั่งนี้ใน Cloud Shell เพื่อเปิดใช้ API ที่จำเป็นทั้งหมดสำหรับ Codelab นี้

gcloud services enable \
  aiplatform.googleapis.com \
  artifactregistry.googleapis.com \
  bigquery.googleapis.com \
  bigqueryconnection.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com

เมื่อดำเนินการสำเร็จ คุณควรเห็นข้อความคล้ายกับข้อความที่แสดงด้านล่าง

Operation "operations/..." finished successfully.

3. รับรหัสและข้อมูลการตั้งค่า

ก่อนอื่น ให้ดาวน์โหลดชิ้นงานเดโมและกำหนดค่าตัวแปรสภาพแวดล้อม

  1. จาก Cloud Shell ให้โคลนที่เก็บ devrel-demos แล้วไปที่ไดเรกทอรีโปรเจ็กต์
git clone https://github.com/GoogleCloudPlatform/devrel-demos.git
cd devrel-demos/data-analytics/cymbal-autos-multimodal
  1. เรียกใช้สคริปต์เพื่อคัดลอกข้อมูลลงในสภาพแวดล้อม สคริปต์นี้จะซิงค์ชุดข้อมูลที่เก็บในเครื่องกับ Bucket ของ Cloud Storage ส่วนตัว และดึงรูปภาพยานพาหนะจาก Bucket สาธารณะ
chmod +x scripts/setup/*.sh
./scripts/setup/00_copy_data.sh

หลังจากนั้น คุณควรเห็นข้อความที่คล้ายกับข้อความต่อไปนี้

Average throughput: 87.8MiB/s
Data copy complete!
  1. จากนั้นตั้งค่าการเชื่อมต่อทรัพยากรระบบคลาวด์ BigQuery หากต้องการวิเคราะห์รูปภาพที่ไม่มีโครงสร้างใน Cloud Storage และเรียกใช้โมเดล Agent Platform โดยตรงจากการค้นหา SQL คุณต้องมอบสิทธิ์ IAM ให้กับบัญชีบริการพื้นฐานใน BigQuery สคริปต์นี้จะสร้างการเชื่อมต่อที่ปลอดภัยดังกล่าวและมอบบทบาทผู้ใช้ Vertex AI และผู้ใช้การใช้บริการให้แก่การเชื่อมต่อ (ซึ่งใช้เวลาประมาณ 1 นาทีในการเผยแพร่)
./scripts/setup/01_setup_api_connection.sh

คุณควรเห็นข้อความที่คล้ายกับข้อความต่อไปนี้

Environment setup complete! Your BigQuery connection is ready.
  1. สุดท้าย ให้สร้างชุดข้อมูล BigQuery เริ่มต้นและโหลดข้อมูลตารางดิบ ซึ่งจะสร้างชุดข้อมูล model_dev และป้อนข้อมูลลงในตารางเริ่มต้น เพื่อวางรากฐานก่อนที่คุณจะเขียนคําค้นหาแมชชีนเลิร์นนิง
./scripts/setup/02_load_to_bq.sh

คุณควรเห็นข้อความที่คล้ายกับข้อความต่อไปนี้

=================================================================
BigQuery load complete!
=================================================================

4. การดึงข้อมูลจากวิชันซิสเต็มหลายโมดัล

ก่อนให้คะแนนข้อมูลยานพาหนะ คุณจะต้องดึงข้อมูลที่มีโครงสร้าง (เช่น สี รูปแบบตัวถัง หรือความเสียหายที่มองเห็นได้) จากรูปภาพดิบหลายร้อยรูป การแตะฟังก์ชัน ObjectRef และโมเดล Gemini ที่โฮสต์ใน Agent Platform จะช่วยให้คุณสร้างฟีเจอร์เหล่านี้ได้โดยไม่ต้องย้ายไฟล์หรือเขียนไปป์ไลน์ข้อมูลที่ซับซ้อน การแยกข้อมูลนี้จะขับเคลื่อนป้าย✨ เงื่อนไขภาพในแอปพลิเคชันส่วนหน้าโดยตรง

  1. เปิด BigQuery Studio ในแท็บเบราว์เซอร์ใหม่
  2. คลิกปุ่ม + เขียนคำค้นหาใหม่ คุณจะใช้ SQL Editor เพื่อโต้ตอบกับโค้ด SQL ตลอด Codelab นี้
  3. ก่อนสร้างโปรแกรมแยกข้อมูลแมชชีนเลิร์นนิง คุณสามารถดูรูปภาพดิบอย่างรวดเร็วได้ เรียกใช้การค้นหาต่อไปนี้เพื่อดูอาร์เรย์ของ URI รูปภาพที่จัดเก็บไว้ใน Google Cloud Storage สำหรับข้อมูลแต่ละรายการ
SELECT auction_id, item_name, description, images 
FROM `model_dev.vehicle_metadata` LIMIT 5;
  1. ตอนนี้ในตัวแก้ไข SQL ของ BigQuery Studio ให้วาง SQL ต่อไปนี้เพื่อสร้างตารางใหม่ที่มีคอลัมน์ image_ref คลิกเรียกใช้
CREATE OR REPLACE TABLE `model_dev.vehicle_multimodal` AS
SELECT 
  *,
  ARRAY(
    SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF(uri, 'us.conn')) 
    FROM UNNEST(images) AS uri
  ) AS image_ref
FROM `model_dev.vehicle_metadata`;
  1. ดูimage_refคอลัมน์ ObjectRef ใหม่ที่คุณเพิ่งสร้าง ตอนนี้ตารางใหม่มีคอลัมน์ ObjectRef ที่มีสิทธิ์ในการดำเนินการกับรูปภาพเอง เรียกใช้การค้นหาต่อไปนี้เพื่อดู
SELECT auction_id, item_name, description, image_ref 
FROM `model_dev.vehicle_multimodal` LIMIT 5;
  1. ตอนนี้คุณจะใช้ AI.GENERATE และ AI.CLASSIFY เพื่อวิเคราะห์รูปภาพ AI.GENERATE จะดึงคะแนนสภาพและสรุปความเสียหายใน 1 ประโยคโดยการแจ้ง Gemini ส่วน AI.CLASSIFY จะจัดหมวดหมู่รูปแบบตัวถังและสีของยานพาหนะอย่างเคร่งครัด

เรียกใช้การค้นหาต่อไปนี้เพื่อดึงข้อมูลเชิงลึกเหล่านี้ลงในตารางฟีเจอร์เฉพาะ โดยคาดว่าจะใช้เวลาประมาณ 3 นาที

CREATE OR REPLACE TABLE `model_dev.vehicle_vision_features` AS
WITH generated_data AS (
   SELECT
   auction_id,
   AI.GENERATE(
     prompt => ('Rate the condition of this car on a scale from 0-100. Output a 1 sentence description of any glaring red flags', image_ref),
     output_schema => 'condition INT64, description_summary STRING'
   ).* EXCEPT(full_response,status)
 FROM
   `model_dev.vehicle_multimodal`
),

-- Object-centric Classifications
classified_data AS (
 SELECT
   auction_id,
   AI.CLASSIFY(
     ('What type of automobile is this?', image_ref[0]),
     categories => ['Truck', 'Sedan', 'SUV']) AS body_style,
   AI.CLASSIFY(
     ('Color of the exterior of the automobile', image_ref[0]),
     categories => ['Black', 'White', 'Silver', 'Gray', 'Red', 'Blue', 'Brown', 'Green', 'Beige', 'Gold']) AS color,
   AI.CLASSIFY(
     ('Color of the interior of the automobile', image_ref[0]),
     categories => ['Black', 'Gray', 'Beige', 'Tan', 'Brown', 'White', 'Red']) AS interior
 FROM `model_dev.vehicle_multimodal`
)

-- Join the AI insights back together into the final feature table
SELECT
 g.auction_id,
 g.condition,
 g.description_summary,
 c.body_style,
 c.color,
 c.interior
FROM generated_data g
JOIN classified_data c ON g.auction_id = c.auction_id;
  1. หากต้องการดูฟีเจอร์ที่สร้างขึ้นด้วยตนเอง ให้เรียกใช้การค้นหาต่อไปนี้ หรือดูภาพหน้าจอด้านล่าง
SELECT auction_id, condition, description_summary, body_style, color, interior FROM `model_dev.vehicle_vision_features` LIMIT 5;

การแยกข้อมูลหลายรูปแบบ

สรุปส่วน: คุณเข้าถึงรูปภาพดิบได้โดยตรงจาก BigQuery และใช้โมเดล Gemini เพื่อดึงฟีเจอร์ภาพที่มีโครงสร้างโดยไม่ต้องย้ายไฟล์ใดๆ

5. การกำหนดราคาแบบคาดการณ์ด้วย XGBoost

คุณต้องมีพื้นฐานที่เชื่อถือได้สำหรับมูลค่ายุติธรรมในตลาดของยานพาหนะเพื่อคำนวณว่ายานพาหนะนั้นเป็นดีลที่ดีอย่างแท้จริงหรือไม่ คุณสามารถฝึกโมเดล XGBoost ภายใน BigQuery ได้โดยตรงโดยใช้ SQL มาตรฐาน แทนที่จะดึงข้อมูลออกมาเป็นสคริปต์หรือ Notebook ในเครื่องเพื่อฝึกโมเดล การคาดการณ์ราคานี้ขับเคลื่อนตรรกะ📈 มูลค่ายุติธรรมในแอปพลิเคชันส่วนหน้า

  1. กลับไปที่แท็บ BigQuery Studio
  2. ก่อนอื่น ให้ดูชุดข้อมูลการฝึก synthetic_carsตารางนี้synthetic_carsมีข้อมูลการขายย้อนหลัง 100,000 รายการที่จะใช้ฝึกโมเดล ซึ่งแตกต่างจากข้อมูลยานพาหนะที่ใช้งานอยู่ เรียกใช้การค้นหานี้เพื่อดูข้อมูลอย่างรวดเร็ว
SELECT
  *
FROM
  `model_dev.synthetic_cars`
LIMIT 10;
  1. ตอนนี้ ให้เรียกใช้ SQL ต่อไปนี้เพื่อฝึกโมเดลการถดถอย XGBoost โมเดลนี้จะเรียนรู้วิธีที่แอตทริบิวต์ต่างๆ เช่น ระยะทาง ปี แบรนด์ และสภาพที่มองเห็นได้ ส่งผลต่อราคาจากบันทึกย้อนหลัง 100,000 รายการ
CREATE OR REPLACE MODEL `model_dev.car_price_model`
OPTIONS(
  MODEL_TYPE = 'BOOSTED_TREE_REGRESSOR',
  INPUT_LABEL_COLS = ['selling_price'],
  MAX_ITERATIONS = 15,
  TREE_METHOD = 'HIST'
) AS
SELECT
  * EXCEPT(vin, sale_date, market_value, seller)
FROM
  `model_dev.synthetic_cars`;
  1. ก่อนที่จะคาดการณ์ราคาสำหรับข้อมูลยานพาหนะที่ใช้งานจริงและกำลังดำเนินการอยู่ คุณต้องรวบรวมฟีเจอร์อินพุตที่เกี่ยวข้องทั้งหมดไว้ในที่เดียว เรียกใช้ SQL นี้เพื่อผสานข้อมูลเมตาของยานพาหนะที่มีโครงสร้างกับฟีเจอร์ที่ดึงมาจากวิชันซิสเต็มที่คุณเพิ่งสร้าง
CREATE OR REPLACE TABLE `model_dev.vehicle_prediction_features` AS
SELECT
  meta.auction_id,
  meta.model_year,
  meta.make,
  meta.model,
  meta.mileage,
  meta.transmission_type,
  meta.state,
  COALESCE(vision.body_style, 'Unknown') AS body_style,
  COALESCE(vision.condition, 50) AS condition,
  COALESCE(meta.color, vision.color, 'Unknown') AS color,
  COALESCE(vision.interior, 'Unknown') AS interior
FROM `model_dev.vehicle_metadata` meta
LEFT JOIN `model_dev.vehicle_vision_features` vision 
  ON meta.auction_id = vision.auction_id;
  1. สุดท้าย ให้คาดการณ์มูลค่ายุติธรรมในตลาดของข้อมูลยานพาหนะที่ลงอย่างต่อเนื่องทั้งหมด เรียกใช้การค้นหาต่อไปนี้เพื่อป้อนฟีเจอร์ที่รวบรวมไว้ลงในโมเดลที่ฝึกใหม่ และบันทึกเอาต์พุตตัวเลขลงในตารางการคาดการณ์ที่ปลอดภัย
CREATE OR REPLACE TABLE `model_dev.vehicle_price_predictions` AS
SELECT 
  auction_id,
  ROUND(predicted_selling_price, 2) AS predicted_market_value
FROM ML.PREDICT(
  MODEL `model_dev.car_price_model`,
  (SELECT * FROM `model_dev.vehicle_prediction_features`)
);
  1. ตอนนี้ให้ยืนยันเอาต์พุตของโมเดล เรียกใช้การค้นหาอย่างรวดเร็วนี้เพื่อดูตัวอย่างมูลค่าตลาดที่คาดการณ์ไว้สำหรับข้อมูลยานพาหนะที่แสดงแบบเรียลไทม์
SELECT * FROM `model_dev.vehicle_price_predictions` LIMIT 5;

การคาดการณ์ XGBoost

สรุปส่วน: คุณฝึกโมเดลการถดถอย XGBoost โดยใช้ธุรกรรมตัวอย่าง 100,000 รายการ และเรียกใช้การอนุมานแบบเป็นกลุ่มเพื่อคาดการณ์มูลค่ายุติธรรมของยานพาหนะที่ใช้งานอยู่ทุกรายการในชุดข้อมูล

6. การฝังเชิงความหมายและการตรวจหาความถูกต้อง

ในส่วนนี้ คุณจะเรียกใช้ไปป์ไลน์การฝัง 2 รายการที่แตกต่างกันเพื่อเปิดใช้ฟีเจอร์อัจฉริยะสำหรับตลาดกลางยานพาหนะ

  1. การค้นหารูปภาพแบบมัลติโมดัล: แปลงรูปภาพยานพาหนะดิบเป็นพื้นที่เวกเตอร์เพื่อให้ผู้ใช้ค้นหาโดยใช้ภาษาที่เป็นธรรมชาติได้ (เช่น "รถบรรทุกที่ใช้งานได้ดี")
  2. การฝังข้อความและการค้นหาความคล้ายกัน: แปลคำอธิบายยานพาหนะที่เขียนเป็นเวกเตอร์ฝังเพื่อเปรียบเทียบข้อมูลที่ใช้งานอยู่กับโปรไฟล์ผู้ที่อาจเป็นนักต้มตุ๋นหรือผู้ที่ชื่นชอบที่รู้จักโดยใช้ VECTOR_SEARCH ซึ่งจะคำนวณ 🔍 คะแนนความถูกต้องที่ผู้ซื้อเห็นในแอป
  1. ก่อนอื่น คุณต้องสร้างการฝังแบบมัลติโมดัลสำหรับข้อมูลยานพาหนะ gemini-embedding-2-preview โมเดลนี้ช่วยให้คุณป้อนทั้งรูปภาพและข้อความลงในการฝังเดียวกันได้ แม้ว่าโมเดลนี้จะประมวลผลหลายรูปแบบพร้อมกันได้อย่างเต็มที่ แต่ในกรณีนี้เราจะฝังเฉพาะรูปภาพยานพาหนะ ซึ่งขับเคลื่อนแถบ "การค้นหาเชิงความหมาย" สำหรับแอปพลิเคชันส่วนหน้า ทำให้ผู้ซื้อใช้ภาษาพูดตามธรรมชาติได้ (เช่น "รถกระบะที่เชื่อถือได้") และดึงข้อมูลที่ตรงกันได้อย่างรวดเร็ว เรียกใช้การค้นหานี้เพื่อสร้างเวกเตอร์หลายรูปแบบโดยใช้ AI.EMBED
CREATE OR REPLACE TABLE `model_dev.vehicle_images_embedded` AS
SELECT
  auction_id,
  AI.EMBED(
    STRUCT(image_ref),
    endpoint => 'gemini-embedding-2-preview').result AS multimodal_embedding
FROM `model_dev.vehicle_multimodal`
WHERE ARRAY_LENGTH(image_ref) > 0;
  1. จากนั้นคุณจะตรวจสอบข้อมูลโปรไฟล์ความเสี่ยงที่โหลดไว้ก่อนหน้านี้ โปรดทราบว่ารายการนี้มีทั้งรูปแบบการหลอกลวงที่ทราบและตัวอย่างรายการที่ถูกต้องของผู้ที่ชื่นชอบ เรียกใช้การค้นหานี้เพื่อดูโปรไฟล์พื้นฐาน
SELECT profile_id, profile_type, description
FROM `model_dev.seller_risk_profiles`;
  1. ตอนนี้คุณจะแปลคำอธิบายความเสี่ยงดิบเหล่านั้นเป็นเวกเตอร์ฝังได้แล้ว คุณสามารถใช้โมเดลการฝังข้อความเฉพาะทาง (text-embedding-005) เพื่อประเมินภาษาที่เขียนที่คุณเพิ่งแสดงตัวอย่างอย่างเคร่งครัด วาง SQL ต่อไปนี้ แล้วคลิกเรียกใช้เพื่อฝังโปรไฟล์พื้นฐาน
CREATE OR REPLACE TABLE `model_dev.seller_risk_profiles_embedded` AS
SELECT 
  profile_id, 
  description AS content, 
  profile_type, 
  AI.EMBED(description, endpoint => 'text-embedding-005').result AS text_embedding
FROM `model_dev.seller_risk_profiles`;
  1. จากนั้นสร้างการฝังที่เปรียบเทียบได้สำหรับสินค้าคงคลังที่เป็นยานพาหนะจริงที่พร้อมจำหน่าย เรียกใช้การค้นหานี้เพื่อแปลคำอธิบาย HTML ดิบสำหรับยานพาหนะแต่ละคันเป็นพื้นที่เวกเตอร์เพื่อให้เปรียบเทียบกับโปรไฟล์พื้นฐานได้
CREATE OR REPLACE TABLE `model_dev.vehicle_descriptions_embedded` AS
SELECT 
  auction_id,
  description AS content,
  AI.EMBED(description, endpoint => 'text-embedding-005').result AS text_embedding
FROM `model_dev.vehicle_metadata`
WHERE description IS NOT NULL;
  1. สุดท้าย ให้ดำเนินการค้นหาเวกเตอร์เพื่อคำนวณระยะทางเชิงความหมายระหว่างข้อมูลที่แสดงแบบเรียลไทม์กับโปรไฟล์พื้นฐาน เรียกใช้ SQL ต่อไปนี้เพื่อทำการแมป ระยะทางทางคณิตศาสตร์ที่ต่ำกว่าหมายความว่าข้อมูลมีความคล้ายคลึงกับกลุ่มการหลอกลวงที่ทราบกันดี ในขณะที่ระยะทางที่สูงกว่าบ่งบอกถึงคำอธิบายที่ถูกต้อง
CREATE OR REPLACE TABLE `model_dev.vehicle_authenticity_scores` AS
SELECT 
  scam_search.query.auction_id,
  CAST(
    GREATEST(0.0, LEAST(100.0, ROUND((MIN(scam_search.distance) - 0.33) / 0.12 * 100.0))) 
    AS INT64
  ) AS authenticity_score
FROM VECTOR_SEARCH(
  TABLE `model_dev.seller_risk_profiles_embedded`,
  'text_embedding',
  (
      SELECT text_embedding, auction_id 
      FROM `model_dev.vehicle_descriptions_embedded`
  ),
  top_k => 15,
  distance_type => 'COSINE'
) AS scam_search
WHERE scam_search.base.profile_type = 'scam'
GROUP BY 1;

เนื้อหาของตารางนี้อาจมีลักษณะดังนี้

การคาดการณ์คะแนนความจริงใจ

สรุปส่วน: คุณสร้างการฝังแบบหลายรูปแบบสำหรับแถบค้นหาฟรอนท์เอนด์ และใช้การค้นหาเวกเตอร์ภายใน BigQuery โดยตรงเพื่อประเมินข้อมูล HTML ดิบเทียบกับโปรไฟล์การหลอกลวงที่ทราบ

7. การให้คะแนนดีลแบบ Generative

ตอนนี้คุณมีชุดข้อมูลที่มีโครงสร้างซึ่งสร้างขึ้นผ่านเทคนิคแมชชีนเลิร์นนิงที่แตกต่างกันหลายอย่าง ซึ่งทั้งหมดนี้ได้รับการประสานงานภายใน BigQuery อย่างสมบูรณ์ ได้แก่ การแยกข้อมูลจากภาพ โมเดล XGBoost เพื่อคาดการณ์มูลค่ายุติธรรม และการฝังการค้นหาแบบเวกเตอร์

ขั้นตอนสุดท้ายคือการผสานสัญญาณ AI เหล่านี้เข้ากับมุมมองแบบรวมเป็นคะแนนดีลที่ชัดเจนสำหรับแอปพลิเคชันส่วนหน้า

  1. ก่อนอื่น ให้รวมข้อมูลเมตาดิบกับฟีเจอร์การมองเห็นที่ AI แยกออกมา เอาต์พุตการกำหนดราคาแบบคาดการณ์ และคะแนนความถูกต้องเชิงความหมาย เรียกใช้ SQL ต่อไปนี้
CREATE OR REPLACE TABLE `model_dev.vehicle_features_enhanced` AS
SELECT
  meta.auction_id,
  meta.item_name,
  meta.model_year,
  meta.make,
  meta.model,
  meta.mileage,
  meta.current_bid,
  meta.listing_url,
  meta.transmission_type,
  meta.description,
  meta.state,
  COALESCE(vision.body_style, 'Unknown') AS body_style,
  COALESCE(vision.condition, 50) AS condition,
  COALESCE(meta.color, vision.color, 'Unknown') AS color,
  COALESCE(vision.interior, 'Unknown') AS interior,
  COALESCE(scam.authenticity_score, 100) AS authenticity_score,
  vision.description_summary,
  prices.predicted_market_value
FROM `model_dev.vehicle_metadata` meta
LEFT JOIN `model_dev.vehicle_vision_features` vision 
  ON meta.auction_id = vision.auction_id
LEFT JOIN `model_dev.vehicle_price_predictions` prices
  ON meta.auction_id = prices.auction_id
LEFT JOIN `model_dev.vehicle_authenticity_scores` scam
  ON meta.auction_id = scam.auction_id;
  1. จากนั้นคำนวณคะแนนดีล 0-100 โดยรวมสัญญาณ AI ที่แตกต่างกัน 4 สัญญาณ สูตรนี้จะปรับสมดุลระหว่างมูลค่า คุณภาพ และความเสี่ยงเพื่อแสดงข้อมูลที่ดีที่สุด
    • คะแนนราคา (40%): วัดส่วนลดเทียบกับมูลค่ายุติธรรม
    • คะแนนวิสัยทัศน์ (30%): ข้อมูลเชิงลึกจากการวิเคราะห์รูปภาพก่อนหน้า
    • คะแนนความถูกต้อง (15%): การประเมินความเสี่ยงที่จะเกิดการหลอกลวง
    • คะแนนสภาพ (15%): อนุมานแบบเรียลไทม์จากรายละเอียดของผู้ขายผ่าน AI.SCORE
    เรียกใช้การค้นหาต่อไปนี้
CREATE OR REPLACE TABLE `model_dev.marketplace_listings` AS
WITH score_elements AS (
  SELECT 
    *,
    -- 1. SELLER DESCRIPTION SCORE (use AI.SCORE on seller description)
      AI.SCORE(
        FORMAT("Rate the vehicle condition (0-100) based ONLY on this text: '%s'", description)
    ) AS description_score,

    -- 2. PRICE SCORE
    -- Higher impact for underpricing, lower impact for overpricing.
    CAST(LEAST(100.0, GREATEST(0.0, 
      75.0 + (
        IF((predicted_market_value - current_bid) > 0, 
           ((predicted_market_value - current_bid) / NULLIF(predicted_market_value, 0)) * 250.0,
           ((predicted_market_value - current_bid) / NULLIF(predicted_market_value, 0)) * 40.0
        )
      )
    )) AS INT64) AS price_score
  FROM `model_dev.vehicle_features_enhanced`
),
final_calcs AS (
  SELECT 
    *,
    
    -- 3. Combine scores: Price (40%), Condition (30%), Description (15%), Authenticity (15%)
    ROUND(
      (
        (price_score * 0.40) + 
        (CAST(condition AS INT64) * 0.30) + 
        (COALESCE(description_score, 50) * 0.15) + 
        (CAST(authenticity_score AS INT64) * 0.15)
      )
      -- Authenticity penalty for scores below 50.
      * (IF(CAST(authenticity_score AS INT64) < 50, 0.20, 1.05)) 
    ) AS raw_score
  FROM score_elements
)
SELECT 
  * EXCEPT(raw_score),
  
  -- 4. Set floor values: low authenticity scores drop to 10; others floor at 35.
  CAST(GREATEST(
    (IF(CAST(authenticity_score AS INT64) < 50, 10, 35)), 
    LEAST(100, raw_score)
  ) AS INT64) AS deal_score
FROM final_calcs;

คําค้นหาจะใช้ตรรกะ 2 เลเยอร์ที่เฉพาะเจาะจงเพื่อให้คําแนะนํามีคุณภาพสูง ดังนี้

  1. การกำหนดเกณฑ์ความถูกต้อง: หากระบบแจ้งว่าข้อมูล "มีความเสี่ยงสูง" (คะแนนต่ำกว่า 50) ระบบจะลดคะแนนดีลทั้งหมดลง 80% โดยอัตโนมัติเพื่อป้องกันไม่ให้มีการโปรโมตข้อมูลที่น่าสงสัย
  2. การเพิ่มประสิทธิภาพ"อัญมณีที่ซ่อนอยู่": สูตรนี้ใช้ตรรกะแบบเป็นช่วงเพื่อให้รางวัลส่วนลดอย่างจริงจังในขณะที่ผ่อนปรนเรื่องการมาร์กอัปมากขึ้น เพื่อให้มั่นใจว่ารถยนต์ที่มีราคาสูงเกินไปแต่มีสภาพสมบูรณ์ยังคงได้รับการจัดอันดับเป็น "ยุติธรรม"

ตารางผลลัพธ์ model_dev.marketplace_listings จะมีฟิลด์ต่างๆ เช่น deal_score พร้อมกับ price_score และ authenticity_score

  1. หากต้องการดูคะแนนดีลด้วยตนเอง ให้เรียกใช้การค้นหาต่อไปนี้ หรือดูภาพหน้าจอด้านล่าง
SELECT item_name, model_year, authenticity_score, predicted_market_value, price_score, deal_score FROM `model_dev.marketplace_listings`

คะแนนดีลที่สร้างขึ้น

สรุปส่วน: คุณได้รวมการกำหนดราคาแบบคาดการณ์ ฟีเจอร์ภาพ และคะแนนความถูกต้องเข้ากับคำอธิบายของผู้ขายเพื่อคำนวณคะแนนดีลเดียวสำหรับข้อมูลแต่ละรายการ

8. ทำให้แอปพลิเคชันส่วนหน้าใช้งานได้

ตอนนี้ได้เวลาสร้างแอปพลิเคชันส่วนหน้าแล้ว ซึ่งจะช่วยให้คุณค้นหาสินค้าคงคลังของข้อมูลยานพาหนะและโต้ตอบกับข้อมูลเชิงลึกที่ AI สร้างขึ้นซึ่งคุณเพิ่งสร้างได้ เช่น คะแนนดีล

ส่งออกคะแนน AI ไปยังส่วนหน้า

ส่วนหน้าของ React อาศัยเพย์โหลด JSON ในเครื่องเพื่อให้หน้าเว็บโหลดเริ่มต้นได้อย่างรวดเร็ว หากต้องการขับเคลื่อนมาร์เก็ตเพลส ให้ดึงคะแนนข้อตกลงแบบ Generative สุดท้ายจาก BigQuery แล้วแทรกลงในโปรเจ็กต์ Next.js อีกครั้ง

  1. ตรวจสอบว่าสภาพแวดล้อมพร้อมใช้งาน หากเซสชัน Cloud Shell หมดเวลาหรือคุณไปยังโฟลเดอร์อื่น ให้เรียกใช้คำสั่งต่อไปนี้เพื่อกลับไปยังรูทของโปรเจ็กต์และกู้คืนตัวแปรสภาพแวดล้อม
cd ~/devrel-demos/data-analytics/cymbal-autos-multimodal && \
export PROJECT_ID=$(gcloud config get-value project) && \
export USER_BUCKET="cymbal-autos-${PROJECT_ID}"
  1. เรียกใช้สคริปต์ Python ที่ระบุเพื่อค้นหามุมมอง BigQuery สุดท้ายและผสานคะแนนดีลใหม่ลงในที่เก็บข้อมูลพื้นฐานของแอปพลิเคชัน
python3 scripts/setup/08_export_frontend_data.py

คุณจะได้รับข้อความยืนยัน เช่น

💾 Updated local file: app/src/data/cars.json

ติดตั้งใช้งานแอปพลิเคชันไปยัง Cloud Run

เมื่อเพิ่มข้อมูลเรียบร้อยแล้ว คุณจะทำให้แอปพลิเคชันส่วนหน้า Next.js ใช้งานได้ในอินเทอร์เน็ตสาธารณะโดยใช้ Cloud Run โดยมีอินเทอร์เฟซที่ทันสมัยพร้อมการจัดอันดับดีล แถบเลื่อนรูปภาพแบบอินเทอร์แอกทีฟ และแถบค้นหาเชิงความหมายแบบไฮบริดแบบไดนามิกที่ค้นหา BigQuery แบบเรียลไทม์

  1. ใน Cloud Shell ให้ไปที่ไดเรกทอรี app/ ของที่เก็บที่โคลน ขั้นตอนนี้สำคัญมาก การอยู่ในไดเรกทอรีรากจะทำให้บิลด์ล้มเหลว
cd app
  1. ติดตั้งใช้งานแอปพลิเคชันเป็นคอนเทนเนอร์แบบไร้เซิร์ฟเวอร์โดยใช้ Cloud Run คำสั่งจะส่ง PROJECT_ID เป็นตัวแปรสภาพแวดล้อมเพื่อให้ Next.js API ทราบว่าควรค้นหาโปรเจ็กต์ BigQuery ใด
gcloud run deploy cymbal-autos-frontend \
  --source . \
  --region us-west1 \
  --allow-unauthenticated \
  --min-instances 1 \
  --set-env-vars PROJECT_ID=$PROJECT_ID \
  --project $PROJECT_ID
  1. เมื่อการติดตั้งใช้งานเสร็จสมบูรณ์ เทอร์มินัลจะแสดง URL ของบริการที่ปลอดภัย โดยจะมีลักษณะคล้ายกับตัวอย่างต่อไปนี้
Service URL: https://cymbal-autos-frontend-[YOUR-PROJECT-NUMBER].us-west1.run.app/

9. สำรวจแอปพลิเคชัน Cymbal Autos

เมื่อพุชคอนเทนเนอร์ส่วนหน้าไปยัง Cloud Run แล้ว ก็ถึงเวลาทดสอบแอป

  1. ไปที่เว็บไซต์: เปิด URL บริการที่ปลอดภัยซึ่ง Cloud Run แสดงผล

หน้าแรกของ Cymbal Autos

  1. ทำการค้นหาเชิงความหมาย: ลองค้นหาแนวคิดเชิงนามธรรม เช่น "รถบรรทุกที่ใช้งานได้จริงซึ่งบรรทุกของและขับแบบออฟโรดได้" แอป Next.js จะแปลข้อความดิบเป็นเวกเตอร์ฝังแบบมัลติโมดัลและเรียกใช้ VECTOR_SEARCH แบบเรียลไทม์กับ BigQuery เพื่อจับคู่แนวคิดของคุณกับระบบนิเวศของยานพาหนะ

แถบค้นหาของ Cymbal Autos

หมายเหตุ: ระบบจะจัดเรียงข้อมูลตามความคล้ายกันเชิงความหมาย

  1. ตรวจสอบผลลัพธ์: BigQuery คำนวณระยะทางทางคณิตศาสตร์ที่แน่นอนระหว่างแนวคิดเชิงนามธรรมกับฟีเจอร์ของยานพาหนะเพื่อแสดงผลลัพธ์ที่ตรงกันเชิงความหมายมากที่สุด

ผลการค้นหาของ Cymbal Autos

  1. ดูรายละเอียด: คลิกยานพาหนะเพื่อเปิดโปรไฟล์ข้อมูลทั้งหมด
  2. ตรวจสอบสัญญาณ AI: เลื่อนดูรายละเอียดเพื่อดูคะแนนแมชชีนเลิร์นนิงดิบที่คุณสร้างไว้ก่อนหน้านี้ใน Lab
    • 📈 มูลค่ายุติธรรม: ราคาพื้นฐานที่โมเดล XGBoost คาดการณ์
    • ✨ สภาพภาพ: การจัดประเภทความเสียหายทางกายภาพที่โมเดล Gemini ดึงออกมา
    • 🔍 คะแนนความถูกต้อง: เมตริกเวกเตอร์ความถูกต้องจะแยกผู้ขายที่ถูกต้องตามกฎหมายออกจากผู้ที่อาจเป็นสแกมเมอร์

คะแนนการจัดอันดับข้อมูลอัตโนมัติของ Cymbal

10. ล้างข้อมูล

หากต้องการหลีกเลี่ยงการเรียกเก็บเงินอย่างต่อเนื่องในบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ใน Codelab นี้ คุณสามารถลบทั้งโปรเจ็กต์ที่อยู่ในระบบคลาวด์ของ Google ที่สร้างขึ้นสำหรับ Codelab นี้ หรือเรียกใช้สคริปต์การลบอัตโนมัติต่อไปนี้

  1. จากเทอร์มินัล Cloud Shell ให้กลับไปที่ไดเรกทอรีรูทที่มี
cd ..
  1. เรียกใช้สคริปต์ล้างข้อมูลด้านล่าง ซึ่งจะเป็นการล้างข้อมูลใน Bucket ของ Google Cloud Storage, ทิ้งmodel_devชุดข้อมูล BigQuery, ลบการเชื่อมต่อ BigQuery และลบบริการ Cloud Run
chmod +x scripts/cleanup/teardown.sh
./scripts/cleanup/teardown.sh

11. ขอแสดงความยินดี

ยินดีด้วย คุณสร้างมาร์เก็ตเพลสยานพาหนะอัจฉริยะเรียบร้อยแล้ว คุณใช้ BigQuery เพื่อรวมการวิเคราะห์ข้อมูลที่ไม่มีโครงสร้าง การสร้างโมเดลเชิงคาดการณ์ และการผสานรวม AI ไว้ในพื้นที่ทํางานเดียว

สิ่งที่คุณได้เรียนรู้

  • วิธีเชื่อมต่อ BigQuery กับรูปภาพที่ไม่มีโครงสร้างใน Cloud Storage โดยใช้ ObjectRef
  • วิธีแยกแอตทริบิวต์ของยานพาหนะจากรูปภาพโดยใช้ BigQuery กับโมเดล Gemini เช่น ฟังก์ชัน AI.GENERATE และ AI.CLASSIFY
  • วิธีคาดการณ์ราคายานพาหนะโดยใช้ BigQuery ML
  • วิธีระบุข้อมูลที่น่าสงสัยด้วยการฝังคำอธิบายยานพาหนะและดำเนินการVECTOR_SEARCH
  • วิธีใช้ AI.SCORE เพื่อประเมินข้อมูลที่ไม่มีโครงสร้างได้ทันทีและรวมผลลัพธ์ไว้ในคะแนนดีลที่ครอบคลุม
  • วิธีส่งออกข้อมูลและติดตั้งใช้งานแอปพลิเคชันมาร์เก็ตเพลส Next.js ใน Cloud Run

ขั้นตอนถัดไป