출시 준비 중사전 등록하기
취향옷장KOEN
기술 · 엔지니어링 노트

취향옷장은 Claude로 이렇게 만들어요.

퓨리파이솔루션의 작업 노트예요. 제품은 개발 중이며, 아직 만들지 않은 것은 계획으로 표시했어요.

도구 스키마

코디 계획과 쇼핑 체크는 Claude 도구 사용 루프로 실행돼요. 모델은 search_closet(나중에는 search_catalog)이 돌려준 아이템 ID만 고를 수 있고, 모든 후보는 정해진 규칙으로 확인을 거쳐요.

tools.json
[
  {"name": "tag_garment",
   "description": "Vision: tag one garment photo into the Garment schema.",
   "input_schema": {"type": "object",
     "properties": {"image_id": {"type": "string"}},
     "required": ["image_id"]}},
  {"name": "search_closet",
   "description": "Find the user's own items matching filters.",
   "input_schema": {"type": "object", "properties": {
     "category": {"enum": ["top","bottom","outer","dress","shoes","bag","accessory"]},
     "season":   {"enum": ["spring","summer","autumn","winter"]},
     "formality_min": {"type": "integer", "minimum": 1, "maximum": 5},
     "formality_max": {"type": "integer", "minimum": 1, "maximum": 5},
     "colors": {"type": "array", "items": {"type": "string"}},
     "exclude_ids": {"type": "array", "items": {"type": "string"}}}}},
  {"name": "get_weather",
   "description": "Hourly forecast for a city and date.",
   "input_schema": {"type": "object", "properties": {
     "city": {"type": "string"}, "date": {"type": "string", "format": "date"}},
     "required": ["city", "date"]}},
  {"name": "score_outfit",
   "description": "Deterministic rule checks for a candidate look.",
   "input_schema": {"type": "object", "properties": {
     "item_ids": {"type": "array", "items": {"type": "string"}},
     "temp_c": {"type": "number"}, "occasion_formality": {"type": "integer"}},
     "required": ["item_ids"]}},
  {"name": "check_fit",
   "description": "Compare an item's size chart and silhouette with the user's sizes.",
   "input_schema": {"type": "object", "properties": {
     "item_ref": {"type": "string"}, "size": {"type": "string"}},
     "required": ["item_ref"]}},
  {"name": "check_color_harmony",
   "description": "Score a color against owned items; returns matching item IDs.",
   "input_schema": {"type": "object", "properties": {
     "hex": {"type": "string", "pattern": "^#[0-9a-f]{6}$"}},
     "required": ["hex"]}},
  {"name": "check_budget",
   "description": "Compare a price with the user's budget for the category.",
   "input_schema": {"type": "object", "properties": {
     "price_krw": {"type": "integer"}, "category": {"type": "string"}},
     "required": ["price_krw", "category"]}}
]
계획 중인 도구
// Planned, not built yet
search_catalog(season | item_type, filters)  -> candidate items from partner/affiliate catalogs
get_calendar_context(date)                   -> occasions + formality hints

옷 JSON 스키마

비전 태깅은 이 스키마에 맞춘 구조화 출력을 써요. 검증에 실패한 응답은 검증 오류를 붙여 한 번 다시 시도하고, 그래도 실패하면 사용자가 직접 고칠 수 있게 보여줘요.

garment.schema.json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Garment",
  "type": "object",
  "required": ["category", "subcategory", "colors", "pattern",
               "material", "fit", "seasons", "formality", "confidence"],
  "properties": {
    "category":    {"enum": ["top","bottom","outer","dress","shoes","bag","accessory"]},
    "subcategory": {"type": "string", "maxLength": 40},
    "colors": {
      "type": "array", "minItems": 1, "maxItems": 3,
      "items": {"type": "object",
                "properties": {"name": {"type": "string"},
                               "hex": {"type": "string", "pattern": "^#[0-9a-f]{6}$"},
                               "share": {"type": "number"}}}
    },
    "pattern":   {"enum": ["solid","stripe","check","dot","floral","graphic","other"]},
    "material":  {"type": "string"},
    "fit":       {"enum": ["slim","regular","relaxed","oversized","n/a"]},
    "silhouette": {"enum": ["straight","tapered","wide","a-line","boxy","fitted","n/a"]},
    "seasons":   {"type": "array", "items": {"enum": ["spring","summer","autumn","winter"]}},
    "formality": {"type": "integer", "minimum": 1, "maximum": 5},
    "mood_tags": {"type": "array", "maxItems": 6, "items": {"type": "string"}},
    "confidence": {"type": "number", "minimum": 0, "maximum": 1}
  },
  "additionalProperties": false
}

취향 프로필 JSON 스키마

온보딩 진단으로 시작해, 좋아요·싫어요, 저장한 코디, 직접 수정한 내용으로 업데이트돼요.

taste_profile.schema.json
{
  "title": "TasteProfile",
  "type": "object",
  "required": ["styles", "palette", "fit", "sizes", "budget_krw"],
  "properties": {
    "styles":  {"type": "array", "items": {"type": "object",
                "properties": {"tag": {"type": "string"},
                               "weight": {"type": "number", "minimum": 0, "maximum": 1}}}},
    "palette": {"type": "array", "maxItems": 8,
                "items": {"type": "string", "pattern": "^#[0-9a-f]{6}$"}},
    "avoid":   {"type": "array", "items": {"type": "string"}},
    "fit":     {"type": "object", "properties": {
                "tops": {"enum": ["slim","regular","relaxed","oversized"]},
                "bottoms": {"enum": ["straight","tapered","wide"]}}},
    "sizes":   {"type": "object", "properties": {
                "top": {"type": "string"}, "bottom_waist_cm": {"type": "number"},
                "shoe_mm": {"type": "integer"}}},
    "formality_range": {"type": "array", "items": {"type": "integer"}, "minItems": 2, "maxItems": 2},
    "budget_krw": {"type": "object", "additionalProperties": {"type": "integer"}},
    "source": {"enum": ["quiz", "feedback", "user_edit"]}
  }
}

검증 규칙

  • 존재: 모든 아이템 ID는 사용자의 옷장(또는 후보 카탈로그 결과)에 있어야 해요.
  • 슬롯: 슬롯(상의, 하의 또는 원피스, 아우터, 신발)마다 아이템은 최대 하나. 기온이 기준보다 낮으면 아우터가 필요해요.
  • 날씨 적합도: 계절과 보온성이 예보에 맞아야 하고, 비가 오면 스웨이드와 캔버스 신발은 빼요.
  • 포멀함: 모든 아이템이 상황의 포멀 단계에서 ±1 이내여야 해요.
  • 컬러 조화: 뉴트럴 베이스에 채도 높은 포인트는 최대 하나, 규칙 기반 팔레트 확인.
  • 쇼핑 체크: 핏은 사용자의 사이즈·실루엣과, 소재는 선호·계절과, 컬러는 가진 옷과, 무드는 스타일 프로필과, 가격은 예산과 비교해요. 다섯 가지 결과를 모두 보여주며, 통과하지 못한 항목도 숨기지 않아요.
  • 신선함: 사용자가 정한 기간 안에 같은 상의를 반복하지 않아요.

모델 라우팅

작업모델 등급이유
옷 태깅 (비전)작고 빠른 Claude 모델양이 많고 스키마가 좁아 평가하기 쉬워요
빠른 교체작은 모델정해진 코디 안에서의 제한된 검색
취향·옷장 분석큰 Claude 모델옷장 전체에 걸친 해석
데일리·상황별·캡슐 코디큰 모델여러 단계의 도구 사용과 트레이드오프
쇼핑 검증 (계획)큰 모델 + 정해진 규칙 확인확인은 코드로, 트레이드오프 설명은 모델이

프롬프트 캐싱

시스템 프롬프트, 도구 정의, 취향 프로필, 옷장을 압축한 JSON 요약이 프롬프트 캐싱용 고정 접두부가 돼요. 요청마다 달라지는 입력(날짜, 날씨, 상황, 쇼핑 검색어)은 그 뒤에 와요. 옷장이나 취향 프로필이 바뀌면 캐시를 새로 만들어요.

평가 계획

평가지표상태
사람 레이블 대비 태깅 정확도항목별 정확도 (카테고리, 패턴, 핏, 포멀함), 컬러 일치진행 중
스키마 유효성첫 시도에 유효한 태깅 응답 비율진행 중
코디 규칙 확인날씨 적합도, 포멀함, 컬러 조화 통과율계획
상황별 코디정해진 상황 프롬프트 세트에 대한 사람 평가계획
쇼핑 검증핏, 컬러, 가격에 대한 사람 판단과의 일치도계획
근거 있는 설명도구 결과와 일치하는 이유계획
비용과 지연 시간경로별 토큰, 캐시 적중률, p50/p95 지연 시간계획

아직 공개한 결과는 없으며, 이 사이트에서 성능 수치를 주장하지 않아요.

사용자 사진 개인정보

앱이 출시되면 옷장 사진은 태깅을 위해 Claude API로 처리할 계획이며, 가능하면 사진 대신 구조화된 태그만 보관할 계획이에요. 현재 웹사이트에서 수집하는 정보는 사전 등록뿐이에요. 개인정보 페이지를 확인해 주세요.

개발 방식

취향옷장은 Claude Code로 개발해요. 이 사이트는 Cloudflare Pages에서 호스팅돼요.