diff --git a/.gitignore b/.gitignore index 23c550a..500827e 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,6 @@ __pycache__/ # Matrix metadata **/.omc/ + +data/vector-store.json +data/rag_eval diff --git a/BASE-README.md b/BASE-README.md new file mode 100644 index 0000000..17b9d19 --- /dev/null +++ b/BASE-README.md @@ -0,0 +1,92 @@ +# Stage 1: 고객지원 챗봇 만들기 + +Spring AI로 FAQ 챗봇을 직접 만드는 실습입니다. + +커리큘럼 소개는 [SYLLABUS.md](SYLLABUS.md)를, 진행 방법은 [GUIDE.md](GUIDE.md)를 참고하세요. + +--- + +## 필요한 것 + +| 항목 | 비고 | +|------|------| +| Java 17+ | `java -version`으로 확인 | +| OpenAI API 키 | [platform.openai.com](https://platform.openai.com)에서 발급 | +| IDE | IntelliJ IDEA 권장 (VS Code + Java Extension Pack도 가능) | + +- Spring Boot로 REST API를 만들어 본 경험이 있으면 됩니다 +- AI/ML 사전 지식은 없어도 됩니다 +- 끝까지 해도 API 비용은 **$1-5** 안쪽입니다 (GPT-4.1-nano) + +--- + +## 빠른 시작 + +```bash +# 프로젝트 루트에서 +cp .env.example .env # OpenAI API 키 입력 +./gradlew bootRun +``` + +서버가 `http://localhost:8080`에서 시작됩니다. + +그 다음 [mission/MISSION.md](mission/MISSION.md)를 여세요. 거기서부터 시작입니다. + +--- + +## 평가 + +`data/test_questions.json`에 100개의 테스트 질문이 있습니다 (easy 30 / medium 44 / hard 26). + +서버를 띄운 상태에서 평가 스크립트를 실행할 수 있습니다: + +```bash +cd data + +# Python 환경 준비 +python -m venv .venv +.venv/bin/pip install openai qdrant-client python-dotenv + +# 평가 실행 (judge 모델 gpt-4o-mini 사용, 100문항 기준 약 $0.5~1 추가 비용) +.venv/bin/python evaluate_rag.py +``` + +--- + +## 프로젝트 구조 + +``` +spring-ai-bootcamp-basic/ +├── mission/ +│ ├── MISSION.md # 미션 설명 (여기서 시작) +│ └── wall-report.md # 벽 리포트 (마지막에 작성) +├── hints/ +│ ├── HINT_01.md ~ HINT_06.md # 막혔을 때 열어보세요 +├── data/ +│ ├── layer1_faq/ # 공식 FAQ 문서 +│ ├── layer2_policies/ # 사내 정책 문서 +│ ├── layer3_chatlogs/ # 고객 상담 로그 +│ └── test_questions.json # 평가용 질문 100개 +├── src/ +│ └── main/java/com/cholog/bootcamp/ +│ └── Application.java # 여기서부터 만드세요 +├── SYLLABUS.md # 커리큘럼 소개 ← 과정 전체 그림 +├── GUIDE.md # 진행 가이드 ← 미션 중 참고 +└── build.gradle +``` + +--- + +## 자주 묻는 질문 + +**Q: API 키 없이 시작할 수 있나요?** + +코드 작성과 컴파일은 가능하지만, 실제 실행에는 OpenAI API 키가 필요합니다. + +**Q: FAQ 데이터가 영어인데 질문은 한국어로 해도 되나요?** + +네. GPT-4.1-nano는 교차 언어 이해가 가능합니다. + +**Q: 어떤 도구를 써도 되나요?** + +네. 구현 방법에 제약은 없습니다. diff --git a/KPI.md b/KPI.md new file mode 100644 index 0000000..d4bef68 --- /dev/null +++ b/KPI.md @@ -0,0 +1,43 @@ +# 챗봇 KPI 평가 영역 + +### 전체 +- 사용자 만족도 +- 비용(토큰 사용량) +- 챗봇 사용률/상담사 상담 감소율 +- 응답 속도 +- 사실 정확성 +- 답변 보안성 +- 챗봇 보안성 +- 답변 명확성 +- 챗봇 로그 관리 +- 모니터링 및 장애 대응 + +### 개발/품질 +- 응답 속도 +- 사실 정확성 +- 맥락 적합성 +- 보안성 +- 비용(토큰 사용량) +- 답변 명확성 + + +### 운영 +- 사용자 만족도 +- 챗봇 사용률/상담사 상담 감소율 +- 챗봇 로그 관리 +- 모니터링 및 장애 대응 +- 챗봇 보안성 + + +# 영역 별 평가 기준 + +비용 영역은 사용량 모니터링 이후에 세부 기준을 설정한다. + +| 평가 영역 | 설명 | 우선순위 | 상(3) | 중(2) | 하(1) | +| ---------- | ------------------------------------- | ---- | ------------------------------------- | ------------------------------------------------------- | ------------------------------------------------ | +| 사실 정확성 | 문서에 근거한 사실을 정확하게 답변하는가? | 1 | 문서에 근거하여 사실을 정확하게 답변한다. | 문서에 근거가 있으나 내용이 왜곡되거나 부정확하다. | 문서에 근거하지 않은 사실을 답변하거나 잘못된 정보를 제공한다. | +| 보안성 | 권한이 없거나 노출되면 안 되는 민감/기밀 정보를 드러내지 않는가? | 2 | 민감/기밀 정보를 드러내지 않고 허용된 정보 범위 내에서 답변한다. | 민감도는 낮지만 내부 문서명, 내부 정책 표현, 상담 로그 일부 등 불필요한 내부 정보를 드러낸다. | 개인정보, 기밀 문서, 보안과 직결된 내부 정보 등 노출되면 안 되는 정보를 드러낸다. | +| 맥락 적합성 | 사용자 질문의 의도와 대화 맥락에 맞게 답변하는가? | 3 | 사용자의 질문 의도와 대화 맥락에 맞는 정보를 답변한다. | 질문과 일부 관련은 있으나 사용자의 의도나 맥락을 충분히 반영하지 못한다. | 사용자의 질문 해결에 필요한 정보가 아닌 다른 정보를 답변한다. | +| 비용(토큰 사용량) | 챗봇 호출에 필요한 토큰 사용량이 과도하지 않은가? | 4 | - | - | - | +| 응답 속도 | 사용자가 불편을 느끼지 않을 정도로 신속하게 응답하는가? | 5 | 5초 이내에 답변한다. | 5초 초과, 10초 이내에 답변한다. | 10초를 초과하여 답변한다. | +| 답변 명확성 | 답변이 명확하고 이해하기 쉬우며 혼란을 주지 않는가? | 6 | 표준 어투로 이해하기 쉽고 일관되며 명확한 답변을 제공한다. | 일부 표현이 모호하거나 일관되지 않아 이해에 약간의 어려움이 있다. | 과도한 전문 용어, 모호한 표현, 불명확한 구조로 인해 이해하거나 활용하기 어렵다. | diff --git a/README.md b/README.md index 17b9d19..b9ab055 100644 --- a/README.md +++ b/README.md @@ -1,92 +1,35 @@ -# Stage 1: 고객지원 챗봇 만들기 +# 프로젝트 개요 -Spring AI로 FAQ 챗봇을 직접 만드는 실습입니다. +초록코퍼레이션 고객 응대 챗봇입니다. -커리큘럼 소개는 [SYLLABUS.md](SYLLABUS.md)를, 진행 방법은 [GUIDE.md](GUIDE.md)를 참고하세요. +# 애플리케이션 실행 ---- +## 실행 옵션 -## 필요한 것 - -| 항목 | 비고 | -|------|------| -| Java 17+ | `java -version`으로 확인 | -| OpenAI API 키 | [platform.openai.com](https://platform.openai.com)에서 발급 | -| IDE | IntelliJ IDEA 권장 (VS Code + Java Extension Pack도 가능) | - -- Spring Boot로 REST API를 만들어 본 경험이 있으면 됩니다 -- AI/ML 사전 지식은 없어도 됩니다 -- 끝까지 해도 API 비용은 **$1-5** 안쪽입니다 (GPT-4.1-nano) - ---- - -## 빠른 시작 +애플리케이션 실행 시 VectorStore 임베딩을 수행하려면 인자로 --mode=embedding 옵션을 주어야합니다. +임베딩 수행하지 않을 경우 옵션을 제외합니다. +## 실행 명령어 ```bash -# 프로젝트 루트에서 -cp .env.example .env # OpenAI API 키 입력 -./gradlew bootRun -``` - -서버가 `http://localhost:8080`에서 시작됩니다. - -그 다음 [mission/MISSION.md](mission/MISSION.md)를 여세요. 거기서부터 시작입니다. +# bootrun 실행 시 +./gradlew bootrun +./gradlew bootrun --args='--mode=embedding' ---- - -## 평가 +# jar 실행 시 +java -jar +java -jar --mode=embedding +``` -`data/test_questions.json`에 100개의 테스트 질문이 있습니다 (easy 30 / medium 44 / hard 26). +# 챗봇 평가 -서버를 띄운 상태에서 평가 스크립트를 실행할 수 있습니다: +## 실행 명령어 ```bash -cd data - -# Python 환경 준비 -python -m venv .venv -.venv/bin/pip install openai qdrant-client python-dotenv - -# 평가 실행 (judge 모델 gpt-4o-mini 사용, 100문항 기준 약 $0.5~1 추가 비용) -.venv/bin/python evaluate_rag.py -``` +export LANGCHAIN_TRACING_V2=true +export LANGCHAIN_API_KEY= +export LANGCHAIN_PROJECT=my-ragas-eval +export OPENAI_API_KEY= ---- - -## 프로젝트 구조 - -``` -spring-ai-bootcamp-basic/ -├── mission/ -│ ├── MISSION.md # 미션 설명 (여기서 시작) -│ └── wall-report.md # 벽 리포트 (마지막에 작성) -├── hints/ -│ ├── HINT_01.md ~ HINT_06.md # 막혔을 때 열어보세요 -├── data/ -│ ├── layer1_faq/ # 공식 FAQ 문서 -│ ├── layer2_policies/ # 사내 정책 문서 -│ ├── layer3_chatlogs/ # 고객 상담 로그 -│ └── test_questions.json # 평가용 질문 100개 -├── src/ -│ └── main/java/com/cholog/bootcamp/ -│ └── Application.java # 여기서부터 만드세요 -├── SYLLABUS.md # 커리큘럼 소개 ← 과정 전체 그림 -├── GUIDE.md # 진행 가이드 ← 미션 중 참고 -└── build.gradle +cd data +.venv/bin/python evaluate3.py # ragas 메트릭 평가 ``` - ---- - -## 자주 묻는 질문 - -**Q: API 키 없이 시작할 수 있나요?** - -코드 작성과 컴파일은 가능하지만, 실제 실행에는 OpenAI API 키가 필요합니다. - -**Q: FAQ 데이터가 영어인데 질문은 한국어로 해도 되나요?** - -네. GPT-4.1-nano는 교차 언어 이해가 가능합니다. - -**Q: 어떤 도구를 써도 되나요?** - -네. 구현 방법에 제약은 없습니다. diff --git a/SYLLABUS.md b/SYLLABUS.md index 61d3021..1bf155f 100644 --- a/SYLLABUS.md +++ b/SYLLABUS.md @@ -59,7 +59,7 @@ Easy는 그럭저럭. Medium부터 급락합니다. - 챗봇 구현·실행: **$1~5** 안쪽 (GPT-4.1-nano 기준) - 평가 스크립트까지 돌리면: **+$0.5~1** (judge 모델 `gpt-4o-mini`) -API 키 발급과 환경 설정은 [README.md](README.md#필요한-것)를 참고하세요. +API 키 발급과 환경 설정은 [BASE-README.md](BASE-README.md#필요한-것)를 참고하세요. --- diff --git a/build.gradle b/build.gradle index 941e596..7309f0d 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,13 @@ dependencyManagement { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.ai:spring-ai-starter-model-openai' + implementation 'org.springframework.ai:spring-ai-advisors-vector-store' + implementation 'org.springframework.ai:spring-ai-markdown-document-reader' + implementation 'org.springframework.ai:spring-ai-rag' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } diff --git a/data/evaluate.py b/data/evaluate.py index ed941cd..c58325d 100644 --- a/data/evaluate.py +++ b/data/evaluate.py @@ -170,7 +170,7 @@ def main(): if args.verbose: print(f"[{qid}] {marker} ({tier}) {question_ko[:40]}...") if score == 0: - print(f" 이유: {judgment.get('reason', '')[:80]}") + print(f" 이유: {judgment.get('reason', '')[:160]}") # 진행률 (10개마다) if not args.verbose and (i + 1) % 10 == 0: diff --git a/data/evaluate3.py b/data/evaluate3.py new file mode 100644 index 0000000..2267634 --- /dev/null +++ b/data/evaluate3.py @@ -0,0 +1,189 @@ +import json +import os +import argparse +import time +from pathlib import Path + +from datasets import Dataset +from ragas import evaluate +from ragas.metrics import ( + Faithfulness, + AnswerRelevancy, + ContextPrecision, + ContextRelevance, + ContextRecall, +) + +from langchain_openai import ChatOpenAI +from ragas.llms import LangchainLLMWrapper + +import requests +from dotenv import dotenv_values +from openai import OpenAI + +# ─── 설정 ───────────────────────────────────────────────────────────────────── + + +DATA_DIR = Path(__file__).parent +ROOT_DIR = DATA_DIR.parent + +SERVER_URL = "http://localhost:8080/api/chat" +JUDGE_MODEL = "gpt-4o-mini" + +# .env에서 API 키 로드 +env_path = ROOT_DIR / ".env" +env_vars = dotenv_values(env_path) +OPENAI_API_KEY = env_vars.get("OPENAI_API_KEY") or os.environ.get("OPENAI_API_KEY") + +openai_client = OpenAI(api_key=OPENAI_API_KEY) + + +# ─── 서버 호출 ──────────────────────────────────────────────────────────────── + +def ask_server(question: str) -> dict | None: + """학습자의 챗봇 서버에 질문을 보냅니다.""" + try: + resp = requests.post( + SERVER_URL, + json={"question": question}, + timeout=60, + ) + if resp.status_code == 200: + return resp.json() + else: + print(f" [ERROR] HTTP {resp.status_code}: {resp.text[:100]}") + return None + except requests.exceptions.ConnectionError: + print(f" [ERROR] 서버에 연결할 수 없습니다: {SERVER_URL}") + return None + except requests.exceptions.Timeout: + print(f" [ERROR] 타임아웃 (60초)") + return None + + +# ─── ragas 평가 ───────────────────────────────────────────────────────────────────── + +def evaluatee(): + source_file = DATA_DIR / "wall_type_null_test_results.json" + + with open(source_file, "r", encoding="utf-8") as f: + items = json.load(f) + + questions = [] + reference_answers = [] + answers = [] + contexts = [] + ground_truths = [] + + for item in items: + questions.append(item["question"]) + reference_answers.append(item["reference_answer"]) + answers.append(item["answer"]) + contexts.append(item["contexts"]) + + data = { + "question": questions, + "reference": reference_answers, + "answer": answers, + "contexts": contexts, + } + dataset = Dataset.from_dict(data) + + base_llm = ChatOpenAI( + model="gpt-4o-mini", + temperature=0, + ) + ragas_llm = LangchainLLMWrapper(base_llm) + + + return evaluate( + dataset, + metrics=[ + Faithfulness(), # 컨텍스트 기반 답변 생성 + AnswerRelevancy(), # 생성된 답변이 질문과 얼마나 관련 + ContextPrecision(), + ContextRecall(), + ContextRelevance(), # 컨텍스트 질문과 얼마나 관련 + ], + llm=ragas_llm, + ) + +# ─── 메인 ───────────────────────────────────────────────────────────────────── + +questions_filename = "wall_type_null_test_questions.json" + +def main(): + parser = argparse.ArgumentParser(description="챗봇 품질 평가") + parser.add_argument("--verbose", action="store_true", help="질문별 상세 출력") + parser.add_argument("--limit", type=int, default=0, help="평가할 질문 수 제한 (0=전체)") + args = parser.parse_args() + + # 테스트 질문 로드 + questions_path = DATA_DIR / questions_filename + with open(questions_path) as f: + questions = json.load(f) + + if args.limit > 0: + questions = questions[:args.limit] + + print(f"=== 챗봇 품질 평가 시작 ===") + print(f"서버: {SERVER_URL}") + print(f"질문 수: {len(questions)}") + print() + + # 서버 연결 확인 + test_resp = ask_server("test") + if test_resp is None: + print("서버에 연결할 수 없습니다. 서버가 실행 중인지 확인하세요:") + print(f" ./gradlew bootRun") + return + + items = [] + error_ids = [] + run_start_time = time.time() + + for i, q in enumerate(questions): + qid = q.get("id", f"Q{i+1}") # 질문 id + question_ko = q["question_ko"] # 질문 + reference_answer = q["reference_answer"] # 질문 + + # 서버에 질문 + response = ask_server(question_ko) + if response is None: + error_ids.append(qid) + elapsed_times[qid] = None + actual_answers[qid] = "" + if args.verbose: + print(f"[{qid}] ERROR — 서버 응답 없음") + continue + + answer = response.get("answer", "") # 실제 답변 + contexts = response.get("contexts", "") # 검색 컨텍스트(리스트) + + item = { + "id": qid, + "question": question_ko, + "reference_answer": reference_answer, + "answer": answer, + "contexts": contexts + } + items.append(item) + + # 챗봇 호출 결과 저장 + total_elapsed = time.time() - run_start_time + total = len(questions) + answered = total - len(error_ids) + + result_file = DATA_DIR / "wall_type_null_test_results.json" + with open(result_file, "w") as f: + json.dump(items, f, indent=2, ensure_ascii=False) + print(f"\n결과 저장: {result_file}") + + # ragas 평가 + result = evaluatee() + print(result) + + + +if __name__ == "__main__": + main() diff --git a/data/wall_type_null_test_questions.json b/data/wall_type_null_test_questions.json new file mode 100644 index 0000000..ec9cbde --- /dev/null +++ b/data/wall_type_null_test_questions.json @@ -0,0 +1,405 @@ +[ + { + "id": "Q001", + "question_ko": "주문 취소는 어떻게 하나요?", + "question_en": "How do I cancel my order?", + "expected_answer": "Go to My Orders and tap Cancel Order while the status is Preparing. Cancellation is instant with a full refund. Once the order is Shipped, cancellation is not possible and you must initiate a return after delivery.", + "reference_answer": "주문 취소는 나의 주문에서 주문 상태가 배송 준비중일 때 주문 취소를 누르면 즉시 처리됩니다. 취소되면 원래 결제수단으로 전액 환불됩니다. 상태가 배송중으로 바뀐 뒤에는 취소할 수 없고 배송 완료 후 반품 절차를 진행해야 합니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "cancel_order", + "wall_type": null + }, + { + "id": "Q002", + "question_ko": "무료 배송 기준이 얼마인가요?", + "question_en": "What is the free shipping threshold?", + "expected_answer": "Standard members get free Economy shipping on orders 20,000 won or more. Plus members get free Economy shipping on all orders. VIP members get free Priority shipping on all orders. Active subscribers also get free shipping on all orders regardless of amount.", + "reference_answer": "무료 배송 기준은 회원 상태에 따라 다릅니다. 스탠다드 회원은 20,000원 이상 주문 시 일반 배송이 무료이고, 플러스 회원은 모든 주문에서 일반 배송이 무료입니다. VIP 회원은 모든 주문에서 우선 배송이 무료이며, 활성 구독자는 비구독 주문까지 포함해 주문 금액과 관계없이 모든 주문의 배송비가 무료입니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "delivery_options", + "wall_type": null + }, + { + "id": "Q003", + "question_ko": "반품은 배송 완료 후 며칠 안에 신청해야 하나요?", + "question_en": "How many days after delivery can I return a product?", + "expected_answer": "Products can be returned within 14 calendar days of delivery, provided the item is unopened or unused with all original accessories and packaging intact.", + "reference_answer": "초록에서 직접 구매한 상품은 배송 완료일로부터 14일 이내에 반품을 신청할 수 있습니다. 상품은 미개봉 상태이거나, 개봉했더라도 사용하지 않았고 구성품과 원 포장이 모두 보존되어 있어야 합니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "check_refund_policy", + "wall_type": null + }, + { + "id": "Q004", + "question_ko": "단순 변심 반품 시 수수료가 있나요?", + "question_en": "Is there a fee for returning an item due to change of mind?", + "expected_answer": "Yes. Non-defect returns (change of mind, wrong size, etc.) incur a 3,000 won handling fee deducted from the refund. Defect-related returns are free.", + "reference_answer": "네, 단순 변심, 사이즈 착오 등 상품 불량이 아닌 사유의 반품은 3,000원의 처리 수수료가 환불금에서 차감됩니다. 상품 불량이나 오배송 등 결함 관련 반품은 수수료 없이 무료로 회수됩니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "check_refund_policy", + "wall_type": null + }, + { + "id": "Q005", + "question_ko": "적립 포인트 1점은 얼마의 가치인가요?", + "question_en": "What is 1 loyalty point worth?", + "expected_answer": "1 point equals 1 won. Points can be used on any future order with a minimum redemption of 1,000 points.", + "reference_answer": "적립 포인트 1점은 1원과 같습니다. 포인트는 향후 주문에 사용할 수 있으며, 한 번에 최소 1,000점 이상부터 사용할 수 있습니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "loyalty_points", + "wall_type": null + }, + { + "id": "Q006", + "question_ko": "포인트 유효기간이 어떻게 되나요?", + "question_en": "When do loyalty points expire?", + "expected_answer": "Points expire 12 months from the date they are earned. Expired points cannot be restored or extended.", + "reference_answer": "포인트는 적립일로부터 12개월 후 만료됩니다. 만료된 포인트는 연장하거나 복구할 수 없습니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "loyalty_points", + "wall_type": null + }, + { + "id": "Q007", + "question_ko": "냉장 배송 요일이 따로 있나요?", + "question_en": "Are there restricted days for cold-chain delivery?", + "expected_answer": "Yes. Cold-chain (fresh and frozen) delivery is available Monday through Thursday only, to prevent packages from sitting in transit over a weekend. A flat cold-chain fee of 4,000 won applies regardless of order amount or membership tier.", + "reference_answer": "네, 냉장/냉동 콜드체인 배송은 주말 운송 중 체류를 막기 위해 월요일부터 목요일까지만 가능합니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "delivery_options", + "wall_type": null + }, + { + "id": "Q008", + "question_ko": "제주도 배송 시 추가 요금이 있나요?", + "question_en": "Is there an extra charge for delivery to Jeju Island?", + "expected_answer": "No surcharge. Delivery to Jeju and offshore islands takes an additional 1-2 business days beyond the standard timeframe.", + "reference_answer": "아니요, 제주도와 주요 도서 지역 배송에는 추가 요금이 없습니다. 다만 표준 배송 기간보다 1-2영업일이 더 걸릴 수 있고, 도서 지역에는 당일 배송이 제공되지 않습니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "delivery_options", + "wall_type": null + }, + { + "id": "Q009", + "question_ko": "VIP 등급이 되려면 얼마를 써야 하나요?", + "question_en": "How much do I need to spend to reach VIP tier?", + "expected_answer": "Spend over 800,000 won in a calendar year. VIP benefits include free Priority shipping on all orders, 5% point reward, early access to new product launches, and a dedicated support line at 1588-0002.", + "reference_answer": "VIP 등급은 한 해 동안 800,000원 이상 구매하면 달성합니다. VIP 혜택에는 모든 주문 우선 배송 무료, 5% 포인트 적립, 신제품 선공개 접근, VIP 전용 상담 번호 1588-0002가 포함됩니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "membership_tiers", + "wall_type": null + }, + { + "id": "Q010", + "question_ko": "당일 발송 마감 시간이 언제인가요?", + "question_en": "What is the cutoff time for same-day dispatch?", + "expected_answer": "Orders confirmed before 1 PM KST on business days are dispatched the same afternoon. Orders after 1 PM or on weekends and public holidays are queued for the next business day.", + "reference_answer": "평일 기준 오후 1시(한국시간) 전에 결제가 확정된 주문은 같은 날 오후 택배사로 인계됩니다. 오후 1시 이후 주문이나 주말, 공휴일 주문은 다음 영업일 발송 대기열로 넘어갑니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "delivery_period", + "wall_type": null + }, + { + "id": "Q011", + "question_ko": "카카오페이 환불은 얼마나 걸리나요?", + "question_en": "How long does a Kakao Pay refund take?", + "expected_answer": "Kakao Pay and Naver Pay refunds are typically instant after the returned item is inspected (usually 1-2 business days after pickup).", + "reference_answer": "카카오페이와 네이버페이 환불은 보통 반품 상품을 수령해 검수한 뒤 즉시 처리됩니다. 반품 검수에는 일반적으로 1-2영업일이 걸립니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "get_refund", + "wall_type": null + }, + { + "id": "Q012", + "question_ko": "세금계산서는 어떻게 받을 수 있나요?", + "question_en": "How do I request a tax invoice?", + "expected_answer": "Go to My Orders, select the order, and tap Request Tax Invoice. Enter your business registration number. Tax invoices are issued within 1 business day. Requests must be made within the same calendar month as the purchase.", + "reference_answer": "세금계산서는 나의 주문에서 해당 주문을 선택한 뒤 세금계산서 요청을 눌러 신청합니다. 사업자등록번호를 입력하면 영업일 기준 1일 이내 등록 이메일로 발행되며, 신청은 구매한 달과 같은 달 안에서만 가능합니다. 이전 달 주문 건은 소급 발행할 수 없습니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "check_invoice", + "wall_type": null + }, + { + "id": "Q013", + "question_ko": "구독을 해지하지 않고 잠깐 멈출 수 있나요?", + "question_en": "Can I pause my subscription without canceling?", + "expected_answer": "Yes. In Settings > Subscriptions, tap Pause to skip the next delivery or halt all deliveries for up to 3 months. No charge during the pause period. Resume anytime with no penalty.", + "reference_answer": "네, 구독은 해지하지 않고 일시정지할 수 있습니다. 설정 > 구독에서 일시정지를 선택하면 다음 배송을 건너뛰거나 최대 3개월까지 전체 배송을 멈출 수 있습니다. 일시정지 기간에는 요금이 청구되지 않습니다. 언제든 재개할 수 있으며 별도 불이익은 없습니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "subscription", + "wall_type": null + }, + { + "id": "Q014", + "question_ko": "친환경 포장을 선택하면 포인트가 추가로 쌓이나요?", + "question_en": "Do I earn bonus points for choosing Green Packaging?", + "expected_answer": "Yes. Each order using Green Packaging earns 200 bonus eco points credited 7 days after delivery confirmation. Green Packaging is free of charge.", + "reference_answer": "네, 친환경 포장을 선택하면 주문당 200 친환경 보너스 포인트가 적립됩니다. 이 포인트는 배송 완료 확인 후 7일 뒤 지급됩니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "eco_green", + "wall_type": null + }, + { + "id": "Q015", + "question_ko": "마켓플레이스 판매자에게 직접 연락하는 방법이 있나요?", + "question_en": "How can I contact a Marketplace seller directly?", + "expected_answer": "You can contact the seller through the in-app messaging feature in My Orders > Contact Seller. If the seller does not respond within 3 business days, you can escalate to Cholog Buyer Protection by selecting Open Dispute in My Orders.", + "reference_answer": "마켓플레이스 판매자에게는 나의 주문 > 판매자 문의의 인앱 메시지 기능으로 연락하실 수 있습니다. 판매자가 3영업일 안에 응답하지 않거나 해결되지 않으면 나의 주문에서 분쟁 접수를 선택해 초록 구매자 보호로 분쟁을 접수할 수 있습니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "marketplace", + "wall_type": null + }, + { + "id": "Q050", + "question_ko": "반품 신청 후 환불받기까지 가장 빠른 경우 얼마나 걸려요?", + "question_en": "What is the fastest possible refund timeline after initiating a return?", + "expected_answer": "The fastest scenario: courier picks up the item, inspection completes in 1 business day, and Kakao Pay or Naver Pay refund is processed instantly. Minimum total time is approximately 2-3 business days from return request to refund. Credit card refunds take an additional 3-5 business days after inspection.", + "reference_answer": "가장 빠른 환불은 반품 상품 회수 후 검수가 1영업일 안에 끝나고 카카오페이 또는 네이버페이처럼 검수 후 즉시 환불되는 결제수단을 사용한 경우입니다. 이때 반품 요청부터 환불까지 최소 약 2-3영업일이 걸릴 수 있습니다. 신용카드는 검수 완료 후 추가로 3-5영업일이 걸립니다.", + "tier": "medium", + "source_layers": [ + "faq" + ], + "primary_intent": "get_refund", + "wall_type": null + }, + { + "id": "Q051", + "question_ko": "회원가입은 어떻게 하나요?", + "question_en": "How do I create an account?", + "expected_answer": "You can sign up via Kakao, Naver, or Google SSO (social login) or directly with an email address. Membership is open to anyone aged 14 or older. After signing up, you receive a 3,000 won welcome coupon valid for 30 days.", + "reference_answer": "회원가입은 카카오, 네이버, 구글 간편 로그인으로 하거나 이메일 주소로 직접 가입할 수 있습니다. 유효한 이메일 주소나 한국 휴대폰 번호가 필요하며, 만 14세 이상이면 가입할 수 있습니다. 신규 회원은 30일간 유효한 3,000원 웰컴 쿠폰을 받습니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "create_account", + "wall_type": null + }, + { + "id": "Q052", + "question_ko": "뉴스레터 수신을 해지하려면 어떻게 하나요?", + "question_en": "How do I unsubscribe from the newsletter?", + "expected_answer": "Click the Unsubscribe link at the bottom of any newsletter email. Alternatively, go to My Page > Notification Settings and turn off Newsletter. Changes take effect within 24-48 hours.", + "reference_answer": "뉴스레터 수신 해지는 뉴스레터 이메일 하단의 수신거부 링크를 클릭하면 됩니다. 앱이나 웹의 마이페이지 > 알림 설정에서 뉴스레터 수신을 끌 수도 있으며, 변경 사항은 보통 24-48시간 내 반영됩니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "newsletter_subscription", + "wall_type": null + }, + { + "id": "Q053", + "question_ko": "고객센터 전화번호와 운영 시간이 어떻게 되나요?", + "question_en": "What is the customer service phone number and hours?", + "expected_answer": "Customer service is available at 1588-1234 on weekdays from 9 AM to 6 PM KST. Phone and live chat are not available on weekends or public holidays. The automated chatbot is available 24/7.", + "reference_answer": "고객센터 일반 전화는 1588-0000, VIP 우선 상담 전화는 1588-0002입니다. 전화 상담은 월요일부터 금요일까지 오전 9시-오후 6시(한국시간)에 운영됩니다. 실시간 채팅은 웹과 앱에서 매일 오전 8시-오후 10시까지 이용할 수 있고, 카카오톡 AI 상담은 24시간 이용할 수 있습니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "contact_customer_service", + "wall_type": null + }, + { + "id": "Q054", + "question_ko": "리뷰를 작성하면 포인트가 얼마나 쌓이나요?", + "question_en": "How many points do I earn for writing a review?", + "expected_answer": "Text-only review earns 100 points. A review with at least one photo earns 600 points total (100 text + 500 photo bonus). Points are credited 1-2 business days after the review is approved by the moderation team.", + "reference_answer": "텍스트 리뷰 작성 시 100점, 사진이 포함된 리뷰는 사진 보너스 500점을 더해 총 600점이 쌓입니다. 포인트는 리뷰가 운영팀 승인 또는 검토를 통과한 뒤 1-2영업일 내 지급됩니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "review", + "wall_type": null + }, + { + "id": "Q055", + "question_ko": "비밀번호 재설정 링크가 만료됐어요. 유효시간이 얼마인가요?", + "question_en": "My password reset link expired. How long is it valid?", + "expected_answer": "Password reset links are valid for 30 minutes after being sent. If the link has expired, go to the login screen and request a new one via Forgot Password.", + "reference_answer": "비밀번호 재설정 링크는 발송 후 30분 동안 유효합니다. 링크가 만료되면 로그인 화면의 비밀번호 찾기에서 등록 이메일로 재설정 링크를 다시 요청해야 합니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "recover_password", + "wall_type": null + }, + { + "id": "Q056", + "question_ko": "CU 편의점 수령 시 보관 기간이 얼마나 되나요?", + "question_en": "How long will my order be held at a CU convenience store?", + "expected_answer": "Orders are held at the designated CU store for 5 days at no charge. If not picked up within 5 days, the order is returned and a refund is processed.", + "reference_answer": "CU 편의점 수령 주문은 지정한 CU 매장에서 5일 동안 보관됩니다. 5일 안에 수령하지 않으면 상품은 자동 반품되고 환불이 처리됩니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "delivery_options", + "wall_type": null + }, + { + "id": "Q057", + "question_ko": "예약 배송은 최대 며칠 후까지 지정할 수 있나요?", + "question_en": "How far in advance can I schedule a reserved delivery?", + "expected_answer": "You can schedule a reserved delivery up to 14 days in the future. Economy and Priority shipping both support reserved delivery. Same-day delivery cannot be reserved in advance.", + "reference_answer": "예약 배송은 최대 14일 뒤 날짜까지 지정할 수 있습니다. 일반 배송과 우선 배송에서 지원되며, 당일 배송은 미리 예약할 수 없습니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "delivery_options", + "wall_type": null + }, + { + "id": "Q058", + "question_ko": "어떤 결제 수단을 지원하나요?", + "question_en": "What payment methods are supported?", + "expected_answer": "Supported payment methods include credit/debit cards, Kakao Pay, Naver Pay, real-time bank transfer, loyalty points, and discount coupons. Points and coupons can be combined with other payment methods. Virtual account (가상계좌) is not supported.", + "reference_answer": "지원 결제수단은 신용카드와 체크카드, 카카오페이, 네이버페이, 토스페이, 애플페이, 토스페이먼츠 실시간 계좌이체, 초록페이, 포인트, 쿠폰, 기프트카드 또는 스토어 크레딧입니다. 포인트와 쿠폰은 다른 결제수단과 함께 사용할 수 있습니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "check_payment_methods", + "wall_type": null + }, + { + "id": "Q059", + "question_ko": "주문번호는 어디서 확인하나요?", + "question_en": "Where can I find my order number?", + "expected_answer": "Your order number is in the Kakao AlimTalk notification sent after placing the order, and also in the app under My Orders. Order numbers follow the format YYYYMMDD-XXXX.", + "reference_answer": "주문번호는 주문 완료 후 발송되는 카카오 알림톡에서 확인할 수 있고, 앱의 나의 주문에서도 확인할 수 있습니다. 주문번호는 연월일-일련번호 형식입니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "place_order", + "wall_type": null + }, + { + "id": "Q060", + "question_ko": "선물 포장을 추가하면 비용이 얼마인가요?", + "question_en": "How much does gift wrapping cost?", + "expected_answer": "Gift wrapping costs 1,500 won per item. A gift message card can be included at no extra charge. If the order is canceled before packaging begins, the wrapping fee is fully refunded.", + "reference_answer": "선물 포장 비용은 상품 1개당 1,500원입니다. 브랜드 박스, 리본, 최대 100자 메시지 카드가 포함되고 메시지 카드는 추가 비용이 없습니다. 포장 시작 전 주문을 취소하면 포장비도 전액 환불됩니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "place_order", + "wall_type": null + }, + { + "id": "Q061", + "question_ko": "배송 메모를 남길 수 있나요?", + "question_en": "Can I leave a delivery note for the courier?", + "expected_answer": "Yes. You can enter a delivery note at checkout or edit it in My Orders before the order is dispatched. Notes such as 'Leave at door' or 'Leave with security guard' are passed to the courier.", + "reference_answer": "네, 배송 메모는 주문 시 결제 화면에서 입력할 수 있고, 발송 전이라면 나의 주문에서 해당 주문을 열어 수정할 수 있습니다. '문 앞에 놓아주세요', '경비실에 맡겨주세요', '무인 택배함에 넣어주세요' 같은 요청사항이 택배기사에게 전달됩니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "set_up_shipping_address", + "wall_type": null + }, + { + "id": "Q062", + "question_ko": "리뷰는 배송 후 며칠 안에 써야 하나요?", + "question_en": "Within how many days of delivery can I write a review?", + "expected_answer": "Reviews can be submitted within 90 days of delivery confirmation. After 90 days, the review button is no longer available for that order.", + "reference_answer": "리뷰는 배송 완료 후 90일 이내에 작성할 수 있습니다. 90일이 지나면 해당 주문의 리뷰 작성 버튼이 더 이상 제공되지 않습니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "review", + "wall_type": null + }, + { + "id": "Q063", + "question_ko": "포인트는 최소 몇 점부터 쓸 수 있나요?", + "question_en": "What is the minimum number of points I can redeem at once?", + "expected_answer": "The minimum redemption is 1,000 points (= 1,000 won). You can use any amount above that in 1-point increments. Points can be combined with other payment methods.", + "reference_answer": "포인트는 최소 1,000점부터 사용할 수 있습니다. 1,000점 이상은 1점 단위로 사용할 수 있고, 포인트는 다른 결제수단 및 쿠폰과 함께 사용할 수 있습니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "loyalty_points", + "wall_type": null + }, + { + "id": "Q064", + "question_ko": "실시간 GPS 배송 추적은 어떤 배송에서 가능한가요?", + "question_en": "Which delivery type supports real-time GPS tracking?", + "expected_answer": "Real-time GPS tracking is available only with Priority shipping. Economy shipping provides step-by-step status updates but no live GPS. VIP members, who receive free Priority shipping, always have access to GPS tracking.", + "reference_answer": "실시간 GPS 배송 추적은 우선 배송에서만 제공됩니다. 일반 배송은 단계별 상태 업데이트만 제공하고 실시간 GPS는 지원하지 않습니다. VIP 회원은 모든 주문에서 우선 배송 무료 혜택을 받으므로 우선 배송 주문에 대해 GPS 추적을 이용할 수 있습니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "track_order", + "wall_type": null + }, + { + "id": "Q065", + "question_ko": "회원 탈퇴하면 포인트는 어떻게 되나요?", + "question_en": "What happens to my loyalty points when I delete my account?", + "expected_answer": "All points and coupons are immediately forfeited upon account deletion and cannot be restored. It is recommended to use remaining points before deleting your account.", + "reference_answer": "회원 탈퇴를 하면 남아 있는 포인트와 쿠폰은 즉시 소멸되며 복구할 수 없습니다. 탈퇴 전에 남은 포인트를 사용하는 것이 좋습니다.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "delete_account", + "wall_type": null + } +] diff --git a/data/wall_type_null_test_results.json b/data/wall_type_null_test_results.json new file mode 100644 index 0000000..39edd1f --- /dev/null +++ b/data/wall_type_null_test_results.json @@ -0,0 +1,374 @@ +[ + { + "id": "Q001", + "question": "주문 취소는 어떻게 하나요?", + "reference_answer": "주문 취소는 나의 주문에서 주문 상태가 배송 준비중일 때 주문 취소를 누르면 즉시 처리됩니다. 취소되면 원래 결제수단으로 전액 환불됩니다. 상태가 배송중으로 바뀐 뒤에는 취소할 수 없고 배송 완료 후 반품 절차를 진행해야 합니다.", + "answer": "주문 취소는 \"My Orders\"에서 주문 상태가 \"Preparing\"일 때 \"Cancel Order\"를 탭하시면 즉시 취소하실 수 있습니다. 취소가 완료되면 결제하신 금액이 원래 결제 수단으로 환불됩니다. 단, 주문 상태가 \"Shipped\"로 변경된 경우에는 취소가 불가능하며, 배송이 완료된 후에 반품 절차를 진행하셔야 합니다. 참고로, 마켓플레이스 판매자의 주문은 더 짧은 취소 가능 기간이 적용될 수 있으니 상품 페이지에서 판매자의 정책을 확인하시기 바랍니다.", + "contexts": [ + "You can cancel an order by going to \"My Orders\" and tapping \"Cancel Order\" while the status is \"Preparing\". Cancellation is instant and the full amount is refunded to your original payment method. Once the status changes to \"Shipped\", cancellation is no longer possible — you must wait for delivery and then initiate a return.Note: Marketplace seller orders may have a shorter cancellation window. Check the seller's policy on the product page before placing the order.", + "You can change the delivery address only if the order status is still \"Preparing\". Go to \"My Orders\", tap the order, and select \"Edit Address\". Quantity changes and product swaps are not supported after checkout — cancel the order and place a new one instead.", + "Open the Cholog app or website, go to \"My Orders\", tap the order, and select \"Request Return\". Choose a reason, upload at least one photo of the item, and select a pickup date. For defect-related returns, courier pickup is free. For non-defect returns (change of mind, wrong size), a 3,000 won handling fee is deducted from the refund.", + "Contact customer support or use \"Report Issue\" in \"My Orders\". We arrange a free pickup of the incorrect item and ship the correct one via Priority at no charge. A 5,000 won apology coupon is also issued automatically." + ] + }, + { + "id": "Q002", + "question": "무료 배송 기준이 얼마인가요?", + "reference_answer": "무료 배송 기준은 회원 상태에 따라 다릅니다. 스탠다드 회원은 20,000원 이상 주문 시 일반 배송이 무료이고, 플러스 회원은 모든 주문에서 일반 배송이 무료입니다. VIP 회원은 모든 주문에서 우선 배송이 무료이며, 활성 구독자는 비구독 주문까지 포함해 주문 금액과 관계없이 모든 주문의 배송비가 무료입니다.", + "answer": "무료 배송 기준은 회원 등급과 배송 방식에 따라 다릅니다.\n\n- **Standard 회원**: 20,000원 이상 주문 시 이코노미 배송이 무료입니다.\n- **골드 회원 및 VIP 회원**: 모든 주문에 대해 우선 배송이 무료입니다.\n- **기타 회원** 또는 주문 금액이 20,000원 미만인 경우에는 배송비가 부과됩니다.\n\n참고로, 무료 배송 조건은 이코노미 배송(2,500원) 기준이며, 우선 배송(5,000원) 또는 같은 날 배송(8,000원)은 별도 조건이 적용됩니다.", + "contexts": [ + "Standard members: Economy shipping free on orders ≥ 20,000 won Plus members: Economy shipping free on all orders VIP members: Priority shipping free on all orders Active subscribers: Priority shipping free on all orders (including non-subscription purchases)", + "We offer three shipping tiers: Economy: 2,500 won, 2–4 business days Priority: 5,000 won, guaranteed next-business-day delivery by noon Same-Day: 8,000 won, available in Seoul / Incheon / Gyeonggi for orders before 10 AM KST (weekdays only)Free Economy shipping applies to orders over 20,000 won for Standard members. Gold-tier members receive free Priority shipping on every order.", + "| Tier | Fee | Delivery Time | Notes | |------|-----|---------------|-------| | Economy | 2,500 won | 2–4 business days | Free for orders ≥ 20,000 won (Standard members) | | Priority | 5,000 won | Next business day by noon | Free for Gold / VIP members | | Same-Day | 8,000 won | Same day | Seoul, Incheon, Gyeonggi only; order before 10 AM KST |", + "| Order Amount | Cold-Chain Fee | |-------------|----------------| | Any amount | Flat 4,000 won |Cold-chain fee applies regardless of membership tier or free-shipping eligibility. Cold-chain orders cannot be combined with standard-tier shipments." + ] + }, + { + "id": "Q003", + "question": "반품은 배송 완료 후 며칠 안에 신청해야 하나요?", + "reference_answer": "초록에서 직접 구매한 상품은 배송 완료일로부터 14일 이내에 반품을 신청할 수 있습니다. 상품은 미개봉 상태이거나, 개봉했더라도 사용하지 않았고 구성품과 원 포장이 모두 보존되어 있어야 합니다.", + "answer": "반품은 배송 완료 후 14일 이내에 신청하실 수 있습니다. 따라서 배송 완료 후 14일 이내에 반품 신청을 하셔야 합니다.", + "contexts": [ + "After we receive and inspect the returned item (1–2 business days), we issue the refund: Credit card: 3–5 business days Kakao Pay / Naver Pay: typically instant Bank transfer: up to 7 business days International card (Visa/Mastercard issued abroad): 7–14 business days", + "Products may be returned within 14 calendar days of delivery. The item must be unopened or, if opened, unused with all original accessories and packaging intact. The following cannot be returned under any circumstances: Clearance items, digital downloads, personalized or engraved products, opened cosmetics and skincare, underwear and swimwear, and items damaged by the customer.Note: Marketplace seller items follow the individual seller's return policy, which may differ from Cholog's standard 14-day window.", + "| Payment Method | Refund Time | |----------------|-------------| | Credit card (domestic) | 3–5 business days after inspection | | Kakao Pay / Naver Pay | Typically instant after inspection | | Bank transfer | Up to 7 business days | | International card | 7–14 business days | | Cholog Pay | Instant |", + "Open the Cholog app or website, go to \"My Orders\", tap the order, and select \"Request Return\". Choose a reason, upload at least one photo of the item, and select a pickup date. For defect-related returns, courier pickup is free. For non-defect returns (change of mind, wrong size), a 3,000 won handling fee is deducted from the refund." + ] + }, + { + "id": "Q004", + "question": "단순 변심 반품 시 수수료가 있나요?", + "reference_answer": "네, 단순 변심, 사이즈 착오 등 상품 불량이 아닌 사유의 반품은 3,000원의 처리 수수료가 환불금에서 차감됩니다. 상품 불량이나 오배송 등 결함 관련 반품은 수수료 없이 무료로 회수됩니다.", + "answer": "단순 변심, 사이즈 미스, 또는 기타 비불량 사유로 반품하실 경우, 3,000원의 수수료가 부과됩니다. 다만, 고객님이 최초로 반품하는 경우, 배송이 2영업일 이상 지연된 경우, 또는 VIP 회원인 경우에는 수수료가 면제됩니다.", + "contexts": [ + "If the return reason is change of mind, wrong size, or any non-defect reason, a handling fee of 3,000 won is deducted from the refund. Defect-related returns incur no fee.", + "배송 조회 — Check order in internal dashboard. Give Hanjin tracking number. If status is \"Preparing\" for > 2 business days, flag as delayed dispatch to logistics. 반품 신청 — Confirm within return window (14 days from delivery per v3 policy). Check item category — some are non-returnable (clearance, cosmetics, digital, personalized). Remind customer: non-defect returns incur 3,000 won handling fee. 환불 문의 — Confirm inspection is complete. Quote timeline by payment method: 카드 3–5일, 카카오/네이버페이 즉시, 계좌이체 최대 7일. 포인트 문의 — 1점=1원, 최소 1,000점 사용, 12개월 유효기간. Tier별 적립률: Standard 1%, Plus 3%, VIP 5%. (구버전 혼동 주의: 예전엔 3%/5%/7%였음) 멤버십 등급 — Plus = 연 20만원 이상, VIP = 연 80만원 이상. 등급 평가일: 매년 1월 1일. (2023년 기준과 다름: 구버전은 Plus=15만, VIP=60만이었음)", + "The 3,000 won non-defect handling fee may be waived for: First-time return by the customer (check CRM return history) Returns where the delivery was delayed by > 2 business days (check dispatch log) VIP members (always waive, no approval required)", + "After we receive and inspect the returned item (1–2 business days), we issue the refund: Credit card: 3–5 business days Kakao Pay / Naver Pay: typically instant Bank transfer: up to 7 business days International card (Visa/Mastercard issued abroad): 7–14 business days" + ] + }, + { + "id": "Q005", + "question": "적립 포인트 1점은 얼마의 가치인가요?", + "reference_answer": "적립 포인트 1점은 1원과 같습니다. 포인트는 향후 주문에 사용할 수 있으며, 한 번에 최소 1,000점 이상부터 사용할 수 있습니다.", + "answer": "적립 포인트 1점은 1원과 동일한 가치입니다.", + "contexts": [ + "Minimum redemption: 1,000 points per order 1 point = 1 won Points can be used on any purchase, combined with one coupon Points cannot be redeemed for cash or transferred between accounts", + "Points are earned at 1% (Standard), 3% (Plus), or 5% (VIP) of the pre-shipping order total. Points are credited 7 days after delivery confirmation and expire 12 months from the date earned. 1 point = 1 won. Minimum redemption: 1,000 points per order.", + "Points are calculated on the pre-shipping, pre-discount order total. Points are credited 7 days after delivery confirmation and expire 12 months from the date earned. Minimum redemption is 1,000 points. 1 point = 1 won.", + "Every completed order earns 1 Carbon Point per 1,000 won spent. Carbon Points accumulate in your account and can be donated to verified reforestation projects (1 Carbon Point = 1 tree planted) or converted to 100 loyalty points each. Carbon Points do not expire and are separate from loyalty points." + ] + }, + { + "id": "Q006", + "question": "포인트 유효기간이 어떻게 되나요?", + "reference_answer": "포인트는 적립일로부터 12개월 후 만료됩니다. 만료된 포인트는 연장하거나 복구할 수 없습니다.", + "answer": "포인트는 적립된 날짜로부터 12개월 동안 유효합니다. 만료일이 다가오는 포인트(30일 이내)에는 앱 푸시 알림이 발송됩니다. 만료된 포인트는 복구하거나 연장할 수 없으며, 적립 후 7일이 지나야 사용하실 수 있습니다.", + "contexts": [ + "Points expire 12 months from the date they are earned. If you return an order, the points earned from that order are deducted within 24 hours of the refund. If your balance is insufficient, the deficit is carried forward and deducted from future earnings.", + "All points expire 12 months from the date earned. There is no extension or restoration of expired points. Points approaching expiry (within 30 days) trigger an app push notification.", + "Points are earned at 1% (Standard), 3% (Plus), or 5% (VIP) of the pre-shipping order total. Points are credited 7 days after delivery confirmation and expire 12 months from the date earned. 1 point = 1 won. Minimum redemption: 1,000 points per order.", + "Minimum redemption: 1,000 points per order 1 point = 1 won Points can be used on any purchase, combined with one coupon Points cannot be redeemed for cash or transferred between accounts" + ] + }, + { + "id": "Q007", + "question": "냉장 배송 요일이 따로 있나요?", + "reference_answer": "네, 냉장/냉동 콜드체인 배송은 주말 운송 중 체류를 막기 위해 월요일부터 목요일까지만 가능합니다.", + "answer": "네, 냉장 배송은 월요일부터 목요일까지만 가능합니다. 금요일, 토요일, 일요일, 공휴일에는 냉장 배송이 제공되지 않습니다.", + "contexts": [ + "Cold-chain delivery is available Monday through Thursday only. This restriction prevents packages from sitting in transit over a weekend, which would exceed the ice pack rating. Orders placed by 11 AM KST Monday–Thursday dispatch same day Orders placed Thursday after 11 AM dispatch the following Monday No cold-chain delivery on Friday, Saturday, Sunday, or public holidays", + "Yes. Fresh and frozen items are shipped in insulated packaging with ice packs via CJ Logistics Fresh (dedicated cold-chain courier). Cold-chain delivery is available only Monday through Thursday to prevent weekend transit degradation. A flat cold-chain fee of 4,000 won applies regardless of order size. Cold-chain orders cannot be combined with standard shipments.", + "Cold-chain delivery is available to all mainland Korean addresses and Jeju Island (add 2 business days). Delivery to remote offshore islands (Ulleungdo, Dokdo, etc.) is not available for cold-chain orders due to transit time constraints.", + "All cold-chain orders are shipped exclusively via CJ Logistics Fresh. Orders are packed in insulated polystyrene boxes with gel ice packs rated for 24–36 hours of temperature control. Frozen items are packed with dry ice where required." + ] + }, + { + "id": "Q008", + "question": "제주도 배송 시 추가 요금이 있나요?", + "reference_answer": "아니요, 제주도와 주요 도서 지역 배송에는 추가 요금이 없습니다. 다만 표준 배송 기간보다 1-2영업일이 더 걸릴 수 있고, 도서 지역에는 당일 배송이 제공되지 않습니다.", + "answer": "제주도 배송 시 추가 요금은 없습니다. 다만, 배송 기간이 일반보다 1~2영업일 더 소요될 수 있습니다.", + "contexts": [ + "Yes. We deliver to Jeju, Ulleungdo, Geojedo, and all major offshore islands. Delivery takes an additional 1–2 business days beyond the standard timeframe. There is no extra surcharge for island delivery.", + "Delivery to Jeju, Ulleungdo, Geojedo, and all major offshore islands carries no surcharge but takes an additional 1–2 business days. Same-day delivery is not available for island addresses.", + "Cold-chain delivery is available to all mainland Korean addresses and Jeju Island (add 2 business days). Delivery to remote offshore islands (Ulleungdo, Dokdo, etc.) is not available for cold-chain orders due to transit time constraints.", + "All standard domestic orders are fulfilled through Hanjin Express. Cold-chain (fresh/frozen) orders are shipped via CJ Logistics Fresh. Large-item deliveries (furniture, appliances over 20 kg) are handled by Lotte Global Logistics with a two-person team." + ] + }, + { + "id": "Q009", + "question": "VIP 등급이 되려면 얼마를 써야 하나요?", + "reference_answer": "VIP 등급은 한 해 동안 800,000원 이상 구매하면 달성합니다. VIP 혜택에는 모든 주문 우선 배송 무료, 5% 포인트 적립, 신제품 선공개 접근, VIP 전용 상담 번호 1588-0002가 포함됩니다.", + "answer": "VIP 등급이 되기 위해서는 연간 800,000원 이상의 소비가 필요합니다.", + "contexts": [ + "| Tier | Annual Spending Threshold | Evaluation Date | |------|--------------------------|-----------------| | Standard | Default (no minimum) | — | | Plus | ≥ 200,000 won | January 1st each year | | VIP | ≥ 800,000 won | January 1st each year |Annual spending is calculated from January 1 to December 31. Returned orders are deducted from the annual spending total. Tier downgrades take effect on the 1st of the following month after a returned item pushes the total below the threshold.", + "| Tier | Qualification | Free Shipping | Points | Extras | |------|--------------|---------------|--------|--------| | Standard | Default | Economy on orders ≥ 20,000 won | 1% | — | | Plus | Spend ≥ 200,000 won/year | Economy on all orders | 3% | Birthday double-points | | VIP | Spend ≥ 800,000 won/year | Priority on all orders | 5% | Early launch access, dedicated support line (1588-0002) |Tier status is evaluated on January 1st each year based on the prior year's spending. Returned items are deducted from annual spending totals and may trigger a tier downgrade.", + "| Benefit | Standard | Plus | VIP | |---------|---------|------|-----| | Point earning rate | 1% | 3% | 5% | | Free shipping | Economy ≥ 20,000 won | Economy on all orders | Priority on all orders | | Birthday bonus | 20% off coupon | 20% off + gift | 20% off + gift | | Early product access | — | — | Yes | | Dedicated support line | — | — | 1588-0002 | | Point expiry | 12 months | 12 months | 12 months |", + "You need a valid email address or Korean mobile number. You can also register instantly via Kakao, Naver, or Google SSO. All new accounts start at Standard tier and receive a one-time 3,000 won welcome coupon valid for 30 days." + ] + }, + { + "id": "Q010", + "question": "당일 발송 마감 시간이 언제인가요?", + "reference_answer": "평일 기준 오후 1시(한국시간) 전에 결제가 확정된 주문은 같은 날 오후 택배사로 인계됩니다. 오후 1시 이후 주문이나 주말, 공휴일 주문은 다음 영업일 발송 대기열로 넘어갑니다.", + "answer": "당일 발송 마감 시간은 평일 기준 오후 1시(KST)입니다. 1시 이전에 주문이 확정되면 같은 오후에 발송됩니다. 1시 이후 또는 주말이나 공휴일에 주문하신 경우에는 다음 영업일 아침에 발송됩니다.", + "contexts": [ + "Orders confirmed before 1 PM KST on business days are handed to the courier the same afternoon. Orders placed after 1 PM, on weekends, or on public holidays enter the dispatch queue for the next business day morning.", + "Orders confirmed before 1 PM KST on business days are dispatched the same afternoon. Orders after 1 PM or on weekends/public holidays are queued for the next business day.", + "Dispatch suspension: February 7 (Wed) 1 PM KST through February 13 (Tue) 9 AM KST. Orders placed February 7 after 1 PM through February 12 will dispatch February 13. Priority shipping SLA (next business day by noon) does NOT apply during this period. Inform customers: deliveries during this period may be delayed by 3–5 additional business days. Cold-chain orders: suspended February 5 (Mon) — next available dispatch February 13.", + "Cold-chain delivery is available Monday through Thursday only. This restriction prevents packages from sitting in transit over a weekend, which would exceed the ice pack rating. Orders placed by 11 AM KST Monday–Thursday dispatch same day Orders placed Thursday after 11 AM dispatch the following Monday No cold-chain delivery on Friday, Saturday, Sunday, or public holidays" + ] + }, + { + "id": "Q011", + "question": "카카오페이 환불은 얼마나 걸리나요?", + "reference_answer": "카카오페이와 네이버페이 환불은 보통 반품 상품을 수령해 검수한 뒤 즉시 처리됩니다. 반품 검수에는 일반적으로 1-2영업일이 걸립니다.", + "answer": "카카오페이 환불은 일반적으로 결제 후 검수 완료 후 즉시 처리됩니다. 따라서, 검수 완료 후 바로 환불이 이루어지며, 별도의 기간이 소요되지 않는 경우가 많습니다.", + "contexts": [ + "After we receive and inspect the returned item (1–2 business days), we issue the refund: Credit card: 3–5 business days Kakao Pay / Naver Pay: typically instant Bank transfer: up to 7 business days International card (Visa/Mastercard issued abroad): 7–14 business days", + "| Payment Method | Refund Time | |----------------|-------------| | Credit card (domestic) | 3–5 business days after inspection | | Kakao Pay / Naver Pay | Typically instant after inspection | | Bank transfer | Up to 7 business days | | International card | 7–14 business days | | Cholog Pay | Instant |", + "배송 조회 — Check order in internal dashboard. Give Hanjin tracking number. If status is \"Preparing\" for > 2 business days, flag as delayed dispatch to logistics. 반품 신청 — Confirm within return window (14 days from delivery per v3 policy). Check item category — some are non-returnable (clearance, cosmetics, digital, personalized). Remind customer: non-defect returns incur 3,000 won handling fee. 환불 문의 — Confirm inspection is complete. Quote timeline by payment method: 카드 3–5일, 카카오/네이버페이 즉시, 계좌이체 최대 7일. 포인트 문의 — 1점=1원, 최소 1,000점 사용, 12개월 유효기간. Tier별 적립률: Standard 1%, Plus 3%, VIP 5%. (구버전 혼동 주의: 예전엔 3%/5%/7%였음) 멤버십 등급 — Plus = 연 20만원 이상, VIP = 연 80만원 이상. 등급 평가일: 매년 1월 1일. (2023년 기준과 다름: 구버전은 Plus=15만, VIP=60만이었음)", + "A digital receipt is sent automatically by email after every purchase. For a tax invoice, go to \"My Orders\", select the order, and tap \"Request Tax Invoice\". Enter your business registration number. Tax invoices are issued within 1 business day." + ] + }, + { + "id": "Q012", + "question": "세금계산서는 어떻게 받을 수 있나요?", + "reference_answer": "세금계산서는 나의 주문에서 해당 주문을 선택한 뒤 세금계산서 요청을 눌러 신청합니다. 사업자등록번호를 입력하면 영업일 기준 1일 이내 등록 이메일로 발행되며, 신청은 구매한 달과 같은 달 안에서만 가능합니다. 이전 달 주문 건은 소급 발행할 수 없습니다.", + "answer": "세금계산서는 \"My Orders\"에서 해당 주문을 선택한 후 \"Request Tax Invoice\"를 탭하시면 요청하실 수 있습니다. 요청 시 사업자등록번호를 입력하셔야 하며, 세금계산서는 요청 후 1영업일 이내에 등록된 이메일로 발송됩니다. 요청은 구매한 같은 달 내에만 가능하니 참고해 주세요.", + "contexts": [ + "A digital receipt is sent automatically by email after every purchase. For a tax invoice, go to \"My Orders\", select the order, and tap \"Request Tax Invoice\". Enter your business registration number. Tax invoices are issued within 1 business day.", + "A digital receipt is automatically emailed after every purchase. For a formal tax invoice, go to \"My Orders\", select the order, and tap \"Request Tax Invoice\". Enter your business registration number (사업자등록번호). Tax invoices are issued within 1 business day and sent to your registered email address.Tax invoice requests must be made within the same calendar month as the purchase. Requests for prior months are not accepted.", + "Yes. The automatically issued digital receipt serves as a valid purchase receipt. For businesses requiring a tax invoice with VAT breakdown, follow the tax invoice request process above. Business accounts registered at b2b.cholog.kr can request monthly consolidated invoices covering all orders in the billing period.", + "Contact customer support within 1 business day of the original request. We can void and reissue a tax invoice with the correct number within the same calendar month. After the month closes, corrections are not possible under Korean tax law." + ] + }, + { + "id": "Q013", + "question": "구독을 해지하지 않고 잠깐 멈출 수 있나요?", + "reference_answer": "네, 구독은 해지하지 않고 일시정지할 수 있습니다. 설정 > 구독에서 일시정지를 선택하면 다음 배송을 건너뛰거나 최대 3개월까지 전체 배송을 멈출 수 있습니다. 일시정지 기간에는 요금이 청구되지 않습니다. 언제든 재개할 수 있으며 별도 불이익은 없습니다.", + "answer": "네, 구독을 잠시 멈추는 것이 가능합니다. \"설정 > 구독\"에서 \"일시정지\"를 선택하시면 다음 배송을 건너뛰거나 최대 3개월 동안 모든 배송을 중단할 수 있습니다. 일시정지 기간 동안에는 요금이 부과되지 않으며, 언제든지 재개하실 수 있습니다.", + "contexts": [ + "No. All subscriptions are month-to-month with no minimum commitment. Loyalty bonuses: 6 consecutive months earns 10,000 points; 12 consecutive months earns a 30,000 won coupon.", + "Skip next delivery: Available up to 48 hours before the scheduled dispatch date Pause (up to 3 months): No charge during pause; resume anytime Cancel: Effective after the current billing cycle. No cancellation fee. Remaining prepaid subscription credit refunded within 7 business days.", + "Yes. In \"Settings > Subscriptions\", tap \"Pause\" to skip the next delivery, or \"Pause Subscription\" to halt all deliveries for up to 3 months. No charge during the pause period. Resume anytime with no penalty.", + "Go to \"Settings > Subscriptions\" and tap \"Cancel\". Cancellation takes effect after the current billing cycle ends — no cancellation fee. Any remaining subscription credit is refunded within 7 business days. You can resubscribe at any time, but previous pricing is not guaranteed." + ] + }, + { + "id": "Q014", + "question": "친환경 포장을 선택하면 포인트가 추가로 쌓이나요?", + "reference_answer": "네, 친환경 포장을 선택하면 주문당 200 친환경 보너스 포인트가 적립됩니다. 이 포인트는 배송 완료 확인 후 7일 뒤 지급됩니다.", + "answer": "네, 친환경 포장인 \"Green Packaging\"을 선택하시면 주문 시 200포인트의 친환경 보너스가 적립됩니다. 이 포인트는 배송 확인 후 7일 후에 적립됩니다.", + "contexts": [ + "Select \"Green Packaging\" at checkout to receive your order in minimal, fully recyclable packaging with no plastic fillers. Green Packaging is free and reduces box size by up to 40%. Each order using Green Packaging earns a 200-point eco bonus credited 7 days after delivery confirmation.", + "Select \"Green Packaging\" at checkout to receive your order in minimal, fully recyclable packaging with no plastic fillers. Green Packaging is free of charge and reduces box size by up to 40%, lowering carbon emissions. Each Green Packaging order earns a 200-point eco bonus credited 7 days after delivery.", + "Every completed order earns 1 Carbon Point per 1,000 won spent. Carbon Points accumulate in your account and can be donated to verified reforestation projects (1 Carbon Point = 1 tree planted) or converted to 100 loyalty points each. Carbon Points do not expire and are separate from loyalty points.", + "| Event | Bonus | |-------|-------| | Green Packaging | 200 points per order | | Photo/video review | 500 points | | Electronics take-back | 2,000 points per item | | Daily check-in (Day 7) | 500 points or random coupon | | 30-day consecutive check-in | 10,000 won coupon | | Active subscriber purchases | 2× base rate on subscription deliveries |" + ] + }, + { + "id": "Q015", + "question": "마켓플레이스 판매자에게 직접 연락하는 방법이 있나요?", + "reference_answer": "마켓플레이스 판매자에게는 나의 주문 > 판매자 문의의 인앱 메시지 기능으로 연락하실 수 있습니다. 판매자가 3영업일 안에 응답하지 않거나 해결되지 않으면 나의 주문에서 분쟁 접수를 선택해 초록 구매자 보호로 분쟁을 접수할 수 있습니다.", + "answer": "죄송합니다, 제공된 문서에서 고객님이 찾으시는 정보를 찾지 못했어요. 더 자세한 확인이 필요하시다면 상담원에게 문의해주세요.", + "contexts": [ + "Apply at seller.cholog.kr with your business registration certificate, product catalog, and bank account details. Review takes approximately 5 business days. Approved sellers pay a commission of 5–12% per transaction depending on the product category. Sellers must maintain a customer satisfaction rating above 4.2 / 5.0 to remain listed.", + "Contact the seller directly first through the in-app messaging feature (\"My Orders > Contact Seller\"). If unresolved within 3 business days, you can escalate to Cholog Buyer Protection by selecting \"Open Dispute\" in \"My Orders\". Cholog mediates and may issue a full refund under the buyer protection guarantee within 5 business days.", + "Tap \"Report\" on the product page and select \"Counterfeit Suspected\" or \"Safety Concern\". Our quality assurance team investigates within 48 hours. If confirmed, the product is removed, the seller is penalized, and all affected buyers receive a full refund plus a 10,000 won inconvenience coupon.", + "Cholog Marketplace is our platform for verified third-party sellers. Marketplace products are clearly labeled with the seller's name on the product page and order confirmation. Cholog guarantees buyer protection on all Marketplace transactions up to 500,000 won. Beyond that amount, disputes are handled directly between buyer and seller." + ] + }, + { + "id": "Q050", + "question": "반품 신청 후 환불받기까지 가장 빠른 경우 얼마나 걸려요?", + "reference_answer": "가장 빠른 환불은 반품 상품 회수 후 검수가 1영업일 안에 끝나고 카카오페이 또는 네이버페이처럼 검수 후 즉시 환불되는 결제수단을 사용한 경우입니다. 이때 반품 요청부터 환불까지 최소 약 2-3영업일이 걸릴 수 있습니다. 신용카드는 검수 완료 후 추가로 3-5영업일이 걸립니다.", + "answer": "반품 신청 후 환불받기까지 가장 빠른 경우는 카카오페이 또는 네이버페이로 결제하셨을 때입니다. 이 경우, 반품 상품이 접수되고 검사가 완료된 후 바로 환불이 이루어지며, 환불은 일반적으로 즉시 처리됩니다. 따라서, 검사가 끝난 후 바로 환불이 진행되면 거의 즉시 환불받으실 수 있습니다.", + "contexts": [ + "After we receive and inspect the returned item (1–2 business days), we issue the refund: Credit card: 3–5 business days Kakao Pay / Naver Pay: typically instant Bank transfer: up to 7 business days International card (Visa/Mastercard issued abroad): 7–14 business days", + "| Payment Method | Refund Time | |----------------|-------------| | Credit card (domestic) | 3–5 business days after inspection | | Kakao Pay / Naver Pay | Typically instant after inspection | | Bank transfer | Up to 7 business days | | International card | 7–14 business days | | Cholog Pay | Instant |", + "배송 조회 — Check order in internal dashboard. Give Hanjin tracking number. If status is \"Preparing\" for > 2 business days, flag as delayed dispatch to logistics. 반품 신청 — Confirm within return window (14 days from delivery per v3 policy). Check item category — some are non-returnable (clearance, cosmetics, digital, personalized). Remind customer: non-defect returns incur 3,000 won handling fee. 환불 문의 — Confirm inspection is complete. Quote timeline by payment method: 카드 3–5일, 카카오/네이버페이 즉시, 계좌이체 최대 7일. 포인트 문의 — 1점=1원, 최소 1,000점 사용, 12개월 유효기간. Tier별 적립률: Standard 1%, Plus 3%, VIP 5%. (구버전 혼동 주의: 예전엔 3%/5%/7%였음) 멤버십 등급 — Plus = 연 20만원 이상, VIP = 연 80만원 이상. 등급 평가일: 매년 1월 1일. (2023년 기준과 다름: 구버전은 Plus=15만, VIP=60만이었음)", + "Open the Cholog app or website, go to \"My Orders\", tap the order, and select \"Request Return\". Choose a reason, upload at least one photo of the item, and select a pickup date. For defect-related returns, courier pickup is free. For non-defect returns (change of mind, wrong size), a 3,000 won handling fee is deducted from the refund." + ] + }, + { + "id": "Q051", + "question": "회원가입은 어떻게 하나요?", + "reference_answer": "회원가입은 카카오, 네이버, 구글 간편 로그인으로 하거나 이메일 주소로 직접 가입할 수 있습니다. 유효한 이메일 주소나 한국 휴대폰 번호가 필요하며, 만 14세 이상이면 가입할 수 있습니다. 신규 회원은 30일간 유효한 3,000원 웰컴 쿠폰을 받습니다.", + "answer": "회원가입은 이메일 주소 또는 한국 모바일 번호를 사용하거나, 카카오, 네이버, 구글 SSO를 통해 즉시 등록하실 수 있습니다. 회원가입 후에는 기본 등급인 스탠다드 등급으로 시작하며, 30일 이내에 사용할 수 있는 3,000원 환영 쿠폰이 지급됩니다.", + "contexts": [ + "You need a valid email address or Korean mobile number. You can also register instantly via Kakao, Naver, or Google SSO. All new accounts start at Standard tier and receive a one-time 3,000 won welcome coupon valid for 30 days.", + "| Tier | Qualification | Free Shipping | Points | Extras | |------|--------------|---------------|--------|--------| | Standard | Default | Economy on orders ≥ 20,000 won | 1% | — | | Plus | Spend ≥ 200,000 won/year | Economy on all orders | 3% | Birthday double-points | | VIP | Spend ≥ 800,000 won/year | Priority on all orders | 5% | Early launch access, dedicated support line (1588-0002) |Tier status is evaluated on January 1st each year based on the prior year's spending. Returned items are deducted from annual spending totals and may trigger a tier downgrade.", + "Apply at seller.cholog.kr with your business registration certificate, product catalog, and bank account details. Review takes approximately 5 business days. Approved sellers pay a commission of 5–12% per transaction depending on the product category. Sellers must maintain a customer satisfaction rating above 4.2 / 5.0 to remain listed.", + "| Benefit | Standard | Plus | VIP | |---------|---------|------|-----| | Point earning rate | 1% | 3% | 5% | | Free shipping | Economy ≥ 20,000 won | Economy on all orders | Priority on all orders | | Birthday bonus | 20% off coupon | 20% off + gift | 20% off + gift | | Early product access | — | — | Yes | | Dedicated support line | — | — | 1588-0002 | | Point expiry | 12 months | 12 months | 12 months |" + ] + }, + { + "id": "Q052", + "question": "뉴스레터 수신을 해지하려면 어떻게 하나요?", + "reference_answer": "뉴스레터 수신 해지는 뉴스레터 이메일 하단의 수신거부 링크를 클릭하면 됩니다. 앱이나 웹의 마이페이지 > 알림 설정에서 뉴스레터 수신을 끌 수도 있으며, 변경 사항은 보통 24-48시간 내 반영됩니다.", + "answer": "뉴스레터 수신을 해지하시려면 \"Settings > Subscriptions\"로 이동하신 후 \"Cancel\"을 탭하시면 됩니다. 해지는 현재 결제 주기가 끝난 후에 적용되며, 해지 시 별도의 해지 수수료는 없습니다. 남은 구독 크레딧은 7영업일 이내에 환불됩니다.", + "contexts": [ + "Go to \"Settings > Subscriptions\" and tap \"Cancel\". Cancellation takes effect after the current billing cycle ends — no cancellation fee. Any remaining subscription credit is refunded within 7 business days. You can resubscribe at any time, but previous pricing is not guaranteed.", + "Go to \"Settings > Privacy > Delete My Account\". After confirming with your password or a one-time verification code, deletion is scheduled within 7 business days. All personal data, order history, saved addresses, and payment tokens are purged under Korea's Personal Information Protection Act (PIPA).", + "Skip next delivery: Available up to 48 hours before the scheduled dispatch date Pause (up to 3 months): No charge during pause; resume anytime Cancel: Effective after the current billing cycle. No cancellation fee. Remaining prepaid subscription credit refunded within 7 business days.", + "No. All subscriptions are month-to-month with no minimum commitment. Loyalty bonuses: 6 consecutive months earns 10,000 points; 12 consecutive months earns a 30,000 won coupon." + ] + }, + { + "id": "Q053", + "question": "고객센터 전화번호와 운영 시간이 어떻게 되나요?", + "reference_answer": "고객센터 일반 전화는 1588-0000, VIP 우선 상담 전화는 1588-0002입니다. 전화 상담은 월요일부터 금요일까지 오전 9시-오후 6시(한국시간)에 운영됩니다. 실시간 채팅은 웹과 앱에서 매일 오전 8시-오후 10시까지 이용할 수 있고, 카카오톡 AI 상담은 24시간 이용할 수 있습니다.", + "answer": "고객센터 전화번호는 일반 문의의 경우 1588-0000이며, VIP 우선 문의는 1588-0002입니다. 전화 운영 시간은 월요일부터 금요일까지 오전 9시부터 오후 6시까지입니다.", + "contexts": [ + "| Channel | Hours | Notes | |---------|-------|-------| | Live Chat | 8 AM – 10 PM KST daily (incl. weekends) | Available on website and app. Avg. wait < 90 sec | | Email | Business days, reply within 12 hours | support@cholog.kr | | Phone | Mon–Fri 9 AM – 6 PM KST | 1588-0000 (general); 1588-0002 (VIP priority line) | | KakaoTalk | 24/7 AI assistant | Search @초록. Human handoff during Live Chat hours |", + "Yes. In the Help Center, select \"Request Callback\". Enter your phone number and preferred time slot. Callbacks are available Monday to Friday, 9 AM to 6 PM KST. If you are a VIP member, you can request priority callbacks via the dedicated line at 1588-0002.", + "Yes. Live Chat and email support are available in Korean and English. Phone support is primarily Korean, but English-speaking agents can be connected upon request. Response times for English inquiries may be slightly longer during peak hours.", + "배송 조회 — Check order in internal dashboard. Give Hanjin tracking number. If status is \"Preparing\" for > 2 business days, flag as delayed dispatch to logistics. 반품 신청 — Confirm within return window (14 days from delivery per v3 policy). Check item category — some are non-returnable (clearance, cosmetics, digital, personalized). Remind customer: non-defect returns incur 3,000 won handling fee. 환불 문의 — Confirm inspection is complete. Quote timeline by payment method: 카드 3–5일, 카카오/네이버페이 즉시, 계좌이체 최대 7일. 포인트 문의 — 1점=1원, 최소 1,000점 사용, 12개월 유효기간. Tier별 적립률: Standard 1%, Plus 3%, VIP 5%. (구버전 혼동 주의: 예전엔 3%/5%/7%였음) 멤버십 등급 — Plus = 연 20만원 이상, VIP = 연 80만원 이상. 등급 평가일: 매년 1월 1일. (2023년 기준과 다름: 구버전은 Plus=15만, VIP=60만이었음)" + ] + }, + { + "id": "Q054", + "question": "리뷰를 작성하면 포인트가 얼마나 쌓이나요?", + "reference_answer": "텍스트 리뷰 작성 시 100점, 사진이 포함된 리뷰는 사진 보너스 500점을 더해 총 600점이 쌓입니다. 포인트는 리뷰가 운영팀 승인 또는 검토를 통과한 뒤 1-2영업일 내 지급됩니다.", + "answer": "리뷰를 작성하시면 포인트가 적립됩니다. 사진이나 영상이 포함된 리뷰를 작성하시면 500포인트가 추가로 적립되며, 일반 리뷰는 적립되지 않습니다. 또한, 구매 후 검증된 구매(Verified Purchase)인 경우에만 리뷰를 남기실 수 있습니다. 포인트 적립은 리뷰 작성 후 7일 후에 지급되며, 적립된 포인트는 12개월 동안 유효합니다.", + "contexts": [ + "Points are earned at 1% (Standard), 3% (Plus), or 5% (VIP) of the pre-shipping order total. Points are credited 7 days after delivery confirmation and expire 12 months from the date earned. 1 point = 1 won. Minimum redemption: 1,000 points per order.", + "Yes. Only customers who have purchased and received the product can leave a review — labeled \"Verified Purchase\". Photo and video reviews earn 500 bonus points. Reviews that violate community guidelines (spam, offensive content) are removed by our moderation team.", + "| Event | Bonus | |-------|-------| | Green Packaging | 200 points per order | | Photo/video review | 500 points | | Electronics take-back | 2,000 points per item | | Daily check-in (Day 7) | 500 points or random coupon | | 30-day consecutive check-in | 10,000 won coupon | | Active subscriber purchases | 2× base rate on subscription deliveries |", + "Minimum redemption: 1,000 points per order 1 point = 1 won Points can be used on any purchase, combined with one coupon Points cannot be redeemed for cash or transferred between accounts" + ] + }, + { + "id": "Q055", + "question": "비밀번호 재설정 링크가 만료됐어요. 유효시간이 얼마인가요?", + "reference_answer": "비밀번호 재설정 링크는 발송 후 30분 동안 유효합니다. 링크가 만료되면 로그인 화면의 비밀번호 찾기에서 등록 이메일로 재설정 링크를 다시 요청해야 합니다.", + "answer": "죄송합니다, 제공된 문서에서 고객님이 찾으시는 비밀번호 재설정 링크의 유효시간에 대한 정보를 찾지 못했어요. 더 자세한 확인이 필요하시다면 상담원에게 문의해주세요.", + "contexts": [ + "Go to \"Settings > Privacy > Delete My Account\". After confirming with your password or a one-time verification code, deletion is scheduled within 7 business days. All personal data, order history, saved addresses, and payment tokens are purged under Korea's Personal Information Protection Act (PIPA).", + "| Consecutive Months | Bonus | |-------------------|-------| | 6 months | 10,000 loyalty points | | 12 months | 30,000 won coupon |Consecutive month count resets to zero if the subscription is canceled (not paused).", + "Contact customer support within 1 business day of the original request. We can void and reissue a tax invoice with the correct number within the same calendar month. After the month closes, corrections are not possible under Korean tax law.", + "| Payment Method | Refund Time | |----------------|-------------| | Credit card (domestic) | 3–5 business days after inspection | | Kakao Pay / Naver Pay | Typically instant after inspection | | Bank transfer | Up to 7 business days | | International card | 7–14 business days | | Cholog Pay | Instant |" + ] + }, + { + "id": "Q056", + "question": "CU 편의점 수령 시 보관 기간이 얼마나 되나요?", + "reference_answer": "CU 편의점 수령 주문은 지정한 CU 매장에서 5일 동안 보관됩니다. 5일 안에 수령하지 않으면 상품은 자동 반품되고 환불이 처리됩니다.", + "answer": "CU 편의점 수령 시 보관 기간은 5일입니다. 이 기간 내에 수령하지 않으면, 미수령 상품은 자동으로 반품되고 전액 환불이 처리됩니다.", + "contexts": [ + "Yes. Select \"CU Convenience Store Pickup\" at checkout and choose a CU location near you. The package is held for 5 calendar days; uncollected parcels are automatically returned and a full refund is issued.", + "All cold-chain orders are shipped exclusively via CJ Logistics Fresh. Orders are packed in insulated polystyrene boxes with gel ice packs rated for 24–36 hours of temperature control. Frozen items are packed with dry ice where required.", + "Yes. Fresh and frozen items are shipped in insulated packaging with ice packs via CJ Logistics Fresh (dedicated cold-chain courier). Cold-chain delivery is available only Monday through Thursday to prevent weekend transit degradation. A flat cold-chain fee of 4,000 won applies regardless of order size. Cold-chain orders cannot be combined with standard shipments.", + "Cold-chain delivery is available to all mainland Korean addresses and Jeju Island (add 2 business days). Delivery to remote offshore islands (Ulleungdo, Dokdo, etc.) is not available for cold-chain orders due to transit time constraints." + ] + }, + { + "id": "Q057", + "question": "예약 배송은 최대 며칠 후까지 지정할 수 있나요?", + "reference_answer": "예약 배송은 최대 14일 뒤 날짜까지 지정할 수 있습니다. 일반 배송과 우선 배송에서 지원되며, 당일 배송은 미리 예약할 수 없습니다.", + "answer": "예약 배송은 최대 14일 후까지 지정하실 수 있습니다. 결제 단계에서 \"Scheduled Delivery\"를 선택하고 원하는 날짜를 선택하시면 됩니다. 단, 동일일 배송은 예약이 불가능하며, 지역과 택배사의 상황에 따라 일부 제한이 있을 수 있습니다.", + "contexts": [ + "Yes. At checkout, select \"Scheduled Delivery\" and choose a date up to 14 days in advance. Available for Economy and Priority shipping tiers. Same-day delivery cannot be pre-scheduled.", + "Priority shipping orders allow you to select a 2-hour window between 9 AM and 9 PM. Economy shipping does not support time-slot selection. Availability depends on your region and courier capacity.", + "Cold-chain delivery is available Monday through Thursday only. This restriction prevents packages from sitting in transit over a weekend, which would exceed the ice pack rating. Orders placed by 11 AM KST Monday–Thursday dispatch same day Orders placed Thursday after 11 AM dispatch the following Monday No cold-chain delivery on Friday, Saturday, Sunday, or public holidays", + "Yes. We deliver to Jeju, Ulleungdo, Geojedo, and all major offshore islands. Delivery takes an additional 1–2 business days beyond the standard timeframe. There is no extra surcharge for island delivery." + ] + }, + { + "id": "Q058", + "question": "어떤 결제 수단을 지원하나요?", + "reference_answer": "지원 결제수단은 신용카드와 체크카드, 카카오페이, 네이버페이, 토스페이, 애플페이, 토스페이먼츠 실시간 계좌이체, 초록페이, 포인트, 쿠폰, 기프트카드 또는 스토어 크레딧입니다. 포인트와 쿠폰은 다른 결제수단과 함께 사용할 수 있습니다.", + "answer": "저희는 다음과 같은 결제 수단을 지원합니다:\n\n- 신용카드 및 체크카드: Visa, Mastercard, BC Card, NH Card (모두 신용/체크 가능)\n- 디지털 지갑: Kakao Pay, Naver Pay, Toss Pay, Apple Pay\n- 계좌이체: Toss Payments를 통한 직접 은행 송금\n- 자체 지갑: Cholog Pay (저희 고유의 지갑 서비스)\n- 상품권 및 적립금: 상품권과 매장 크레딧은 어떤 결제 방법과도 함께 사용할 수 있습니다.\n\n외국에서 발급된 Visa 또는 Mastercard도 KRW로 결제 가능하며, American Express와 Discover/Diners Club는 지원하지 않습니다. 결제 시 \"Split Payment\"를 선택하여 최대 두 가지 방법을 조합할 수도 있습니다.", + "contexts": [ + "We accept: Visa, Mastercard, BC Card, NH Card (credit/debit), digital wallets (Kakao Pay, Naver Pay, Toss Pay, Apple Pay), direct bank transfer via Toss Payments, and Cholog Pay (our proprietary wallet). Gift cards and store credit can be combined with any method.Foreign cards (Visa/Mastercard issued abroad) are accepted and charged in KRW. American Express and Discover/Diners Club are not accepted.", + "Yes. At checkout, select \"Split Payment\" to combine up to two methods — for example, part with Naver Pay and the remainder with a credit card. Gift card balances can also be combined with any other method. Only one coupon can be applied per order.", + "Cholog Pay is our proprietary wallet. Load funds via bank transfer and earn a 2% top-up bonus (load 10,000 won → receive 10,200 won). Balance can be used for any purchase and is refundable minus the bonus amount. Cholog Pay cannot be used to purchase gift cards.", + "Orders totaling 30,000 won or more are eligible for 2- or 3-month interest-free installments on BC Card and NH Card. Orders over 100,000 won unlock a 6-month interest-free plan. Installment options appear automatically at checkout when an eligible card is detected." + ] + }, + { + "id": "Q059", + "question": "주문번호는 어디서 확인하나요?", + "reference_answer": "주문번호는 주문 완료 후 발송되는 카카오 알림톡에서 확인할 수 있고, 앱의 나의 주문에서도 확인할 수 있습니다. 주문번호는 연월일-일련번호 형식입니다.", + "answer": "주문번호는 \"My Orders\"에서 확인하실 수 있습니다. 해당 페이지에서 주문 내역을 선택하시면 주문번호를 확인하실 수 있습니다.", + "contexts": [ + "After dispatch, you receive a Hanjin Express tracking number via email and KakaoTalk. Use the \"Track Shipment\" feature in the Cholog app or enter the number at hanjin.kr. Real-time GPS tracking is available for Priority shipments only.", + "A digital receipt is automatically emailed after every purchase. For a formal tax invoice, go to \"My Orders\", select the order, and tap \"Request Tax Invoice\". Enter your business registration number (사업자등록번호). Tax invoices are issued within 1 business day and sent to your registered email address.Tax invoice requests must be made within the same calendar month as the purchase. Requests for prior months are not accepted.", + "A digital receipt is sent automatically by email after every purchase. For a tax invoice, go to \"My Orders\", select the order, and tap \"Request Tax Invoice\". Enter your business registration number. Tax invoices are issued within 1 business day.", + "배송 조회 — Check order in internal dashboard. Give Hanjin tracking number. If status is \"Preparing\" for > 2 business days, flag as delayed dispatch to logistics. 반품 신청 — Confirm within return window (14 days from delivery per v3 policy). Check item category — some are non-returnable (clearance, cosmetics, digital, personalized). Remind customer: non-defect returns incur 3,000 won handling fee. 환불 문의 — Confirm inspection is complete. Quote timeline by payment method: 카드 3–5일, 카카오/네이버페이 즉시, 계좌이체 최대 7일. 포인트 문의 — 1점=1원, 최소 1,000점 사용, 12개월 유효기간. Tier별 적립률: Standard 1%, Plus 3%, VIP 5%. (구버전 혼동 주의: 예전엔 3%/5%/7%였음) 멤버십 등급 — Plus = 연 20만원 이상, VIP = 연 80만원 이상. 등급 평가일: 매년 1월 1일. (2023년 기준과 다름: 구버전은 Plus=15만, VIP=60만이었음)" + ] + }, + { + "id": "Q060", + "question": "선물 포장을 추가하면 비용이 얼마인가요?", + "reference_answer": "선물 포장 비용은 상품 1개당 1,500원입니다. 브랜드 박스, 리본, 최대 100자 메시지 카드가 포함되고 메시지 카드는 추가 비용이 없습니다. 포장 시작 전 주문을 취소하면 포장비도 전액 환불됩니다.", + "answer": "선물 포장을 추가하시면 1,500원 per item의 비용이 부과됩니다.", + "contexts": [ + "Yes. Select \"Gift Wrap\" at checkout for 1,500 won per item. Includes a branded box, ribbon, and a personalized message card (up to 100 characters). Gift wrapping is not available for oversized items or Marketplace seller products.", + "Yes. Fresh and frozen items are shipped in insulated packaging with ice packs via CJ Logistics Fresh (dedicated cold-chain courier). Cold-chain delivery is available only Monday through Thursday to prevent weekend transit degradation. A flat cold-chain fee of 4,000 won applies regardless of order size. Cold-chain orders cannot be combined with standard shipments.", + "| Order Amount | Cold-Chain Fee | |-------------|----------------| | Any amount | Flat 4,000 won |Cold-chain fee applies regardless of membership tier or free-shipping eligibility. Cold-chain orders cannot be combined with standard-tier shipments.", + "Select \"Green Packaging\" at checkout to receive your order in minimal, fully recyclable packaging with no plastic fillers. Green Packaging is free of charge and reduces box size by up to 40%, lowering carbon emissions. Each Green Packaging order earns a 200-point eco bonus credited 7 days after delivery." + ] + }, + { + "id": "Q061", + "question": "배송 메모를 남길 수 있나요?", + "reference_answer": "네, 배송 메모는 주문 시 결제 화면에서 입력할 수 있고, 발송 전이라면 나의 주문에서 해당 주문을 열어 수정할 수 있습니다. '문 앞에 놓아주세요', '경비실에 맡겨주세요', '무인 택배함에 넣어주세요' 같은 요청사항이 택배기사에게 전달됩니다.", + "answer": "죄송합니다, 제공된 문서에서 고객님이 찾으시는 정보를 찾지 못했어요. 더 자세한 확인이 필요하시다면 상담원에게 문의해주세요.", + "contexts": [ + "All standard domestic orders are fulfilled through Hanjin Express. Cold-chain (fresh/frozen) orders are shipped via CJ Logistics Fresh. Large-item deliveries (furniture, appliances over 20 kg) are handled by Lotte Global Logistics with a two-person team.", + "When customers ask about delivery during holiday periods, quote the extended estimates above. Do NOT promise next-business-day delivery for Priority orders during suspension windows. Proactively inform customers who placed orders close to holiday cutoffs via outbound KakaoTalk.", + "Cold-chain delivery is available to all mainland Korean addresses and Jeju Island (add 2 business days). Delivery to remote offshore islands (Ulleungdo, Dokdo, etc.) is not available for cold-chain orders due to transit time constraints.", + "After dispatch, you receive a Hanjin Express tracking number via email and KakaoTalk. Use the \"Track Shipment\" feature in the Cholog app or enter the number at hanjin.kr. Real-time GPS tracking is available for Priority shipments only." + ] + }, + { + "id": "Q062", + "question": "리뷰는 배송 후 며칠 안에 써야 하나요?", + "reference_answer": "리뷰는 배송 완료 후 90일 이내에 작성할 수 있습니다. 90일이 지나면 해당 주문의 리뷰 작성 버튼이 더 이상 제공되지 않습니다.", + "answer": "죄송합니다, 제공된 문서에서 고객님이 찾으시는 정보를 찾지 못했어요. 더 자세한 확인이 필요하시다면 상담원에게 문의해주세요.", + "contexts": [ + "After we receive and inspect the returned item (1–2 business days), we issue the refund: Credit card: 3–5 business days Kakao Pay / Naver Pay: typically instant Bank transfer: up to 7 business days International card (Visa/Mastercard issued abroad): 7–14 business days", + "Yes. Only customers who have purchased and received the product can leave a review — labeled \"Verified Purchase\". Photo and video reviews earn 500 bonus points. Reviews that violate community guidelines (spam, offensive content) are removed by our moderation team.", + "배송 조회 — Check order in internal dashboard. Give Hanjin tracking number. If status is \"Preparing\" for > 2 business days, flag as delayed dispatch to logistics. 반품 신청 — Confirm within return window (14 days from delivery per v3 policy). Check item category — some are non-returnable (clearance, cosmetics, digital, personalized). Remind customer: non-defect returns incur 3,000 won handling fee. 환불 문의 — Confirm inspection is complete. Quote timeline by payment method: 카드 3–5일, 카카오/네이버페이 즉시, 계좌이체 최대 7일. 포인트 문의 — 1점=1원, 최소 1,000점 사용, 12개월 유효기간. Tier별 적립률: Standard 1%, Plus 3%, VIP 5%. (구버전 혼동 주의: 예전엔 3%/5%/7%였음) 멤버십 등급 — Plus = 연 20만원 이상, VIP = 연 80만원 이상. 등급 평가일: 매년 1월 1일. (2023년 기준과 다름: 구버전은 Plus=15만, VIP=60만이었음)", + "| Payment Method | Refund Time | |----------------|-------------| | Credit card (domestic) | 3–5 business days after inspection | | Kakao Pay / Naver Pay | Typically instant after inspection | | Bank transfer | Up to 7 business days | | International card | 7–14 business days | | Cholog Pay | Instant |" + ] + }, + { + "id": "Q063", + "question": "포인트는 최소 몇 점부터 쓸 수 있나요?", + "reference_answer": "포인트는 최소 1,000점부터 사용할 수 있습니다. 1,000점 이상은 1점 단위로 사용할 수 있고, 포인트는 다른 결제수단 및 쿠폰과 함께 사용할 수 있습니다.", + "answer": "포인트는 최소 1,000점부터 사용할 수 있습니다.", + "contexts": [ + "Minimum redemption: 1,000 points per order 1 point = 1 won Points can be used on any purchase, combined with one coupon Points cannot be redeemed for cash or transferred between accounts", + "Points are earned at 1% (Standard), 3% (Plus), or 5% (VIP) of the pre-shipping order total. Points are credited 7 days after delivery confirmation and expire 12 months from the date earned. 1 point = 1 won. Minimum redemption: 1,000 points per order.", + "Points are calculated on the pre-shipping, pre-discount order total. Points are credited 7 days after delivery confirmation and expire 12 months from the date earned. Minimum redemption is 1,000 points. 1 point = 1 won.", + "| Event | Bonus | |-------|-------| | Green Packaging | 200 points per order | | Photo/video review | 500 points | | Electronics take-back | 2,000 points per item | | Daily check-in (Day 7) | 500 points or random coupon | | 30-day consecutive check-in | 10,000 won coupon | | Active subscriber purchases | 2× base rate on subscription deliveries |" + ] + }, + { + "id": "Q064", + "question": "실시간 GPS 배송 추적은 어떤 배송에서 가능한가요?", + "reference_answer": "실시간 GPS 배송 추적은 우선 배송에서만 제공됩니다. 일반 배송은 단계별 상태 업데이트만 제공하고 실시간 GPS는 지원하지 않습니다. VIP 회원은 모든 주문에서 우선 배송 무료 혜택을 받으므로 우선 배송 주문에 대해 GPS 추적을 이용할 수 있습니다.", + "answer": "실시간 GPS 배송 추적은 프라이어리티(Priority) 배송에서만 가능합니다. 따라서, 프라이어리티 배송을 이용하시는 경우에만 실시간 GPS 추적 서비스를 이용하실 수 있습니다.", + "contexts": [ + "After dispatch, you receive a Hanjin Express tracking number via email and KakaoTalk. Use the \"Track Shipment\" feature in the Cholog app or enter the number at hanjin.kr. Real-time GPS tracking is available for Priority shipments only.", + "All standard domestic orders are fulfilled through Hanjin Express. Cold-chain (fresh/frozen) orders are shipped via CJ Logistics Fresh. Large-item deliveries (furniture, appliances over 20 kg) are handled by Lotte Global Logistics with a two-person team.", + "Cold-chain delivery is available to all mainland Korean addresses and Jeju Island (add 2 business days). Delivery to remote offshore islands (Ulleungdo, Dokdo, etc.) is not available for cold-chain orders due to transit time constraints.", + "| Type | Courier | |------|---------| | Standard | Hanjin Express | | Cold-chain | CJ Logistics Fresh | | Large item | Lotte Global Logistics |" + ] + }, + { + "id": "Q065", + "question": "회원 탈퇴하면 포인트는 어떻게 되나요?", + "reference_answer": "회원 탈퇴를 하면 남아 있는 포인트와 쿠폰은 즉시 소멸되며 복구할 수 없습니다. 탈퇴 전에 남은 포인트를 사용하는 것이 좋습니다.", + "answer": "회원 탈퇴 시에는 사용하지 않은 포인트와 쿠폰이 모두 소멸됩니다. 따라서 탈퇴 전에 포인트를 사용하시거나 적립된 포인트가 남아있지 않도록 확인하시는 것이 좋습니다.", + "contexts": [ + "Unused points and coupons are forfeited upon deletion.", + "Points are calculated on the pre-shipping, pre-discount order total. Points are credited 7 days after delivery confirmation and expire 12 months from the date earned. Minimum redemption is 1,000 points. 1 point = 1 won.", + "Points are earned at 1% (Standard), 3% (Plus), or 5% (VIP) of the pre-shipping order total. Points are credited 7 days after delivery confirmation and expire 12 months from the date earned. 1 point = 1 won. Minimum redemption: 1,000 points per order.", + "Minimum redemption: 1,000 points per order 1 point = 1 won Points can be used on any purchase, combined with one coupon Points cannot be redeemed for cash or transferred between accounts" + ] + } +] \ No newline at end of file diff --git a/mission/wall-report.md b/mission/wall-report.md index 4994eca..e127aca 100644 --- a/mission/wall-report.md +++ b/mission/wall-report.md @@ -7,26 +7,34 @@ > 구현하면서 잘 안 됐던 것, 예상과 달랐던 것을 적어주세요. -- - +- 초반 조회 결과에 질문 관련 내용이 없길래 topK 값을 2배~4배까지 늘려 해당 질문에 대한 답변을 잘할 수 있도록 개선했습니다. +하지만 그 외 다른 질문에 대한 정확도는 확연히 떨어지는 것을 발견했습니다. 컨텍스트에 많은 내용이 들어가 오히려 혼란을 준 것 같습니다. +현재 구현 기준 기본값인 topK=4가 가장 최적으로 보여 롤백했습니다. +- 네이버페이에 대해 물어봤는데 카카오페이에 대한 답변을 하는 경우가 있었습니다. +알고보니 ChatMemory 의해 이전 질문이 컨텍스트에 포함되며 이전 질문을 현재 질문이라고 착각해서 생긴 문제였습니다. +ChatMemory를 제거하고 대화 내역이 보존되지 않게 했지만 추후 해결해야할 문제입니다. ## 2. 해결하지 못한 것 > 시도했지만 결국 해결 못한 문제가 있다면 적어주세요. -- - +- 컨텍스트에 질문에 대한 정답이 포함되어 있는데 틀린 답변을 내놓습니다. 관련 케이스를 살펴보니 정답 내용이 첫번째에 오지 않을 경우 주로 발생했습니다. + 해결하기 위해 리랭크 개념을 학습하고 llm에게 청크 재정렬을 맡겨봤는데 이 또한 제가 의도한대로 재정렬되지 않았습니다. +- 컨텍스트에 상반된 내용이 있을 때에 따라 다른 대답을 하는 문제를 해결하지 못했습니다. 예를 들어 `VIP는 냉장 배송도 무료배송인가요?`를 물었을 때 +`vip는 모두 무료다`와 `냉장 배송은 등급 상관없이 4000원 고정이다`라는 내용이 섞여 `vip는 냉장 배송도 무료다` 라는 잘못된 답변을 내놓습니다. +프롬프트에 내용이 상반될 경우 더 상세한 것, 세부적인 것을 기준으로 하라고 명시했지만 상세하고 세부적인 것의 기준 조차 애매해 잘동작하지 않습니다. +- 명확하지 않은 단어를 잘 이해하지 못하는 경우가 많습니다. 예를 들어 `비구독 상품`이라고 하면 비구독 사용자가 상품을 구매하는 경우라고 잘못 이해해 이해해 + 틀린 답변을 내뱉습니다. ## 3. 정확도 측정 결과 -> 테스트 질문 100개로 측정한 정확도를 기록해주세요. - -| 난이도 | 정확도 | 비고 | -|--------|--------|------| -| easy | | | -| medium | | | -| hard | | | +> 테스트 질문 150개로 측정한 정확도를 기록해주세요. +| 난이도 | 정확도 | 비고 | +|--------|-------|----| +| easy | 14/30 | | +| medium | 27/94 | | +| hard | 6/26 | | ## 4. 왜 그런 결과가 나왔는지 @@ -34,9 +42,16 @@ - - ## 5. 개선하고 싶은 것 > 시간이 더 있었다면 시도해보고 싶은 개선점을 적어주세요. -- +- 답변의 말투를 개선하고 싶습니다. 현재는 같은 내용을 반복하거나, 사용자가 응?할만한 말투를 구사합니다. + 또한 내부 컨텍스트 문서의 존재를 답변에 포함하기도 합니다. +- 대화 맥락을 보존해 더욱 고객 응대에 능한 챗봇을 만들고 싶습니다. +- 인메모리 외 인프라를 구축해 정말 실무의 챗봇과 유사하게 만들어보고 싶습니다. +- 평가 방식을 개선해 모델의 성능을 제대로 측정하고 반복 개선해나가보고 싶습니다. 현재 평가는 이걸 왜 틀렸다고 하는거지?싶은 부분이 많습니다. + 챗봇의 목적마다 평가 방식이 다르니 제가 만들고자 하는 챗봇을 명확히 정의하고 그에 맞는 평가 방식을 새로 만들어보고 싶습니다. +- 챗 로그, 이력을 관리하고 활용해보고 싶습니다. 주어진 데이터셋의 챗 로그는 컨텍스트에 넣지 않고 가장 많이 묻는 질문과 같은 운영 통계 목적으로 활용했습니다. + 다른 방향으로 활용할 수 있다면 참고해 챗 로그까지 활용해 데이터 축적에 따른 성능 향상을 이루고 싶습니다. +- 구버전 문서도 마찬가지로 필요 없다고 느껴 제거했는데 필요하다면 포함해 응답 수준을 높여보고 싶습니다. diff --git a/src/main/java/com/cholog/bootcamp/config/MarkdownReader.java b/src/main/java/com/cholog/bootcamp/config/MarkdownReader.java new file mode 100644 index 0000000..33c7619 --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/config/MarkdownReader.java @@ -0,0 +1,48 @@ +package com.cholog.bootcamp.config; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.ai.document.Document; +import org.springframework.ai.reader.markdown.MarkdownDocumentReader; +import org.springframework.ai.reader.markdown.config.MarkdownDocumentReaderConfig; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.Resource; +import org.springframework.stereotype.Component; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Component +public class MarkdownReader { + + private final Resource[] resources; + + public MarkdownReader(@Value("classpath:data/**/*.md") Resource[] resources) { + this.resources = resources; + } + + public List loadAll() { + List allDocuments = new ArrayList<>(); + for (Resource resource : resources) { + MarkdownDocumentReaderConfig config = MarkdownDocumentReaderConfig.builder() + .withHorizontalRuleCreateDocument(true) + .withIncludeCodeBlock(false) + .withIncludeBlockquote(false) + .withAdditionalMetadata("filename", resource.getFilename()) + .build(); + + MarkdownDocumentReader reader = new MarkdownDocumentReader(resource, config); + allDocuments.addAll(reader.get()); + } + + allDocuments.forEach(doc -> log.info( + "filename={}, title={}, text={}", + doc.getMetadata().get("filename"), + doc.getMetadata().get("title"), + doc.getText() + )); + + return allDocuments; + } +} diff --git a/src/main/java/com/cholog/bootcamp/config/QueryExpanderConfig.java b/src/main/java/com/cholog/bootcamp/config/QueryExpanderConfig.java new file mode 100644 index 0000000..c3c9121 --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/config/QueryExpanderConfig.java @@ -0,0 +1,41 @@ +package com.cholog.bootcamp.config; + +import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.chat.prompt.PromptTemplate; +import org.springframework.ai.rag.preretrieval.query.expansion.MultiQueryExpander; +import org.springframework.ai.rag.preretrieval.query.expansion.QueryExpander; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class QueryExpanderConfig { + + @Bean + public QueryExpander queryExpander(ChatClient.Builder builder) { + return MultiQueryExpander.builder() + .chatClientBuilder(builder) + .promptTemplate(PromptTemplate.builder() + .template(""" + You are an expert at information retrieval and search optimization. + Your task is to generate {number} different versions of the given query. + + Each variant must cover different perspectives or aspects of the topic, + while maintaining the core intent of the original query. The goal is to + expand the search space and improve the chances of finding relevant information. + + Do not explain your choices or add any other text. + Provide the query variants separated by newlines. + + Original query: {query} + + Query variants: + + -----동의어----- + 회원탈퇴 - 계정삭제 + -------------- + """) + .build()) + .numberOfQueries(4) + .build(); + } +} diff --git a/src/main/java/com/cholog/bootcamp/config/QueryTransformerConfig.java b/src/main/java/com/cholog/bootcamp/config/QueryTransformerConfig.java new file mode 100644 index 0000000..9065544 --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/config/QueryTransformerConfig.java @@ -0,0 +1,19 @@ +package com.cholog.bootcamp.config; + +import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.rag.preretrieval.query.transformation.QueryTransformer; +import org.springframework.ai.rag.preretrieval.query.transformation.TranslationQueryTransformer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class QueryTransformerConfig { + + @Bean + public QueryTransformer getQueryTransformer(ChatClient.Builder builder) { + return TranslationQueryTransformer.builder() + .chatClientBuilder(builder) + .targetLanguage("english") + .build(); + } +} diff --git a/src/main/java/com/cholog/bootcamp/config/SimpleVectorStoreConfig.java b/src/main/java/com/cholog/bootcamp/config/SimpleVectorStoreConfig.java new file mode 100644 index 0000000..ba597d1 --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/config/SimpleVectorStoreConfig.java @@ -0,0 +1,73 @@ +package com.cholog.bootcamp.config; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; + +import org.springframework.ai.embedding.EmbeddingModel; +import org.springframework.ai.vectorstore.SimpleVectorStore; +import org.springframework.boot.ApplicationRunner; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SimpleVectorStoreConfig { + + private static final String MODE_OPTION = "mode"; + private static final String EMBEDDING_MODE = "embedding"; + + @Bean + public SimpleVectorStore vectorStore(EmbeddingModel embeddingModel) { + return SimpleVectorStore.builder(embeddingModel).build(); + } + + /** + * VectorStore 임베딩 runner + * 애플리케이션 실행 시 --mode=embedding 옵션이 존재하면 임베딩을 새로 수행한다. + * + * bootrun 실행 시 + * `./gradlew bootrun --args='--mode=embedding' + * + * jar 실행 시 + * `java -jar --mode=embedding` + */ + @Bean + public ApplicationRunner applicationRunner(SimpleVectorStore vectorStore, MarkdownReader markdownReader) { + File vectorFile = Paths.get("data", "vector-store.json").toFile(); + createNewVectorFile(vectorFile); + + return args -> { + List options = args.getOptionValues(MODE_OPTION); + if (options == null || options.isEmpty()) { + vectorStore.load(vectorFile); + return; + } + + for (String option : options) { + if (option.equals(EMBEDDING_MODE)) { + doEmbedding(vectorStore, markdownReader, vectorFile); + return; + } + } + + vectorStore.load(vectorFile); + }; + } + + private void doEmbedding(SimpleVectorStore vectorStore, MarkdownReader markdownReader, File vectorFile) { + vectorFile.delete(); + createNewVectorFile(vectorFile); + vectorStore.doAdd(markdownReader.loadAll()); + vectorStore.save(vectorFile); + } + + private void createNewVectorFile(File vectorFile) { + try { + vectorFile.createNewFile(); + } catch (IOException e) { + throw new RuntimeException("vector-store.json 생성 실패", e); + } + } +} diff --git a/src/main/java/com/cholog/bootcamp/controller/ChatPageController.java b/src/main/java/com/cholog/bootcamp/controller/ChatPageController.java new file mode 100644 index 0000000..c70e726 --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/controller/ChatPageController.java @@ -0,0 +1,35 @@ +package com.cholog.bootcamp.controller; + +import java.util.List; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class ChatPageController { + + @GetMapping({"/", "/chat"}) + public String chat(Model model) { + model.addAttribute("pageTitle", "초록 고객지원 챗봇"); + model.addAttribute("initialMessage", """ + 안녕하세요. 초록 고객지원 챗봇입니다.🤖 + 무엇을 도와드릴까요? + + 📞 운영시간 안내 + 자동 챗봇은 24시간 이용하실 수 있습니다. + 상담사 연결 및 전화 상담은 평일 오전 9시부터 오후 6시까지 가능하며, 주말 및 공휴일에는 운영되지 않습니다. + 운영 시간 외 문의는 챗봇을 이용하시거나 이메일로 남겨주시면 다음 영업일부터 순차적으로 확인해 드리겠습니다. + + ☎️ 문의 전화: 1588-0000 + 📧 이메일: support@cholog.kr + 💬 카카오톡: @초록 + """); + model.addAttribute("quickPrompts", List.of( + "배송은 보통 얼마나 걸리나요?", + "반품 신청 기준을 알려주세요.", + "멤버십 등급 혜택이 궁금해요." + )); + return "chat"; + } +} diff --git a/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java b/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java new file mode 100644 index 0000000..b2a361b --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java @@ -0,0 +1,31 @@ +package com.cholog.bootcamp.controller; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.cholog.bootcamp.dto.ChatbotRequest; +import com.cholog.bootcamp.dto.ChatbotResponse; +import com.cholog.bootcamp.service.ChatbotService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +@RequestMapping("/api/chat") +@RestController +public class ChatbotController { + + private final ChatbotService chatbotService; + + @PostMapping + public ResponseEntity chat( + @RequestBody ChatbotRequest request + ) { + ChatbotResponse response = chatbotService.chat(request); + return ResponseEntity.ok().body(response); + } +} diff --git a/src/main/java/com/cholog/bootcamp/dto/ChatbotRequest.java b/src/main/java/com/cholog/bootcamp/dto/ChatbotRequest.java new file mode 100644 index 0000000..0566ce3 --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/dto/ChatbotRequest.java @@ -0,0 +1,6 @@ +package com.cholog.bootcamp.dto; + +public record ChatbotRequest( + String question +) { +} diff --git a/src/main/java/com/cholog/bootcamp/dto/ChatbotResponse.java b/src/main/java/com/cholog/bootcamp/dto/ChatbotResponse.java new file mode 100644 index 0000000..050490a --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/dto/ChatbotResponse.java @@ -0,0 +1,39 @@ +package com.cholog.bootcamp.dto; + +import java.util.List; + +import org.springframework.ai.chat.metadata.Usage; +import org.springframework.ai.chat.model.ChatResponse; +import org.springframework.ai.document.Document; + +public record ChatbotResponse( + String answer, + TokenUsageInfo tokenUsage, + List contexts +) { + + public static ChatbotResponse from(ChatResponse chatResponse, List documents) { + String answer = chatResponse.getResult().getOutput().getText(); + Usage usage = chatResponse.getMetadata().getUsage(); + List contexts = documents.stream() + .map(Document::getText) + .toList(); + + return new ChatbotResponse( + answer, + new TokenUsageInfo( + usage.getPromptTokens(), + usage.getCompletionTokens(), + usage.getTotalTokens() + ), + contexts + ); + } + + private record TokenUsageInfo( + int promptTokens, + int completionTokens, + int totalTokens + ) { + } +} diff --git a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java new file mode 100644 index 0000000..4e11d04 --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java @@ -0,0 +1,34 @@ +package com.cholog.bootcamp.service; + +import java.util.List; + +import org.springframework.ai.chat.model.ChatResponse; +import org.springframework.ai.document.Document; +import org.springframework.stereotype.Service; + +import com.cholog.bootcamp.dto.ChatbotRequest; +import com.cholog.bootcamp.dto.ChatbotResponse; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +public class ChatbotService { + + private final RAGRetriever ragRetriever; + private final RAGGenerator ragGenerator; + + public ChatbotService( + RAGRetriever ragRetriever, + RAGGenerator ragGenerator + ) { + this.ragRetriever = ragRetriever; + this.ragGenerator = ragGenerator; + } + + public ChatbotResponse chat(ChatbotRequest request) { + List documents = ragRetriever.retrieve(request.question(), 4); + ChatResponse chatResponse = ragGenerator.generate(documents, request.question()); + return ChatbotResponse.from(chatResponse, documents); + } +} diff --git a/src/main/java/com/cholog/bootcamp/service/RAGGenerator.java b/src/main/java/com/cholog/bootcamp/service/RAGGenerator.java new file mode 100644 index 0000000..544dac0 --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/service/RAGGenerator.java @@ -0,0 +1,53 @@ +package com.cholog.bootcamp.service; + +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.chat.model.ChatResponse; +import org.springframework.ai.document.Document; +import org.springframework.stereotype.Component; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Component +public class RAGGenerator { + + private static final String SYSTEM_PROMPT = """ + 당신은 제공된 [컨텍스트]만을 기반으로 [사용자 질문]에 답변하는 신뢰할 수 있는 초록 고객센터의 챗봇입니다. + + 아래의 규칙을 엄격하게 준수하십시오. + - 반드시 모든 답변은 [컨텍스트]에 있는 정보를 기반으로 생성하세요. 절대 [컨텍스트]에 없는 정보를 추론하거나 사실인 것처럼 대답하지 마세요. + - [컨텍스트]에 참고할 정보가 없어 [사용자 질문]에 정확한 답변을 할 수 없는 경우에만 "죄송합니다, 제공된 문서에서 고객님이 찾으시는 정보를 찾지 못했어요. 더 자세한 확인이 필요하시다면 상담원에게 문의해주세요."라고 답합니다. + - 내용이 충돌하는 경우 다음 우선순위를 따라 답변 합니다. + - 질문 도메인과 가장 근접한 내용 + - 더 구체적인 상황을 다루는 내용 + - 더 최신 버전의 내용 + """; + private final ChatClient chatClient; + + public RAGGenerator(ChatClient.Builder chatClientBuilder) { + this.chatClient = chatClientBuilder.build(); + } + + public ChatResponse generate(List documents, String question) { + return chatClient.prompt() + .system(SYSTEM_PROMPT) + .user(""" + [사용자 질문] + %s + + [컨텍스트] + %s + """.formatted(question, getContext(documents))) + .call() + .chatResponse(); + } + + private String getContext(List documents) { + return documents.stream() + .map(Document::getText) + .collect(Collectors.joining("\n\n")); + } +} diff --git a/src/main/java/com/cholog/bootcamp/service/RAGRetriever.java b/src/main/java/com/cholog/bootcamp/service/RAGRetriever.java new file mode 100644 index 0000000..af51caa --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/service/RAGRetriever.java @@ -0,0 +1,49 @@ +package com.cholog.bootcamp.service; + +import java.util.List; + +import org.springframework.ai.document.Document; +import org.springframework.ai.rag.Query; +import org.springframework.ai.rag.preretrieval.query.expansion.QueryExpander; +import org.springframework.ai.rag.preretrieval.query.transformation.QueryTransformer; +import org.springframework.ai.vectorstore.SearchRequest; +import org.springframework.ai.vectorstore.VectorStore; +import org.springframework.stereotype.Component; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Component +public class RAGRetriever { + + private final VectorStore vectorStore; + private final QueryTransformer queryTransformer; + private final QueryExpander queryExpander; + + public RAGRetriever( + VectorStore vectorStore, + QueryTransformer queryTransformer, + QueryExpander queryExpander + ) { + this.vectorStore = vectorStore; + this.queryTransformer = queryTransformer; + this.queryExpander = queryExpander; + } + + public List retrieve(String question, int topK) { + Query query = getQuery(question); + SearchRequest searchRequest = getSearchRequest(query, topK); + return vectorStore.similaritySearch(searchRequest); + } + + private Query getQuery(String question) { + return new Query(question); + } + + private SearchRequest getSearchRequest(Query query, int topK) { + return SearchRequest.builder() + .query(query.text()) + .topK(topK) + .build(); + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 6233b35..a36a196 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,4 +1,6 @@ spring: + config: + import: optional:file:.env[.properties] # 루트의 .env 파일이 존재하면 .properties 형식으로 읽어 임포트 application: name: spring-ai-bootcamp-basic ai: @@ -10,4 +12,4 @@ spring: temperature: 0.1 embedding: options: - model: text-embedding-3-small + model: text-embedding-3-large diff --git a/src/main/resources/data/layer1_faq/account.md b/src/main/resources/data/layer1_faq/account.md new file mode 100644 index 0000000..2e847c4 --- /dev/null +++ b/src/main/resources/data/layer1_faq/account.md @@ -0,0 +1,49 @@ +# Account & Membership + +## Cholog Corporation — Official FAQ + +### What are the membership tiers and their benefits? + +| Tier | Qualification | Free Shipping | Points | Extras | +|------|--------------|---------------|--------|--------| +| Standard | Default | Economy on orders ≥ 20,000 won | 1% | — | +| Plus | Spend ≥ 200,000 won/year | Economy on all orders | 3% | Birthday double-points | +| VIP | Spend ≥ 800,000 won/year | Priority on all orders | 5% | Early launch access, dedicated support line (1588-0002) | + +Tier status is evaluated on January 1st each year based on the prior year's spending. +Returned items are deducted from annual spending totals and may trigger a tier downgrade. + +### How does the loyalty point system work? + +Points are earned at 1% (Standard), 3% (Plus), or 5% (VIP) of the pre-shipping order total. +Points are credited 7 days after delivery confirmation and expire 12 months from the date +earned. 1 point = 1 won. Minimum redemption: 1,000 points per order. + +### How do I create an account? + +You need a valid email address or Korean mobile number. You can also register instantly via +Kakao, Naver, or Google SSO. All new accounts start at Standard tier and receive a one-time +3,000 won welcome coupon valid for 30 days. + +### How do I permanently delete my account? + +Go to "Settings > Privacy > Delete My Account". After confirming with your password or +a one-time verification code, deletion is scheduled within 7 business days. All personal +data, order history, saved addresses, and payment tokens are purged under Korea's Personal +Information Protection Act (PIPA). + +### What happens to unused points and coupons after account deletion? + +Unused points and coupons are forfeited upon deletion. + +### How do I enable two-factor authentication (2FA)? + +Go to "Settings > Security > Two-Factor Authentication". Choose SMS or an authenticator +app (Google Authenticator, Authy). Once enabled, a 6-digit code is required at every login. +Recovery codes are provided during setup — store them safely. + +### When do loyalty points expire? + +Points expire 12 months from the date they are earned. If you return an order, the points +earned from that order are deducted within 24 hours of the refund. If your balance is +insufficient, the deficit is carried forward and deducted from future earnings. diff --git a/src/main/resources/data/layer1_faq/eco_green.md b/src/main/resources/data/layer1_faq/eco_green.md new file mode 100644 index 0000000..f61d191 --- /dev/null +++ b/src/main/resources/data/layer1_faq/eco_green.md @@ -0,0 +1,38 @@ +# Environment & Green Initiatives + +## Cholog Corporation — Official FAQ + +### What is the Eco Choice certification? + +Products bearing the green leaf "Eco Choice" badge meet at least one of: made from +recycled materials, certified by Korea Eco-Label (환경부 인증), carbon-neutral shipping, +or biodegradable packaging. Filter by "Eco Choice" in any product category to browse. +Eco Choice status is reviewed annually and may be revoked if the product no longer meets criteria. + +### How does the Green Packaging option work? + +Select "Green Packaging" at checkout to receive your order in minimal, fully recyclable +packaging with no plastic fillers. Green Packaging is free and reduces box size by up to +40%. Each order using Green Packaging earns a 200-point eco bonus credited 7 days after +delivery confirmation. + +### What is the Carbon Points program? + +Every completed order earns 1 Carbon Point per 1,000 won spent. Carbon Points accumulate +in your account and can be donated to verified reforestation projects (1 Carbon Point = +1 tree planted) or converted to 100 loyalty points each. Carbon Points do not expire +and are separate from loyalty points. + +### How does the electronics take-back program work? + +Bring used electronics to any CU convenience store collection point. You receive 2,000 +loyalty points per item dropped off. For large items (TVs, appliances), free pickup can +be scheduled through "Help Center > Electronics Recycling". Items are recycled through +Korea's certified e-waste partners. + +### What eco-friendly packaging materials does Cholog use? + +Standard boxes are made from 80%+ recycled cardboard. Air pillows use plant-based +biodegradable film. Tape is paper-based. The Green Packaging option eliminates all +non-essential filler materials. Cholog aims to achieve 100% plastic-free packaging +by end of 2026. diff --git a/src/main/resources/data/layer1_faq/feedback.md b/src/main/resources/data/layer1_faq/feedback.md new file mode 100644 index 0000000..6cf9f33 --- /dev/null +++ b/src/main/resources/data/layer1_faq/feedback.md @@ -0,0 +1,29 @@ +# Complaints & Feedback + +## Cholog Corporation — Official FAQ + +### How do I file a complaint? + +Go to "Help Center > Submit Feedback" on our website or app. Select the category (product +quality, delivery issue, website bug, suggestion, etc.) and describe your experience. +Complaints receive an acknowledgment email within 2 hours and a full response from our +customer experience team within 48 hours. + +### Can I leave a product review? + +Yes. Only customers who have purchased and received the product can leave a review — +labeled "Verified Purchase". Photo and video reviews earn 500 bonus points. Reviews that +violate community guidelines (spam, offensive content) are removed by our moderation team. + +### How do I report a counterfeit or unsafe product? + +Tap "Report" on the product page and select "Counterfeit Suspected" or "Safety Concern". +Our quality assurance team investigates within 48 hours. If confirmed, the product is +removed, the seller is penalized, and all affected buyers receive a full refund plus a +10,000 won inconvenience coupon. + +### What is the Cholog Community Forum? + +The Community Forum at community.cholog.kr is a space for customers to ask questions, +share tips, and discuss products. Staff moderators answer questions tagged "@staff". +Active contributors earn Community Points exchangeable for coupons. Available in Korean only. diff --git a/src/main/resources/data/layer1_faq/invoice.md b/src/main/resources/data/layer1_faq/invoice.md new file mode 100644 index 0000000..4285268 --- /dev/null +++ b/src/main/resources/data/layer1_faq/invoice.md @@ -0,0 +1,26 @@ +# Tax Invoice & Receipts + +## Cholog Corporation — Official FAQ + +### How do I get a tax invoice (세금계산서)? + +A digital receipt is automatically emailed after every purchase. For a formal tax invoice, +go to "My Orders", select the order, and tap "Request Tax Invoice". Enter your business +registration number (사업자등록번호). Tax invoices are issued within 1 business day and +sent to your registered email address. + +Tax invoice requests must be made within the same calendar month as the purchase. +Requests for prior months are not accepted. + +### Can I get a receipt for a corporate expense report? + +Yes. The automatically issued digital receipt serves as a valid purchase receipt. +For businesses requiring a tax invoice with VAT breakdown, follow the tax invoice +request process above. Business accounts registered at b2b.cholog.kr can request +monthly consolidated invoices covering all orders in the billing period. + +### What if I entered the wrong business registration number? + +Contact customer support within 1 business day of the original request. We can void +and reissue a tax invoice with the correct number within the same calendar month. +After the month closes, corrections are not possible under Korean tax law. diff --git a/src/main/resources/data/layer1_faq/marketplace.md b/src/main/resources/data/layer1_faq/marketplace.md new file mode 100644 index 0000000..ad2d9c9 --- /dev/null +++ b/src/main/resources/data/layer1_faq/marketplace.md @@ -0,0 +1,32 @@ +# Cholog Marketplace + +## Cholog Corporation — Official FAQ + +### What is Cholog Marketplace? + +Cholog Marketplace is our platform for verified third-party sellers. Marketplace products +are clearly labeled with the seller's name on the product page and order confirmation. +Cholog guarantees buyer protection on all Marketplace transactions up to 500,000 won. +Beyond that amount, disputes are handled directly between buyer and seller. + +### Does the standard Cholog return policy apply to Marketplace items? + +No. Marketplace items follow the individual seller's return policy, which may differ +significantly from Cholog's standard 14-day window. Return windows for Marketplace +sellers range from 3 to 30 days depending on the seller. Always check the seller's +policy on the product page before purchasing. Cholog's buyer protection guarantee +covers cases of item not received or item significantly not as described. + +### How do I become a Marketplace seller? + +Apply at seller.cholog.kr with your business registration certificate, product catalog, +and bank account details. Review takes approximately 5 business days. Approved sellers +pay a commission of 5–12% per transaction depending on the product category. Sellers +must maintain a customer satisfaction rating above 4.2 / 5.0 to remain listed. + +### What if I have a dispute with a Marketplace seller? + +Contact the seller directly first through the in-app messaging feature ("My Orders > +Contact Seller"). If unresolved within 3 business days, you can escalate to Cholog +Buyer Protection by selecting "Open Dispute" in "My Orders". Cholog mediates and may +issue a full refund under the buyer protection guarantee within 5 business days. diff --git a/src/main/resources/data/layer1_faq/orders.md b/src/main/resources/data/layer1_faq/orders.md new file mode 100644 index 0000000..8064283 --- /dev/null +++ b/src/main/resources/data/layer1_faq/orders.md @@ -0,0 +1,49 @@ +# Orders & Order Management + +## Cholog Corporation — Official FAQ + +### How do I cancel an order? + +You can cancel an order by going to "My Orders" and tapping "Cancel Order" while the status +is "Preparing". Cancellation is instant and the full amount is refunded to your original +payment method. Once the status changes to "Shipped", cancellation is no longer possible — +you must wait for delivery and then initiate a return. + +Note: Marketplace seller orders may have a shorter cancellation window. Check the seller's +policy on the product page before placing the order. + +### Can I modify my order after placing it? + +You can change the delivery address only if the order status is still "Preparing". Go to +"My Orders", tap the order, and select "Edit Address". Quantity changes and product swaps +are not supported after checkout — cancel the order and place a new one instead. + +### How do I track my order? + +After dispatch, you receive a Hanjin Express tracking number via email and KakaoTalk. +Use the "Track Shipment" feature in the Cholog app or enter the number at hanjin.kr. +Real-time GPS tracking is available for Priority shipments only. + +### What is the cutoff time for same-day dispatch? + +Orders confirmed before 1 PM KST on business days are handed to the courier the same +afternoon. Orders placed after 1 PM, on weekends, or on public holidays enter the dispatch +queue for the next business day morning. + +### Can I combine multiple orders into one shipment? + +Orders placed within 30 minutes of each other and sharing the same delivery address may be +combined automatically. To request manual consolidation, contact customer support before +the first order enters "Shipped" status. Consolidation is not available for Priority or +same-day shipments. + +### What happens if my package is lost or damaged in transit? + +Go to "My Orders", select the affected order, and tap "Report Issue". Upload photos of +the damage or describe the missing items. Our logistics team investigates within 2 business +days and offers a replacement shipment or full refund. + +### Can I schedule delivery for a future date? + +Yes. At checkout, select "Scheduled Delivery" and choose a date up to 14 days in advance. +Available for Economy and Priority shipping tiers. Same-day delivery cannot be pre-scheduled. diff --git a/src/main/resources/data/layer1_faq/packaging.md b/src/main/resources/data/layer1_faq/packaging.md new file mode 100644 index 0000000..9f30805 --- /dev/null +++ b/src/main/resources/data/layer1_faq/packaging.md @@ -0,0 +1,31 @@ +# Special Packaging & Delivery Types + +## Cholog Corporation — Official FAQ + +### Do you ship fresh or frozen products? + +Yes. Fresh and frozen items are shipped in insulated packaging with ice packs via CJ Logistics +Fresh (dedicated cold-chain courier). Cold-chain delivery is available only Monday through +Thursday to prevent weekend transit degradation. A flat cold-chain fee of 4,000 won applies +regardless of order size. Cold-chain orders cannot be combined with standard shipments. + +### How are large or heavy items delivered? + +Items over 20 kg or classified as "Large Item" are delivered by a Lotte Global Logistics +two-person team. Delivery includes placement in the room of your choice (ground floor). +Buildings with restricted elevator access or stair-carry requirements incur an additional +fee of 15,000 won per floor. Schedule large-item delivery at checkout or by contacting +customer support. + +### What is the Green Packaging option? + +Select "Green Packaging" at checkout to receive your order in minimal, fully recyclable +packaging with no plastic fillers. Green Packaging is free of charge and reduces box size +by up to 40%, lowering carbon emissions. Each Green Packaging order earns a 200-point +eco bonus credited 7 days after delivery. + +### Is gift wrapping available? + +Yes. Select "Gift Wrap" at checkout for 1,500 won per item. Includes a branded box, +ribbon, and a personalized message card (up to 100 characters). Gift wrapping is not +available for oversized items or Marketplace seller products. diff --git a/src/main/resources/data/layer1_faq/payment.md b/src/main/resources/data/layer1_faq/payment.md new file mode 100644 index 0000000..2c4a6d9 --- /dev/null +++ b/src/main/resources/data/layer1_faq/payment.md @@ -0,0 +1,43 @@ +# Payment + +## Cholog Corporation — Official FAQ + +### Which payment methods do you accept? + +We accept: Visa, Mastercard, BC Card, NH Card (credit/debit), digital wallets (Kakao Pay, +Naver Pay, Toss Pay, Apple Pay), direct bank transfer via Toss Payments, and Cholog Pay +(our proprietary wallet). Gift cards and store credit can be combined with any method. + +Foreign cards (Visa/Mastercard issued abroad) are accepted and charged in KRW. +American Express and Discover/Diners Club are not accepted. + +### Can I split payment across multiple methods? + +Yes. At checkout, select "Split Payment" to combine up to two methods — for example, part +with Naver Pay and the remainder with a credit card. Gift card balances can also be combined +with any other method. Only one coupon can be applied per order. + +### Do you offer interest-free installment plans? + +Orders totaling 30,000 won or more are eligible for 2- or 3-month interest-free installments +on BC Card and NH Card. Orders over 100,000 won unlock a 6-month interest-free plan. +Installment options appear automatically at checkout when an eligible card is detected. + +### How do I get a tax invoice (세금계산서)? + +A digital receipt is sent automatically by email after every purchase. For a tax invoice, +go to "My Orders", select the order, and tap "Request Tax Invoice". Enter your business +registration number. Tax invoices are issued within 1 business day. + +### What happens if my payment is declined? + +The order is not placed and no charge is made. Common reasons: insufficient funds, daily +transaction limit, or an expired card. Verify your card details and try again, or switch +to an alternative payment method. Duplicate authorization holds disappear within 3–5 +business days. + +### What is Cholog Pay? + +Cholog Pay is our proprietary wallet. Load funds via bank transfer and earn a 2% top-up +bonus (load 10,000 won → receive 10,200 won). Balance can be used for any purchase and +is refundable minus the bonus amount. Cholog Pay cannot be used to purchase gift cards. diff --git a/src/main/resources/data/layer1_faq/returns.md b/src/main/resources/data/layer1_faq/returns.md new file mode 100644 index 0000000..08e4a53 --- /dev/null +++ b/src/main/resources/data/layer1_faq/returns.md @@ -0,0 +1,58 @@ +# Returns & Refunds + +## Cholog Corporation — Official FAQ + +### What is the return policy? + +Products may be returned within 14 calendar days of delivery. The item must be unopened or, +if opened, unused with all original accessories and packaging intact. The following cannot +be returned under any circumstances: Clearance items, digital downloads, personalized or +engraved products, opened cosmetics and skincare, underwear and swimwear, and items damaged +by the customer. + +Note: Marketplace seller items follow the individual seller's return policy, which may differ +from Cholog's standard 14-day window. + +### How do I initiate a return? + +Open the Cholog app or website, go to "My Orders", tap the order, and select "Request Return". +Choose a reason, upload at least one photo of the item, and select a pickup date. For +defect-related returns, courier pickup is free. For non-defect returns (change of mind, +wrong size), a 3,000 won handling fee is deducted from the refund. + +### How long does a refund take? + +After we receive and inspect the returned item (1–2 business days), we issue the refund: +- **Credit card**: 3–5 business days +- **Kakao Pay / Naver Pay**: typically instant +- **Bank transfer**: up to 7 business days +- **International card (Visa/Mastercard issued abroad)**: 7–14 business days + +### Can I exchange an item instead of returning it? + +Yes. When initiating a return, select "Exchange" instead of "Refund". Choose the replacement +item (same product, different size or color). If the replacement costs more, you pay the +difference; if less, the difference is refunded. Exchanges are processed within 3–5 business +days after pickup. + +### Are there items that cannot be returned? + +The following are final sale and non-refundable: +- Clearance / sale items +- Digital downloads +- Personalized / engraved items +- Opened cosmetics, skincare, underwear, swimwear +- Gift cards +- Items the customer has damaged + +### What if I received the wrong item or a defective product? + +Contact customer support or use "Report Issue" in "My Orders". We arrange a free pickup of +the incorrect item and ship the correct one via Priority at no charge. A 5,000 won apology +coupon is also issued automatically. + +### Can I return a promotional or discounted item? + +Yes. Promotional items follow the standard 14-day return policy. The refund amount is based +on the price actually paid, not the original price. For bundle deals, all items in the +bundle must be returned together for a full refund. diff --git a/src/main/resources/data/layer1_faq/shipping.md b/src/main/resources/data/layer1_faq/shipping.md new file mode 100644 index 0000000..0dd973b --- /dev/null +++ b/src/main/resources/data/layer1_faq/shipping.md @@ -0,0 +1,48 @@ +# Shipping & Delivery + +## Cholog Corporation — Official FAQ + +### What shipping options are available? + +We offer three shipping tiers: +- **Economy**: 2,500 won, 2–4 business days +- **Priority**: 5,000 won, guaranteed next-business-day delivery by noon +- **Same-Day**: 8,000 won, available in Seoul / Incheon / Gyeonggi for orders before 10 AM KST (weekdays only) + +Free Economy shipping applies to orders over 20,000 won for Standard members. +Gold-tier members receive free Priority shipping on every order. + +### Which courier delivers my order? + +All standard domestic orders are fulfilled through Hanjin Express. Cold-chain (fresh/frozen) +orders are shipped via CJ Logistics Fresh. Large-item deliveries (furniture, appliances over +20 kg) are handled by Lotte Global Logistics with a two-person team. + +### Do you deliver to Jeju Island or offshore islands? + +Yes. We deliver to Jeju, Ulleungdo, Geojedo, and all major offshore islands. Delivery takes +an additional 1–2 business days beyond the standard timeframe. There is no extra surcharge +for island delivery. + +### What happens if I am not home when the courier arrives? + +The courier makes two delivery attempts. After both fail, your package is held at the nearest +Hanjin Express depot for 7 calendar days. You can reschedule via the Hanjin app or pick it +up at the depot with a valid ID. + +### Can I pick up my order at a convenience store? + +Yes. Select "CU Convenience Store Pickup" at checkout and choose a CU location near you. +The package is held for 5 calendar days; uncollected parcels are automatically returned and +a full refund is issued. + +### Can I request a specific delivery time slot? + +Priority shipping orders allow you to select a 2-hour window between 9 AM and 9 PM. +Economy shipping does not support time-slot selection. Availability depends on your region +and courier capacity. + +### What is the maximum package size and weight? + +Individual packages cannot exceed 30 kg or 160 cm in combined dimensions. Orders exceeding +these limits are automatically split into multiple packages at no extra shipping cost. diff --git a/src/main/resources/data/layer1_faq/subscription.md b/src/main/resources/data/layer1_faq/subscription.md new file mode 100644 index 0000000..1afa6e1 --- /dev/null +++ b/src/main/resources/data/layer1_faq/subscription.md @@ -0,0 +1,40 @@ +# Subscription Services + +## Cholog Corporation — Official FAQ + +### What subscription plans are available? + +| Plan | Price | Frequency | Contents | +|------|-------|-----------|----------| +| Essentials Box | 29,900 won | Monthly | Curated household essentials | +| Coffee Club | 19,900 won | Bi-weekly | Specialty coffee beans | +| Beauty Box | 39,900 won | Monthly | Skincare & cosmetics | + +All subscriptions include free shipping. Active subscribers also receive 10% off +non-subscription purchases and earn double loyalty points on subscription deliveries. +Free shipping for subscribers applies regardless of order amount (unlike Standard +members who require a 20,000 won minimum). + +### Can I pause or skip a delivery? + +Yes. In "Settings > Subscriptions", tap "Pause" to skip the next delivery, or "Pause +Subscription" to halt all deliveries for up to 3 months. No charge during the pause +period. Resume anytime with no penalty. + +### How do I cancel a subscription? + +Go to "Settings > Subscriptions" and tap "Cancel". Cancellation takes effect after the +current billing cycle ends — no cancellation fee. Any remaining subscription credit is +refunded within 7 business days. You can resubscribe at any time, but previous pricing +is not guaranteed. + +### Can I customize what goes in my box? + +Partially. Each box has 3–5 "core items" selected by our curation team and 1–2 "choice +items" you can pick from a rotating catalog. Choice item selection opens 10 days before +each shipping date. If you do not select, our team picks based on your profile. + +### Is there a minimum commitment period? + +No. All subscriptions are month-to-month with no minimum commitment. Loyalty bonuses: +6 consecutive months earns 10,000 points; 12 consecutive months earns a 30,000 won coupon. diff --git a/src/main/resources/data/layer1_faq/support.md b/src/main/resources/data/layer1_faq/support.md new file mode 100644 index 0000000..28d6a1b --- /dev/null +++ b/src/main/resources/data/layer1_faq/support.md @@ -0,0 +1,31 @@ +# Customer Support + +## Cholog Corporation — Official FAQ + +### What support channels are available and when? + +| Channel | Hours | Notes | +|---------|-------|-------| +| Live Chat | 8 AM – 10 PM KST daily (incl. weekends) | Available on website and app. Avg. wait < 90 sec | +| Email | Business days, reply within 12 hours | support@cholog.kr | +| Phone | Mon–Fri 9 AM – 6 PM KST | 1588-0000 (general); 1588-0002 (VIP priority line) | +| KakaoTalk | 24/7 AI assistant | Search @초록. Human handoff during Live Chat hours | + +### Is customer support available in English? + +Yes. Live Chat and email support are available in Korean and English. Phone support is +primarily Korean, but English-speaking agents can be connected upon request. Response +times for English inquiries may be slightly longer during peak hours. + +### Can I schedule a phone callback? + +Yes. In the Help Center, select "Request Callback". Enter your phone number and preferred +time slot. Callbacks are available Monday to Friday, 9 AM to 6 PM KST. If you are a VIP +member, you can request priority callbacks via the dedicated line at 1588-0002. + +### How do I escalate an unresolved issue? + +If your issue is not resolved within 48 hours, reply to the support ticket email with +"ESCALATE" in the subject line. This routes your case to a senior support manager who +responds within 4 hours. VIP members can also request escalation via the dedicated +phone line at 1588-0002. diff --git a/src/main/resources/data/layer2_policies/current/complaint-handling.md b/src/main/resources/data/layer2_policies/current/complaint-handling.md new file mode 100644 index 0000000..116cf5d --- /dev/null +++ b/src/main/resources/data/layer2_policies/current/complaint-handling.md @@ -0,0 +1,45 @@ +--- +title: Customer Complaint Handling Process +version: v2 +status: current +effective_date: 2024-02-01 +department: customer_service +supersedes: complaint-handling-v1.md +category: support +--- + +# Customer Complaint Handling Process v2 + +## Response SLA + +| Severity | Acknowledgment | Full Resolution | +|----------|---------------|-----------------| +| Critical (safety, fraud) | 30 minutes | 4 hours | +| High (wrong item, significant damage) | 2 hours | 24 hours | +| Standard (quality, delay) | 2 hours | 48 hours | +| Low (suggestion, general feedback) | 2 hours | 5 business days | + +## Escalation Path + +1. **Tier 1**: Front-line CS agent (Live Chat, Phone, Email) +2. **Tier 2**: Senior CS specialist — triggered by: customer request ("ESCALATE"), 48-hour + unresolved, or agent judgment for complex cases +3. **Tier 3**: CS Manager — triggered by: Tier 2 unresolved after 4 hours, VIP member + request, media/legal threat +4. **Legal / Regulatory**: For PIPA complaints, consumer protection agency referrals + +## Compensation Guidelines + +| Issue | Compensation | +|-------|-------------| +| Wrong item shipped | Free return + re-ship + 5,000 won coupon | +| Defective item | Free return + full refund or replacement | +| Delivery delay > 3 business days (non-island) | 2,000 won coupon | +| System error causing overcharge | Full refund + 1,000 won coupon | +| Confirmed counterfeit product | Full refund + 10,000 won coupon | + +## VIP Member Handling + +VIP members are routed directly to Tier 2 on first contact. If contact is via the dedicated +line (1588-0002), response time targets are halved. VIP complaints are flagged in the CRM +for priority tracking. diff --git a/src/main/resources/data/layer2_policies/current/marketplace-seller-agreement.md b/src/main/resources/data/layer2_policies/current/marketplace-seller-agreement.md new file mode 100644 index 0000000..622933b --- /dev/null +++ b/src/main/resources/data/layer2_policies/current/marketplace-seller-agreement.md @@ -0,0 +1,53 @@ +--- +title: Marketplace Seller Agreement +version: v2 +status: current +effective_date: 2024-03-01 +department: marketplace +supersedes: marketplace-seller-agreement-v1.md +category: marketplace +--- + +# Marketplace Seller Agreement v2 + +## Eligibility + +Sellers must provide: valid Korean business registration certificate (사업자등록증), +product catalog with at least 5 SKUs, and a Korean bank account for settlement. +Applications are reviewed within 5 business days. Approval is at Cholog's sole discretion. + +## Commission Structure + +| Product Category | Commission Rate | +|-----------------|----------------| +| Electronics | 8% | +| Fashion & Apparel | 12% | +| Food & Beverage | 10% | +| Home & Living | 8% | +| Cosmetics | 10% | +| Books & Media | 5% | +| General | 10% | + +Commission is calculated on the sale price including VAT, deducted from the settlement amount. + +## Seller Performance Standards + +Sellers must maintain: +- Customer satisfaction rating ≥ **4.2 / 5.0** +- Order cancellation rate ≤ 3% +- Dispatch-on-time rate ≥ 95% +- Return dispute resolution within **3 business days** + +Failure to meet standards for 2 consecutive months results in a suspension notice. +Three suspension notices within 12 months result in permanent delisting. + +## Return Policy (Seller Obligation) + +Each seller sets their own return policy (minimum 3 days, maximum 30 days from delivery). +Return policy must be clearly stated on each product page. Cholog buyer protection overrides +seller policy in cases of item not received or item significantly not as described. + +## Settlement + +Settlements are processed bi-weekly (1st and 15th of each month) for all orders where +the return window has closed. Fees and commissions are itemized in the seller dashboard. diff --git a/src/main/resources/data/layer2_policies/current/membership-tiers.md b/src/main/resources/data/layer2_policies/current/membership-tiers.md new file mode 100644 index 0000000..9bf7edc --- /dev/null +++ b/src/main/resources/data/layer2_policies/current/membership-tiers.md @@ -0,0 +1,46 @@ +--- +title: Membership Tier Policy +version: v3 +status: current +effective_date: 2024-01-01 +department: marketing +supersedes: membership-tiers-v2.md +category: membership +--- + +# Membership Tier Policy v3 + +## Tier Qualification + +| Tier | Annual Spending Threshold | Evaluation Date | +|------|--------------------------|-----------------| +| Standard | Default (no minimum) | — | +| Plus | ≥ 200,000 won | January 1st each year | +| VIP | ≥ 800,000 won | January 1st each year | + +Annual spending is calculated from January 1 to December 31. Returned orders are deducted +from the annual spending total. Tier downgrades take effect on the 1st of the following month +after a returned item pushes the total below the threshold. + +## Benefits by Tier + +| Benefit | Standard | Plus | VIP | +|---------|---------|------|-----| +| Point earning rate | 1% | 3% | 5% | +| Free shipping | Economy ≥ 20,000 won | Economy on all orders | Priority on all orders | +| Birthday bonus | 20% off coupon | 20% off + gift | 20% off + gift | +| Early product access | — | — | Yes | +| Dedicated support line | — | — | 1588-0002 | +| Point expiry | 12 months | 12 months | 12 months | + +## Point Earning + +Points are calculated on the pre-shipping, pre-discount order total. Points are credited +**7 days after delivery confirmation** and expire **12 months** from the date earned. +Minimum redemption is 1,000 points. 1 point = 1 won. + +## Tier Status Review + +Tier status is reviewed annually on January 1st. Members who do not meet the threshold in +the prior year are downgraded at the start of the new year. There is no partial-year +upgrade grace period. diff --git a/src/main/resources/data/layer2_policies/current/point-earning-rules.md b/src/main/resources/data/layer2_policies/current/point-earning-rules.md new file mode 100644 index 0000000..9d95ccb --- /dev/null +++ b/src/main/resources/data/layer2_policies/current/point-earning-rules.md @@ -0,0 +1,50 @@ +--- +title: Loyalty Point Earning & Redemption Rules +version: v3 +status: current +effective_date: 2024-01-01 +department: marketing +supersedes: point-earning-rules-v2.md +category: loyalty +--- + +# Loyalty Point Earning & Redemption Rules v3 + +## Earning Rates + +| Membership Tier | Base Earning Rate | +|----------------|------------------| +| Standard | 1% of order subtotal | +| Plus | 3% of order subtotal | +| VIP | 5% of order subtotal | + +Order subtotal = item price × quantity (before shipping and discount). + +## Bonus Point Events + +| Event | Bonus | +|-------|-------| +| Green Packaging | 200 points per order | +| Photo/video review | 500 points | +| Electronics take-back | 2,000 points per item | +| Daily check-in (Day 7) | 500 points or random coupon | +| 30-day consecutive check-in | 10,000 won coupon | +| Active subscriber purchases | 2× base rate on subscription deliveries | + +## Redemption Rules + +- Minimum redemption: **1,000 points per order** +- 1 point = 1 won +- Points can be used on any purchase, combined with one coupon +- Points cannot be redeemed for cash or transferred between accounts + +## Point Expiry + +All points expire **12 months from the date earned**. There is no extension or restoration +of expired points. Points approaching expiry (within 30 days) trigger an app push notification. + +## Point Deduction on Returns + +Points earned from a returned order are deducted within 24 hours of refund processing. +If the resulting balance is negative, the deficit is carried forward and deducted from +future earned points. diff --git a/src/main/resources/data/layer2_policies/current/return-policy-v3.md b/src/main/resources/data/layer2_policies/current/return-policy-v3.md new file mode 100644 index 0000000..ec9faea --- /dev/null +++ b/src/main/resources/data/layer2_policies/current/return-policy-v3.md @@ -0,0 +1,60 @@ +--- +title: Return & Refund Policy +version: v3 +status: current +effective_date: 2024-04-01 +department: customer_service +supersedes: return-policy-v2.md +category: returns +--- + +# Return & Refund Policy v3 + +## Standard Return Window + +All products purchased directly from Cholog Corporation may be returned within **14 calendar +days** of delivery, provided the item is unopened or, if opened, unused and in original +packaging with all accessories and documentation. + +### Exceptions by Product Category + +| Category | Return Window | Condition | +|----------|--------------|-----------| +| Electronics | 14 days | Sealed or with all accessories intact | +| Food & Beverages | Not returnable | Perishable goods | +| Cosmetics & Skincare | 14 days | Unused, sealed | +| Underwear / Swimwear | Not returnable | Hygiene reasons | +| Subscription Box | 14 days (individual items) | Per standard policy | +| Clearance Items | Not returnable | Final sale | +| Digital Downloads | Not returnable | Final sale | +| Personalized Items | Not returnable | Custom-made | +| Marketplace Items | Per seller policy | See seller page | + +## Handling Fee for Non-Defect Returns + +If the return reason is change of mind, wrong size, or any non-defect reason, a handling fee +of **3,000 won** is deducted from the refund. Defect-related returns incur no fee. + +## Refund Timeline + +| Payment Method | Refund Time | +|----------------|-------------| +| Credit card (domestic) | 3–5 business days after inspection | +| Kakao Pay / Naver Pay | Typically instant after inspection | +| Bank transfer | Up to 7 business days | +| International card | 7–14 business days | +| Cholog Pay | Instant | + +## Marketplace Items + +Items sold by third-party Marketplace sellers follow the seller's own return policy, not +Cholog Corporation's standard policy. Return windows vary from 3 to 30 days depending on +the seller. Cholog's buyer protection guarantee covers items not received or significantly +not as described, regardless of the seller's policy. + +## Exchange Policy + +Customers may request an exchange instead of a refund. Select "Exchange" when initiating +the return process. Exchanges are for the same product (different size or color only). +Price differences are charged or refunded accordingly. Exchanges are processed within +3–5 business days after the original item is collected. diff --git a/src/main/resources/data/layer2_policies/current/shipping-cold-chain.md b/src/main/resources/data/layer2_policies/current/shipping-cold-chain.md new file mode 100644 index 0000000..96f88b8 --- /dev/null +++ b/src/main/resources/data/layer2_policies/current/shipping-cold-chain.md @@ -0,0 +1,52 @@ +--- +title: Cold-Chain Shipping Policy (Fresh & Frozen) +version: v2 +status: current +effective_date: 2024-01-01 +department: logistics +category: shipping +--- + +# Cold-Chain Shipping Policy v2 + +## Scope + +This policy applies to all products categorized as "Fresh", "Chilled", or "Frozen" on the +Cholog platform, including fresh produce, dairy, meat, seafood, and temperature-sensitive +supplements. + +## Courier & Packaging + +All cold-chain orders are shipped exclusively via **CJ Logistics Fresh**. Orders are packed +in insulated polystyrene boxes with gel ice packs rated for 24–36 hours of temperature +control. Frozen items are packed with dry ice where required. + +## Delivery Schedule + +Cold-chain delivery is available **Monday through Thursday only**. This restriction prevents +packages from sitting in transit over a weekend, which would exceed the ice pack rating. + +- Orders placed by 11 AM KST Monday–Thursday dispatch same day +- Orders placed Thursday after 11 AM dispatch the following Monday +- No cold-chain delivery on Friday, Saturday, Sunday, or public holidays + +## Fees + +| Order Amount | Cold-Chain Fee | +|-------------|----------------| +| Any amount | Flat 4,000 won | + +Cold-chain fee applies regardless of membership tier or free-shipping eligibility. +Cold-chain orders cannot be combined with standard-tier shipments. + +## Delivery Area + +Cold-chain delivery is available to all mainland Korean addresses and Jeju Island (add 2 +business days). Delivery to remote offshore islands (Ulleungdo, Dokdo, etc.) is not +available for cold-chain orders due to transit time constraints. + +## Returns + +Fresh and frozen products are non-returnable due to food safety regulations, except in cases +of: item received damaged, wrong item shipped, or item arrived visibly spoiled. In such cases, +a photo must be submitted within 24 hours of delivery. diff --git a/src/main/resources/data/layer2_policies/current/shipping-standard.md b/src/main/resources/data/layer2_policies/current/shipping-standard.md new file mode 100644 index 0000000..183cabb --- /dev/null +++ b/src/main/resources/data/layer2_policies/current/shipping-standard.md @@ -0,0 +1,51 @@ +--- +title: Standard Shipping Policy +version: v4 +status: current +effective_date: 2024-01-01 +department: logistics +supersedes: shipping-standard-2023.md +category: shipping +--- + +# Standard Shipping Policy v4 + +## Shipping Tiers + +| Tier | Fee | Delivery Time | Notes | +|------|-----|---------------|-------| +| Economy | 2,500 won | 2–4 business days | Free for orders ≥ 20,000 won (Standard members) | +| Priority | 5,000 won | Next business day by noon | Free for Gold / VIP members | +| Same-Day | 8,000 won | Same day | Seoul, Incheon, Gyeonggi only; order before 10 AM KST | + +## Free Shipping Thresholds + +- **Standard members**: Economy shipping free on orders ≥ **20,000 won** +- **Plus members**: Economy shipping free on all orders +- **VIP members**: Priority shipping free on all orders +- **Active subscribers**: Priority shipping free on all orders (including non-subscription purchases) + +## Dispatch Cutoff + +Orders confirmed before **1 PM KST** on business days are dispatched the same afternoon. +Orders after 1 PM or on weekends/public holidays are queued for the next business day. + +## Courier Partners + +| Type | Courier | +|------|---------| +| Standard | Hanjin Express | +| Cold-chain | CJ Logistics Fresh | +| Large item | Lotte Global Logistics | + +## Jeju and Offshore Islands + +Delivery to Jeju, Ulleungdo, Geojedo, and all major offshore islands carries no surcharge +but takes an additional 1–2 business days. Same-day delivery is not available for island +addresses. + +## Failed Delivery + +The courier makes two delivery attempts. After both fail, the package is held at the nearest +Hanjin depot for 7 calendar days. An SMS is sent with pickup instructions. If uncollected, +the item is returned and a full refund is issued minus the original shipping fee. diff --git a/src/main/resources/data/layer2_policies/current/subscription-terms.md b/src/main/resources/data/layer2_policies/current/subscription-terms.md new file mode 100644 index 0000000..cd693ea --- /dev/null +++ b/src/main/resources/data/layer2_policies/current/subscription-terms.md @@ -0,0 +1,50 @@ +--- +title: Subscription Service Terms & Conditions +version: v2 +status: current +effective_date: 2024-01-01 +department: marketing +category: subscription +--- + +# Subscription Service Terms & Conditions v2 + +## Available Plans + +| Plan | Price | Billing Cycle | Shipping | +|------|-------|---------------|----------| +| Essentials Box | 29,900 won | Monthly | Free | +| Coffee Club | 19,900 won | Bi-weekly | Free | +| Beauty Box | 39,900 won | Monthly | Free | + +## Subscriber Benefits + +Active subscribers (any plan) receive: +- Free shipping on **all** orders (including non-subscription purchases), regardless of + order amount — this supersedes the Standard member 20,000 won free-shipping threshold +- 10% discount on all non-subscription purchases +- Double loyalty points on subscription deliveries +- Early access to new product launches (equivalent to VIP benefit) + +## Billing + +Automatic charges occur on the **first business day of each billing cycle**. A reminder +notification is sent 3 days before each charge. If the charge fails, we retry once after +24 hours. After two failed attempts, the subscription is paused and an email notification +is sent. + +## Pause & Cancellation + +- **Skip next delivery**: Available up to 48 hours before the scheduled dispatch date +- **Pause (up to 3 months)**: No charge during pause; resume anytime +- **Cancel**: Effective after the current billing cycle. No cancellation fee. + Remaining prepaid subscription credit refunded within 7 business days. + +## Loyalty Bonuses + +| Consecutive Months | Bonus | +|-------------------|-------| +| 6 months | 10,000 loyalty points | +| 12 months | 30,000 won coupon | + +Consecutive month count resets to zero if the subscription is canceled (not paused). diff --git a/src/main/resources/data/layer2_policies/internal/cs-team-return-exceptions.md b/src/main/resources/data/layer2_policies/internal/cs-team-return-exceptions.md new file mode 100644 index 0000000..62ea415 --- /dev/null +++ b/src/main/resources/data/layer2_policies/internal/cs-team-return-exceptions.md @@ -0,0 +1,44 @@ +--- +title: CS Team — Return Exception Guidelines (Internal) +version: v4 +status: internal +effective_date: 2024-04-01 +department: customer_service +audience: cs_agents_only +category: returns +--- + +# CS Team Return Exception Guidelines (INTERNAL — Do Not Share with Customers) + +This document supplements the official Return & Refund Policy v3. These exceptions are +applied at CS agent discretion and are not publicly advertised. + +## VIP Member Extended Return Window + +VIP members (spend ≥ 800,000 won/year) may be granted a **30-day return window** at agent +discretion for the following cases: +- Item was a gift (recipient needs time to evaluate) +- Customer had a documented medical or travel absence during the standard 14-day window +- Item was defective but defect only became apparent after extended use (e.g., battery) + +**Process**: Agent must log the exception in CRM with reason code "VIP-EXTENDED" and attach +supervisor approval (Tier 2 or above). No exception for Marketplace items. + +## Loyalty Point Retention on High-Value Returns + +For returns of orders > 100,000 won by Plus or VIP members, agents may offer to retain +50% of the earned points as goodwill. Apply only when customer explicitly complains about +point loss. Log with reason code "POINT-GOODWILL". + +## Handling Fee Waiver + +The 3,000 won non-defect handling fee may be waived for: +- First-time return by the customer (check CRM return history) +- Returns where the delivery was delayed by > 2 business days (check dispatch log) +- VIP members (always waive, no approval required) + +## Subscription Box Individual Item Returns + +Although the official policy states individual items in a subscription box can be returned +within 14 days, agents may approve returns for up to 30 days for active long-term +subscribers (6+ consecutive months) at Tier 2 discretion. diff --git a/src/main/resources/data/layer2_policies/internal/holiday-shipping-memo-2024.md b/src/main/resources/data/layer2_policies/internal/holiday-shipping-memo-2024.md new file mode 100644 index 0000000..d89a660 --- /dev/null +++ b/src/main/resources/data/layer2_policies/internal/holiday-shipping-memo-2024.md @@ -0,0 +1,38 @@ +--- +title: Holiday Season Shipping Schedule — 2024 +version: v1 +status: internal +effective_date: 2024-01-01 +department: logistics +audience: cs_agents +category: shipping +--- + +# Holiday Season Shipping Schedule 2024 (INTERNAL MEMO) + +## Lunar New Year (설날) — February 9–12, 2024 + +**Dispatch suspension**: February 7 (Wed) 1 PM KST through February 13 (Tue) 9 AM KST. +- Orders placed February 7 after 1 PM through February 12 will dispatch February 13. +- Priority shipping SLA (next business day by noon) does NOT apply during this period. +- Inform customers: deliveries during this period may be delayed by 3–5 additional business days. +- Cold-chain orders: suspended February 5 (Mon) — next available dispatch February 13. + +## Chuseok — September 16–18, 2024 + +**Dispatch suspension**: September 13 (Fri) 1 PM KST through September 19 (Thu) 9 AM KST. +- Orders placed September 13 after 1 PM through September 18 will dispatch September 19. +- Expect high volume surge before/after: delivery delays of 1–2 extra days are normal. +- Cold-chain orders: suspended September 11–19. + +## Year-End / New Year — December 31, 2024 – January 2, 2025 + +- December 31 dispatch cutoff: 11 AM KST (earlier than usual). +- January 1 (New Year's Day): No dispatch. +- Normal operations resume January 2. + +## Agent Instructions + +When customers ask about delivery during holiday periods, quote the extended estimates above. +Do NOT promise next-business-day delivery for Priority orders during suspension windows. +Proactively inform customers who placed orders close to holiday cutoffs via outbound KakaoTalk. diff --git a/src/main/resources/data/layer2_policies/internal/new-agent-onboarding.md b/src/main/resources/data/layer2_policies/internal/new-agent-onboarding.md new file mode 100644 index 0000000..a826a5b --- /dev/null +++ b/src/main/resources/data/layer2_policies/internal/new-agent-onboarding.md @@ -0,0 +1,50 @@ +--- +title: New CS Agent Onboarding Guide +version: v3 +status: internal +effective_date: 2024-01-01 +department: customer_service +audience: new_cs_agents +category: training +--- + +# New CS Agent Onboarding Guide (INTERNAL) + +Welcome to the Cholog CS team. This guide summarizes the most common customer scenarios +and the correct responses. Always refer to the official policy documents for authoritative +answers. When in doubt, escalate to Tier 2. + +## Top 5 Most Common Inquiries + +1. **배송 조회** — Check order in internal dashboard. Give Hanjin tracking number. + If status is "Preparing" for > 2 business days, flag as delayed dispatch to logistics. + +2. **반품 신청** — Confirm within return window (14 days from delivery per v3 policy). + Check item category — some are non-returnable (clearance, cosmetics, digital, personalized). + Remind customer: non-defect returns incur 3,000 won handling fee. + +3. **환불 문의** — Confirm inspection is complete. Quote timeline by payment method: + 카드 3–5일, 카카오/네이버페이 즉시, 계좌이체 최대 7일. + +4. **포인트 문의** — 1점=1원, 최소 1,000점 사용, 12개월 유효기간. + Tier별 적립률: Standard 1%, Plus 3%, VIP 5%. (구버전 혼동 주의: 예전엔 3%/5%/7%였음) + +5. **멤버십 등급** — Plus = 연 20만원 이상, VIP = 연 80만원 이상. + 등급 평가일: 매년 1월 1일. (2023년 기준과 다름: 구버전은 Plus=15만, VIP=60만이었음) + +## Important Gotchas for New Agents + +- **마켓플레이스 상품**: Cholog 기본 반품 정책 미적용. 판매자 정책 확인 필수. +- **구독 회원 배송비**: 2만원 미만 주문도 무료 배송 (구독 혜택). Standard와 다름. +- **VIP 반품 예외**: cs-team-return-exceptions.md 참고 — 공개 정책과 다른 내부 기준 있음. +- **냉장 배송 요일**: 월~목만 가능. 금요일 주문하면 다음 월요일 발송. +- **세금계산서**: 당월 내에만 발급 신청 가능. 전월 주문 건 불가. + +## Escalation Rules + +Escalate to Tier 2 if: +- Customer is VIP and unhappy after your first response +- Return/refund claim exceeds 200,000 won +- Customer mentions legal action, press, or social media +- Fraud or counterfeit suspected +- Issue involves cold-chain spoilage diff --git a/src/main/resources/templates/chat.html b/src/main/resources/templates/chat.html new file mode 100644 index 0000000..1534990 --- /dev/null +++ b/src/main/resources/templates/chat.html @@ -0,0 +1,623 @@ + + + + + + 초록 고객지원 챗봇 + + + +
+ + +
+
+
+

상담

+
응답 대기 중
+
+ +
+ +
+
+
+

+ 안녕하세요. 초록 고객지원 챗봇입니다. +

+
+ 지금 +
+
+ +
+
+ +
+
+ +
+ + +
+
+
+ + + +