브릿지웍스
경력근거: 사용자가 영수증을 업로드하면 즉시 리워드를 받을 수 있는 오프라인 리워드 서비스
브릿지웍스 캐시모어는 수천만 건의 영수증 실구매 데이터를 가진 리워드 서비스라, 영수증 중복·조작을 짚고 소비를 분류하는 이 도구는 캐시모어의 실제 영수증 데이터가 있어야 점검을 검증합니다.
'영수증을 업로드하면 리워드를 받는 오프라인 리워드 서비스'. 영수증 점검이 리워드 신뢰의 토대.
'실구매 데이터를 대규모로 축적'. 중복·조작 점검과 소비 분류가 데이터 가치를 지킴.
'소수 인원으로 빠른 실행과 실험'. 점검+분류가 1인 E2E 로 만들 만한 문제.
업로드된 영수증 데이터를 받아 중복·조작 의심을 규칙으로 짚고, 소비를 카테고리로 분류해 근거와 함께 보여주는 1주 포트폴리오입니다.
브릿지웍스 PE. 영수증 어뷰징을 사람이 검수하던 일을, 자동 점검 + 소비 분류 도구로 옮기고 싶은 사람입니다.
영수증에 가맹점·금액을 붙이면, 도구가 (a) 중복·조작 의심을 규칙으로 짚고 (b) 소비를 카테고리로 분류합니다.
영수증 데이터를 받아 중복·조작 의심을 짚고 소비를 카테고리로 분류해 근거와 함께 보여주는 동작하는 도구입니다.
중복·조작 판정이 실제 어뷰징을 잡는 비율과 오탐을 보여주는 대시보드입니다.
정제된 소비 데이터로 카테고리·지역 소비 인사이트를 자동 생성하는 단계입니다.
영수증을 넣으면 중복·조작 플래그와 소비 분류가 근거와 함께 나오는 걸 시연합니다.
중복 탐지가 정답과 일치하는 비율 100%
측정: 결정적 재계산, 표본: 영수증 200건
일부러 만든 중복·결측·미등록 가맹점 영수증 30종을 넣어도 점검이 멈추지 않고 처리되는 걸 시연합니다.
위 수치는 더미데이터 자가채점이며, 실제 어뷰징 탐지 정확도는 브릿지웍스 실데이터 + 실 검수자가 있어야 측정 가능합니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다.
정답을 작성자가 만들었으니 잘 맞는 것이 당연합니다. 결측·경계·미등록·표기 흔들림 케이스를 더미에 일부러 섞어 쉬운 문제만 푸는 게 아님을 보여줍니다.
오탐 비용: 정상 영수증을 조작으로 막으면 사용자 피해이므로 고신뢰만 차단, 나머지는 검토 큐로 보냅니다.
실제 도입 시 달라지는 것: 실 영수증 OCR·가맹점 분포가 더미와 다르므로 규칙·카테고리 사전을 실데이터로 맞춰야 한다(도입 단계 과제)
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
영수증 데이터를 묶어 중복·조작 점검 입력으로 쓴다
| receipt_id | store_raw | store_id | amount | category | dup_flag | uploaded_at |
|---|---|---|---|---|---|---|
| RC900 | OO마트(구) | — | — | 생활 | — | 2026-05-20T13:00:00 |
| RC901 | 가맹점0 | s0 | 0 | 식음료 | true | 2026-05-20T13:00:00 |
| RC902 | 고액영수증 | s2 | 9,999,999 | 패션 | false | 2026-05-20T13:00:01 |
| RC903 | 미등록가맹점 | — | 3,000 | 생활 | — | 1970-01-01T00:00:00 |
| RC000 | 가맹점0 | s0 | 5,000 | 식음료 | false | 2026-05-20T13:00:00 |
{"type":"object","properties":{"receipt_id":{"type":"string"},"store_raw":{"type":"string"},"store_id":{"type":["string","null"]},"amount":{"type":["number","null"]},"category":{"type":"string"},"dup_flag":{"type":["boolean","null"]},"uploaded_at":{"type":"string"}},"required":["receipt_id","store_raw","store_id","amount","category","dup_flag","uploaded_at"]}. 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: amount null(OCR 실패)·0·극단, dup_flag null(미점검), store_id null 미등록, uploaded_at 1970(잡음), store_raw 표기 흔들림, 동일 영수증 중복. 형식 깨뜨리기 시도 3건도 별도로.{"type":"object","properties":{"receipt_id":{"type":"string"},"store_raw":{"type":"string"},"store_id":{"type":["string","null"]},"amount":{"type":["number","null"]},"category":{"type":"string"},"dup_flag":{"type":["boolean","null"]},"uploaded_at":{"type":"string"}},"required":["receipt_id","store_raw","store_id","amount","category","dup_flag","uploaded_at"]}| Python | 영수증 데이터 ingest + 점검 + eval |
| TypeScript | 대시보드 렌더 + Zod 검증 |
| React | 점검·분류 대시보드 |
| Next.js | 앱 셸 |
| Node.js | 점검 API(`POST /receipts`) |
| PostgreSQL | 영수증 단일 진실원 |
✓ pass → 그대로 멈춰도 완성품입니다. 더 키우려면 2주차(점검 정확도 검증)로 갑니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 3주차(소비 인사이트 리포트)로 갑니다.
영수증 점검 + 소비 분류
{"type":"object","properties":{"receipt_id":{"type":"string"},"abuse":{"type":"string","enum":["none","dup","suspect","review"]},"category":{"type":"string"},"evidence":{"type":"string"}},"required":["receipt_id","abuse","category","evidence"]}[
{
"receipt_id": "RC901",
"abuse": "dup",
"category": "식음료",
"evidence": "동일 가맹점·금액·시각 중복"
},
{
"receipt_id": "RC000",
"abuse": "none",
"category": "식음료",
"evidence": "정상"
},
{
"receipt_id": "RC900",
"abuse": "review",
"category": "미분류",
"evidence": "금액 결측. 확인 필요"
}
]abuse 규칙·evidence 정합성은 자동 검증, category 정확성은 사람/judge 검증.