1. 소개
이 Codelab에서는 온라인 차량 마켓인 'Cymbal Autos'의 백엔드를 빌드하고 프런트엔드를 배포합니다. BigQuery와 Gemini Enterprise Agent Platform의 Gemini 모델을 사용하여 차량 사진을 검사하고, BigQuery ML을 사용하여 가격을 예측하고, 벡터 삽입을 사용하여 사기 리스팅을 감지하고, 복합 거래 점수를 계산합니다. 마지막으로 Cloud Run에 배포된 Next.js 프런트엔드에 이러한 통계를 표시합니다.

실습할 내용
- ObjectRef를 사용하여 BigQuery를 비정형 Cloud Storage 이미지에 연결
- Gemini 모델이 포함된 BigQuery를 사용하여 사진에서 차량 속성 추출
- BigQuery ML로 XGBoost 회귀 모델을 학습시켜 공정 시장 가격 예측
- 차량 설명을 삽입하고
VECTOR_SEARCH을 실행하여 사기 가능성이 있는 리스팅과 신뢰할 수 있는 리스팅을 식별합니다. AI.SCORE를 사용하여 판매자 설명의 상태 신호를 통합하면서 각 비즈니스 정보에 대한 포괄적인 할인 점수 계산- 데이터를 내보내고 Next.js 마켓 애플리케이션을 Google Cloud Run에 배포
필요한 항목
- 웹브라우저(예: Chrome)
- 결제가 사용 설정된 Google Cloud 프로젝트
- SQL, Python, Google Cloud에 대한 기본적인 지식
- API를 사용 설정하고, 리소스를 만들고, 권한을 할당할 수 있는 충분한 IAM 권한 (예: 프로젝트 소유자)
이 Codelab은 중급 개발자를 위한 것입니다.
이 Codelab에서 만든 리소스의 비용은 5달러 미만이어야 합니다.
2. 시작하기 전에
Google Cloud 프로젝트 만들기
- Google Cloud 콘솔의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.
- Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.
Cloud Shell 시작
Google Cloud Shell을 사용하여 코드를 다운로드하고, 설정 스크립트를 실행하고, 애플리케이션을 배포합니다.
- Google Cloud 콘솔 상단에서 Cloud Shell 활성화를 클릭합니다.

- Cloud Shell에 연결되면 애플리케이션이 Google Cloud API에 액세스할 수 있도록 세션을 인증합니다. 메시지에 따라 Cloud Shell을 승인합니다.
gcloud auth application-default login
- Google Cloud 프로젝트 ID와 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에서 다음 명령어를 실행하여 이 Codelab에 필요한 모든 API를 사용 설정합니다.
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
- 스크립트를 실행하여 데이터를 환경에 복사합니다. 이 스크립트는 로컬 저장소 데이터 세트를 개인 Cloud Storage 버킷에 동기화하고 공개 버킷에서 차량 이미지를 가져옵니다.
chmod +x scripts/setup/*.sh
./scripts/setup/00_copy_data.sh
그런 다음 다음과 유사한 메시지가 표시됩니다.
Average throughput: 87.8MiB/s Data copy complete!
- 다음으로 BigQuery Cloud 리소스 연결을 설정합니다. Cloud Storage의 구조화되지 않은 이미지를 분석하고 SQL 쿼리에서 Agent Platform 모델을 직접 호출하려면 BigQuery에서 기본 서비스 계정에 IAM 권한을 위임해야 합니다. 이 스크립트는 보안 연결을 만들고 필요한 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 함수와 Agent Platform에서 호스팅되는 Gemini 모델을 활용하면 파일을 이동하거나 복잡한 데이터 파이프라인을 작성하지 않고도 이러한 기능을 생성할 수 있습니다. 이 추출은 프런트엔드 애플리케이션의 ✨ 시각적 조건 배지를 직접 지원합니다.
- 새 브라우저 탭에서 BigQuery Studio를 엽니다.
- + 새 쿼리 작성 버튼을 클릭합니다. 이 Codelab에서는 SQL 편집기를 사용하여 SQL 코드와 상호작용합니다.
- 머신러닝 추출기를 빌드하기 전에 원시 이미지를 간단히 살펴볼 수 있습니다. 다음 쿼리를 실행하여 각 등록정보에 대해 Google Cloud Storage에 저장된 이미지 URI 배열을 확인합니다.
SELECT auction_id, item_name, description, images
FROM `model_dev.vehicle_metadata` LIMIT 5;
- 이제 BigQuery Studio SQL 편집기에서 다음 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_refObjectRef 열을 확인합니다. 이제 새 테이블에는 이미지 자체에서 실행할 수 있는 권한이 있는 ObjectRef 열이 있습니다. 다음 쿼리를 실행하여 확인합니다.
SELECT auction_id, item_name, description, image_ref
FROM `model_dev.vehicle_multimodal` LIMIT 5;
- 이제
AI.GENERATE및AI.CLASSIFY를 사용하여 이미지를 분석합니다.AI.GENERATE는 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를 사용한 예측 가격 책정
차량이 정말 좋은 거래인지 계산하려면 공정 시장 가치에 대한 신뢰할 수 있는 기준이 필요합니다. 모델을 학습시키기 위해 데이터를 로컬 스크립트나 노트북으로 가져오는 대신 표준 SQL을 사용하여 BigQuery 내에서 직접 XGBoost 모델을 학습시킬 수 있습니다. 이 가격 예측은 프런트엔드 애플리케이션의 📈 공정 시장 가치 로직을 지원합니다.
- BigQuery Studio 탭으로 다시 이동합니다.
- 먼저 학습 데이터 세트를 살펴보세요. 활성 차량 등록정보와 달리 이
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;

섹션 요약: 100,000개의 샘플 거래를 사용하여 XGBoost 회귀 모델을 학습시키고 배치 추론을 실행하여 데이터 세트의 모든 활성 차량 등록정보의 공정 시장 가치를 예측했습니다.
6. 시맨틱 임베딩 및 진위 여부 감지
이 섹션에서는 두 개의 개별 삽입 파이프라인을 실행하여 차량 마켓플레이스의 스마트 기능을 사용 설정합니다.
- 멀티모달 이미지 검색: 원시 차량 사진을 벡터 공간으로 변환하여 사용자가 자연어 (예: '신뢰할 수 있는 작업용 트럭')를 사용하여 검색할 수 있도록 합니다.
- 텍스트 임베딩 및 유사성 검색:
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. 생성형 거래 점수
이제 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;
- 그런 다음 4가지 고유한 AI 신호를 결합하여 0~100점의 거래 점수를 계산합니다. 이 수식은 가치, 품질, 위험을 균형 있게 고려하여 최적의 등록정보를 표시합니다.
- 가격 점수 (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;
고품질 추천을 보장하기 위해 쿼리는 두 가지 특정 로직 레이어를 적용합니다.
- 진위 여부 게이팅: '위험도 높음' (점수 < 50)으로 표시된 등록정보의 경우 의심스러운 등록정보가 홍보되지 않도록 총 할인 점수가 자동으로 80% 삭감됩니다.
- '숨겨진 보석' 최적화: 이 수식은 구간별 로직을 사용하여 할인에 적극적으로 보상을 제공하면서도 인상에 더 관대하여 상태가 양호한 과도한 가격의 자동차도 '보통' 순위를 달성할 수 있습니다.
결과 테이블 model_dev.marketplace_listings에는 price_score, authenticity_score과 함께 deal_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 페이로드를 사용합니다. 마켓을 지원하려면 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에 애플리케이션 배포
데이터가 성공적으로 보강되면 Cloud Run을 사용하여 Next.js 프런트엔드 애플리케이션을 공개 인터넷에 배포할 수 있습니다. 거래 평점, 대화형 이미지 캐러셀, 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에 푸시했으므로 이제 앱을 테스트할 차례입니다.
- 사이트 방문: Cloud Run에서 반환된 보안 서비스 URL을 엽니다.

- 시맨틱 검색 실행: '견인 및 오프로드가 가능한 신뢰할 수 있는 작업용 트럭'과 같은 추상적인 개념을 검색해 보세요. Next.js 앱은 원시 텍스트를 멀티모달 벡터 임베딩으로 변환하고 BigQuery에 대해 실시간
VECTOR_SEARCH를 실행하여 아이디어를 차량 생태계에 매핑합니다.

참고: 목록은 의미론적 유사성을 기준으로 정렬됩니다.
- 결과 검토: BigQuery는 추상적인 아이디어와 차량의 기능 간의 정확한 수학적 거리를 계산하여 가장 유사한 의미론적 일치 항목을 반환했습니다.

- 세부정보 살펴보기: 차량을 클릭하여 전체 등록정보 프로필을 엽니다.
- AI 신호 확인: 세부정보를 스크롤하여 실습 초반에 생성한 원시 머신러닝 점수를 확인합니다.
- 📈 공정 시장 가치: XGBoost 모델에서 예측한 기준 가격입니다.
- ✨ 시각적 상태: Gemini 모델에서 추출한 물리적 손상 등급입니다.
- 🔍 진정성 점수: 진정성 벡터 측정항목은 합법적인 판매자와 잠재적 사기범을 구분합니다.

10. 삭제
이 Codelab에서 사용한 리소스 비용이 Google Cloud 계정에 계속 청구되지 않도록 하려면 이 Codelab에서 만든 Google Cloud 프로젝트 전체를 삭제하거나 다음 자동 해체 스크립트를 실행하면 됩니다.
- Cloud Shell 터미널에서 포함된 루트 디렉터리로 다시 이동합니다.
cd ..
- 아래 정리 스크립트를 실행합니다. 이렇게 하면 Google Cloud Storage 버킷이 비워지고,
model_devBigQuery 데이터 세트가 삭제되고, BigQuery 연결이 삭제되고, Cloud Run 서비스가 삭제됩니다.
chmod +x scripts/cleanup/teardown.sh
./scripts/cleanup/teardown.sh
11. 마무리
축하합니다. 지능형 차량 마켓을 성공적으로 구축했습니다. BigQuery를 사용하여 비정형 데이터 분석, 예측 모델링, AI 통합을 단일 작업공간으로 통합했습니다.
학습한 내용
- ObjectRef를 사용하여 BigQuery를 구조화되지 않은 Cloud Storage 이미지에 연결하는 방법
AI.GENERATE및AI.CLASSIFY함수와 같은 Gemini 모델을 사용하여 사진에서 차량 속성을 추출하는 방법- BigQuery ML을 사용하여 차량 가격을 예측하는 방법
- 차량 설명을 삽입하고
VECTOR_SEARCH를 실행하여 잠재적인 사기 등록정보를 식별하는 방법 AI.SCORE를 사용하여 비정형 데이터를 즉석에서 평가하고 결과를 포괄적인 거래 점수에 통합하는 방법- 데이터를 내보내고 Next.js 마켓 애플리케이션을 Cloud Run에 배포하는 방법
다음 단계
- BigQuery에서 사용할 수 있는 생성형 AI 함수의 전체 범위 알아보기
- GoogleSQL로 예측 모델 만들기 자세히 알아보기