Xây dựng một trang web thương mại về xe dựa trên AI bằng BigQuery và các mô hình Gemini

1. Giới thiệu

Trong lớp học lập trình này, bạn sẽ tạo phần phụ trợ và triển khai phần giao diện người dùng cho "Cymbal Autos", một trang web thương mại trực tuyến về xe. Bạn sẽ sử dụng BigQuerycác mô hình Gemini trên Nền tảng tác nhân Gemini Enterprise để kiểm tra ảnh xe, dự đoán giá bằng BigQuery ML, phát hiện các trang thông tin lừa đảo bằng cách sử dụng vectơ nhúng và tính điểm thoả thuận tổng hợp. Cuối cùng, bạn sẽ hiển thị những thông tin chi tiết này trên một giao diện người dùng Next.js được triển khai cho Cloud Run.

Sơ đồ kiến trúc cho thấy BigQuery giao tiếp với Nền tảng tác nhân và phân phát giao diện người dùng Next.js Cloud Run

Bạn sẽ thực hiện

  • Kết nối BigQuery với hình ảnh không có cấu trúc trên Cloud Storage bằng ObjectRef
  • Trích xuất thuộc tính của xe từ ảnh bằng BigQuery với các mô hình Gemini
  • Dự đoán giá thị trường hợp lý bằng cách huấn luyện mô hình hồi quy XGBoost bằng BigQuery ML
  • Xác định trang thông tin lừa đảo tiềm ẩn và trang thông tin đáng tin cậy bằng cách nhúng nội dung mô tả xe và thực hiện VECTOR_SEARCH
  • Tính Điểm ưu đãi toàn diện cho từng trang thông tin, đồng thời kết hợp các tín hiệu về tình trạng trong nội dung mô tả của người bán bằng cách sử dụng AI.SCORE
  • Xuất dữ liệu và triển khai ứng dụng Next.js marketplace lên Google Cloud Run

Bạn cần có

  • Một trình duyệt web như Chrome
  • Một dự án trên Google Cloud đã bật tính năng thanh toán
  • Hiểu biết cơ bản về SQL, Python và Google Cloud
  • Có đủ quyền IAM để bật API, tạo tài nguyên và chỉ định quyền (ví dụ: Chủ sở hữu dự án)

Lớp học lập trình này dành cho nhà phát triển có trình độ trung cấp.

Các tài nguyên được tạo trong lớp học lập trình này sẽ có chi phí dưới 5 USD.

2. Trước khi bắt đầu

Tạo một dự án trên Google Cloud

  1. Trong Google Cloud Console, trên trang chọn dự án, hãy chọn hoặc tạo một dự án trên Google Cloud.
  2. Đảm bảo rằng bạn đã bật tính năng thanh toán cho dự án trên Cloud. Tìm hiểu cách kiểm tra xem tính năng thanh toán có được bật trên một dự án hay không.

Khởi động Cloud Shell

Bạn sẽ sử dụng Google Cloud Shell để tải mã xuống, chạy tập lệnh thiết lập và triển khai ứng dụng.

  1. Nhấp vào Kích hoạt Cloud Shell ở đầu Google Cloud Console.

Mở Cloud Shell

  1. Sau khi kết nối với Cloud Shell, hãy xác thực phiên của bạn để đảm bảo ứng dụng có thể truy cập vào các Cloud APIs của Google. Làm theo lời nhắc để uỷ quyền cho Cloud Shell:
gcloud auth application-default login
  1. Đặt mã dự án Google Cloud và tên riêng biệt cho bộ chứa Google Cloud Storage (nơi bạn sẽ lưu trữ dữ liệu thô):
export PROJECT_ID=$(gcloud config get-value project)
export USER_BUCKET="cymbal-autos-${PROJECT_ID}"

gcloud config set project $PROJECT_ID

Bạn sẽ thấy một thông báo tương tự như thông báo bên dưới:

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

Bật API

Chạy lệnh này trong Cloud Shell để bật tất cả các API cần thiết cho lớp học lập trình này:

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

Khi thực thi thành công, bạn sẽ thấy một thông báo tương tự như thông báo dưới đây:

Operation "operations/..." finished successfully.

3. Lấy mã và thiết lập dữ liệu

Trước tiên, hãy tải tài sản minh hoạ xuống và định cấu hình các biến môi trường.

  1. Trong Cloud Shell, hãy sao chép kho lưu trữ devrel-demos và chuyển đến thư mục dự án:
git clone https://github.com/GoogleCloudPlatform/devrel-demos.git
cd devrel-demos/data-analytics/cymbal-autos-multimodal
  1. Chạy tập lệnh để sao chép dữ liệu vào môi trường của bạn. Tập lệnh này đồng bộ hoá các tập dữ liệu trong kho lưu trữ cục bộ với bộ chứa Cloud Storage cá nhân của bạn và tìm nạp hình ảnh xe từ một bộ chứa công khai:
chmod +x scripts/setup/*.sh
./scripts/setup/00_copy_data.sh

Sau đó, bạn sẽ thấy một thông báo tương tự như:

Average throughput: 87.8MiB/s
Data copy complete!
  1. Tiếp theo, hãy thiết lập BigQuery Cloud Resource Connection. Để phân tích hình ảnh không có cấu trúc trong Cloud Storage và gọi các mô hình Nền tảng tác nhân ngay từ các truy vấn SQL, BigQuery phải uỷ quyền IAM cho một Tài khoản dịch vụ cơ bản. Tập lệnh này tạo kết nối an toàn đó và cấp cho kết nối này các vai trò cần thiết là Người dùng Vertex AI và Người tiêu dùng sử dụng dịch vụ (mất khoảng một phút để truyền tải):
./scripts/setup/01_setup_api_connection.sh

Bạn sẽ thấy một thông báo tương tự như sau:

Environment setup complete! Your BigQuery connection is ready.
  1. Cuối cùng, hãy tạo tập dữ liệu BigQuery ban đầu và tải dữ liệu dạng bảng thô. Thao tác này sẽ tạo tập dữ liệu model_dev và điền sẵn các bảng bắt đầu, thiết lập nền tảng trước khi bạn viết bất kỳ truy vấn học máy nào:
./scripts/setup/02_load_to_bq.sh

Bạn sẽ thấy một thông báo tương tự như sau:

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

4. Trích xuất thông tin từ hình ảnh đa phương thức

Trước khi chấm điểm trang thông tin về xe, bạn sẽ trích xuất dữ liệu có cấu trúc (chẳng hạn như màu sắc, kiểu thân xe hoặc hư hỏng về hình ảnh) từ hàng trăm bức ảnh thô. Bằng cách khai thác các hàm ObjectRef và mô hình Gemini được lưu trữ trong Agent Platform, bạn có thể tạo các tính năng này mà không cần di chuyển bất kỳ tệp nào hoặc viết các quy trình dữ liệu phức tạp. Quy trình trích xuất này trực tiếp hỗ trợ huy hiệu ✨ Điều kiện về hình ảnh trên ứng dụng giao diện người dùng.

  1. Mở BigQuery Studio trong một thẻ trình duyệt mới.
  2. Nhấp vào nút + Soạn truy vấn mới. Bạn sẽ dùng Trình chỉnh sửa SQL để tương tác với mã SQL trong suốt lớp học lập trình này.
  3. Trước khi tạo các trình trích xuất học máy, bạn có thể xem nhanh hình ảnh thô. Chạy truy vấn sau để xem mảng URI hình ảnh được lưu trữ trong Google Cloud Storage cho từng trang thông tin:
SELECT auction_id, item_name, description, images 
FROM `model_dev.vehicle_metadata` LIMIT 5;
  1. Giờ đây, trong Trình chỉnh sửa SQL của BigQuery Studio, hãy dán SQL sau đây để tạo một bảng mới có cột image_ref. Nhấp vào Chạy.
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. Hãy xem cột image_ref ObjectRef mới mà bạn vừa tạo. Bảng mới hiện có một cột ObjectRef có quyền thực thi trên chính các hình ảnh. Chạy truy vấn sau để xem:
SELECT auction_id, item_name, description, image_ref 
FROM `model_dev.vehicle_multimodal` LIMIT 5;
  1. Bây giờ, bạn sẽ dùng AI.GENERATEAI.CLASSIFY để phân tích hình ảnh. AI.GENERATE trích xuất điểm số về tình trạng và bản tóm tắt thiệt hại bằng một câu bằng cách nhắc Gemini, trong khi AI.CLASSIFY phân loại nghiêm ngặt kiểu thân xe và màu sắc của xe.

Thực thi truy vấn sau để trích xuất những thông tin chi tiết này vào một bảng đối tượng chuyên biệt. Bạn sẽ mất khoảng 3 phút để hoàn tất.

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. Để tự xem các đối tượng được tạo, hãy chạy truy vấn sau hoặc chỉ cần xem ảnh chụp màn hình bên dưới:
SELECT auction_id, condition, description_summary, body_style, color, interior FROM `model_dev.vehicle_vision_features` LIMIT 5;

Trích xuất đa phương thức

Tóm tắt phần: Bạn đã truy cập trực tiếp vào hình ảnh thô từ BigQuery và sử dụng các mô hình Gemini để trích xuất các đặc điểm trực quan có cấu trúc mà không cần di chuyển bất kỳ tệp nào.

5. Định giá dự đoán bằng XGBoost

Để tính toán xem một chiếc xe có phải là một giao dịch thực sự tốt hay không, bạn cần có một đường cơ sở đáng tin cậy cho giá trị thị trường hợp lý của chiếc xe đó. Thay vì kéo dữ liệu ra các tập lệnh hoặc sổ tay cục bộ để huấn luyện một mô hình, bạn có thể huấn luyện mô hình XGBoost ngay trong BigQuery bằng SQL chuẩn. Mức giá dự đoán này thúc đẩy logic 📈 Giá trị thị trường hợp lý trên ứng dụng giao diện người dùng.

  1. Chuyển về thẻ BigQuery Studio.
  2. Trước tiên, hãy xem tập dữ liệu huấn luyện. Không giống như các trang thông tin đang hoạt động về xe, bảng synthetic_cars này chứa 100.000 giao dịch bán hàng trước đây sẽ được dùng để huấn luyện mô hình. Hãy chạy truy vấn nhanh này để xem trước:
SELECT
  *
FROM
  `model_dev.synthetic_cars`
LIMIT 10;
  1. Bây giờ, hãy thực thi SQL sau đây để huấn luyện mô hình hồi quy XGBoost. Mô hình này học cách các thuộc tính như quãng đường đã đi, năm sản xuất, thương hiệu và tình trạng hình ảnh ảnh hưởng đến giá từ 100.000 bản ghi trước đây:
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. Trước khi dự đoán giá cho các trang thông tin xe đang hoạt động, bạn phải thu thập tất cả các đặc điểm đầu vào có liên quan vào một nơi. Chạy SQL này để hợp nhất siêu dữ liệu có cấu trúc của xe với các đối tượng được trích xuất bằng thị giác mà bạn vừa tạo:
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. Cuối cùng, hãy dự đoán giá trị thị trường hợp lý của mọi trang thông tin đang hoạt động về xe. Thực thi truy vấn sau để đưa các đặc điểm được tổng hợp vào mô hình mới được huấn luyện và lưu các đầu ra bằng số vào một bảng dự đoán an toàn:
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. Bây giờ, hãy xác minh kết quả đầu ra của mô hình. Chạy truy vấn nhanh này để xem trước các giá trị thị trường dự đoán cho trang thông tin xe đang hoạt động:
SELECT * FROM `model_dev.vehicle_price_predictions` LIMIT 5;

Dự đoán bằng XGBoost

Tóm tắt phần: Bạn đã huấn luyện mô hình hồi quy XGBoost bằng 100.000 giao dịch mẫu và chạy suy luận hàng loạt để dự đoán giá trị thị trường hợp lý cho mọi trang thông tin đang hoạt động về xe trong tập dữ liệu.

6. Tính năng Nhúng ngữ nghĩa và phát hiện tính chân thực

Trong phần này, bạn sẽ thực thi 2 quy trình nhúng riêng biệt để bật các tính năng thông minh cho trang web thương mại về xe:

  1. Tìm kiếm hình ảnh đa phương thức: Dịch ảnh thô về xe thành không gian vectơ để cho phép người dùng tìm kiếm bằng ngôn ngữ tự nhiên (ví dụ: "một chiếc xe tải công việc đáng tin cậy").
  2. Nhúng văn bản và tìm kiếm tương tự: Dịch nội dung mô tả bằng văn bản về xe thành các vectơ nhúng để so sánh các trang thông tin đang hoạt động với các hồ sơ người dùng tiềm năng hoặc hồ sơ người dùng giả mạo đã biết bằng cách sử dụng VECTOR_SEARCH. Việc này sẽ tính toán 🔍 Điểm số về tính xác thực mà người mua nhìn thấy trên ứng dụng.
  1. Trước tiên, bạn cần tạo các vectơ nhúng đa phương thức cho trang thông tin về xe. Với mô hình gemini-embedding-2-preview, bạn có thể nhập cả hình ảnh và văn bản vào cùng một thành phần nhúng. Mặc dù mô hình này hoàn toàn có khả năng xử lý đồng thời nhiều phương thức, nhưng trong trường hợp cụ thể này, chúng tôi chỉ nhúng hình ảnh xe. Điều này hỗ trợ thanh "tìm kiếm ngữ nghĩa" cho ứng dụng giao diện người dùng, cho phép người mua sử dụng ngôn ngữ tự nhiên (chẳng hạn như "một chiếc xe bán tải đáng tin cậy") và nhanh chóng truy xuất các trang thông tin phù hợp. Chạy truy vấn này để tạo vectơ đa phương thức bằng cách dùng 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. Tiếp theo, bạn sẽ kiểm tra dữ liệu hồ sơ rủi ro đã tải trước đó. Xin lưu ý rằng danh sách này chứa cả các kiểu thủ đoạn lừa đảo đã biết và danh sách mẫu hợp pháp của người hâm mộ. Chạy truy vấn này để xem hồ sơ cơ sở:
SELECT profile_id, profile_type, description
FROM `model_dev.seller_risk_profiles`;
  1. Bây giờ, bạn sẽ dịch những nội dung mô tả rủi ro thô đó thành các vectơ nhúng. Bạn có thể sử dụng một mô hình nhúng văn bản chuyên biệt (text-embedding-005) để đánh giá nghiêm ngặt ngôn ngữ viết mà bạn vừa xem trước. Dán SQL sau đây rồi nhấp vào Chạy để nhúng hồ sơ cơ sở:
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. Tiếp theo, hãy tạo các mục nhúng có thể so sánh cho kho xe thực tế đang hoạt động. Chạy truy vấn này để dịch nội dung mô tả HTML thô cho từng chiếc xe thành không gian vectơ để có thể so sánh với các hồ sơ cơ sở:
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. Cuối cùng, hãy thực hiện tìm kiếm vectơ để tính khoảng cách ngữ nghĩa giữa trang thông tin đang hoạt động và hồ sơ cơ sở. Chạy SQL sau để thực hiện việc liên kết. Khoảng cách toán học càng thấp thì tức là trang thông tin càng giống với một cụm lừa đảo đã biết, còn khoảng cách càng cao thì tức là nội dung mô tả hợp pháp.
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;

Nội dung của bảng này có thể có dạng như sau:

Dự đoán điểm số về tính chân thực

Tóm tắt phần: Bạn đã tạo các mục nhúng đa phương thức cho thanh tìm kiếm trên giao diện người dùng và sử dụng tính năng tìm kiếm vectơ ngay trong BigQuery để đánh giá các trang thông tin văn bản HTML thô dựa trên hồ sơ lừa đảo đã biết.

7. Tính điểm giao dịch bằng AI tạo sinh

Giờ đây, bạn có các tập dữ liệu có cấu trúc được tạo thông qua nhiều kỹ thuật học máy riêng biệt, tất cả đều được điều phối hoàn toàn trong BigQuery: trích xuất hình ảnh, mô hình XGBoost để dự đoán giá trị thị trường hợp lý và vectơ nhúng tìm kiếm.

Bước cuối cùng là hợp nhất các tín hiệu AI này thành một chế độ xem hợp nhất dưới dạng Điểm số ưu đãi chính thức cho ứng dụng giao diện người dùng.

  1. Trước tiên, hãy kết hợp siêu dữ liệu thô với các đặc điểm thị giác do AI trích xuất, kết quả định giá dự đoán và điểm số xác thực ngữ nghĩa. Thực thi SQL sau:
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. Tiếp theo, hãy tính Điểm số giao dịch từ 0 đến 100 bằng cách kết hợp 4 tín hiệu riêng biệt của AI. Công thức này cân bằng giá trị, chất lượng và rủi ro để hiển thị những trang thông tin tốt nhất:
    • Điểm giá (40%): Đo lường mức tiết kiệm so với giá trị thị trường hợp lý.
    • Điểm số về hình ảnh (30%): Thông tin chi tiết từ hoạt động phân tích ảnh trước đây.
    • Điểm xác thực (15%): Đánh giá rủi ro lừa đảo.
    • Điểm tình trạng (15%): Được suy luận ngay lập tức từ nội dung mô tả của người bán thông qua AI.SCORE.
    Thực thi truy vấn sau:
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;

Để đảm bảo đề xuất có chất lượng cao, truy vấn sẽ áp dụng 2 lớp logic cụ thể:

  1. Cổng xác thực: Nếu một trang thông tin bị gắn cờ là "Rủi ro cao" (điểm số < 50), thì tổng Điểm ưu đãi sẽ tự động giảm 80% để ngăn các trang thông tin đáng ngờ được quảng bá.
  2. Tối ưu hoá"Ngọc ẩn": Công thức này sử dụng logic từng phần để thưởng cho mức tiết kiệm một cách tích cực trong khi vẫn khoan dung hơn đối với mức tăng giá, đảm bảo rằng một chiếc xe có giá quá cao nhưng ở tình trạng nguyên vẹn vẫn có thể đạt được thứ hạng "Khá".

Bảng kết quả model_dev.marketplace_listings chứa các trường như deal_score, cùng với price_scoreauthenticity_score.

  1. Để tự xem điểm ưu đãi, hãy chạy truy vấn sau hoặc chỉ cần xem ảnh chụp màn hình bên dưới:
SELECT item_name, model_year, authenticity_score, predicted_market_value, price_score, deal_score FROM `model_dev.marketplace_listings`

Điểm giao dịch được tạo

Tóm tắt phần: Bạn đã kết hợp giá dự đoán, các đặc điểm trực quan và điểm số về tính xác thực cùng với nội dung mô tả của người bán để tính toán một Điểm ưu đãi duy nhất cho mỗi trang thông tin.

8. Triển khai ứng dụng giao diện người dùng

Bây giờ, đã đến lúc thiết lập ứng dụng giao diện người dùng. Nhờ đó, bạn có thể tìm kiếm khoảng không quảng cáo của trang thông tin về xe và tương tác với thông tin chi tiết do AI tạo mà bạn vừa tạo, chẳng hạn như Điểm ưu đãi.

Xuất điểm số do AI chấm sang giao diện người dùng

Giao diện người dùng React dựa vào một tải trọng JSON cục bộ để tải trang ban đầu một cách nhanh chóng. Để hỗ trợ trang web thương mại, hãy trích xuất Điểm số cuối cùng của ưu đãi tạo sinh từ BigQuery và đưa lại vào dự án Next.js.

  1. Đảm bảo môi trường của bạn đã sẵn sàng. Nếu phiên Cloud Shell của bạn hết thời gian chờ hoặc bạn chuyển đến một thư mục khác, hãy chạy lệnh sau để quay lại thư mục gốc của dự án và khôi phục các biến môi trường:
cd ~/devrel-demos/data-analytics/cymbal-autos-multimodal && \
export PROJECT_ID=$(gcloud config get-value project) && \
export USER_BUCKET="cymbal-autos-${PROJECT_ID}"
  1. Chạy tập lệnh Python được cung cấp để truy vấn chế độ xem BigQuery cuối cùng và hợp nhất Điểm số giao dịch mới vào kho dữ liệu cơ bản của ứng dụng:
python3 scripts/setup/08_export_frontend_data.py

Bạn sẽ nhận được một thông báo xác nhận như:

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

Triển khai ứng dụng lên Cloud Run

Sau khi làm phong phú dữ liệu thành công, bạn có thể triển khai ứng dụng giao diện người dùng Next.js lên Internet công cộng bằng Cloud Run. Ứng dụng này có giao diện hiện đại với các mức đánh giá ưu đãi, băng chuyền hình ảnh tương tác và một thanh tìm kiếm ngữ nghĩa kết hợp linh hoạt, truy vấn BigQuery theo thời gian thực.

  1. Trong Cloud Shell, hãy chuyển đến thư mục app/ của kho lưu trữ bạn đã sao chép. Điều này rất quan trọng – việc giữ nguyên thư mục gốc sẽ khiến quá trình tạo không thành công.
cd app
  1. Triển khai ứng dụng dưới dạng một vùng chứa không máy chủ bằng Cloud Run. Lệnh này truyền PROJECT_ID dưới dạng một biến môi trường để API Next.js biết dự án BigQuery nào cần truy vấn:
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. Khi quá trình triển khai hoàn tất, thiết bị đầu cuối sẽ xuất ra một URL dịch vụ bảo mật. Thông báo sẽ có dạng như sau:
Service URL: https://cymbal-autos-frontend-[YOUR-PROJECT-NUMBER].us-west1.run.app/

9. Khám phá Ứng dụng Cymbal Autos

Sau khi đẩy vùng chứa giao diện người dùng lên Cloud Run, bạn có thể kiểm thử ứng dụng.

  1. Truy cập vào trang web: Mở URL dịch vụ bảo mật do Cloud Run trả về.

Trang chủ của Cymbal Autos

  1. Thực hiện tìm kiếm ngữ nghĩa: Thử tìm kiếm một khái niệm trừu tượng, chẳng hạn như "Một chiếc xe tải công trình đáng tin cậy có thể chở hàng và đi trên đường địa hình". Ứng dụng Next.js sẽ dịch văn bản thô của bạn thành một vectơ nhúng đa phương thức và kích hoạt VECTOR_SEARCH theo thời gian thực đối với BigQuery, ánh xạ ý tưởng của bạn với hệ sinh thái xe.

Cymbal Autos Search Bar

Lưu ý: trang thông tin được sắp xếp theo mức độ tương đồng về ngữ nghĩa.

  1. Xem xét kết quả: BigQuery đã tính toán khoảng cách chính xác về mặt toán học giữa ý tưởng trừu tượng của bạn và các đặc điểm của chiếc xe để trả về những kết quả phù hợp nhất về mặt ngữ nghĩa.

Cymbal Autos Search Results

  1. Xem chi tiết: Nhấp vào một chiếc xe bất kỳ để mở trang thông tin đầy đủ về chiếc xe đó.
  2. Kiểm tra tín hiệu AI: Di chuyển qua các chi tiết để xem điểm số học máy thô mà bạn đã tạo trước đó trong phòng thí nghiệm:
    • 📈 Giá trị thị trường hợp lý: Giá cơ sở do mô hình XGBoost của bạn dự đoán.
    • ✨ Tình trạng bên ngoài: Mức độ hư hỏng vật lý do các mô hình Gemini trích xuất.
    • 🔍 Điểm số chân thực: Chỉ số vectơ chân thực giúp phân biệt người bán hợp pháp với những kẻ lừa đảo tiềm ẩn.

Điểm số về việc đăng tin tự động của Cymbal

10. Dọn dẹp

Để tránh bị tính phí liên tục cho tài khoản Google Cloud đối với các tài nguyên được dùng trong lớp học lập trình này, bạn có thể xoá toàn bộ dự án trên đám mây của Google Cloud mà bạn đã tạo cho lớp học lập trình này hoặc bạn có thể thực thi tập lệnh huỷ thiết lập tự động sau đây.

  1. Từ cửa sổ dòng lệnh Cloud Shell, hãy chuyển về thư mục gốc chứa:
cd ..
  1. Chạy tập lệnh dọn dẹp bên dưới. Thao tác này sẽ xoá dữ liệu trong vùng chứa Google Cloud Storage, xoá tập dữ liệu model_dev BigQuery, xoá kết nối BigQuery và xoá dịch vụ Cloud Run.
chmod +x scripts/cleanup/teardown.sh
./scripts/cleanup/teardown.sh

11. Xin chúc mừng

Xin chúc mừng! Bạn đã xây dựng thành công một trang web thương mại thông minh về xe. Bạn đã sử dụng BigQuery để hợp nhất hoạt động phân tích dữ liệu không có cấu trúc, lập mô hình dự đoán và tích hợp AI vào một không gian làm việc duy nhất.

Kiến thức bạn học được

  • Cách kết nối BigQuery với hình ảnh không có cấu trúc trên Cloud Storage bằng ObjectRef
  • Cách trích xuất các thuộc tính của xe từ ảnh bằng BigQuery với các mô hình Gemini như hàm AI.GENERATEAI.CLASSIFY
  • Cách dự đoán giá xe bằng BigQuery ML
  • Cách xác định trang thông tin lừa đảo tiềm ẩn bằng cách nhúng nội dung mô tả xe và thực hiện VECTOR_SEARCH
  • Cách sử dụng AI.SCORE để đánh giá dữ liệu không có cấu trúc ngay lập tức và kết hợp kết quả vào Điểm giao dịch toàn diện
  • Cách xuất dữ liệu và triển khai ứng dụng trang web thương mại Next.js lên Cloud Run

Các bước tiếp theo