모두의포트폴리오
PE · FDE 직군을 위한 포트폴리오 밀키트
예전 판입니다 (1판)이 문서는 2026-08-02 에 새 판으로 개정됐습니다. 슬랙 자동발송 리포트에 덧붙어 있던 대시보드를 걷어내고, 사람이 화면에서 원천 표기를 확정해야만 지표와 위젯이 열리는 대시보드 빌더 화면 하나로 다시 썼습니다.최신 판 보기 →
경력라플라스테크놀로지스 · 프로덕트 엔지니어 (Product Engineer)

흩어진 이커머스 데이터에서 이상·기회를 짚어 알려주는 도구

라플라스테크놀로지스 공고에서 뽑은 세 가지 시그널.

라플라스테크놀로지스는 주문·광고·재고·리뷰를 라플라스 애널리틱스로 통합해 대시보드·알림을 주는 회사라, 흩어진 데이터에서 이상·기회를 짚는 이 도구는 라플라스가 통합하는 다채널 이커머스 데이터가 있어야 권고를 검증할 수 있다.

01

이커머스 전방위 데이터 통합

주문·고객·광고·재무·재고·리뷰·검색 트렌드를 라플라스에 통합해 대시보드·알림·AI Agent 를 제공. 통합 데이터를 한 스키마로 닫아야 이상·기회를 짚는다.

라플라스 애널리틱스통합대시보드AI Agent
02

고객 가치로 빠르게 연결

고객 문제를 직접 이해하고 빠른 실행·실험으로 제품 가설을 실제 고객 가치로 연결. 권고가 실제로 맞았는지 확인하는 루프가 핵심.

고객 성공가설 검증고객 가치React
03

경계 없는 풀스택

프론트·백·데이터·인프라 경계를 두지 않고 문제 해결 중심. SQL ELT·3rd Party API·k8s 까지 다뤄, 통합 파이프라인을 직접 닫는다.

ELT3rd Party APIk8s문제 해결

포트폴리오 요약

주문·재고·광고·리뷰를 한 스키마로 모아 한 화면에서 본다. LLM 이 이상(매출 급감·재고 부족·리뷰 악화) Top3 와 권고 액션 3건을 짚고, 매일 운영 리포트를 슬랙으로 보낸다. 1주차만으로 완성품이고, 권고가 실제로 맞았는지 확인(2주차)·알림 자동화(3주차)로 키운다. (근거는 채용공고 정렬이다.)

고객 정의

여러 도구에 흩어진 이커머스 지표를 매번 손으로 모아 이상을 찾는 상황을 끝내고, 그 권고가 실제로 효과가 있었는지까지 확인하고 싶은 라플라스 PE.

고민 지점

주문·재고·광고·리뷰를 한 스키마로 묶으면, LLM 이 (a) 이상 Top3 와 (b) 권고 액션 3건을 몇 초 안에 답하고, (c) 다음 기간 실측치로 그 권고가 맞았는지 확인한다.

주차별 일정

1주차여기까지로 완성

운영 이상 리포트 + 매일 자동 발송

주문·재고·광고·리뷰를 한곳에 모아, 이상 Top3 와 권고 액션을 LLM 이 만들고 매일 슬랙으로 보내는 동작하는 도구.

  1. 1일 · 데이터를 한곳에 모을 표준 표 만들기주문/재고/광고(orders_daily·inventory_snapshot·channel_spend) 스키마 설계 + 채널 표기 통일
  2. 2-3일 · 외부 API 데이터를 자동으로 받아 정리SQL ELT + 리뷰 표 붙이기
  3. 4-5일 · 이상과 권고를 LLM 이 답하게 하기프롬프트 v1(이상 Top3 / 권고 / 근거 지표) + Zod 로 출력 형식 검증
  4. 6일 · 매일 운영 리포트 슬랙 자동 발송FastAPI 봇(정해진 시각 실행 + 발송 기록)
  5. 7일 · 7일치 시연 영상 + 직접 만든 정답과 비교한 기준선여기까지가 1주차 완성품
2주차선택 성장

권고가 실제로 맞았는지 확인

지난 기간 권고의 예상 효과를 다음 기간 실측치와 맞춰보고, 운영자 2명이 권고 타당성을 라벨링해 신뢰도를 보여주는 대시보드.

  1. 8-9일 · 운영자 2명이 권고 타당성을 라벨링검토 가이드 + 운영자와 LLM 이 얼마나 일치하는지 측정(Cohen’s κ: 두 판정이 우연 이상으로 일치하는 정도, 0~1)
  2. 10-11일 · 권고 액션 다듬기3건 + 예상 효과 + 확신도(낮음/보통/높음)
  3. 12일 · 권고가 실제로 맞았는지 확인하는 화면예상 vs 실제 효과 적중률 + 확신도 vs 실제 정확도 그래프
  4. 13일 · ‘무엇 때문에 급감’ 단정 자동 차단토큰 매칭 + 별도 LLM 검사 + 5% 사람 점검
3주차선택 성장

이상 알림 자동화

확인된 권고를 바탕으로 임계값 기반 알림을 자동 발송해, 운영자가 이상을 놓치지 않게 하는 단계.

  1. 15-16일 · 임계값 기반 이상 알림 자동화알림 규칙 + 오탐률 점검(0.7~0.95 임계 조정)
  2. 17-18일 · 두 번째 주기 운영보정된 기준으로 다시 권고→확인, 검토 표본 누적(총 60건)
  3. 19-21일 · 3주 통합 시연 영상 + 실제 도입 계획(실 고객사 데이터 연동, 분포 재보정 4주)

데모 · 측정 지표

01

이상 시나리오 10개를 넣으면 이상 Top3 와 권고 액션 3건이 몇 초 안에 나오는 걸 시연으로 보여준다

02

일부러 만든 악성·결측 입력 30종을 넣어도 출력 형식(스키마)이 한 번도 안 깨진다. 형식 검증(Zod)을 자동 통과한다

03

매일 운영 리포트가 슬랙으로 자동 발송되는 걸 14일치 시연으로 보여준다

04

내가 만든 정답 30개 중 이상 Top3 가 일치한 게 25개(83%). 단, 정답과 데이터를 모두 내가 만든 합성 기준이므로 ‘성능 검증’ 이 아니라 ‘데모 조건에서의 동작’ 이다

정직 경계선

진짜 성능 검증은 여기서 멈춘다

위 수치는 전부 작성자가 만든 더미데이터 자가채점이며, 실제 적중률·일치도는 라플라스 실 고객사 데이터 + 실 운영자 검수가 있어야 측정 가능하다. 이 도구는 ‘그 검증을 바로 돌릴 수 있는 상태’ 까지 만든다.

미리 알아둬야 할 것들

이건 고객·실데이터 없이 혼자 만든 포트폴리오다. 모든 수치는 합성 데이터 자가채점이라 ‘성능 증명’ 이 아니다. 면접에서 솔직히 ‘데모 조건 동작 + 실검증 준비 상태’ 로 설명하는 게 오히려 신뢰를 준다

정답을 내가 만들었으니 잘 맞는 게 당연하다. 그래서 일부러 헷갈리는 결측·악성·경계 케이스를 더미에 섞어, 쉬운 문제만 푸는 게 아님을 보여줘야 한다

‘무엇 때문에 매출이 급감했다’ 는 상관일 뿐 인과가 아닐 수 있다. 그래서 단정 표현을 강제로 누그러뜨리고 별도 LLM 검사로 우회 표현까지 거른다

채널·상품 표기가 제각각이라 통합이 깨진다. 표기 정규화로 묶고, 못 묶은 건 추측하지 말고 ‘미매핑’ 으로 알린다

실제 도입 시 달라지는 것 명시. 실 고객사 분포는 더미와 다르므로 임계·기준을 다시 맞춰야 하고, 운영자 검수도 실제 인력으로 교체해야 한다(도입 단계 과제로 분리)

더미 데이터

① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.

orders_dailyTABLE· 12 rows

채널·상품별 일일 주문·매출 로그. 인사이트 LLM 이 가장 먼저 질의하는 테이블. 운영 현실대로 결측(광고비 미연동)·미등록 신상품·급감 이상치를 일부러 섞어, 쉬운 데이터만 푸는 게 아님을 보여준다.

② orders_daily.seed.json 다운로드
① 인라인 샘플 (프리뷰 5 / 12)
datechannelskusku_idordersrevenue_krwad_spend_krw
2026-05-04smartstore콜드브루 1Lm_coldbrew3204,480,000600,000
2026-05-04coupang콜드브루 1Lm_coldbrew2102,940,000520,000
2026-05-04own_mall원두 200gm_bean200881,408,000—
2026-05-05smartstore콜드브루1Lm_coldbrew3184,452,000610,000
2026-05-05coupang드립백 10개입(신상)—1401,820,000300,000
③ 증강 프롬프트 (본인 LLM 에 붙여서 N 배 늘리기)
아래 Zod 스키마에 맞는 이커머스 주문 로그 14일치 JSON 배열로 생성. 채널 3곳, SKU 5종 분포 포함.

z.object({ date: z.string(), channel: z.enum(["smartstore","coupang","own_mall"]), sku: z.string(), sku_id: z.string().nullable(), orders: z.number().int(), revenue_krw: z.number().int(), ad_spend_krw: z.number().int().nullable() })

쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) sku 별칭 표기 혼입('콜드브루 1L'/'콜드브루1L' 처럼 sku_id 로 정규화돼야 함), (2) 미등록 신상품(sku_id=null) 1~2건, (3) ad_spend_krw=null 결측 2~3건, (4) orders=0 인 급감 이상치 1건 + 평소 2배 급증 1건. JSON 배열만.
schema (3 층의 단일 출처)
z.object({ date: z.string(), channel: z.enum(["smartstore","coupang","own_mall"]), sku: z.string(), sku_id: z.string().nullable(), orders: z.number().int(), revenue_krw: z.number().int(), ad_spend_krw: z.number().int().nullable() })
external_reviewsTABLE· 12 rows

상품·채널별 리뷰 평점·키워드. 리뷰 악화 이상의 분모. 평점 결측·미매핑 sku 를 일부러 섞어, 리뷰 인사이트가 결측을 만났을 때도 안 깨지는지 보여준다.

② external_reviews.seed.json 다운로드
① 인라인 샘플 (프리뷰 5 / 12)
datesku_idchannelrating_1to5neg_keyword
2026-05-04m_coldbrewsmartstore4.6—
2026-05-05m_coldbrewsmartstore4.5—
2026-05-06m_coldbrewsmartstore3.1배송 지연
2026-05-06m_coldbrewcoupang2.8포장 파손
2026-05-07m_bean200own_mall4.4—
③ 증강 프롬프트 (본인 LLM 에 붙여서 N 배 늘리기)
아래 Zod 스키마에 맞는 external_reviews 40행 JSON 배열을 orders_daily 의 sku_id·channel 과 매칭되도록 생성.

z.object({ date: z.string(), sku_id: z.string().nullable(), channel: z.enum(["smartstore","coupang","own_mall"]), rating_1to5: z.number().nullable(), neg_keyword: z.string().nullable() })

쉬운 데이터만 만들지 말 것 — 하드 케이스: (1) rating_1to5=null 결측 1~2건, (2) sku_id=null 미매핑 1건, (3) 특정 채널 평점이 2~3점대로 급락하는 악화 시퀀스 1세트(neg_keyword 동반). JSON 배열만.
schema (3 층의 단일 출처)
z.object({ date: z.string(), sku_id: z.string().nullable(), channel: z.enum(["smartstore","coupang","own_mall"]), rating_1to5: z.number().nullable(), neg_keyword: z.string().nullable() })

기술 상세 · 아키텍처·운영·출력 스키마

기술 스택 매핑
ReactNext.js 운영 대시보드(이상 카드 + 권고 적중률 차트) 프론트 렌더링 + Zod 런타임 검증
k8sGitops 기반 ingest 워커·리포트 봇·인사이트 API 배포(오토스케일)
FastAPI인사이트 API(`POST /insights`: 기간 입력 → output_schema 반환) + 일일 리포트 봇
SQL3rd Party API 소싱 데이터의 ELT(원천 → PostgreSQL upsert) + 뷰(`v_daily_kpi`)
LLM 선택
model
Claude Sonnet (이상·권고 생성) + GPT-4o-mini (LLM-as-judge 인과 단정 평가)
prompt
few-shot 3 예시 + Zod schema 강제 + hedge 토큰 가드 + 후행 judge 로 ‘때문이다’ 단정 검출
rationale
권고는 톤·hedge 가 중요해 Sonnet, judge 는 비용·속도 우선 mini. RAG 불필요(데이터 14일 × 채널 = 컨텍스트 윈도우 내).
결정 게이트
1주차 끝운영 이상 리포트가 매일 자동으로 도는가. 여기까지가 그 자체로 제출 가능한 완성품이다.

✓ pass → 그대로 멈춰도 완결. 더 키우고 싶으면 2주차(권고가 맞았는지 확인)로 진행.

2주차 끝지난 권고가 실제로 맞았는지 확인되고 운영자 신뢰도가 붙는가.

✓ pass → 여기서 멈춰도 완결. 더 키우면 3주차(이상 알림 자동화)로 진행.

재사용 레이어 · 코어 70% / 도메인 30%
core (재사용 가능)
  • Zod 스키마 강제 + parse 검증 파이프라인
  • bootstrap Cohen’s κ CI / Brier score / Platt scaling 계산기
  • LLM-as-judge 인과 단정 가드 + 토큰 매칭
  • 일일 리포트 봇(FastAPI + Slack Webhook)
  • 이상·권고 적중률 대시보드(Next.js)
  • 인간 spot check 5% 자동 샘플러
domain (교체 대상)
  • orders_daily / inventory_snapshot / channel_spend 테이블
  • 이커머스 운영자 페르소나 라벨 가이드
  • 이상 유형·권고 액션 로직
출력 스키마 · ops_insight_output

1) 이상 카드(해석·근거 지표·완곡 표현), 2) 권고 액션 3건 + 예상 효과 + 확신도, 3) 다음 기간 실측치로 적중 여부 검증. 권고→확인 한 주기를 한 스키마에 담음.

schema (JSON Schema)
z.object({ period: z.string(), insights: z.array(z.object({ insight_id: z.string(), headline: z.string().min(10), interpretation: z.string().min(20), evidence_metrics: z.array(z.object({ name: z.string(), value: z.union([z.number(), z.string()]) })).min(1), hedge: z.string().min(8).nullable() })).min(3).max(5), actions: z.array(z.object({ target: z.string(), reason: z.string().min(20), expected_effect: z.string(), confidence: z.enum(["low","mid","high"]) })).min(3).max(3), verification: z.object({ prior_period: z.string(), hit_rate: z.number(), hits: z.array(z.object({ target: z.string(), predicted: z.string(), actual: z.string(), hit: z.boolean() })) }).nullable() })
모범 출력 (2)
[
  {
    "period": "2026-05-06",
    "insights": [
      {
        "insight_id": "ins_0506_01",
        "headline": "쿠팡 콜드브루 매출 급감",
        "interpretation": "쿠팡 콜드브루 주문 0건 — 평소 210건 대비 전멸. 광고비는 그대로 집행. 품절 또는 노출 차단 의심.",
        "evidence_metrics": [
          {
            "name": "orders",
            "value": 0
          },
          {
            "name": "prev_avg_orders",
            "value": 210
          },
          {
            "name": "ad_spend_krw",
            "value": 500000
          }
        ],
        "hedge": "표본 1일 — 노출 차단 여부는 채널 콘솔 확인 필요."
      },
      {
        "insight_id": "ins_0506_02",
        "headline": "콜드브루 리뷰 평점 하락",
        "interpretation": "스마트스토어 콜드브루 평점 4.5→3.1. ‘배송 지연’ 키워드 동행.",
        "evidence_metrics": [
          {
            "name": "rating_1to5",
            "value": 3.1
          },
          {
            "name": "neg_keyword",
            "value": "배송 지연"
          }
        ],
        "hedge": "리뷰 표본 소수 — 추세 단정 어려움."
      },
      {
        "insight_id": "ins_0506_03",
        "headline": "원두 자체몰 안정 유지",
        "interpretation": "원두 200g 자체몰 주문·평점 안정. 광고비 미연동이라 ROAS 산출 불가.",
        "evidence_metrics": [
          {
            "name": "orders",
            "value": 90
          },
          {
            "name": "ad_spend_krw",
            "value": "null"
          }
        ],
        "hedge": "광고비 결측으로 효율 비교 보류."
      }
    ],
    "actions": [
      {
        "target": "쿠팡 콜드브루",
        "reason": "주문 0건 + 광고비 집행 중 — 품절/노출 상태를 즉시 점검",
        "expected_effect": "노출 복구 시 주문 회복",
        "confidence": "high"
      },
      {
        "target": "콜드브루 배송",
        "reason": "리뷰 ‘배송 지연’ 급증 — 물류 SLA 점검",
        "expected_effect": "평점 회복",
        "confidence": "mid"
      },
      {
        "target": "원두 광고 연동",
        "reason": "광고비 미연동으로 효율 측정 불가 — 트래킹 연결",
        "expected_effect": "ROAS 가시화",
        "confidence": "mid"
      }
    ],
    "verification": null
  },
  {
    "period": "2026-05-08",
    "insights": [
      {
        "insight_id": "ins_0508_01",
        "headline": "스마트스토어 콜드브루 급증",
        "interpretation": "주문 610건 — 평소 2배. 평점 4.7 동반, 자연 수요로 보임.",
        "evidence_metrics": [
          {
            "name": "orders",
            "value": 610
          },
          {
            "name": "rating_1to5",
            "value": 4.7
          }
        ],
        "hedge": "프로모션 여부 미확인 — 단발 가능성."
      }
    ],
    "actions": [
      {
        "target": "콜드브루 재고",
        "reason": "급증 지속 시 품절 위험 — 발주 선제",
        "expected_effect": "품절 방지",
        "confidence": "high"
      },
      {
        "target": "쿠팡 콜드브루",
        "reason": "전일 0건 후 회복 확인 필요",
        "expected_effect": "회복 확인",
        "confidence": "mid"
      },
      {
        "target": "드립백 신상품",
        "reason": "sku_id 미등록 — 마스터 등록해 추적 시작",
        "expected_effect": "추적 가능",
        "confidence": "high"
      }
    ],
    "verification": {
      "prior_period": "2026-05-06 권고",
      "hit_rate": 0.67,
      "hits": [
        {
          "target": "쿠팡 콜드브루",
          "predicted": "노출 복구 시 회복",
          "actual": "5/8 회복",
          "hit": true
        },
        {
          "target": "콜드브루 배송",
          "predicted": "평점 회복",
          "actual": "여전히 2점대",
          "hit": false
        },
        {
          "target": "원두 광고 연동",
          "predicted": "ROAS 가시화",
          "actual": "연동 완료",
          "hit": true
        }
      ]
    }
  }
]
검증 노트 (자동 vs 수동)

자동: (1) Zod parse, (2) evidence_metrics.name 이 입력 스키마 실제 메트릭 이름, (3) 인과 단정 토큰 검출 + LLM-as-judge 평가, (4) 권고 적중률 자동 계산. 수동: 운영자 2명 비동기 라벨 → bootstrap Cohen’s κ CI 하한 ≥ 0.6, judge 인간 spot check 5%. verification 은 차기간 실측치 자동 조인.