화이트큐브는 일본·미국 시장의 뷰티 커머스 매출 데이터를 가진 곳이라, 현지 시장 데이터로 상품·카피를 추천하는 이 도구는 그 현지 판매 데이터가 있어야 추천을 검증한다.
'습관앱에서 뷰티득템앱으로 폭발적 확장'. 어떤 상품이 현지에서 통하는지 데이터로 짚는 게 확장의 토대.
'일본 7개월 만에 월매출 7억'. 현지화 추천·카피가 글로벌 성장의 1주 단위.
'속도와 실험, 실패를 용인하는 문화'. 추천 가설을 빠르게 검증하는 도구가 잘 맞음.
현지(일본) 시장의 상품·리뷰 데이터를 받아 잘 팔릴 상품을 근거와 함께 추천하고, 현지화 카피를 제안하는 1주 포트폴리오.
화이트큐브 글로벌 PE. 현지에서 무엇이 통할지 사람이 감으로 고르던 일을, 데이터 추천 + 현지화 카피 도구로 옮기고 싶은 사람.
상품에 현지 리뷰·가격을 붙이면, 도구가 (a) 현지에서 잘 팔릴 상품을 근거와 함께 추천하고 (b) 현지화 카피를 제안한다.
현지 시장의 상품·리뷰 데이터를 받아 잘 팔릴 상품을 근거와 함께 추천하고 현지화 카피를 제안하는 동작하는 도구.
추천 상품의 실제 판매·전환으로 적합도를 재고, 카피 채택률을 보여주는 대시보드.
같은 추천 코어를 미국 시장 데이터로 확장하고 카피를 다국어화하는 단계.
현지 시장 데이터를 넣으면 추천 상품과 현지화 카피가 근거와 함께 나오는 걸 시연한다
추천 근거로 인용한 리뷰가 실제 리뷰에 존재하는 비율 100%
측정: 인용 일치 규칙, 표본: 추천 200건
일부러 만든 결측·미등록·표기 흔들림 상품 30종을 넣어도 추천이 멈추지 않고 처리되는 걸 시연한다
위 수치는 더미데이터 자가채점이며, 실제 추천 적합도는 화이트큐브 실데이터 + 실 검수자가 있어야 측정 가능. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만든다.
이건 고객·실데이터 없이 혼자 만든 포트폴리오라 모든 수치는 합성 데이터 자가채점이다. 면접에서 '데모 동작 + 실검증 준비 상태'로 솔직히 설명하는 게 오히려 신뢰를 준다
정답을 내가 만들었으니 잘 맞는 게 당연. 그래서 결측·경계·미등록·표기 흔들림 케이스를 더미에 일부러 섞어 쉬운 문제만 푸는 게 아님을 보여준다
현지 편향: 리뷰 많은 상품이 과대 추천될 수 있어 reviews_local 보정·신상품 노출 규칙을 둔다
실제 도입 시 달라지는 것: 실 현지 선호·가격·언어가 더미와 다르므로 추천 기준·카피 톤을 실데이터로 맞춰야 한다(도입 단계 과제)
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
현지 시장 상품·리뷰를 묶어 추천 입력으로 쓴다
| product_id | name_raw | product_key | market | price_local | reviews_local | rating |
|---|---|---|---|---|---|---|
| P900 | OO세럼(구명) | — | JP | — | 0 | — |
| P901 | 상품0 | pr_0 | JP | 1,200 | 0 | — |
| P902 | 베스트셀러 | pr_2 | JP | 2,000 | 99,999 | 5 |
| P903 | 미등록상품 | — | US | 9.99 | 3 | 2 |
| P000 | 상품0 | pr_0 | JP | 1,000 | 10 | 3.5 |
z.object({ product_id: z.string(), name_raw: z.string(), product_key: z.string().nullable(), market: z.string(), price_local: z.number().nullable(), reviews_local: z.number(), rating: z.number().nullable() }). 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: price_local/rating null(미수집), reviews_local 0(신상품)·극단, product_key null 미등록, name_raw 표기 흔들림(구명/별칭), market 혼재(JP/US). 형식 깨뜨리기 시도 3건도 별도로.z.object({ product_id: z.string(), name_raw: z.string(), product_key: z.string().nullable(), market: z.string(), price_local: z.number().nullable(), reviews_local: z.number(), rating: z.number().nullable() })| Python | 시장 데이터 ingest + 추천 + eval |
| TypeScript | 추천 렌더 + Zod 런타임 검증 |
| React | 추천 대시보드 |
| Next.js | 웹 앱 셸 |
| FastAPI | 추천 API(`POST /recommend`) |
| PostgreSQL | 상품·리뷰 단일 진실원 |
✓ pass → 그대로 멈춰도 완성품. 더 키우려면 2주차(추천 적합도 검증)로.
✓ pass → 여기서 멈춰도 완결. 더 키우려면 3주차(미국 시장 확장)로.
현지 상품 추천 + 카피
z.object({ product_id: z.string(), score: z.number(), reasons: z.array(z.object({ metric: z.string(), value: z.number() })), copy_local: z.string(), note: z.string() })[
{
"product_id": "P010",
"score": 0.85,
"reasons": [
{
"metric": "reviews_local",
"value": 60
}
],
"copy_local": "今だけ、毎日のスキンケアを格上げ",
"note": ""
},
{
"product_id": "P901",
"score": 0.4,
"reasons": [],
"copy_local": "新登場",
"note": "신상품. 데이터 부족"
},
{
"product_id": "P900",
"score": 0.2,
"reasons": [],
"copy_local": "-",
"note": "가격·평점 결측. 확인 필요"
}
]reasons 정합성·인용 존재는 자동 검증, copy_local 품질·현지성은 사람/judge 검증.