← 마스터맵
💬 봉이 채팅형 무인 고객센터 — 통신3사
SKT·KT·LG U+ 공식 데이터 · 상담사 개입 없이 채팅 완결 · RAG 기반 · 2026-06~07
✅
목적: 전화 문의를
채팅 안에서 상담사 개입 없이 모두 해결. 통신3사 공식 데이터로 요금제·결합·부가서비스·FAQ를 무인 응대. 로밍 상담은
여행 eSIM(14번)으로 크로스셀.
0 · 왜 채팅형 고객센터인가 (배경·목적)
배경 — 통신 상담이 봉이 최다 문의
봉이의 본질은 N채널 유입(웹·앱·전화·매장)을 전화번호 기준으로 통합하는 것. 그중 통신 상담(요금제·결합·부가서비스·로밍)이 가장 빈도 높은 문의다. 현재는 상담사가 전화로 일일이 응대 → 인건비·대기시간·업무시간(야간 불가)의 구조적 한계.
목적 — 전화 문의를 채팅에서 무인 완결
| 문제(As-Is) | 해결(To-Be) |
| 전화 대기·업무시간 한정 | 24시간·즉시·대기0 채팅 응대 |
| 반복 문의가 상담사 시간 소모 | 요금비교·할인·조건은 무인 → 상담사는 계약·판매(고부가)에 집중 |
| 상담사별 안내 편차·오안내 리스크 | 통신3사 공식 데이터(환각0)로 일관·정확 |
| 로밍 문의가 매출로 안 이어짐 | 로밍 상담 → 여행 eSIM 크로스셀(14번) 수익 연결 |
봉이 개발범위는 원래 CRM(어드민)만이지만(feedback_crm_only), 이 채널은 고객 대면 무인센터라 예외로 구축 — N채널 통합(project_bongi_unified_customer)을 보완한다.
1 · 구축된 데이터 (cs 스키마 · dev)
✅ 통신3사 데이터 구축 완료 — 공식 페이지 직접 크롤 + 스파이더 거미 검증(사실왜곡 금지, 🔴 0).
| 테이블 | 건수 | 내용 | 출처 |
| cs.plans | 72 | 요금제(KT38·SKT16·LGU18)·약정가·데이터 | 3사 공식(product.kt·tworld·lguplus) |
| cs.bundles | 24 | 결합상품·할인tier·종료일 | 3사 공식 |
| cs.faqs | 69 | 17토픽 FAQ·answer_type | 3사 공식 FAQ |
| cs.vas_products | 157 | 부가서비스(로밍9·데이터·안심·통화·구독) | 공식 BFF API(LGU 136 전수) |
| cs.carrier_links | — | 연락처·딥링크·멤버십·부가서비스 redirect | 3사 공식 |
품질: carrier 일관·중복0·노이즈0·약정가 정합·환각0. WebSearch 적재 금지, 공식 소스만(feedback_official_source_only). 부가서비스 WebSearch 7건 오류를 공식 BFF로 적발·교체한 이력.
테이블별 컬럼 구성 (파싱 대상 = 무인 응대 필드)
| 테이블 | 핵심 컬럼 | 응대 역할 |
| plans | carrier · plan_name · network(5G/LTE) · monthly_fee · discount_fee(약정가=×0.75) · data_amount · data_daily · call_amount · message · age_target · commit_type · ott_benefits · conditions · benefits · embedding | 요금제 비교·안내 |
| bundles | carrier · bundle_name · bundle_type · components · discount_rule · discount_tiers(jsonb {amount,unit:won/percent}) · conditions · guide_script · sales_status · sales_end_date | 결합 할인·종료 안내 |
| faqs | topic_code(17토픽) · question · question_variants · answer · answer_detail · answer_type(info/redirect) · guide_script · policy · confidence · embedding · last_verified | 상담 문의 응대 |
| vas_products | carrier · category(roaming·data·safety·call·content·pack·membership) · name · fee_type · fee · data_amount · region | 부가서비스 안내 |
| carrier_links | carrier · kind · label · url · phone · note | redirect 딥링크·대표번호 |
| crawl_raw | batch_id · carrier · source_url · kind · raw | 크롤 원본(파싱 전 보존) |
| topics | code · name · parent_code · sort | 17 상담 토픽 분류 |
공통 메타: 전 테이블에 source_url(공식 출처)·crawled_at·published_at·is_active. staging→publish 게이트로 미검증 데이터는 노출 안 됨. plans·faqs엔 embedding vector(384) — RAG 검색용.
🕷️ 데이터 파싱·검증 파이프라인 (cs-crawler)
공식 페이지→Playwright 크롤→crawl_raw 원본→파싱→staging→🕷️거미 검증→publish
크롤 파싱 함정 · 대응 (실전 학습 corpus)
| 함정 | 증상 | 대응 (cs-crawler/lib) |
| SPA 가격(LG U+) | 가격 JS 렌더, 빈 추출 → "크롤 불가" 오결론 | removePopups 후 본문 "월정액 X원 | 약정 할인 시 Y원"(대기 3.5s+) |
| SKT 봇 throttle | bodyLen 0 간헐 발생 | gotoRetry(minLen 검사+재시도 대기 증가) |
| LG U+ 팝업 | "오늘하루그만보기"만 10자 추출 | [class*=popup/layer/dim] 제거 |
| KT OTT 선택형 | table.pduct-tbl-plan 0행 | 표 없으면 본문 정규식 fallback(초이스 90,000 복구) |
| 부가서비스 전수 | SPA 목록 상품링크 크롤 불가 | BFF API 직접호출 — page.on('response') 탐지 → node fetch(LG U+ addon 198건 전수) |
| 이름 prefix | "유플러스 데이터플랜MAX" | stripCarrierPrefix |
| 종료 상품 | 구상품 혼입 | detectSalesStatus + 5년 isStale(신규가입 종료 5년내=보존, 이전=제거) |
| %↔원 혼재 | discount_tiers 단위 불일치 | {amount, unit:"won"|"percent"} 명시 |
answer_type 파싱 규칙
info(DB에 답 있는 정적 문의: 요금·할인·조건) → 즉시 직접 답변. vs redirect(실시간·개인정보: 요금조회·명의·해지) → 공식 딥링크 + 대표번호(carrier_links). 파싱 시 질문 유형으로 분류·저장.
검증 — 스파이더 거미 (사실왜곡 금지)
🕷️ 제1법칙: 라이브 공식 페이지 대조로만 판정. WebSearch 비교블로그 적재 금지. 요금·할인·조건·종료일 불일치·환각 = 🔴 즉시 수정 → 🔴 0 될 때까지 재직조 루프. 잡은 버그는 corpus에 증류(다음 라운드 0라운드에 탐지).
2 · RAG 아키텍처 (무인 응대)
고객 질문→e5 임베딩(384d)→하이브리드 검색(topic+의미)→answer_type 분기→답변
answer_type = info
DB에 답이 있는 정적 문의(요금·데이터·할인·조건) → 즉시 직접 답변.
answer_type = redirect
실시간·개인정보(요금조회·명의·해지) → 공식 딥링크 + 대표번호 안내(carrier_links).
⚠️ 현재 faqs.embedding = 0건(데이터 재적재로 초기화) → RAG 구동 전 임베딩 재생성 필요(scripts/embed-faqs.mjs, Xenova multilingual-e5-small, 로컬·무키).
3 · 백엔드
// routes/cs-chat.js
POST /api/cs/chat // 질문→검색→답변
1) embed(query) // e5 query:
2) hybrid(topic+vector) // pgvector
3) answer_type 분기
4) Claude 요약답변 + 출처
pgvector 0.8 · embedding vector(384) · cs 스키마(dev sesgd…)
4 · 프론트 (챗봇 위젯)
5만원대 5G 요금제 비교해줘
KT 5G슬림·SKT 슬림·LGU 데이터플랜 모두 55,000원(약정 41,250원). SKT 슬림이 데이터 1GB 많아요(15GB).
일본 로밍 얼마야?
baro 8GB 39,000원(30일). 근데 5일 여행이면 여행 eSIM 16,100원이 더 저렴 👉
🖼️ 와이어프레임
5 · 관련 문서
6 · 남은 개발 (데이터는 완료)
| 단계 | 작업 | 상태 |
| 데이터 | 통신3사 322건 공식 크롤·거미검증 | 완료 |
| 임베딩 | faqs·plans e5 임베딩 재생성 | 필요 |
| 백엔드 | routes/cs-chat.js + 하이브리드 검색 RPC | 개발 |
| 프론트 | 챗봇 위젯(서비스 임베드) | 개발 |
| 연동 | cs 스키마 dev→live 이전 + 로밍→eSIM 크로스셀 | 개발 |
✅ 핵심 자산(공식 데이터 322건)은 확보 완료 — 임베딩+챗봇 개발만 남음.