올리브영은 20년 이상 축적된 오프라인·온라인을 잇는 옴니채널 데이터를 가진 곳이라, 매장·온라인 문의 응대를 현장에 배포하는 이 도구는 올리브영의 매장 운영 맥락이 있어야 실제 현장 문제를 푼다.
'현장 문제를 직접 이해하고 AI 솔루션을 설계부터 배포'. FDE 의 핵심이 현장 배포.
'온·오프 경계를 허무는 End-to-End 플랫폼'. 매장·온라인 데이터 통합이 토대.
'전사 AI Transformation 수행'. 반복 문의 자동화가 AX 의 1주 단위.
매장·온라인 CS 문의와 운영 데이터를 받아 반복 문의를 근거(상품·정책 인용)와 함께 자동 응대하고, 현장 배포 가능한 형태로 만드는 1주 FDE PoC.
올리브영 FDE. 매장·온라인 반복 문의를 상담사가 처리하던 일을, 근거 기반 자동 응대로 현장에 배포하고 싶은 사람.
문의에 상품·정책 컨텍스트를 붙이면, LLM 이 (a) 반복 문의를 근거와 함께 자동 응대하고 (b) 불확실하면 상담사로 에스컬레이션한다.
CS 문의를 받아 상품·정책 근거와 함께 자동 응대하고 불확실하면 상담사로 보내는 동작하는 도구.
상담사 라벨과 자동 응대 정확도 일치도(κ)를 재고, 오답 차단율을 보여주는 대시보드.
매장 키오스크·온라인 등 여러 채널로 같은 응대 엔진을 확장 배포하는 단계.
문의를 넣으면 상품·정책 근거와 함께 자동 응대가 나오고 불확실하면 에스컬레이션되는 걸 시연한다
응대 근거로 인용한 상품·정책이 실제 데이터에 존재하는 비율 100%. 없으면 환각 차단
측정: 인용 일치 규칙, 표본: 응대 200건
일부러 만든 모호·결측·미등록 상품 문의 30종을 넣어도 응대가 멈추지 않고 처리되는 걸 시연한다
위 수치는 더미데이터 자가채점이며, 실제 응대 정확도는 올리브영 실데이터 + 실 검수자가 있어야 측정 가능. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만든다.
이건 고객·실데이터 없이 혼자 만든 포트폴리오라 모든 수치는 합성 데이터 자가채점이다. 면접에서 '데모 동작 + 실검증 준비 상태'로 솔직히 설명하는 게 오히려 신뢰를 준다
정답을 내가 만들었으니 잘 맞는 게 당연. 그래서 결측·경계·미등록·표기 흔들림 케이스를 더미에 일부러 섞어 쉬운 문제만 푸는 게 아님을 보여준다
오응답 위험: 환불·개인정보 같은 민감 문의는 자동 응대하지 않고 상담사로 에스컬레이션한다
실제 도입 시 달라지는 것: 실 상품·정책·문의 분포가 더미와 다르므로 RAG·규칙을 실데이터로 맞춰야 한다(도입 단계 과제)
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
매장·온라인 문의·상품을 묶어 응대 입력으로 쓴다
| ticket_id | channel | text | sku_raw | sku_id | sensitive |
|---|---|---|---|---|---|
| T900 | 온라인 | (문의 누락) | — | — | — |
| T901 | 매장 | 환불해주세요 | 상품0 | sku0 | true |
| T902 | 앱 | 그거 있어요? | — | — | false |
| T903 | 온라인 | 재고 문의 | 미등록상품 | — | — |
| T000 | 매장 | 이 제품 재고 있나요? (0) | 상품0 | sku0 | false |
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건도 별도로.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 | 매장 앱 응대 연동 |
✓ pass → 그대로 멈춰도 완성품. 더 키우려면 2주차(응대 정확도 검증)로.
✓ pass → 여기서 멈춰도 완결. 더 키우려면 3주차(매장 채널 확장)로.
자동 응대 + 근거
z.object({ ticket_id: z.string(), reply: z.string(), citations: z.array(z.object({ source: z.string(), quote: z.string() })), escalate: z.boolean() })[
{
"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
}
]citations 존재·escalate 규칙은 자동 검증, reply 적절성은 상담사/judge 검증.