칼라비는 커머스 운영의 CS·챗봇을 다루는 회사라, CS 문의를 분류하고 응답 초안을 만드는 이 도구는 칼라비의 실제 문의 로그가 있어야 분류를 검증한다.
'커머스 운영, 챗봇' 직무. CS 문의 분류·응답이 커머스 운영의 핵심.
'AI-Native Product Engineer'. 문의 분류+응답 초안이 AI-native 운영의 1주 단위.
CS 응대 자동화가 커머스 운영 효율의 직접 가치.
커머스 CS 문의를 받아 주문·배송·환불 유형으로 분류하고, 주문 데이터 근거와 함께 응답 초안과 미해결 이슈를 짚는 1주 포트폴리오.
칼라비 PE. CS 문의를 상담사가 일일이 분류·응답하던 일을, 자동 분류 + 응답 초안 도구로 옮기고 싶은 사람.
문의에 주문 컨텍스트를 붙이면, LLM 이 (a) 문의를 유형별로 분류하고 (b) 주문 근거와 함께 응답 초안·미해결을 제시한다.
CS 문의를 받아 유형별로 분류하고 주문 근거와 함께 응답 초안·미해결을 짚는 동작하는 도구.
상담사 라벨과 분류 일치도(κ)·응답 채택률을 보여주는 대시보드.
단순 문의는 자동 응답, 복잡한 건은 담당자에게 라우팅하는 단계.
CS 문의를 넣으면 유형 분류·응답 초안·미해결이 주문 근거와 함께 나오는 걸 시연한다
응답 근거로 인용한 주문 정보가 실제 주문에 존재하는 비율 100%
측정: 근거 일치 규칙, 표본: 문의 200건
일부러 만든 중의·결측·미등록 주문 문의 30종을 넣어도 분류가 멈추지 않고 처리되는 걸 시연한다
위 수치는 더미데이터 자가채점이며, 실제 CS 분류 정확도는 칼라비 실데이터 + 실 검수자가 있어야 측정 가능. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만든다.
이건 고객·실데이터 없이 혼자 만든 포트폴리오라 모든 수치는 합성 데이터 자가채점이다. 면접에서 '데모 동작 + 실검증 준비 상태'로 솔직히 설명하는 게 오히려 신뢰를 준다
정답을 내가 만들었으니 잘 맞는 게 당연. 그래서 결측·경계·미등록·표기 흔들림 케이스를 더미에 일부러 섞어 쉬운 문제만 푸는 게 아님을 보여준다
오응답 위험: 환불·결제 같은 민감 문의는 자동 응답하지 않고 상담사 검토 큐로 보낸다
실제 도입 시 달라지는 것: 실 문의 분포·주문 시스템이 더미와 다르므로 유형 사전·연동을 실데이터로 맞춰야 한다(도입 단계 과제)
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
커머스 CS 문의·주문을 묶어 분류·응답 입력으로 쓴다
| ticket_id | customer_raw | customer_id | text | issue_type | order_id | resolved |
|---|---|---|---|---|---|---|
| CS900 | OO고객(구) | — | (문의 누락) | none | — | — |
| CS901 | 고객0 | c0 | 환불 처리해주세요 | refund | O0 | false |
| CS902 | 중의문의 | c2 | 그거요 | none | — | — |
| CS903 | 미등록주문 | — | 주문 어디갔어요 | order | O999 | — |
| CS000 | 고객0 | c0 | 배송이 안 와요 (0) | delivery | O0 | false |
z.object({ ticket_id: z.string(), customer_raw: z.string(), customer_id: z.string().nullable(), text: z.string(), issue_type: z.enum(['order','delivery','refund','none']), order_id: z.string().nullable(), resolved: z.boolean().nullable() }). 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: text 누락·중의('그거요'), issue_type none, order_id null/미등록(orphan), resolved null, customer_raw 표기 흔들림. 형식 깨뜨리기 시도 3건도 별도로.z.object({ ticket_id: z.string(), customer_raw: z.string(), customer_id: z.string().nullable(), text: z.string(), issue_type: z.enum(['order','delivery','refund','none']), order_id: z.string().nullable(), resolved: z.boolean().nullable() })| Python | 문의 ingest + 분류 + eval(공고 스택 미명시 → 도메인 기반 추론) |
| TypeScript | 대시보드 렌더 + Zod 검증 |
| React | CS 대응 대시보드 |
| Node.js | 분류·응답 API |
| PostgreSQL | 문의·주문 단일 진실원 |
| LLM | 유형 분류 + 응답 초안 생성 |
✓ pass → 그대로 멈춰도 완성품. 더 키우려면 2주차(분류·응답 검증)로.
✓ pass → 여기서 멈춰도 완결. 더 키우려면 3주차(자동 응답·라우팅)로.
CS 분류 + 응답 초안
z.object({ ticket_id: z.string(), issue_type: z.string(), draft: z.string(), order_ref: z.string().nullable(), needs_agent: z.boolean() })[
{
"ticket_id": "CS000",
"issue_type": "delivery",
"draft": "주문 O0은 오늘 출고 예정입니다",
"order_ref": "O0",
"needs_agent": false
},
{
"ticket_id": "CS901",
"issue_type": "refund",
"draft": "환불 문의 확인 중입니다(상담사 검토)",
"order_ref": "O0",
"needs_agent": true
},
{
"ticket_id": "CS902",
"issue_type": "none",
"draft": "문의 내용을 한 번 더 알려주시겠어요?",
"order_ref": null,
"needs_agent": true
}
]order_ref 존재·issue_type 형식은 자동 검증, draft 적절성·needs_agent 는 상담사/judge 검증.