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/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/VectorStoreConfig.java b/src/main/java/com/cholog/bootcamp/config/VectorStoreConfig.java new file mode 100644 index 0000000..e7ca9e7 --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/config/VectorStoreConfig.java @@ -0,0 +1,16 @@ +package com.cholog.bootcamp.config; + +import org.springframework.ai.embedding.EmbeddingModel; +import org.springframework.ai.vectorstore.SimpleVectorStore; +import org.springframework.ai.vectorstore.VectorStore; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class VectorStoreConfig { + + @Bean + public VectorStore vectorStore(EmbeddingModel embeddingModel) { + return SimpleVectorStore.builder(embeddingModel).build(); + } +} 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..edc1e91 --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/dto/ChatbotResponse.java @@ -0,0 +1,27 @@ +package com.cholog.bootcamp.dto; + +import org.springframework.ai.chat.metadata.Usage; + +public record ChatbotResponse( + String answer, + TokenUsageInfo tokenUsage +) { + + public static ChatbotResponse from(String answer, Usage usage) { + return new ChatbotResponse( + answer, + new TokenUsageInfo( + usage.getPromptTokens(), + usage.getCompletionTokens(), + usage.getTotalTokens() + ) + ); + } + + 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..c803442 --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java @@ -0,0 +1,106 @@ +package com.cholog.bootcamp.service; + +import java.io.IOException; +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.chat.metadata.Usage; +import org.springframework.ai.chat.model.ChatResponse; +import org.springframework.ai.document.Document; +import org.springframework.ai.reader.TextReader; +import org.springframework.ai.vectorstore.SearchRequest; +import org.springframework.ai.vectorstore.VectorStore; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; +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 ChatClient chatClient; + private final VectorStore vectorStore; + private final ResourcePatternResolver resolver; + + public ChatbotService( + VectorStore vectorStore, + MarkdownReader markdownReader, + ChatClient.Builder chatClientBuilder + ) { + this.chatClient = chatClientBuilder.build(); + this.vectorStore = vectorStore; + vectorStore.add(markdownReader.loadAll()); + this.resolver = new PathMatchingResourcePatternResolver(); + } + + public ChatbotResponse chat(ChatbotRequest request) { + // 검색 + SearchRequest searchRequest = getSearchRequest(request.question(), 4); + List documents = vectorStore.similaritySearch(searchRequest); + + // 증강 & 생성 + documents = getFullDocuments(documents); + String context = getContext(documents); + ChatResponse chatResponse = chatClient.prompt() + .system(""" + 당신은 초록 고객센터의 챗봇입니다. + 주어진 [컨텍스트]를 기반으로 [사용자 질문]에 답변해주세요. + + 답변 규칙 + - 제공된 컨텍스트를 기반으로만 답변하세요. 절대 일반 상식으로 추론하지 마세요. + - 만약 주어진 컨텍스트로 답변할 수 없다면 모르겠다고 안내하세요. + - 내용이 충돌하는 경우 다음 우선순위를 따라 답변 합니다. + - 질문 도메인과 가장 근접한 내용 + - 더 구체적인 상황을 다루는 내용 + - 더 최신 버전의 내용 + """) + .user(""" + [사용자 질문] + %s + + [컨텍스트] + %s + """.formatted(request.question(), context)) + .call() + .chatResponse(); + + String answer = chatResponse.getResult().getOutput().getText(); + Usage usage = chatResponse.getMetadata().getUsage(); + return ChatbotResponse.from(answer, usage); + } + + private List getFullDocuments(List documents) { + return documents.stream() + .map(document -> document.getMetadata().get("filename").toString()) + .distinct() + .map(filename -> { + try { + return resolver.getResources("classpath:data/**/" + filename)[0]; + } catch (IOException e) { + throw new RuntimeException(e); + } + }) + .map(TextReader::new) + .flatMap(reader -> reader.get().stream()) + .toList(); + } + + private static String getContext(List documents) { + return documents.stream() + .map(Document::getText) + .collect(Collectors.joining("\n\n")); + } + + private SearchRequest getSearchRequest(String query, int k) { + return SearchRequest.builder() + .query(query) + .topK(k) + .build(); + } +} diff --git a/src/main/java/com/cholog/bootcamp/service/MarkdownReader.java b/src/main/java/com/cholog/bootcamp/service/MarkdownReader.java new file mode 100644 index 0000000..a4719ab --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/service/MarkdownReader.java @@ -0,0 +1,48 @@ +package com.cholog.bootcamp.service; + +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/resources/application.yml b/src/main/resources/application.yml index 6233b35..6793d53 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: 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..8762172 --- /dev/null +++ b/src/main/resources/data/layer1_faq/account.md @@ -0,0 +1,45 @@ +# 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). 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 @@ + + + + + + 초록 고객지원 챗봇 + + + +
+ + +
+
+
+

상담

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

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

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