1. บทนำ
ใน Codelab นี้ คุณจะได้สร้างแบ็กเอนด์และติดตั้งใช้งานฟรอนท์เอนด์สำหรับ "Cymbal Autos" ซึ่งเป็นมาร์เก็ตเพลสยานพาหนะออนไลน์ คุณจะใช้ BigQuery และโมเดล Gemini ในแพลตฟอร์มเอเจนต์ Gemini Enterprise เพื่อตรวจสอบรูปภาพยานพาหนะ คาดการณ์ราคาโดยใช้ BigQuery ML ตรวจหาข้อมูลที่น่าสงสัยโดยใช้การฝังเวกเตอร์ และคำนวณคะแนนข้อตกลงแบบผสม สุดท้าย คุณจะแสดงข้อมูลเชิงลึกเหล่านี้ในส่วนหน้าของ 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
- ในคอนโซล Google Cloud ในหน้าตัวเลือกโปรเจ็กต์ ให้เลือกหรือสร้างโปรเจ็กต์ Google Cloud
- ตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์ที่อยู่ในระบบคลาวด์แล้ว ดูวิธีตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินในโปรเจ็กต์แล้วหรือไม่
เริ่มต้น Cloud Shell
คุณจะใช้ Google Cloud Shell เพื่อดาวน์โหลดโค้ด เรียกใช้สคริปต์การตั้งค่า และทำให้แอปพลิเคชันใช้งานได้
- คลิกเปิดใช้งาน Cloud Shell ที่ด้านบนของ คอนโซล Google Cloud

- เมื่อเชื่อมต่อกับ Cloud Shell แล้ว ให้ตรวจสอบสิทธิ์เซสชันเพื่อให้แน่ใจว่าแอปพลิเคชันของคุณเข้าถึง Google Cloud APIs ได้ ทำตามข้อความแจ้งเพื่อให้สิทธิ์ Cloud Shell
gcloud auth application-default login
- ตั้งค่ารหัสโปรเจ็กต์ 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. รับรหัสและข้อมูลการตั้งค่า
ก่อนอื่น ให้ดาวน์โหลดชิ้นงานเดโมและกำหนดค่าตัวแปรสภาพแวดล้อม
- จาก Cloud Shell ให้โคลนที่เก็บ
devrel-demosแล้วไปที่ไดเรกทอรีโปรเจ็กต์
git clone https://github.com/GoogleCloudPlatform/devrel-demos.git
cd devrel-demos/data-analytics/cymbal-autos-multimodal
- เรียกใช้สคริปต์เพื่อคัดลอกข้อมูลลงในสภาพแวดล้อม สคริปต์นี้จะซิงค์ชุดข้อมูลที่เก็บในเครื่องกับ Bucket ของ Cloud Storage ส่วนตัว และดึงรูปภาพยานพาหนะจาก Bucket สาธารณะ
chmod +x scripts/setup/*.sh
./scripts/setup/00_copy_data.sh
หลังจากนั้น คุณควรเห็นข้อความที่คล้ายกับข้อความต่อไปนี้
Average throughput: 87.8MiB/s Data copy complete!
- จากนั้นตั้งค่าการเชื่อมต่อทรัพยากรระบบคลาวด์ 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.
- สุดท้าย ให้สร้างชุดข้อมูล BigQuery เริ่มต้นและโหลดข้อมูลตารางดิบ ซึ่งจะสร้างชุดข้อมูล
model_devและป้อนข้อมูลลงในตารางเริ่มต้น เพื่อวางรากฐานก่อนที่คุณจะเขียนคําค้นหาแมชชีนเลิร์นนิง
./scripts/setup/02_load_to_bq.sh
คุณควรเห็นข้อความที่คล้ายกับข้อความต่อไปนี้
================================================================= BigQuery load complete! =================================================================
4. การดึงข้อมูลจากวิชันซิสเต็มหลายโมดัล
ก่อนให้คะแนนข้อมูลยานพาหนะ คุณจะต้องดึงข้อมูลที่มีโครงสร้าง (เช่น สี รูปแบบตัวถัง หรือความเสียหายที่มองเห็นได้) จากรูปภาพดิบหลายร้อยรูป การแตะฟังก์ชัน ObjectRef และโมเดล Gemini ที่โฮสต์ใน Agent Platform จะช่วยให้คุณสร้างฟีเจอร์เหล่านี้ได้โดยไม่ต้องย้ายไฟล์หรือเขียนไปป์ไลน์ข้อมูลที่ซับซ้อน การแยกข้อมูลนี้จะขับเคลื่อนป้าย✨ เงื่อนไขภาพในแอปพลิเคชันส่วนหน้าโดยตรง
- เปิด BigQuery Studio ในแท็บเบราว์เซอร์ใหม่
- คลิกปุ่ม + เขียนคำค้นหาใหม่ คุณจะใช้ SQL Editor เพื่อโต้ตอบกับโค้ด SQL ตลอด Codelab นี้
- ก่อนสร้างโปรแกรมแยกข้อมูลแมชชีนเลิร์นนิง คุณสามารถดูรูปภาพดิบอย่างรวดเร็วได้ เรียกใช้การค้นหาต่อไปนี้เพื่อดูอาร์เรย์ของ URI รูปภาพที่จัดเก็บไว้ใน Google Cloud Storage สำหรับข้อมูลแต่ละรายการ
SELECT auction_id, item_name, description, images
FROM `model_dev.vehicle_metadata` LIMIT 5;
- ตอนนี้ในตัวแก้ไข 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`;
- ดู
image_refคอลัมน์ ObjectRef ใหม่ที่คุณเพิ่งสร้าง ตอนนี้ตารางใหม่มีคอลัมน์ ObjectRef ที่มีสิทธิ์ในการดำเนินการกับรูปภาพเอง เรียกใช้การค้นหาต่อไปนี้เพื่อดู
SELECT auction_id, item_name, description, image_ref
FROM `model_dev.vehicle_multimodal` LIMIT 5;
- ตอนนี้คุณจะใช้
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;
- หากต้องการดูฟีเจอร์ที่สร้างขึ้นด้วยตนเอง ให้เรียกใช้การค้นหาต่อไปนี้ หรือดูภาพหน้าจอด้านล่าง
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 ในเครื่องเพื่อฝึกโมเดล การคาดการณ์ราคานี้ขับเคลื่อนตรรกะ📈 มูลค่ายุติธรรมในแอปพลิเคชันส่วนหน้า
- กลับไปที่แท็บ BigQuery Studio
- ก่อนอื่น ให้ดูชุดข้อมูลการฝึก
synthetic_carsตารางนี้synthetic_carsมีข้อมูลการขายย้อนหลัง 100,000 รายการที่จะใช้ฝึกโมเดล ซึ่งแตกต่างจากข้อมูลยานพาหนะที่ใช้งานอยู่ เรียกใช้การค้นหานี้เพื่อดูข้อมูลอย่างรวดเร็ว
SELECT
*
FROM
`model_dev.synthetic_cars`
LIMIT 10;
- ตอนนี้ ให้เรียกใช้ 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`;
- ก่อนที่จะคาดการณ์ราคาสำหรับข้อมูลยานพาหนะที่ใช้งานจริงและกำลังดำเนินการอยู่ คุณต้องรวบรวมฟีเจอร์อินพุตที่เกี่ยวข้องทั้งหมดไว้ในที่เดียว เรียกใช้ 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;
- สุดท้าย ให้คาดการณ์มูลค่ายุติธรรมในตลาดของข้อมูลยานพาหนะที่ลงอย่างต่อเนื่องทั้งหมด เรียกใช้การค้นหาต่อไปนี้เพื่อป้อนฟีเจอร์ที่รวบรวมไว้ลงในโมเดลที่ฝึกใหม่ และบันทึกเอาต์พุตตัวเลขลงในตารางการคาดการณ์ที่ปลอดภัย
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`)
);
- ตอนนี้ให้ยืนยันเอาต์พุตของโมเดล เรียกใช้การค้นหาอย่างรวดเร็วนี้เพื่อดูตัวอย่างมูลค่าตลาดที่คาดการณ์ไว้สำหรับข้อมูลยานพาหนะที่แสดงแบบเรียลไทม์
SELECT * FROM `model_dev.vehicle_price_predictions` LIMIT 5;

สรุปส่วน: คุณฝึกโมเดลการถดถอย XGBoost โดยใช้ธุรกรรมตัวอย่าง 100,000 รายการ และเรียกใช้การอนุมานแบบเป็นกลุ่มเพื่อคาดการณ์มูลค่ายุติธรรมของยานพาหนะที่ใช้งานอยู่ทุกรายการในชุดข้อมูล
6. การฝังเชิงความหมายและการตรวจหาความถูกต้อง
ในส่วนนี้ คุณจะเรียกใช้ไปป์ไลน์การฝัง 2 รายการที่แตกต่างกันเพื่อเปิดใช้ฟีเจอร์อัจฉริยะสำหรับตลาดกลางยานพาหนะ
- การค้นหารูปภาพแบบมัลติโมดัล: แปลงรูปภาพยานพาหนะดิบเป็นพื้นที่เวกเตอร์เพื่อให้ผู้ใช้ค้นหาโดยใช้ภาษาที่เป็นธรรมชาติได้ (เช่น "รถบรรทุกที่ใช้งานได้ดี")
- การฝังข้อความและการค้นหาความคล้ายกัน: แปลคำอธิบายยานพาหนะที่เขียนเป็นเวกเตอร์ฝังเพื่อเปรียบเทียบข้อมูลที่ใช้งานอยู่กับโปรไฟล์ผู้ที่อาจเป็นนักต้มตุ๋นหรือผู้ที่ชื่นชอบที่รู้จักโดยใช้
VECTOR_SEARCHซึ่งจะคำนวณ 🔍 คะแนนความถูกต้องที่ผู้ซื้อเห็นในแอป
- ก่อนอื่น คุณต้องสร้างการฝังแบบมัลติโมดัลสำหรับข้อมูลยานพาหนะ
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;
- จากนั้นคุณจะตรวจสอบข้อมูลโปรไฟล์ความเสี่ยงที่โหลดไว้ก่อนหน้านี้ โปรดทราบว่ารายการนี้มีทั้งรูปแบบการหลอกลวงที่ทราบและตัวอย่างรายการที่ถูกต้องของผู้ที่ชื่นชอบ เรียกใช้การค้นหานี้เพื่อดูโปรไฟล์พื้นฐาน
SELECT profile_id, profile_type, description
FROM `model_dev.seller_risk_profiles`;
- ตอนนี้คุณจะแปลคำอธิบายความเสี่ยงดิบเหล่านั้นเป็นเวกเตอร์ฝังได้แล้ว คุณสามารถใช้โมเดลการฝังข้อความเฉพาะทาง (
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`;
- จากนั้นสร้างการฝังที่เปรียบเทียบได้สำหรับสินค้าคงคลังที่เป็นยานพาหนะจริงที่พร้อมจำหน่าย เรียกใช้การค้นหานี้เพื่อแปลคำอธิบาย 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;
- สุดท้าย ให้ดำเนินการค้นหาเวกเตอร์เพื่อคำนวณระยะทางเชิงความหมายระหว่างข้อมูลที่แสดงแบบเรียลไทม์กับโปรไฟล์พื้นฐาน เรียกใช้ 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 เหล่านี้เข้ากับมุมมองแบบรวมเป็นคะแนนดีลที่ชัดเจนสำหรับแอปพลิเคชันส่วนหน้า
- ก่อนอื่น ให้รวมข้อมูลเมตาดิบกับฟีเจอร์การมองเห็นที่ 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;
- จากนั้นคำนวณคะแนนดีล 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 เลเยอร์ที่เฉพาะเจาะจงเพื่อให้คําแนะนํามีคุณภาพสูง ดังนี้
- การกำหนดเกณฑ์ความถูกต้อง: หากระบบแจ้งว่าข้อมูล "มีความเสี่ยงสูง" (คะแนนต่ำกว่า 50) ระบบจะลดคะแนนดีลทั้งหมดลง 80% โดยอัตโนมัติเพื่อป้องกันไม่ให้มีการโปรโมตข้อมูลที่น่าสงสัย
- การเพิ่มประสิทธิภาพ"อัญมณีที่ซ่อนอยู่": สูตรนี้ใช้ตรรกะแบบเป็นช่วงเพื่อให้รางวัลส่วนลดอย่างจริงจังในขณะที่ผ่อนปรนเรื่องการมาร์กอัปมากขึ้น เพื่อให้มั่นใจว่ารถยนต์ที่มีราคาสูงเกินไปแต่มีสภาพสมบูรณ์ยังคงได้รับการจัดอันดับเป็น "ยุติธรรม"
ตารางผลลัพธ์ model_dev.marketplace_listings จะมีฟิลด์ต่างๆ เช่น deal_score พร้อมกับ price_score และ authenticity_score
- หากต้องการดูคะแนนดีลด้วยตนเอง ให้เรียกใช้การค้นหาต่อไปนี้ หรือดูภาพหน้าจอด้านล่าง
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 อีกครั้ง
- ตรวจสอบว่าสภาพแวดล้อมพร้อมใช้งาน หากเซสชัน 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}"
- เรียกใช้สคริปต์ 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 แบบเรียลไทม์
- ใน Cloud Shell ให้ไปที่ไดเรกทอรี
app/ของที่เก็บที่โคลน ขั้นตอนนี้สำคัญมาก การอยู่ในไดเรกทอรีรากจะทำให้บิลด์ล้มเหลว
cd app
- ติดตั้งใช้งานแอปพลิเคชันเป็นคอนเทนเนอร์แบบไร้เซิร์ฟเวอร์โดยใช้ 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
- เมื่อการติดตั้งใช้งานเสร็จสมบูรณ์ เทอร์มินัลจะแสดง URL ของบริการที่ปลอดภัย โดยจะมีลักษณะคล้ายกับตัวอย่างต่อไปนี้
Service URL: https://cymbal-autos-frontend-[YOUR-PROJECT-NUMBER].us-west1.run.app/
9. สำรวจแอปพลิเคชัน Cymbal Autos
เมื่อพุชคอนเทนเนอร์ส่วนหน้าไปยัง Cloud Run แล้ว ก็ถึงเวลาทดสอบแอป
- ไปที่เว็บไซต์: เปิด URL บริการที่ปลอดภัยซึ่ง Cloud Run แสดงผล

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

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

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

10. ล้างข้อมูล
หากต้องการหลีกเลี่ยงการเรียกเก็บเงินอย่างต่อเนื่องในบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ใน Codelab นี้ คุณสามารถลบทั้งโปรเจ็กต์ที่อยู่ในระบบคลาวด์ของ Google ที่สร้างขึ้นสำหรับ Codelab นี้ หรือเรียกใช้สคริปต์การลบอัตโนมัติต่อไปนี้
- จากเทอร์มินัล Cloud Shell ให้กลับไปที่ไดเรกทอรีรูทที่มี
cd ..
- เรียกใช้สคริปต์ล้างข้อมูลด้านล่าง ซึ่งจะเป็นการล้างข้อมูลใน 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
ขั้นตอนถัดไป
- ดูฟังก์ชัน Generative AI ทั้งหมดที่มีใน BigQuery
- ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างโมเดลการคาดการณ์ด้วย GoogleSQL