모두의포트폴리오
PE · FDE 직군을 위한 포트폴리오 밀키트
예전 판입니다 (1판)이 문서는 2026-08-02 에 새 판으로 개정됐습니다. 올리브영을 파견 고객사처럼 다루던 시점을 전사 AI 조직이 사내 현업을 상대하는 시점으로 바로잡고, 산출물을 상담 콘솔에서 질문을 읽기 전용 SQL 로 바꿔 실행하는 CLI로 좁혔습니다.최신 판 보기 →
경력씨제이올리브영 · Forward Deployed AI Engineer

매장·온라인 운영 데이터에 고객 문의 자동 응대 AI를 배포하는 현장 PoC

씨제이올리브영 공고에서 뽑은 세 가지 시그널.

올리브영은 20년 이상 축적된 오프라인·온라인을 잇는 옴니채널 데이터를 가진 곳이라, 매장·온라인 문의 응대를 현장에 배포하는 이 도구는 올리브영의 매장 운영 맥락이 있어야 실제 현장 문제를 푼다.

01

현장 문제→AI 솔루션 배포

'현장 문제를 직접 이해하고 AI 솔루션을 설계부터 배포'. FDE 의 핵심이 현장 배포.

현장AI배포
02

옴니채널 데이터

'온·오프 경계를 허무는 End-to-End 플랫폼'. 매장·온라인 데이터 통합이 토대.

옴니채널플랫폼데이터
03

전사 AI Transformation

'전사 AI Transformation 수행'. 반복 문의 자동화가 AX 의 1주 단위.

AITransformation솔루션

포트폴리오 요약

매장·온라인 CS 문의와 운영 데이터를 받아 반복 문의를 근거(상품·정책 인용)와 함께 자동 응대하고, 현장 배포 가능한 형태로 만드는 1주 FDE PoC.

고객 정의

올리브영 FDE. 매장·온라인 반복 문의를 상담사가 처리하던 일을, 근거 기반 자동 응대로 현장에 배포하고 싶은 사람.

고민 지점

문의에 상품·정책 컨텍스트를 붙이면, LLM 이 (a) 반복 문의를 근거와 함께 자동 응대하고 (b) 불확실하면 상담사로 에스컬레이션한다.

주차별 일정

1주차여기까지로 완성

문의 자동 응대 + 근거

CS 문의를 받아 상품·정책 근거와 함께 자동 응대하고 불확실하면 상담사로 보내는 동작하는 도구.

  1. 1일 · 문의·상품·정책 스키마 설계 + 응대·에스컬레이션 규칙 정의
  2. 2-3일 · 데이터 ingest(Python) + RAG 근거 + 응대 프롬프트 v1 + Zod 검증
  3. 4일 · 자동 응대 + 근거 인용 + 불확실 에스컬레이션
  4. 5일 · 상담 콘솔(TS)응대·근거·에스컬레이션 한 화면
  5. 6일 · 일부러 만든 결측·모호·미등록 상품 문의 30종으로 응대가 안 깨지는지 점검 + 5% 사람 확인
  6. 7일 · 7일치 시연 영상 + 직접 만든 정답과 비교한 기준선여기까지가 1주차 완성품
2주차선택 성장

응대 정확도 검증

상담사 라벨과 자동 응대 정확도 일치도(κ)를 재고, 오답 차단율을 보여주는 대시보드.

  1. 8-9일 · 상담사 라벨과 자동 응대 정확도 일치도 측정(Cohen’s κ) + 오답 차단율
  2. 10-11일 · 응대 톤·근거 인용 정확도 점검 + 에스컬레이션 임계 튜닝
3주차선택 성장

매장 채널 확장

매장 키오스크·온라인 등 여러 채널로 같은 응대 엔진을 확장 배포하는 단계.

  1. 12-14일 · 매장 키오스크·온라인 등 채널 확장 배포
  2. 15일 · 멀티 채널 배포 시연 + 3주 통합 영상

데모 · 측정 지표

01

문의를 넣으면 상품·정책 근거와 함께 자동 응대가 나오고 불확실하면 에스컬레이션되는 걸 시연한다

02

응대 근거로 인용한 상품·정책이 실제 데이터에 존재하는 비율 100%. 없으면 환각 차단

측정: 인용 일치 규칙, 표본: 응대 200건

03

일부러 만든 모호·결측·미등록 상품 문의 30종을 넣어도 응대가 멈추지 않고 처리되는 걸 시연한다

정직 경계선

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

위 수치는 더미데이터 자가채점이며, 실제 응대 정확도는 올리브영 실데이터 + 실 검수자가 있어야 측정 가능. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만든다.

미리 알아둬야 할 것들

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

정답을 내가 만들었으니 잘 맞는 게 당연. 그래서 결측·경계·미등록·표기 흔들림 케이스를 더미에 일부러 섞어 쉬운 문제만 푸는 게 아님을 보여준다

오응답 위험: 환불·개인정보 같은 민감 문의는 자동 응대하지 않고 상담사로 에스컬레이션한다

실제 도입 시 달라지는 것: 실 상품·정책·문의 분포가 더미와 다르므로 RAG·규칙을 실데이터로 맞춰야 한다(도입 단계 과제)

더미 데이터

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

store_ticketsTABLE· 12 rows

매장·온라인 문의·상품을 묶어 응대 입력으로 쓴다

② store_tickets.seed.json 다운로드
① 인라인 샘플 (프리뷰 5 / 12)
ticket_idchanneltextsku_rawsku_idsensitive
T900온라인(문의 누락)———
T901매장환불해주세요상품0sku0true
T902앱그거 있어요?——false
T903온라인재고 문의미등록상품——
T000매장이 제품 재고 있나요? (0)상품0sku0false
③ 증강 프롬프트 (본인 LLM 에 붙여서 N 배 늘리기)
z.object({ ticket_id: z.string(), channel: z.string(), text: z.string(), sku_raw: z.string().nullable(), sku_id: z.string().nullable(), sensitive: z.boolean().nullable() }). 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: text 누락·모호('그거'), sku_id null 미등록, sensitive null/True(민감 문의), sku_raw 표기 흔들림. 형식 깨뜨리기 시도 3건도 별도로.
schema (3 층의 단일 출처)
z.object({ ticket_id: z.string(), channel: z.string(), text: z.string(), sku_raw: z.string().nullable(), sku_id: z.string().nullable(), sensitive: z.boolean().nullable() })

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

기술 스택 매핑
Python문의·상품 데이터 ingest + 응대 + eval
TypeScript상담 콘솔 렌더 + Zod 검증
JavaScript프론트 응대 위젯
Java상품·정책 API 연동
Go고트래픽 응대 게이트웨이
Kotlin매장 앱 응대 연동
LLM 선택
model
Claude Sonnet(응대 생성) + RAG(상품·정책 근거) + 규칙 기반 에스컬레이션
prompt
상품·정책 근거 인용 강제 + 불확실 시 에스컬레이션 가드 + Zod schema 강제
rationale
반복 문의는 RAG+LLM, 불확실·민감 문의는 규칙으로 상담사 에스컬레이션.
결정 게이트
1주차 끝1주차 완성품이 자동으로 도는가. 여기까지가 그 자체로 제출 가능한 완성품.

✓ pass → 그대로 멈춰도 완성품. 더 키우려면 2주차(응대 정확도 검증)로.

2주차 끝응대 정확도 검증 결과가 나오는가.

✓ pass → 여기서 멈춰도 완결. 더 키우려면 3주차(매장 채널 확장)로.

재사용 레이어 · 코어 70% / 도메인 30%
core (재사용 가능)
  • 상품·정책 RAG 근거 인용 응대 파이프라인
  • 불확실·민감 문의 에스컬레이션 가드
  • Zod 스키마 강제 검증
  • 상담 콘솔(TS)
  • 5% 인간 spot-check 샘플러
domain (교체 대상)
  • 리테일 상품·정책·문의 스키마
  • 옴니채널 CS 유형 사전
  • 상품 표기 정규화
출력 스키마 · reply_output

자동 응대 + 근거

schema (JSON Schema)
z.object({ ticket_id: z.string(), reply: z.string(), citations: z.array(z.object({ source: z.string(), quote: z.string() })), escalate: z.boolean() })
모범 출력 (3)
[
  {
    "ticket_id": "T000",
    "reply": "해당 상품 매장 재고가 있습니다",
    "citations": [
      {
        "source": "inventory",
        "quote": "재고 12"
      }
    ],
    "escalate": false
  },
  {
    "ticket_id": "T901",
    "reply": "환불은 상담사가 도와드릴게요",
    "citations": [],
    "escalate": true
  },
  {
    "ticket_id": "T902",
    "reply": "어떤 상품인지 알려주시겠어요?",
    "citations": [],
    "escalate": false
  }
]
검증 노트 (자동 vs 수동)

citations 존재·escalate 규칙은 자동 검증, reply 적절성은 상담사/judge 검증.