From 2735626df0e669cb67e4ce305c69211f8e8c6352 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Fri, 8 May 2026 20:34:32 +0900 Subject: [PATCH 01/50] =?UTF-8?q?chore:=20env=20=ED=8C=8C=EC=9D=BC=20impor?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 2 ++ 1 file changed, 2 insertions(+) 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: From f75ad57d25bb1c14bf9a086346dac21d2b07f315 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Fri, 8 May 2026 21:38:59 +0900 Subject: [PATCH 02/50] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=20=EC=B1=97=20?= =?UTF-8?q?=EC=97=94=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EB=B0=8F=20ai?= =?UTF-8?q?=20=ED=98=B8=EC=B6=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cholog/bootcamp/ChatbotController.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/com/cholog/bootcamp/ChatbotController.java diff --git a/src/main/java/com/cholog/bootcamp/ChatbotController.java b/src/main/java/com/cholog/bootcamp/ChatbotController.java new file mode 100644 index 0000000..da18e37 --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/ChatbotController.java @@ -0,0 +1,26 @@ +package com.cholog.bootcamp; + +import org.springframework.ai.chat.client.ChatClient; +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; + +@RequestMapping("/api/chat") +@RestController +public class ChatbotController { + + private final ChatClient chatClient; + + public ChatbotController(ChatClient.Builder builder) { + this.chatClient = builder.build(); + } + + @PostMapping + public String chat(@RequestBody String userInput) { + return chatClient.prompt() + .user(userInput) + .call() + .content(); + } +} From f6fa3c4b965dfc0a65ed344171b3f0f1796d04ca Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sat, 9 May 2026 17:07:14 +0900 Subject: [PATCH 03/50] =?UTF-8?q?feat:=20llm=EC=97=90=EA=B2=8C=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=A0=9C?= =?UTF-8?q?=EA=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 우선 vip 베송 기준에 대한 질문에 답할 수 있게끔만 구현하여 구조를 잡는다. --- src/main/java/com/cholog/bootcamp/ChatbotController.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cholog/bootcamp/ChatbotController.java b/src/main/java/com/cholog/bootcamp/ChatbotController.java index da18e37..dcfd6e7 100644 --- a/src/main/java/com/cholog/bootcamp/ChatbotController.java +++ b/src/main/java/com/cholog/bootcamp/ChatbotController.java @@ -1,5 +1,7 @@ package com.cholog.bootcamp; +import java.util.Map; + import org.springframework.ai.chat.client.ChatClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -17,9 +19,11 @@ public ChatbotController(ChatClient.Builder builder) { } @PostMapping - public String chat(@RequestBody String userInput) { + public String chat(@RequestBody String question) { + String promptTemplate = "다음은 답변에 참고할 내용입니다: {data} \\n\\n 질문: {question}\n"; + Map promptParams = Map.of("data", "주문 금액과 상관없이 Priority 배송 무료다.", "question", question); return chatClient.prompt() - .user(userInput) + .user(userSpec -> userSpec.text(promptTemplate).params(promptParams)) .call() .content(); } From d250287ea08a9249c8153afa4cc69f08a33ff64f Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sat, 9 May 2026 17:11:40 +0900 Subject: [PATCH 04/50] =?UTF-8?q?refactor:=20builder=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=ED=94=84=EB=A1=AC=ED=94=84=ED=8A=B8=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cholog/bootcamp/ChatbotController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cholog/bootcamp/ChatbotController.java b/src/main/java/com/cholog/bootcamp/ChatbotController.java index dcfd6e7..bc8364f 100644 --- a/src/main/java/com/cholog/bootcamp/ChatbotController.java +++ b/src/main/java/com/cholog/bootcamp/ChatbotController.java @@ -15,15 +15,15 @@ public class ChatbotController { private final ChatClient chatClient; public ChatbotController(ChatClient.Builder builder) { - this.chatClient = builder.build(); + String prompt = "다음은 답변에 참고할 내용입니다: {data} \\n\\n 질문: {question}\n"; + this.chatClient = builder.defaultUser(prompt).build(); } @PostMapping public String chat(@RequestBody String question) { - String promptTemplate = "다음은 답변에 참고할 내용입니다: {data} \\n\\n 질문: {question}\n"; Map promptParams = Map.of("data", "주문 금액과 상관없이 Priority 배송 무료다.", "question", question); return chatClient.prompt() - .user(userSpec -> userSpec.text(promptTemplate).params(promptParams)) + .user(userSpec -> userSpec.params(promptParams)) .call() .content(); } From 4ecdb13e4cabbae3acbd21b897c8a61c02c53df5 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sat, 9 May 2026 18:27:05 +0900 Subject: [PATCH 05/50] =?UTF-8?q?chore:=20advisors-vector-store=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - QuestionAnswerAdvisor 사용을 위한 의존성 추가 --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 941e596..718e888 100644 --- a/build.gradle +++ b/build.gradle @@ -26,6 +26,7 @@ dependencyManagement { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.ai:spring-ai-starter-model-openai' + implementation 'org.springframework.ai:spring-ai-advisors-vector-store' testImplementation 'org.springframework.boot:spring-boot-starter-test' } From 4ac5a9a0896831305ca99a1ce2b999c138cc7c00 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sat, 9 May 2026 18:29:10 +0900 Subject: [PATCH 06/50] =?UTF-8?q?refactor:=20=EB=B2=A1=ED=84=B0=20db=20?= =?UTF-8?q?=EB=B0=8F=20=EC=96=B4=EB=93=9C=EB=B0=94=EC=9D=B4=EC=A0=80=20?= =?UTF-8?q?=ED=99=9C=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - spring ai가 OpenAiEmbeddingModel을 스프링 빈으로 관리한다 --- .../com/cholog/bootcamp/ChatbotController.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/cholog/bootcamp/ChatbotController.java b/src/main/java/com/cholog/bootcamp/ChatbotController.java index bc8364f..bc4b7fd 100644 --- a/src/main/java/com/cholog/bootcamp/ChatbotController.java +++ b/src/main/java/com/cholog/bootcamp/ChatbotController.java @@ -1,8 +1,10 @@ package com.cholog.bootcamp; -import java.util.Map; - import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor; +import org.springframework.ai.embedding.EmbeddingModel; +import org.springframework.ai.vectorstore.SimpleVectorStore; +import org.springframework.ai.vectorstore.VectorStore; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -14,16 +16,17 @@ public class ChatbotController { private final ChatClient chatClient; - public ChatbotController(ChatClient.Builder builder) { - String prompt = "다음은 답변에 참고할 내용입니다: {data} \\n\\n 질문: {question}\n"; - this.chatClient = builder.defaultUser(prompt).build(); + public ChatbotController(ChatClient.Builder builder, EmbeddingModel embeddingModel) { + VectorStore vectorStore = SimpleVectorStore.builder(embeddingModel).build(); + this.chatClient = builder.defaultAdvisors( + QuestionAnswerAdvisor.builder(vectorStore).build() + ).build(); } @PostMapping public String chat(@RequestBody String question) { - Map promptParams = Map.of("data", "주문 금액과 상관없이 Priority 배송 무료다.", "question", question); return chatClient.prompt() - .user(userSpec -> userSpec.params(promptParams)) + .user(question) .call() .content(); } From 46b20a7cd9a6c71d4c8ba9c1888eb35623b0dbd0 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sat, 9 May 2026 18:30:12 +0900 Subject: [PATCH 07/50] =?UTF-8?q?chore:=20markdown-document-reader=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - md 파일을 Document로 변환하기 위한 라이브러리 --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 718e888..60ce723 100644 --- a/build.gradle +++ b/build.gradle @@ -27,6 +27,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' 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' testImplementation 'org.springframework.boot:spring-boot-starter-test' } From 62b7aad6aafbd3901c42a6f5527ea100d56bb140 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sat, 9 May 2026 19:03:55 +0900 Subject: [PATCH 08/50] =?UTF-8?q?docs:=20resources/data=EC=97=90=20layer?= =?UTF-8?q?=5Fn=20=EB=B3=B5=EC=82=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MarkdownReader에서 classpath로 쉽게 읽어오기 위해 --- .../com/cholog/bootcamp/MarkdownReader.java | 37 ++++++++++++ src/main/resources/data/layer1_faq/account.md | 45 ++++++++++++++ .../resources/data/layer1_faq/eco_green.md | 38 ++++++++++++ .../resources/data/layer1_faq/feedback.md | 29 +++++++++ src/main/resources/data/layer1_faq/invoice.md | 26 ++++++++ .../resources/data/layer1_faq/marketplace.md | 32 ++++++++++ src/main/resources/data/layer1_faq/orders.md | 49 +++++++++++++++ .../resources/data/layer1_faq/packaging.md | 31 ++++++++++ src/main/resources/data/layer1_faq/payment.md | 43 +++++++++++++ src/main/resources/data/layer1_faq/returns.md | 58 ++++++++++++++++++ .../resources/data/layer1_faq/shipping.md | 48 +++++++++++++++ .../resources/data/layer1_faq/subscription.md | 40 +++++++++++++ src/main/resources/data/layer1_faq/support.md | 31 ++++++++++ .../current/complaint-handling.md | 45 ++++++++++++++ .../current/marketplace-seller-agreement.md | 53 ++++++++++++++++ .../current/membership-tiers.md | 46 ++++++++++++++ .../current/point-earning-rules.md | 50 ++++++++++++++++ .../current/return-policy-v3.md | 60 +++++++++++++++++++ .../current/shipping-cold-chain.md | 52 ++++++++++++++++ .../current/shipping-standard.md | 51 ++++++++++++++++ .../current/subscription-terms.md | 50 ++++++++++++++++ .../deprecated/membership-tiers-final-v2.md | 34 +++++++++++ .../deprecated/point-earning-rules-old.md | 34 +++++++++++ .../deprecated/return-policy-v1.md | 40 +++++++++++++ .../deprecated/return-policy-v2.md | 39 ++++++++++++ .../deprecated/shipping-standard-2023.md | 36 +++++++++++ .../internal/cs-team-return-exceptions.md | 44 ++++++++++++++ .../internal/holiday-shipping-memo-2024.md | 38 ++++++++++++ .../internal/new-agent-onboarding.md | 50 ++++++++++++++++ .../data/layer3_chatlogs/2024-01.jsonl | 5 ++ .../data/layer3_chatlogs/2024-02.jsonl | 15 +++++ .../data/layer3_chatlogs/2024-03.jsonl | 5 ++ .../data/layer3_chatlogs/2024-04.jsonl | 15 +++++ .../data/layer3_chatlogs/2024-05.jsonl | 15 +++++ .../data/layer3_chatlogs/2024-06.jsonl | 5 ++ .../data/layer3_chatlogs/2024-07.jsonl | 15 +++++ .../data/layer3_chatlogs/2024-08.jsonl | 30 ++++++++++ .../data/layer3_chatlogs/2024-09.jsonl | 5 ++ .../data/layer3_chatlogs/2024-10.jsonl | 30 ++++++++++ .../data/layer3_chatlogs/2024-11.jsonl | 5 ++ .../data/layer3_chatlogs/2024-12.jsonl | 5 ++ .../data/layer3_chatlogs/2025-01.jsonl | 30 ++++++++++ .../data/layer3_chatlogs/2025-02.jsonl | 30 ++++++++++ .../data/layer3_chatlogs/2025-03.jsonl | 30 ++++++++++ .../data/layer3_chatlogs/2025-04.jsonl | 30 ++++++++++ .../data/layer3_chatlogs/2025-05.jsonl | 30 ++++++++++ .../data/layer3_chatlogs/2025-06.jsonl | 30 ++++++++++ 47 files changed, 1559 insertions(+) create mode 100644 src/main/java/com/cholog/bootcamp/MarkdownReader.java create mode 100644 src/main/resources/data/layer1_faq/account.md create mode 100644 src/main/resources/data/layer1_faq/eco_green.md create mode 100644 src/main/resources/data/layer1_faq/feedback.md create mode 100644 src/main/resources/data/layer1_faq/invoice.md create mode 100644 src/main/resources/data/layer1_faq/marketplace.md create mode 100644 src/main/resources/data/layer1_faq/orders.md create mode 100644 src/main/resources/data/layer1_faq/packaging.md create mode 100644 src/main/resources/data/layer1_faq/payment.md create mode 100644 src/main/resources/data/layer1_faq/returns.md create mode 100644 src/main/resources/data/layer1_faq/shipping.md create mode 100644 src/main/resources/data/layer1_faq/subscription.md create mode 100644 src/main/resources/data/layer1_faq/support.md create mode 100644 src/main/resources/data/layer2_policies/current/complaint-handling.md create mode 100644 src/main/resources/data/layer2_policies/current/marketplace-seller-agreement.md create mode 100644 src/main/resources/data/layer2_policies/current/membership-tiers.md create mode 100644 src/main/resources/data/layer2_policies/current/point-earning-rules.md create mode 100644 src/main/resources/data/layer2_policies/current/return-policy-v3.md create mode 100644 src/main/resources/data/layer2_policies/current/shipping-cold-chain.md create mode 100644 src/main/resources/data/layer2_policies/current/shipping-standard.md create mode 100644 src/main/resources/data/layer2_policies/current/subscription-terms.md create mode 100644 src/main/resources/data/layer2_policies/deprecated/membership-tiers-final-v2.md create mode 100644 src/main/resources/data/layer2_policies/deprecated/point-earning-rules-old.md create mode 100644 src/main/resources/data/layer2_policies/deprecated/return-policy-v1.md create mode 100644 src/main/resources/data/layer2_policies/deprecated/return-policy-v2.md create mode 100644 src/main/resources/data/layer2_policies/deprecated/shipping-standard-2023.md create mode 100644 src/main/resources/data/layer2_policies/internal/cs-team-return-exceptions.md create mode 100644 src/main/resources/data/layer2_policies/internal/holiday-shipping-memo-2024.md create mode 100644 src/main/resources/data/layer2_policies/internal/new-agent-onboarding.md create mode 100644 src/main/resources/data/layer3_chatlogs/2024-01.jsonl create mode 100644 src/main/resources/data/layer3_chatlogs/2024-02.jsonl create mode 100644 src/main/resources/data/layer3_chatlogs/2024-03.jsonl create mode 100644 src/main/resources/data/layer3_chatlogs/2024-04.jsonl create mode 100644 src/main/resources/data/layer3_chatlogs/2024-05.jsonl create mode 100644 src/main/resources/data/layer3_chatlogs/2024-06.jsonl create mode 100644 src/main/resources/data/layer3_chatlogs/2024-07.jsonl create mode 100644 src/main/resources/data/layer3_chatlogs/2024-08.jsonl create mode 100644 src/main/resources/data/layer3_chatlogs/2024-09.jsonl create mode 100644 src/main/resources/data/layer3_chatlogs/2024-10.jsonl create mode 100644 src/main/resources/data/layer3_chatlogs/2024-11.jsonl create mode 100644 src/main/resources/data/layer3_chatlogs/2024-12.jsonl create mode 100644 src/main/resources/data/layer3_chatlogs/2025-01.jsonl create mode 100644 src/main/resources/data/layer3_chatlogs/2025-02.jsonl create mode 100644 src/main/resources/data/layer3_chatlogs/2025-03.jsonl create mode 100644 src/main/resources/data/layer3_chatlogs/2025-04.jsonl create mode 100644 src/main/resources/data/layer3_chatlogs/2025-05.jsonl create mode 100644 src/main/resources/data/layer3_chatlogs/2025-06.jsonl diff --git a/src/main/java/com/cholog/bootcamp/MarkdownReader.java b/src/main/java/com/cholog/bootcamp/MarkdownReader.java new file mode 100644 index 0000000..3830d69 --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/MarkdownReader.java @@ -0,0 +1,37 @@ +package com.cholog.bootcamp; + +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; + +@Component +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()); + } + return allDocuments; + } +} 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/deprecated/membership-tiers-final-v2.md b/src/main/resources/data/layer2_policies/deprecated/membership-tiers-final-v2.md new file mode 100644 index 0000000..e90bdb3 --- /dev/null +++ b/src/main/resources/data/layer2_policies/deprecated/membership-tiers-final-v2.md @@ -0,0 +1,34 @@ +--- +title: Membership Tier Policy +version: v2 +status: deprecated +effective_date: 2023-01-01 +deprecated_date: 2024-01-01 +superseded_by: membership-tiers.md +department: marketing +category: membership +--- + +# Membership Tier Policy v2 (2023) + +> ⚠️ This document is deprecated. VIP threshold was updated for 2024. See membership-tiers.md. + +## Tier Qualification (2023) + +| Tier | Annual Spending Threshold | +|------|--------------------------| +| Standard | Default | +| Plus | ≥ 150,000 won | +| VIP | ≥ 600,000 won | + +(Note: For 2024, thresholds were revised: Plus = 200,000 won, VIP = 800,000 won) + +## Benefits (2023) + +| Benefit | Standard | Plus | VIP | +|---------|---------|------|-----| +| Point rate | 1% | 3% | 5% | +| Free Economy shipping | ≥ 30,000 won | All orders | All orders | +| Free Priority shipping | — | — | All orders | + +(Note: Standard free shipping threshold was 30,000 won in 2023, reduced to 20,000 won in 2024) diff --git a/src/main/resources/data/layer2_policies/deprecated/point-earning-rules-old.md b/src/main/resources/data/layer2_policies/deprecated/point-earning-rules-old.md new file mode 100644 index 0000000..318ded7 --- /dev/null +++ b/src/main/resources/data/layer2_policies/deprecated/point-earning-rules-old.md @@ -0,0 +1,34 @@ +--- +title: Loyalty Point Earning Rules +version: v1 +status: deprecated +effective_date: 2022-01-01 +deprecated_date: 2023-06-01 +superseded_by: point-earning-rules.md +department: marketing +category: loyalty +--- + +# Loyalty Point Earning Rules v1 (Legacy) + +> ⚠️ This document is deprecated. Point rates were revised significantly in June 2023. +> Refer to point-earning-rules.md (v3) for current rates. + +## Legacy Earning Rates (Pre-June 2023) + +| Membership Tier | Earning Rate | +|----------------|--------------| +| Standard | **3%** of order subtotal | +| Gold | **5%** of order subtotal | +| VIP | **7%** of order subtotal | + +(Note: The membership tiers were renamed and restructured in 2023. "Gold" became "Plus". +Earning rates were reduced significantly to align with industry standards.) + +## Legacy Point Expiry + +Points expired **24 months** from the date earned (now reduced to 12 months). + +## Legacy Redemption + +Minimum redemption was **500 points** (now increased to 1,000 points). diff --git a/src/main/resources/data/layer2_policies/deprecated/return-policy-v1.md b/src/main/resources/data/layer2_policies/deprecated/return-policy-v1.md new file mode 100644 index 0000000..37a370e --- /dev/null +++ b/src/main/resources/data/layer2_policies/deprecated/return-policy-v1.md @@ -0,0 +1,40 @@ +--- +title: Return & Refund Policy +version: v1 +status: deprecated +effective_date: 2022-01-01 +deprecated_date: 2023-03-01 +superseded_by: return-policy-v2.md +department: customer_service +category: returns +--- + +# Return & Refund Policy v1 + +> ⚠️ This document is deprecated. Please refer to the current policy (return-policy-v3.md). + +## Standard Return Window + +All products may be returned within **7 calendar days** of delivery, provided the item is +unopened and in original packaging. + +### Non-Returnable Items + +- Clearance items +- Digital downloads +- Personalized items +- Food and beverages + +## Handling Fee + +Non-defect returns incur a handling fee of **5,000 won** deducted from the refund. + +## Refund Timeline + +Credit card refunds: 5–7 business days. +Bank transfer refunds: up to 10 business days. + +## Marketplace Items + +Marketplace items follow Cholog's standard 7-day return policy uniformly. +(Note: This was changed in v2 and v3 — Marketplace items now follow seller-specific policies.) diff --git a/src/main/resources/data/layer2_policies/deprecated/return-policy-v2.md b/src/main/resources/data/layer2_policies/deprecated/return-policy-v2.md new file mode 100644 index 0000000..db5463f --- /dev/null +++ b/src/main/resources/data/layer2_policies/deprecated/return-policy-v2.md @@ -0,0 +1,39 @@ +--- +title: Return & Refund Policy +version: v2 +status: deprecated +effective_date: 2023-03-01 +deprecated_date: 2024-04-01 +superseded_by: return-policy-v3.md +department: customer_service +category: returns +--- + +# Return & Refund Policy v2 + +> ⚠️ This document is deprecated. Please refer to the current policy (return-policy-v3.md). + +## Standard Return Window + +All products may be returned within **10 calendar days** of delivery. The item must be +unused with original packaging intact. + +### Exceptions + +| Category | Return Window | +|----------|--------------| +| Electronics | 7 days | +| Food & Beverages | Not returnable | +| Cosmetics | 7 days, must be unused | +| Marketplace Items | Per seller policy (3–14 days) | + +## Handling Fee + +Non-defect returns incur a handling fee of **3,000 won** deducted from the refund. +(Same as current v3 — but the return window differs.) + +## Refund Timeline + +Credit card refunds: 3–5 business days after inspection. +Kakao Pay / Naver Pay: Typically instant. +Bank transfer: Up to 7 business days. diff --git a/src/main/resources/data/layer2_policies/deprecated/shipping-standard-2023.md b/src/main/resources/data/layer2_policies/deprecated/shipping-standard-2023.md new file mode 100644 index 0000000..e4b53ce --- /dev/null +++ b/src/main/resources/data/layer2_policies/deprecated/shipping-standard-2023.md @@ -0,0 +1,36 @@ +--- +title: Standard Shipping Policy +version: v3 +status: deprecated +effective_date: 2023-01-01 +deprecated_date: 2024-01-01 +superseded_by: shipping-standard.md +department: logistics +category: shipping +--- + +# Standard Shipping Policy v3 (2023) + +> ⚠️ This document is deprecated. Free shipping threshold changed to 20,000 won effective +> 2024-01-01. Refer to the current shipping-standard.md. + +## Shipping Tiers (2023) + +| Tier | Fee | Delivery Time | +|------|-----|---------------| +| Economy | 2,500 won | 2–4 business days | +| Priority | 5,000 won | Next business day by noon | +| Same-Day | 8,000 won | Same day (Seoul/Gyeonggi) | + +## Free Shipping Threshold (2023) + +- **Standard members**: Economy shipping free on orders ≥ **30,000 won** +- **Plus members**: Economy shipping free on orders ≥ **15,000 won** +- **VIP members**: Priority shipping free on all orders + +(Note: As of 2024-01-01, Standard member threshold was reduced to 20,000 won and Plus +members now receive free Economy shipping on ALL orders with no minimum.) + +## Dispatch Cutoff + +Orders confirmed before **2 PM KST** (changed to 1 PM KST in 2024). 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/data/layer3_chatlogs/2024-01.jsonl b/src/main/resources/data/layer3_chatlogs/2024-01.jsonl new file mode 100644 index 0000000..707fef9 --- /dev/null +++ b/src/main/resources/data/layer3_chatlogs/2024-01.jsonl @@ -0,0 +1,5 @@ +{"conversation_id":"CHAT-2024-01-001","timestamp":"2024-01-08T10:23:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"안녕하세요 어제 주문한 건데 배송이 언제 오나요?"},{"role":"agent","text":"안녕하세요 고객님! 주문번호 알려주시면 바로 확인해드릴게요."},{"role":"customer","text":"20240107-1892요"},{"role":"agent","text":"확인했습니다. 오늘 오전 발송 완료되었고 내일 오전 중 도착 예정입니다. 한진택배 운송장번호는 123456789입니다."},{"role":"customer","text":"감사합니다!"}],"resolution":"resolved","primary_intent":"track_order","secondary_intent":null,"tags":["배송조회","일반배송"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-01-002","timestamp":"2024-01-09T14:45:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"반품 신청하려고요. 어떻게 하면 되나요?"},{"role":"agent","text":"네 고객님, 앱이나 웹사이트에서 '나의 주문' → 주문 선택 → '반품 신청' 을 탭하시면 됩니다. 사진 한 장 이상 업로드하시고 수거 날짜 선택하시면 돼요."},{"role":"customer","text":"단순 변심인데 비용이 따로 드나요?"},{"role":"agent","text":"단순 변심이나 사이즈 문제 등 고객 사유 반품의 경우 왕복 배송비 명목으로 3,000원이 환불금에서 차감됩니다."},{"role":"customer","text":"알겠어요 신청할게요"}],"resolution":"resolved","primary_intent":"return_request","secondary_intent":null,"tags":["반품","단순변심"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-01-003","timestamp":"2024-01-10T09:12:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"VIP인데 무료 배송 기준이 어떻게 되나요?"},{"role":"agent","text":"VIP 등급이시면 금액 상관없이 모든 주문에 우선 배송(Priority)이 무료로 적용됩니다. 별도 최소 금액 없이 주문하실 때마다 자동 적용돼요."},{"role":"customer","text":"구독도 하고 있는데 그것도 포함되나요?"},{"role":"agent","text":"네, 구독 중이시면 구독 혜택과 VIP 혜택 중 더 좋은 쪽이 자동 적용됩니다. 어떤 경우든 우선 배송 무료입니다."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":"subscription","tags":["배송비","VIP","구독"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-01-004","timestamp":"2024-01-11T16:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"반품 기간이 어떻게 되나요?"},{"role":"agent","text":"반품은 배송 완료 후 7일 이내에 신청 가능합니다."},{"role":"customer","text":"7일이요? 좀 짧네요"},{"role":"agent","text":"네 맞습니다, 7일 이내로 신청 부탁드립니다."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["반품기간","오답주의"],"agent_accuracy":"incorrect","accuracy_note":"현행 반품 기간은 14일(v3 정책). agent_jung이 구버전(v1, 7일) 기준으로 잘못 안내함."} +{"conversation_id":"CHAT-2024-01-005","timestamp":"2024-01-12T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"포인트 유효기간이 어떻게 되나요?"},{"role":"agent","text":"포인트는 적립일로부터 12개월 동안 유효합니다. 만료 30일 전에 앱 알림으로 안내드려요."},{"role":"customer","text":"그럼 만료되면 복구가 안되나요?"},{"role":"agent","text":"네, 만료된 포인트는 복구나 연장이 되지 않습니다. 만료 전에 꼭 사용해 주세요."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["포인트","유효기간"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2024-02.jsonl b/src/main/resources/data/layer3_chatlogs/2024-02.jsonl new file mode 100644 index 0000000..2e2459c --- /dev/null +++ b/src/main/resources/data/layer3_chatlogs/2024-02.jsonl @@ -0,0 +1,15 @@ +{"conversation_id":"CHAT-2024-02-001","timestamp":"2024-02-02T10:15:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"주문 취소하고 싶어요"},{"role":"agent","text":"주문번호 알려주시면 바로 확인해드릴게요."},{"role":"customer","text":"20240201-3301"},{"role":"agent","text":"확인했습니다. 현재 '배송 준비중' 상태라 취소 가능합니다. 앱에서 나의 주문 > 주문 취소 탭하시면 즉시 처리되고 전액 환불됩니다."},{"role":"customer","text":"감사합니다"}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":null,"tags":["주문취소","즉시취소"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-02-002","timestamp":"2024-02-03T14:30:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"방금 주문했는데 취소 가능한가요? 실수로 눌렀어요"},{"role":"agent","text":"네 고객님! 주문번호 알려주시겠어요?"},{"role":"customer","text":"20240203-7712"},{"role":"agent","text":"확인했습니다. 아직 준비중 상태라 취소 가능해요. 앱 나의 주문에서 직접 취소하시거나 제가 처리해드릴게요. 어떻게 하시겠어요?"},{"role":"customer","text":"직접 할게요 감사해요"}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":null,"tags":["주문취소","실수"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-02-003","timestamp":"2024-02-05T09:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"이미 발송된 주문 취소할 수 있나요?"},{"role":"agent","text":"죄송합니다, 발송 후에는 주문 취소가 불가합니다. 수령 후 반품 신청하셔야 합니다."},{"role":"customer","text":"그럼 반품하면 배송비 드나요?"},{"role":"agent","text":"단순 변심 반품의 경우 3,000원 처리비가 차감됩니다. 제품 불량이라면 무료입니다."}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":"return_request","tags":["취소불가","발송완료","반품안내"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-02-004","timestamp":"2024-02-06T16:45:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"주문 취소 가능한 시간이 있나요?"},{"role":"agent","text":"주문 후 1시간 이내에만 취소 가능합니다."},{"role":"customer","text":"1시간 지났는데 안되나요?"},{"role":"agent","text":"죄송합니다 맞습니다, 1시간 이후엔 취소가 안됩니다."}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":null,"tags":["취소시간","오답주의"],"agent_accuracy":"incorrect","accuracy_note":"주문 취소는 1시간 제한이 아니라 '배송 준비중' 상태일 때까지 가능. agent_jung 오안내."} +{"conversation_id":"CHAT-2024-02-005","timestamp":"2024-02-07T11:20:00+09:00","channel":"live_chat","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"취소하면 환불이 언제 되나요?"},{"role":"agent","text":"취소는 즉시 처리되고요, 환불은 결제 수단에 따라 다릅니다. 신용카드는 3-5영업일, 카카오페이·네이버페이는 거의 즉시, 계좌이체는 최대 7영업일 소요됩니다. 혹시 어떤 수단으로 결제하셨나요?"},{"role":"customer","text":"카카오페이요"},{"role":"agent","text":"그러면 취소 완료 후 거의 바로 환불 처리됩니다!"}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":"get_refund","tags":["취소환불","카카오페이"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-02-006","timestamp":"2024-02-08T13:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"주문 수량 변경 가능한가요? 2개 시켰는데 1개로 바꾸고 싶어요"},{"role":"agent","text":"주문 후 수량 변경은 지원하지 않습니다. 기존 주문을 취소 후 원하시는 수량으로 다시 주문하셔야 합니다. 현재 주문 상태가 어떻게 되나요?"},{"role":"customer","text":"준비중이에요"},{"role":"agent","text":"그러면 지금 취소 가능합니다. 나의 주문에서 취소 후 1개로 재주문해주세요."}],"resolution":"resolved","primary_intent":"change_order","secondary_intent":"cancel_order","tags":["수량변경","재주문안내"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-02-007","timestamp":"2024-02-09T10:30:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"색상 변경 할 수 있나요? 검정으로 잘못 골랐어요"},{"role":"agent","text":"주문 후 색상 변경은 불가합니다. 취소 후 재주문이 필요해요. 아직 준비중 상태면 지금 바로 취소 가능해요."},{"role":"customer","text":"품절되면 어떡해요 ㅠㅠ"},{"role":"agent","text":"빨리 처리하시면 재주문 가능할 거예요! 원하시는 색상이 재고 있는지 제가 먼저 확인해드릴게요. 상품명이 어떻게 되시나요?"}],"resolution":"resolved","primary_intent":"change_order","secondary_intent":null,"tags":["색상변경","재주문","비격식"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-02-008","timestamp":"2024-02-13T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"주문 변경하고 싶은데 어떻게 해요"},{"role":"agent","text":"주문 내용 변경(상품, 수량, 색상 등)은 취소 후 재주문으로만 가능합니다. 배송지 변경은 준비중 상태에서 앱에서 수정 가능하고요."},{"role":"customer","text":"배송지만 바꾸고 싶어요"},{"role":"agent","text":"나의 주문에서 해당 주문 선택 후 주소 수정 탭으로 변경 가능합니다. 발송 전에만 가능하니 서두르세요."}],"resolution":"resolved","primary_intent":"change_order","secondary_intent":"change_shipping_address","tags":["주문변경","배송지변경"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-02-009","timestamp":"2024-02-14T09:45:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"두 개 주문했는데 하나만 취소할 수 있나요?"},{"role":"agent","text":"하나의 주문 건 내에서 일부 상품만 취소하는 부분 취소 기능은 현재 지원하지 않습니다. 전체 취소 후 원하시는 상품만 재주문하셔야 합니다. 번거로우시더라도요, 고객님."},{"role":"customer","text":"VIP라도 안되나요?"},{"role":"agent","text":"죄송하게도 등급과 관계없이 부분 취소 기능이 없습니다. 혹시 원하시면 제가 전체 취소 처리 후 재주문 안내 도와드릴게요."}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":null,"tags":["부분취소","VIP","전체취소"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-02-010","timestamp":"2024-02-16T14:10:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"야 취소 버튼이 없는데?"},{"role":"agent","text":"현재 주문 상태가 어떻게 되세요? '발송 완료'로 바뀐 경우 앱에서 취소 버튼이 사라집니다."},{"role":"customer","text":"발송완료라고 뜨네요"},{"role":"agent","text":"아 그렇군요, 발송 후에는 취소가 불가합니다. 수령 후 반품 신청 가능해요."}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":null,"tags":["취소버튼","발송완료","비격식"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-02-011","timestamp":"2024-02-19T10:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"처음 주문하는데 어떻게 하나요?"},{"role":"agent","text":"앱이나 웹사이트에서 원하시는 상품을 장바구니에 담고 결제하시면 됩니다. 회원이시면 저장된 주소와 결제 수단으로 빠르게 진행 가능해요. 혹시 회원 가입은 되어 계신가요?"},{"role":"customer","text":"네 가입은 했어요"},{"role":"agent","text":"그러면 로그인 후 상품 선택 → 장바구니 → 결제 순서로 진행하시면 됩니다. 20,000원 이상이면 배송비 무료예요!"}],"resolution":"resolved","primary_intent":"place_order","secondary_intent":null,"tags":["첫주문","주문방법"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-02-012","timestamp":"2024-02-20T16:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"비회원으로 주문 가능한가요?"},{"role":"agent","text":"비회원 주문도 가능합니다. 다만 주문 이력 조회나 포인트 적립 등 회원 혜택은 받으실 수 없어요. 가입이 간단하니 SSO로 빠르게 가입 추천드립니다."},{"role":"customer","text":"카카오로 가입 가능하죠?"},{"role":"agent","text":"네, 카카오, 네이버, 구글 SSO 모두 지원합니다. 가입 후 3,000원 쿠폰도 드려요!"}],"resolution":"resolved","primary_intent":"place_order","secondary_intent":"create_account","tags":["비회원주문","회원가입","SSO"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-02-013","timestamp":"2024-02-21T11:15:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"주문하면 포인트 바로 쌓이나요?"},{"role":"agent","text":"네, 결제 즉시 포인트 적립됩니다."},{"role":"customer","text":"얼마나 쌓여요?"},{"role":"agent","text":"구매 금액의 1% 포인트 적립됩니다."}],"resolution":"resolved","primary_intent":"place_order","secondary_intent":"loyalty_points","tags":["포인트적립","주문"],"agent_accuracy":"partially_correct","accuracy_note":"포인트는 결제 즉시가 아닌 배송 완료 후 7일 뒤 적립됨. agent_jung 오안내."} +{"conversation_id":"CHAT-2024-02-014","timestamp":"2024-02-22T09:30:00+09:00","channel":"kakaotalk","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"쿠폰이랑 포인트 같이 쓸 수 있나요?"},{"role":"agent","text":"네, 쿠폰 1개와 포인트를 함께 사용 가능합니다. 쿠폰 할인이 먼저 적용되고 나머지 금액에서 포인트가 차감됩니다. 포인트는 최소 1,000점 이상이어야 사용 가능해요."}],"resolution":"resolved","primary_intent":"place_order","secondary_intent":null,"tags":["쿠폰","포인트","중복사용"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-02-015","timestamp":"2024-02-23T14:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"장바구니에 담아놓은 거 얼마나 유지되나요?"},{"role":"agent","text":"장바구니 보관 기간은 별도로 만료되지 않습니다. 다만 상품이 품절되거나 가격이 변경될 수 있어요. 오래 두시면 가격 변동 가능성이 있으니 빨리 주문하시는 걸 추천드립니다. 상품 재고는 장바구니에 담는다고 예약되지 않아요."}],"resolution":"resolved","primary_intent":"place_order","secondary_intent":null,"tags":["장바구니","유효기간","재고"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2024-03.jsonl b/src/main/resources/data/layer3_chatlogs/2024-03.jsonl new file mode 100644 index 0000000..a1331eb --- /dev/null +++ b/src/main/resources/data/layer3_chatlogs/2024-03.jsonl @@ -0,0 +1,5 @@ +{"conversation_id":"CHAT-2024-03-001","timestamp":"2024-03-05T13:20:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"배송 문의인데요 오늘 주문하면 언제 와요?"},{"role":"agent","text":"안녕하세요! 오늘 오후 1시 이전 결제 확인 주문은 오늘 오후 발송되고, 이후 주문은 내일 오전 발송됩니다. 일반 배송 기준으로 수령까지 영업일 기준 2-4일 소요되고요, 우선 배송 선택하시면 다음 영업일 정오까지 도착 보장입니다. 현재 시각이 오후 1시 넘었으니 내일 오전 발송으로 처리됩니다. 배송 외에 궁금하신 점 있으실까요?"},{"role":"customer","text":"아 그럼 빨리 받고 싶어서요"},{"role":"agent","text":"빠른 수령을 원하신다면 우선 배송(5,000원)을 추천드립니다. 내일 오전 발송, 모레 정오까지 도착 보장입니다. 혹시 주문하실 상품이 냉장 상품이라면 냉장 배송은 월~목만 가능한 점 참고해 주세요!"},{"role":"customer","text":"냉장은 아니에요 그냥 일반 상품이에요 주소 변경도 되나요?"},{"role":"agent","text":"주소 변경은 주문 상태가 '배송 준비중'일 때만 가능합니다. '나의 주문'에서 주문 선택 후 '주소 수정'을 탭해주세요. 이미 '발송 완료'로 바뀐 경우엔 변경이 어렵습니다."},{"role":"customer","text":"아직 준비중이라 변경해야겠네요 감사해요"}],"resolution":"resolved","primary_intent":"delivery_period","secondary_intent":"change_shipping_address","tags":["배송기간","주소변경","주제전환"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-03-002","timestamp":"2024-03-07T10:05:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"걍 환불해주세요 ㅠㅠ 너무 맘에 안들어요"},{"role":"agent","text":"불편을 드려서 정말 죄송합니다 고객님. 어떤 상품 건인지 주문번호 알려주시면 바로 처리해드릴게요."},{"role":"customer","text":"20240301-4421"},{"role":"agent","text":"확인했습니다. 해당 상품 배송 완료일이 3월 1일이고 오늘 7일이니 아직 14일 이내라 반품 신청 가능합니다. 상품 불만족으로 접수해드릴까요? 이 경우 3,000원 처리 수수료가 환불금에서 차감됩니다."},{"role":"customer","text":"얼마나 걸려요?"},{"role":"agent","text":"수거 후 검수 완료까지 1-2영업일, 이후 결제 수단에 따라 카드 3-5일, 카카오페이는 거의 즉시 환불됩니다."},{"role":"customer","text":"카카오페이로 했어요 ㄱㄱ"}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["환불","구어체","비격식"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-03-003","timestamp":"2024-03-10T15:40:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"저 VIP인데 산 지 20일 된 상품 반품 가능한가요?"},{"role":"agent","text":"일반적으로 반품은 배송 완료 후 14일 이내이지만, VIP 고객님의 경우 사정에 따라 추가 검토가 가능합니다. 어떤 상품인지, 반품 사유가 어떻게 되시나요?"},{"role":"customer","text":"결함이 있어서요 처음엔 몰랐는데 쓰다 보니 발견했어요"},{"role":"agent","text":"결함 발견이시군요. VIP 고객님이고 결함 관련 사항이라 예외 처리 가능합니다. 결함 부위 사진을 '나의 주문 > 불만 신고'로 업로드해 주시면 검토 후 반품 처리해드리겠습니다. 처리비용은 없습니다."}],"resolution":"resolved","primary_intent":"return_request","secondary_intent":null,"tags":["VIP","반품예외","결함"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-03-004","timestamp":"2024-03-12T09:30:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_jung","turns":[{"role":"customer","text":"포인트 적립률이 어떻게 되나요? 플러스 등급인데요"},{"role":"agent","text":"플러스 등급은 구매 금액의 3% 포인트 적립됩니다."},{"role":"customer","text":"스탠다드는요?"},{"role":"agent","text":"스탠다드는 3%, 플러스는 5%, VIP는 7% 입니다."},{"role":"customer","text":"어? 방금 플러스 3%라고 하셨잖아요"},{"role":"agent","text":"죄송합니다, 제가 착각했습니다. 정확한 적립률은 스탠다드 1%, 플러스 3%, VIP 5%입니다. 처음 안내가 맞았습니다."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["포인트적립률","상담사실수","오답수정"],"agent_accuracy":"partially_correct","accuracy_note":"agent_jung이 구버전(3%/5%/7%) 적립률을 혼용함. 수정 후 최종 답변은 정확."} +{"conversation_id":"CHAT-2024-03-005","timestamp":"2024-03-15T11:55:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"주문하고 취소하려는데 가능한가요?"},{"role":"agent","text":"배송 준비중 상태라면 취소 가능합니다. '나의 주문'에서 주문 선택 후 '주문 취소'를 눌러주세요. 즉시 처리되고 전액 환불됩니다."},{"role":"customer","text":"이미 발송됐다고 나오는데요"},{"role":"agent","text":"발송 후에는 취소가 불가능합니다. 수령 후 반품 신청하셔야 합니다. 도착하면 반품 신청해 드리겠습니다."},{"role":"customer","text":"그럼 배송비도 제가 내야 하나요?"},{"role":"agent","text":"단순 변심 반품의 경우 3,000원 처리비가 차감됩니다. 제품 결함이라면 무료입니다."}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":"return_request","tags":["주문취소","반품","주제전환"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2024-04.jsonl b/src/main/resources/data/layer3_chatlogs/2024-04.jsonl new file mode 100644 index 0000000..12a183b --- /dev/null +++ b/src/main/resources/data/layer3_chatlogs/2024-04.jsonl @@ -0,0 +1,15 @@ +{"conversation_id":"CHAT-2024-04-001","timestamp":"2024-04-02T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"주문 취소했는데 환불이 안 들어왔어요"},{"role":"agent","text":"취소 처리 일시 확인해드릴게요. 주문번호 알려주시겠어요?"},{"role":"customer","text":"20240401-5521"},{"role":"agent","text":"어제 오후 취소 처리됐네요. 신용카드 결제 건은 3-5영업일 소요됩니다. 오늘 기준 늦어도 다음 주 중에 들어올 거예요."},{"role":"customer","text":"알겠어요"}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":"track_refund","tags":["취소환불","환불대기"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-04-002","timestamp":"2024-04-04T13:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"주문을 두 개 했는데 하나로 합배송 되나요?"},{"role":"agent","text":"30분 이내 동일 주소로 주문하신 경우 자동 합배송될 수 있습니다. 수동 합배송 요청은 첫 주문이 발송 전에 고객센터로 문의주세요."},{"role":"customer","text":"우선배송이랑 일반배송인데도 합배송 가능한가요?"},{"role":"agent","text":"우선배송과 일반배송 혼합 합배송은 불가합니다. 각각 별도 발송됩니다."}],"resolution":"resolved","primary_intent":"place_order","secondary_intent":null,"tags":["합배송","배송방식혼합"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-04-003","timestamp":"2024-04-08T09:15:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"주문 취소하면 쿠폰 복구되나요?"},{"role":"agent","text":"네! 주문 취소 시 사용하셨던 쿠폰은 원래 만료일 내에서 복구됩니다. 다만 쿠폰 유효기간이 이미 만료된 경우엔 복구가 어렵습니다."},{"role":"customer","text":"포인트도요?"},{"role":"agent","text":"포인트도 사용하신 만큼 복구됩니다. 단, 해당 주문으로 적립된 포인트는 취소와 함께 차감됩니다."}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":null,"tags":["취소후쿠폰","포인트복구"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-04-010","timestamp":"2024-04-10T15:20:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"ㅠㅠ 실수로 두 번 주문했어요"},{"role":"agent","text":"아이고! 주문번호 두 개 알려주시면 확인해드릴게요."},{"role":"customer","text":"20240410-1122 랑 20240410-1123이요"},{"role":"agent","text":"두 건 다 아직 준비중이에요. 중복 건 하나 취소해드릴게요. 어떤 걸 남기실 건가요?"},{"role":"customer","text":"1122 남겨주세요"},{"role":"agent","text":"1123 취소 처리했습니다. 카카오페이 환불은 거의 즉시 됩니다!"}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":null,"tags":["중복주문","비격식","즉시취소"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-04-011","timestamp":"2024-04-12T11:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_choi","turns":[{"role":"customer","text":"주문할 때 할인코드 적용을 못 했어요, 환불 후 재주문해야 하나요?"},{"role":"agent","text":"아쉽게도 주문 완료 후에는 쿠폰이나 할인코드 사후 적용이 불가합니다. 현재 주문 상태가 준비중이라면 취소 후 할인코드 적용하여 재주문하시는 방법밖에 없습니다. 현재 상태 확인해드릴까요?"},{"role":"customer","text":"준비중이에요"},{"role":"agent","text":"그러면 취소 후 재주문 권장드립니다. 할인코드 절약 금액이 크시면 특히요."}],"resolution":"resolved","primary_intent":"change_order","secondary_intent":"cancel_order","tags":["할인코드","사후적용불가","재주문"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-04-012","timestamp":"2024-04-15T14:45:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"취소 신청했는데 언제 처리돼요?"},{"role":"agent","text":"취소는 영업일 1-2일 내 처리됩니다."},{"role":"customer","text":"바로 안되나요?"},{"role":"agent","text":"죄송합니다, 확인해보니 준비중 상태면 즉시 취소 됩니다. 제가 잘못 안내드렸어요. 취소 신청 후 바로 완료 문자 받으셨나요?"}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":null,"tags":["취소처리시간","오답수정","agent_jung"],"agent_accuracy":"partially_correct","accuracy_note":"준비중 취소는 즉시 처리. agent_jung이 1-2일이라 오안내 후 수정."} +{"conversation_id":"CHAT-2024-04-013","timestamp":"2024-04-18T10:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"미성년자도 주문 가능한가요?"},{"role":"agent","text":"만 14세 이상이면 보호자 동의 없이 기본 상품 구매 가능합니다. 다만 19세 이상 인증이 필요한 상품(주류 관련 용품, 일부 보충제 등)은 성인 인증이 필요합니다."}],"resolution":"resolved","primary_intent":"place_order","secondary_intent":null,"tags":["미성년자","연령제한","주문자격"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-04-014","timestamp":"2024-04-22T16:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"주문 완료 문자가 안 와요"},{"role":"agent","text":"주문번호 알려주시면 확인해드릴게요."},{"role":"customer","text":"20240422-9901"},{"role":"agent","text":"주문 정상 접수됐습니다! 문자 대신 카카오 알림톡으로 발송됩니다. 카카오 알림 허용 여부 확인해보시겠어요?"},{"role":"customer","text":"아 카카오로 왔네요 ㅎㅎ"}],"resolution":"resolved","primary_intent":"place_order","secondary_intent":null,"tags":["주문확인","알림톡","비격식"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-04-015","timestamp":"2024-04-25T11:30:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"장바구니 20개 상품 한번에 주문 가능한가요?"},{"role":"agent","text":"네, 장바구니 상품 전체 한 번에 주문 가능합니다. 다만 한 주문당 최대 금액은 500만원이고, 그 이상은 B2B팀 통해 별도 처리 필요합니다. 또 마켓플레이스 판매자 상품이 섞여 있다면 판매자별로 별도 주문 처리됩니다."}],"resolution":"resolved","primary_intent":"place_order","secondary_intent":null,"tags":["대량주문","장바구니","마켓플레이스"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-05-001","timestamp":"2024-05-03T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"주문 변경하고 싶은데 이미 발송됐어요"},{"role":"agent","text":"발송 후에는 주문 내용 변경이 불가합니다. 수령 후 반품하고 재주문하셔야 합니다."},{"role":"customer","text":"배송지라도 바꿀 수 있나요?"},{"role":"agent","text":"발송 후 배송지 변경도 어렵습니다. 택배사(한진)에 직접 연락해보시면 가능한 경우도 있긴 한데 보장은 어렵습니다."}],"resolution":"partially_resolved","primary_intent":"change_order","secondary_intent":"change_shipping_address","tags":["발송후변경불가","배송지","주제전환"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-05-002","timestamp":"2024-05-07T14:20:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"주문 취소하면 포인트는 어떻게 돼요?"},{"role":"agent","text":"주문 시 사용한 포인트는 취소 즉시 복구됩니다. 해당 주문으로 적립 예정이었던 포인트는 취소와 함께 소멸됩니다. 이미 배송 완료 후 7일이 지나 포인트가 지급됐다면, 취소 처리 시 회수됩니다."}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":"loyalty_points","tags":["취소포인트","복구","회수"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-05-003","timestamp":"2024-05-10T09:45:00+09:00","channel":"kakaotalk","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"앱이랑 웹이랑 가격 달라요?"},{"role":"agent","text":"기본 가격은 동일하지만 앱 전용 특가 상품이 있어서 앱에서 5-10% 저렴한 경우가 있어요. 앱 전용 딜은 매주 월요일 오전 10시에 업데이트됩니다."}],"resolution":"resolved","primary_intent":"place_order","secondary_intent":null,"tags":["앱전용","가격차이"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-05-011","timestamp":"2024-05-14T15:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"선물 포장으로 주문하고 싶은데 취소하면 포장비도 환불되나요?"},{"role":"agent","text":"선물 포장비(상품당 1,500원)는 주문 취소 시 전액 환불됩니다. 이미 포장 작업이 진행된 경우에는 환불이 어려울 수 있는데, 그런 경우는 거의 없습니다. 취소 즉시 전액 환불이 원칙입니다."}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":null,"tags":["선물포장","포장비환불"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-05-012","timestamp":"2024-05-17T11:10:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"주문번호가 뭔지 모르겠어요"},{"role":"agent","text":"주문번호는 주문 완료 문자나 카카오 알림톡에서 확인하거나, 앱 나의 주문에서 확인 가능합니다."},{"role":"customer","text":"앱 어디에 있어요?"},{"role":"agent","text":"앱 하단 메뉴에서 '나의 주문' 탭을 누르시면 전체 주문 이력이 나옵니다."}],"resolution":"resolved","primary_intent":"place_order","secondary_intent":null,"tags":["주문번호조회","앱사용법"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-05-013","timestamp":"2024-05-22T16:40:00+09:00","channel":"live_chat","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"VIP인데 주문 취소 우선 처리 되나요?"},{"role":"agent","text":"취소 처리 자체는 고객님이 직접 앱에서 즉시 가능하기 때문에 별도 우선 처리 개념은 없습니다. 다만 환불 처리나 복잡한 케이스에서 VIP는 우선 지원 받으실 수 있어요."},{"role":"customer","text":"직접 하면 바로 되는거죠?"},{"role":"agent","text":"네, 준비중 상태면 버튼 하나로 즉시 취소됩니다."}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":null,"tags":["VIP","즉시취소","우선처리"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2024-05.jsonl b/src/main/resources/data/layer3_chatlogs/2024-05.jsonl new file mode 100644 index 0000000..1f074f8 --- /dev/null +++ b/src/main/resources/data/layer3_chatlogs/2024-05.jsonl @@ -0,0 +1,15 @@ +{"conversation_id":"CHAT-2024-05-101","timestamp":"2024-05-02T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"배송 조회 어디서 해요?"},{"role":"agent","text":"앱 나의 주문에서 해당 주문 선택 후 '배송 추적' 버튼을 누르시면 됩니다. 발송 후 한진택배 운송장번호가 발급되면 한진 앱이나 홈페이지에서도 조회 가능해요."}],"resolution":"resolved","primary_intent":"track_order","secondary_intent":null,"tags":["배송조회","운송장"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-05-102","timestamp":"2024-05-03T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"운송장 번호가 어디 있어요? 문자에 없는데"},{"role":"agent","text":"발송 후 카카오 알림톡으로 운송장번호가 발송됩니다. 혹시 카카오 알림톡 수신 허용이 안 되어 있다면 앱 나의 주문에서 확인 가능해요. 주문번호 알려주시면 제가 직접 알려드릴게요."},{"role":"customer","text":"20240502-3341"},{"role":"agent","text":"운송장번호는 456789123입니다. 한진택배 기준 내일 오전 중 도착 예정이에요."}],"resolution":"resolved","primary_intent":"track_order","secondary_intent":null,"tags":["운송장번호","알림톡"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-05-103","timestamp":"2024-05-06T09:20:00+09:00","channel":"kakaotalk","customer_tier":"plus","agent_id":"agent_park","turns":[{"role":"customer","text":"배송이 3일째인데 아직도 안 왔어요"},{"role":"agent","text":"불편드려 죄송합니다. 주문번호 알려주시면 배송 현황 확인해드릴게요."},{"role":"customer","text":"20240503-7712"},{"role":"agent","text":"확인했습니다. 어제 오후 발송됐고 현재 배송 중 상태입니다. 도서산간 지역이나 물량 증가 시 1-2일 지연될 수 있습니다. 혹시 제주도나 도서지역 주소인가요?"},{"role":"customer","text":"아뇨 서울이에요"},{"role":"agent","text":"서울인데 지연되고 있네요. 한진택배 고객센터(1588-0011)에 문의하시거나 제가 물류팀에 확인 요청 드릴게요."}],"resolution":"escalated","primary_intent":"track_order","secondary_intent":null,"tags":["배송지연","서울","에스컬레이션"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-05-104","timestamp":"2024-05-08T15:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"배송 상태가 계속 '배송 중'인데 안 움직여요. 어제부터요"},{"role":"agent","text":"배송 중 상태에서 업데이트가 없는 경우 허브 보관 중이거나 배송기사 할당 대기 상태일 수 있습니다. 오늘 오후까지 업데이트가 없으면 한진택배 고객센터(1588-0011)에 운송장번호로 직접 문의하시는 걸 권장드립니다. 제가 운송장번호 알려드릴까요?"},{"role":"customer","text":"네 알려주세요"},{"role":"agent","text":"주문번호 주시면 확인해드리겠습니다."}],"resolution":"partially_resolved","primary_intent":"track_order","secondary_intent":null,"tags":["배송중정체","허브","운송장"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-05-105","timestamp":"2024-05-09T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"배송 얼마나 걸려요?"},{"role":"agent","text":"일반 배송 기준 2-3일 소요됩니다."},{"role":"customer","text":"2-3일이요? 웹에는 2-4일이라고 나오는데"},{"role":"agent","text":"죄송합니다, 정확히는 영업일 기준 2-4일입니다. 제가 잘못 안내드렸어요."}],"resolution":"resolved","primary_intent":"delivery_period","secondary_intent":null,"tags":["배송기간","오답수정"],"agent_accuracy":"partially_correct","accuracy_note":"일반배송은 2-4영업일. agent_jung이 2-3일로 오안내 후 수정."} +{"conversation_id":"CHAT-2024-05-106","timestamp":"2024-05-13T16:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"오늘 주문하면 내일 받을 수 있나요?"},{"role":"agent","text":"오늘 오후 1시 이전에 주문하셨다면 오늘 발송, 일반 배송으로 내일 받으실 수 있습니다. 1시 이후라면 내일 발송, 모레 도착입니다. 빠르게 받으시려면 우선배송(5,000원)이면 다음 영업일 정오까지 보장됩니다."}],"resolution":"resolved","primary_intent":"delivery_period","secondary_intent":"delivery_options","tags":["당일발송","우선배송","주제전환"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-05-107","timestamp":"2024-05-16T10:30:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_lee","turns":[{"role":"customer","text":"VIP 우선배송 무료 맞죠?"},{"role":"agent","text":"네 맞습니다! VIP 등급이시면 우선배송이 무료로 자동 적용됩니다. 주문 금액에 상관없이요."},{"role":"customer","text":"오늘 3시에 주문하면 모레 받을 수 있겠네요?"},{"role":"agent","text":"오늘 오후 1시가 넘었으니 내일 오전 발송, 모레 정오까지 도착 보장입니다."}],"resolution":"resolved","primary_intent":"delivery_period","secondary_intent":null,"tags":["VIP무료배송","우선배송","도착시간"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-05-108","timestamp":"2024-05-20T14:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"제주도로 배송 얼마나 걸려요?"},{"role":"agent","text":"제주도는 일반 배송에서 1-2일 추가 소요됩니다. 일반 배송 기준 3-6영업일 정도 예상하시면 됩니다. 배송비 추가는 없어요."}],"resolution":"resolved","primary_intent":"delivery_period","secondary_intent":null,"tags":["제주배송","도서지역","배송기간"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-05-109","timestamp":"2024-05-23T09:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"당일 배송 어떻게 신청해요?"},{"role":"agent","text":"당일 배송은 서울, 인천, 경기 지역에서 오전 10시 이전 주문 시 가능합니다. 배송비는 8,000원이며 주문 시 '당일 배송' 옵션을 선택하시면 됩니다. 주말, 공휴일, 대형 상품은 불가합니다."},{"role":"customer","text":"지금 11시인데 안되겠네요"},{"role":"agent","text":"아쉽게도 오늘은 당일 배송이 어렵습니다. 우선 배송(5,000원)으로 내일 정오까지 받으시는 게 가장 빠른 방법이에요."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["당일배송","시간초과","우선배송"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-05-110","timestamp":"2024-05-27T15:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"배송비 무료 되는 기준이 뭔가요?"},{"role":"agent","text":"스탠다드 회원은 2만원 이상 주문 시 일반 배송 무료입니다. 플러스는 금액 무관 무료, VIP는 우선배송까지 무료, 구독 회원은 금액 무관 무료입니다."},{"role":"customer","text":"예전에 3만원이었던 것 같던데요"},{"role":"agent","text":"2024년 1월부터 2만원으로 낮아졌습니다. 예전엔 3만원이었어요."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["배송비","무료기준","버전변경"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-05-111","timestamp":"2024-05-29T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"배송 예약 가능한가요? 다음 주 목요일에 받고 싶어요"},{"role":"agent","text":"네! 주문 시 '예약 배송'을 선택하면 최대 14일 이내 날짜로 예약 가능합니다. 일반 배송, 우선 배송 모두 가능하고 당일 배송은 예약 불가입니다."},{"role":"customer","text":"추가 비용 있나요?"},{"role":"agent","text":"예약 배송 자체는 추가 비용 없습니다. 선택하신 배송 방식 요금만 적용돼요."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["예약배송","날짜지정","무료"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-05-112","timestamp":"2024-05-30T16:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_park","turns":[{"role":"customer","text":"편의점 수령 가능한가요?"},{"role":"agent","text":"네, CU편의점 픽업 서비스 이용 가능합니다. 주문 시 'CU편의점 수령'을 선택하고 가까운 CU 지점을 고르시면 됩니다. 보관 기간은 5일이고 그 이후엔 반송 처리됩니다."},{"role":"customer","text":"보관료 따로 드나요?"},{"role":"agent","text":"보관료는 없습니다. 무료로 5일간 보관됩니다."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["편의점수령","CU","보관기간"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-05-113","timestamp":"2024-05-31T10:15:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"배송 시간대 지정 할 수 있나요?"},{"role":"agent","text":"네, 우선 배송 선택 시 2시간 단위 배송 시간대 지정 가능합니다. 오전 9시부터 오후 9시 사이에서 선택하시면 됩니다."},{"role":"customer","text":"일반 배송도 되나요?"},{"role":"agent","text":"일반 배송은 시간대 지정이 안 됩니다. 우선 배송에서만 가능합니다."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["시간대지정","우선배송"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-05-114","timestamp":"2024-05-31T14:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"부재중이면 어떻게 되나요?"},{"role":"agent","text":"배송기사가 2회 배송 시도 후 근처 한진택배 보관소에 7일간 보관됩니다. 보관소 위치는 한진 앱이나 문자로 안내되고, 직접 수령하거나 재배송 신청 가능합니다. 7일 내 미수령 시 반송 처리됩니다."},{"role":"customer","text":"재배송 신청 어디서 해요?"},{"role":"agent","text":"한진택배 앱이나 hanjin.kr에서 운송장번호로 재배송 신청 가능합니다."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":"track_order","tags":["부재중","재배송","보관소"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-05-115","timestamp":"2024-05-31T16:30:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"배송 추적이 안 돼요 오류남"},{"role":"agent","text":"불편드려 죄송합니다. 주문번호와 사용 중인 기기 정보 알려주시면 확인해드릴게요."},{"role":"customer","text":"20240530-9812, 아이폰이에요"},{"role":"agent","text":"확인했습니다. 운송장번호는 789012345입니다. 앱 오류는 캐시 삭제 후 재시작해보시고, 그래도 안 되면 한진 사이트에서 직접 조회 가능합니다. 현재 '배송 중'으로 오늘 오후 도착 예정입니다."}],"resolution":"resolved","primary_intent":"track_order","secondary_intent":null,"tags":["앱오류","배송추적","VIP"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2024-06.jsonl b/src/main/resources/data/layer3_chatlogs/2024-06.jsonl new file mode 100644 index 0000000..72b5b4a --- /dev/null +++ b/src/main/resources/data/layer3_chatlogs/2024-06.jsonl @@ -0,0 +1,5 @@ +{"conversation_id":"CHAT-2024-06-001","timestamp":"2024-06-03T14:10:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"무료배송 기준이 얼마부터예요?"},{"role":"agent","text":"스탠다드 회원이시면 2만원 이상 주문 시 일반 배송(Economy) 무료 적용됩니다!"},{"role":"customer","text":"예전에 3만원이라고 들은 것 같은데요?"},{"role":"agent","text":"2024년 1월부터 2만원으로 기준이 변경되었습니다! 예전에는 3만원이었는데 지금은 2만원이에요. 구독 회원이시면 금액 상관없이 배송비 무료입니다."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["무료배송","기준변경","버전충돌"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-06-002","timestamp":"2024-06-05T10:25:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"신선 식품 주문하려는데 오늘 주문하면 금요일에 올 수 있나요?"},{"role":"agent","text":"신선/냉장 상품은 CJ로지스틱스 프레시로 발송되는데요, 냉장 배송은 주말 운송 품질 문제로 월요일~목요일만 발송 가능합니다. 오늘이 수요일이니 오늘 오전 11시 이전 주문 건은 오늘 발송되어 내일 목요일 수령 가능하고요, 오늘 11시 이후나 내일 목요일 이후 주문은 다음 주 월요일 발송입니다."},{"role":"customer","text":"아 그럼 오늘 11시 이후에 주문하면 다음주 월요일 발송이군요"},{"role":"agent","text":"네 맞습니다. 냉장 배송료는 주문 금액과 상관없이 4,000원 별도 청구됩니다. 일반 무료 배송 혜택과는 별개예요."},{"role":"customer","text":"알겠어요 그냥 다음주에 주문할게요"}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["냉장배송","배송일정","특수배송"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-06-003","timestamp":"2024-06-08T16:00:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"마켓플레이스 상품도 14일 반품 되나요?"},{"role":"agent","text":"아닙니다 고객님. 마켓플레이스 상품은 초록 코퍼레이션 기본 정책이 아닌 각 판매자의 반품 정책을 따릅니다. 판매자마다 3일~30일로 다양하게 설정되어 있어요."},{"role":"customer","text":"그럼 판매자가 7일이라고 하면 7일이 맞는 건가요?"},{"role":"agent","text":"맞습니다. 상품 페이지에 판매자 반품 정책이 명시되어 있습니다. 다만 '상품 미수령'이나 '상품이 설명과 현저히 다른 경우'는 판매자 정책에 관계없이 초록 바이어 보호 정책이 적용됩니다."},{"role":"customer","text":"VIP면 예외 없나요?"},{"role":"agent","text":"마켓플레이스 상품의 경우 VIP 예외도 판매자 정책을 우선합니다. 단, 결함이나 오배송 건은 VIP 우선 처리해드릴 수 있어요."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["마켓플레이스","반품정책","VIP"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-06-004","timestamp":"2024-06-10T09:45:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"주문하고 결제도 했는데 결제 실패라고 뜨는데요?"},{"role":"agent","text":"결제 실패 시 주문이 접수되지 않고 청구도 되지 않습니다. 카드 잔액 부족, 한도 초과, 카드 만료 등이 원인일 수 있어요. 카드 정보 확인 후 다시 시도해보시거나 다른 결제 수단 이용해 보세요."},{"role":"customer","text":"그럼 돈이 나가지 않은 건 맞죠?"},{"role":"agent","text":"네 맞습니다. 결제 실패 시 금액 청구 없습니다. 혹시 카드 명세서에 '승인 취소'나 '임시 승인' 표시가 보이신다면 3-5영업일 내 자동 소멸됩니다."},{"role":"customer","text":"다른 카드로 다시 결제해볼게요"}],"resolution":"resolved","primary_intent":"payment_issue","secondary_intent":null,"tags":["결제실패","결제문의"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-06-005","timestamp":"2024-06-12T13:30:00+09:00","channel":"kakaotalk","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"구독하면 일반 주문도 배송비 무료인가요?"},{"role":"agent","text":"네! 활성 구독 회원이시면 구독 외 일반 주문에도 배송비 무료 혜택이 적용됩니다. 금액 제한 없이요."},{"role":"customer","text":"와 그럼 스탠다드보다 구독이 훨씬 낫겠네요"},{"role":"agent","text":"맞아요! 구독 시 일반 배송 무료 + 일반 구매 10% 할인 + 구독 배송 포인트 2배 + VIP 수준의 신상품 얼리 엑세스도 혜택이에요."},{"role":"customer","text":"좋다 구독 신청해야겠어요"}],"resolution":"resolved","primary_intent":"subscription","secondary_intent":"delivery_options","tags":["구독혜택","배송비","주제전환"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2024-07.jsonl b/src/main/resources/data/layer3_chatlogs/2024-07.jsonl new file mode 100644 index 0000000..02bdfac --- /dev/null +++ b/src/main/resources/data/layer3_chatlogs/2024-07.jsonl @@ -0,0 +1,15 @@ +{"conversation_id":"CHAT-2024-07-001","timestamp":"2024-07-01T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"배송 왔는데 문 잠겨있어서 못 받았어요"},{"role":"agent","text":"한진택배 앱이나 문자로 보관소 위치 안내 받으셨나요?"},{"role":"customer","text":"문자 왔는데 보관소가 어딘지 모르겠어요"},{"role":"agent","text":"문자에 있는 운송장번호로 hanjin.kr 에서 보관소 위치 확인 가능합니다. 7일 이내 수령하셔야 해요."}],"resolution":"resolved","primary_intent":"track_order","secondary_intent":null,"tags":["부재중","보관소위치"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-07-002","timestamp":"2024-07-03T14:15:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"배송 중이라고만 뜨고 이틀째 업데이트가 없어요"},{"role":"agent","text":"주문번호 알려주시면 확인해드릴게요."},{"role":"customer","text":"20240701-4421"},{"role":"agent","text":"확인했습니다. 허브 통관 중인 것 같습니다. 물량이 많은 시기에 허브에서 지연이 생길 수 있어요. 오늘 오후까지 움직임이 없으면 한진 고객센터(1588-0011) 문의 권장드립니다."}],"resolution":"partially_resolved","primary_intent":"track_order","secondary_intent":null,"tags":["배송지연","허브","이틀째"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-07-003","timestamp":"2024-07-05T09:30:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"우선배송이랑 일반배송 차이가 뭐예요?"},{"role":"agent","text":"일반 배송은 2,500원으로 영업일 2-4일 소요됩니다. 우선 배송은 5,000원이고 다음 영업일 정오까지 도착 보장입니다. 2시간 단위 시간대도 지정 가능하고요. 플러스 등급이시면 일반 배송은 무료이고 우선 배송만 요금이 부과됩니다."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["배송비교","일반우선","플러스"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-07-004","timestamp":"2024-07-08T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"주말에 배송 되나요?"},{"role":"agent","text":"한진택배는 토요일 배송이 가능합니다. 일요일과 공휴일은 배송 없습니다. 당일 배송은 주말 불가입니다."},{"role":"customer","text":"일요일 배송도 해달라고 할 수 없나요?"},{"role":"agent","text":"죄송하게도 일요일 배송은 택배사 정책상 지원하지 않습니다."}],"resolution":"resolved","primary_intent":"delivery_period","secondary_intent":null,"tags":["주말배송","일요일","택배사정책"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-07-005","timestamp":"2024-07-10T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"대형 가전도 배송 해주나요?"},{"role":"agent","text":"네! 20kg 이상이나 '대형 상품'으로 분류된 상품은 롯데글로벌로지스 2인 배송팀이 방문합니다. 지정 장소 배치도 해드려요. 다만 계단 있거나 엘리베이터 제한 건물이면 층당 15,000원 추가 요금이 발생할 수 있습니다."},{"role":"customer","text":"아파트인데 엘리베이터 있어요"},{"role":"agent","text":"그러면 추가 요금 없이 원하시는 층에 배치해드립니다."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["대형가전","2인배송","계단요금"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-07-006","timestamp":"2024-07-12T09:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"울릉도도 배송 돼요?"},{"role":"agent","text":"울릉도는 배송 불가 지역입니다."},{"role":"customer","text":"진짜요? 다른 쇼핑몰은 된다던데"},{"role":"agent","text":"잠깐만요, 확인해보겠습니다. 죄송합니다, 울릉도 포함 주요 도서 지역은 배송 가능합니다. 다만 1-2일 추가 소요됩니다. 잘못 안내드렸습니다."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["울릉도","도서지역","오답수정"],"agent_accuracy":"partially_correct","accuracy_note":"울릉도 배송 가능한데 agent_jung이 불가라고 오안내 후 수정."} +{"conversation_id":"CHAT-2024-07-007","timestamp":"2024-07-15T14:30:00+09:00","channel":"live_chat","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"배송 조회하는데 '준비 중'에서 안 바뀌어요 이틀째"},{"role":"agent","text":"주문번호 알려주시면 확인해드릴게요."},{"role":"customer","text":"20240713-5501"},{"role":"agent","text":"확인했습니다. 재고 확보 지연으로 발송이 늦어지고 있는 상황입니다. 오늘 오후 발송 예정이고, 불편드려 대단히 죄송합니다. 지연 사과 쿠폰 2,000원 발급해드리겠습니다."},{"role":"customer","text":"감사해요"}],"resolution":"resolved","primary_intent":"track_order","secondary_intent":null,"tags":["발송지연","재고부족","사과쿠폰","VIP"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-07-008","timestamp":"2024-07-17T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"오늘 오후 1시 10분에 주문했어요 오늘 발송 되나요?"},{"role":"agent","text":"아쉽게도 발송 마감이 오후 1시라 10분 차이로 내일 오전 발송입니다. 우선 배송 선택하셨다면 내일 오전 발송, 모레 정오까지 도착 보장입니다."},{"role":"customer","text":"ㅠㅠ 1시 딱 맞춰 주문할 걸"},{"role":"agent","text":"아쉽지만 내일 오전 일찍 발송될 거예요!"}],"resolution":"resolved","primary_intent":"delivery_period","secondary_intent":null,"tags":["발송마감","1시","비격식"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-07-009","timestamp":"2024-07-19T15:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_park","turns":[{"role":"customer","text":"구독 상품이랑 일반 상품 같이 주문했는데 따로 와요?"},{"role":"agent","text":"구독 배송과 일반 주문은 별도로 발송됩니다. 같은 날 배송될 수도 있고 다를 수도 있어요. 합배송은 현재 지원하지 않습니다."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":"subscription","tags":["구독배송","합배송","별도발송"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-07-010","timestamp":"2024-07-22T11:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"배송 분리해서 올 수 있나요? 받는 날 다르게"},{"role":"agent","text":"같은 주문 건의 분리 배송은 기본적으로 지원하지 않습니다. 다만 다른 날 받으시려면 주문을 두 번에 나눠서 각각 예약 배송을 설정하시면 됩니다."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["분리배송","예약배송","날짜분리"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-07-011","timestamp":"2024-07-24T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"배송 기사님 연락처 알 수 있나요?"},{"role":"agent","text":"배송 기사 직접 연락처는 개인정보 보호상 안내드리기 어렵습니다. 대신 한진택배 앱에서 '배달 당일' 기사님과 메시지 주고받기 기능이 있어요. 운송장번호로 로그인하시면 됩니다."}],"resolution":"resolved","primary_intent":"track_order","secondary_intent":null,"tags":["배송기사","연락처","개인정보"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-07-012","timestamp":"2024-07-26T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"배송비 청구가 잘못된 것 같아요 2만원 이상 샀는데"},{"role":"agent","text":"주문번호 알려주시면 확인해드릴게요."},{"role":"customer","text":"20240726-1100"},{"role":"agent","text":"확인했습니다. 주문 금액이 18,500원으로 2만원 미만이라 배송비 2,500원이 정상 청구됐습니다."},{"role":"customer","text":"아 할인 적용하니까 줄었군요"},{"role":"agent","text":"네 맞습니다. 배송비 기준은 쿠폰/포인트 적용 후 최종 결제 금액이 아닌 상품 정가 기준입니다. 이 점 참고해 주세요."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["배송비","할인후금액","기준"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-07-013","timestamp":"2024-07-29T10:30:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"실시간 GPS 추적이 된다고 하던데요?"},{"role":"agent","text":"네, 우선 배송 이용 시 실시간 GPS 추적이 가능합니다. 일반 배송은 GPS 추적이 지원되지 않고 단계별 상태 업데이트만 제공됩니다. VIP이시면 우선 배송이 무료이니 항상 GPS 추적 이용 가능합니다."}],"resolution":"resolved","primary_intent":"track_order","secondary_intent":null,"tags":["GPS추적","우선배송","VIP"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-07-014","timestamp":"2024-07-30T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"오피스텔로 배송 될까요?"},{"role":"agent","text":"오피스텔 포함 유효한 한국 주소는 모두 배송 가능합니다. 건물명, 호수 정확히 입력해주시면 됩니다. 다만 경비실이나 무인 택배함에 맡길 수도 있으니 배송 메모에 특이사항 적어두시면 좋습니다."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["오피스텔","배송주소","배송메모"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-07-015","timestamp":"2024-07-31T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"주문하고 얼마 뒤에 발송 알림 와요?"},{"role":"agent","text":"보통 당일이나 다음 날 발송됩니다."},{"role":"customer","text":"알림은 어떻게 와요?"},{"role":"agent","text":"카카오 알림톡으로 발송 완료와 운송장번호 안내됩니다. 카카오 알림 수신 설정 되어 있어야 받을 수 있어요."}],"resolution":"resolved","primary_intent":"track_order","secondary_intent":null,"tags":["발송알림","카카오알림톡"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2024-08.jsonl b/src/main/resources/data/layer3_chatlogs/2024-08.jsonl new file mode 100644 index 0000000..4cce878 --- /dev/null +++ b/src/main/resources/data/layer3_chatlogs/2024-08.jsonl @@ -0,0 +1,30 @@ +{"conversation_id":"CHAT-2024-08-001","timestamp":"2024-08-01T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"배송지를 바꾸고 싶어요"},{"role":"agent","text":"주문번호 알려주시면 확인해드릴게요."},{"role":"customer","text":"20240801-2201"},{"role":"agent","text":"확인했습니다. 현재 '준비중' 상태라 배송지 변경 가능합니다. 앱 나의 주문 > 해당 주문 선택 > 배송지 수정에서 변경하시거나 변경하실 주소 알려주시면 제가 처리해드릴게요."},{"role":"customer","text":"직접 바꿀게요 감사합니다"}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["배송지변경","준비중","즉시가능"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-002","timestamp":"2024-08-02T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"주문 배송지 바꿀 수 있나요?"},{"role":"agent","text":"주문번호 알려주시면 확인해드릴게요."},{"role":"customer","text":"20240801-3310"},{"role":"agent","text":"확인했습니다. 안타깝게도 이미 발송 완료 상태라 배송지 변경이 불가합니다. 발송 후에는 시스템상 변경이 어렵습니다."},{"role":"customer","text":"택배사에 직접 연락하면 어떻게 안 되나요?"},{"role":"agent","text":"한진택배 고객센터(1588-0011)에 운송장번호로 문의하시면 가능한 경우도 있습니다. 다만 배송 진행 중이면 어려울 수 있어요. 운송장번호 알려드릴까요?"},{"role":"customer","text":"네 알려주세요"},{"role":"agent","text":"운송장번호는 123456789입니다. 빠르게 연락해보세요!"}],"resolution":"partially_resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["배송지변경","발송완료","택배사직접"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-003","timestamp":"2024-08-03T09:15:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"배송지 저장을 여러 개 해두고 싶은데 어떻게 해요?"},{"role":"agent","text":"앱 마이페이지 > 배송지 관리에서 최대 10개까지 저장 가능합니다. 추가 버튼 눌러 주소, 수령인, 연락처 입력하시면 됩니다. 자주 쓰는 주소는 '기본 배송지'로 설정해두시면 편해요."}],"resolution":"resolved","primary_intent":"set_up_shipping_address","secondary_intent":null,"tags":["배송지저장","여러개","기본배송지"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-004","timestamp":"2024-08-05T15:00:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_choi","turns":[{"role":"customer","text":"기본 배송지 변경은 어디서 해요?"},{"role":"agent","text":"앱 마이페이지 > 배송지 관리에서 원하시는 주소 옆 '기본 설정' 버튼을 누르시면 됩니다. 주문 시 자동으로 해당 주소가 선택됩니다."},{"role":"customer","text":"주문할 때마다 바꾸는 것도 되죠?"},{"role":"agent","text":"네, 주문 결제 단계에서 저장된 배송지 중 선택하거나 새 주소 직접 입력도 가능합니다. 매 주문마다 유연하게 선택하실 수 있어요."}],"resolution":"resolved","primary_intent":"set_up_shipping_address","secondary_intent":null,"tags":["기본배송지","변경방법"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-005","timestamp":"2024-08-06T11:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"발송됐는데 배송지 바꿀 수 있어요?"},{"role":"agent","text":"잠깐만요, 주문번호 주시면 확인해드리겠습니다."},{"role":"customer","text":"20240805-4401"},{"role":"agent","text":"발송 완료 상태이긴 한데 배송지 변경 요청 넣어드릴게요. 가능할 수도 있어요."},{"role":"customer","text":"그럼 바꿔주세요 / 서울시 마포구 합정동 123-45로 부탁해요"},{"role":"agent","text":"죄송합니다, 다시 확인해보니 발송 후에는 시스템상 배송지 변경이 불가합니다. 제가 잘못 안내드렸어요. 한진 고객센터(1588-0011)에 직접 운송장번호로 문의해보시는 방법밖에 없습니다."}],"resolution":"partially_resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["배송지변경","발송완료","오답수정","agent_jung"],"agent_accuracy":"partially_correct","accuracy_note":"발송 후 배송지 변경 불가인데 agent_jung이 가능할 수도 있다고 오안내 후 수정."} +{"conversation_id":"CHAT-2024-08-006","timestamp":"2024-08-07T10:30:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"이사를 해서 배송지 업데이트 해야 해요"},{"role":"agent","text":"앱 마이페이지 > 배송지 관리에서 기존 주소 수정하시거나 새 주소 추가 후 기본 배송지로 설정하시면 됩니다. 이미 주문된 건이 있다면 별도로 수정 필요하고요."},{"role":"customer","text":"주문된 것도 있는데요"},{"role":"agent","text":"주문번호 알려주시면 해당 건 배송지 변경 가능 여부 확인해드릴게요. 아직 발송 전이면 변경 가능합니다."},{"role":"customer","text":"20240807-1001"},{"role":"agent","text":"확인했습니다. 준비중 상태라 변경 가능합니다. 새 주소 알려주시면 제가 업데이트해드릴게요."},{"role":"customer","text":"서울시 용산구 한강대로 400 / 감사합니다"},{"role":"agent","text":"배송지 업데이트 완료했습니다. 새 주소로 배송될 예정이에요!"}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":"set_up_shipping_address","tags":["이사","배송지업데이트","VIP"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-007","timestamp":"2024-08-08T14:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"주소 잘못 입력했어요 ㅠㅠ 어떡하죠"},{"role":"agent","text":"아이고! 주문번호 알려주시면 바로 확인해드릴게요."},{"role":"customer","text":"20240808-5521"},{"role":"agent","text":"아직 준비중이에요. 지금 바로 변경 가능합니다! 앱 나의 주문에서 직접 수정하시거나 올바른 주소 알려주시면 제가 처리해드릴게요."},{"role":"customer","text":"직접 바꿀게요 빨리요 ㅠ"},{"role":"agent","text":"네! 빨리 바꾸세요. 잘 받으실 수 있을 거예요 😊"}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["주소오류","준비중","비격식"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-008","timestamp":"2024-08-09T09:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"배송지 몇 개까지 저장돼요?"},{"role":"agent","text":"최대 10개까지 저장 가능합니다."},{"role":"customer","text":"10개 다 채웠는데 추가하려면 어떻게 해요?"},{"role":"agent","text":"기존 배송지 중 하나를 삭제하면 새 배송지 추가 가능합니다. 마이페이지 > 배송지 관리에서 삭제 후 추가하시면 됩니다."}],"resolution":"resolved","primary_intent":"set_up_shipping_address","secondary_intent":null,"tags":["배송지한도","10개","삭제후추가"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-009","timestamp":"2024-08-10T15:30:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"직장 주소랑 집 주소 둘 다 자주 써요 어떻게 설정하면 좋을까요"},{"role":"agent","text":"배송지 관리에서 두 주소 모두 저장하시고, 더 자주 쓰시는 쪽을 기본 배송지로 설정하시면 됩니다. 주문할 때마다 결제 단계에서 다른 저장 주소로 변경도 쉽게 가능하니 편하게 쓰실 수 있어요."},{"role":"customer","text":"주문마다 선택할 수 있는 거죠?"},{"role":"agent","text":"네 맞습니다. 매 주문 시 저장된 주소 중 선택하시거나 새 주소 입력 가능합니다."}],"resolution":"resolved","primary_intent":"set_up_shipping_address","secondary_intent":null,"tags":["복수배송지","직장집","주문시선택"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-010","timestamp":"2024-08-12T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"택배가 엉뚱한 데 가고 있어요 배송지가 틀려요"},{"role":"agent","text":"걱정 마세요! 주문번호 알려주시면 바로 확인해드릴게요."},{"role":"customer","text":"20240811-7702"},{"role":"agent","text":"확인했습니다. 어제 발송 완료됐고 현재 배송 중입니다. 발송 후에는 시스템 변경이 어렵지만 한진택배 고객센터(1588-0011)에 운송장번호 234567890으로 즉시 문의해보세요. 배송 중 변경은 택배사에서만 처리 가능합니다."},{"role":"customer","text":"왜 확인을 안 한 거지 진짜"},{"role":"agent","text":"정말 불편하고 걱정되시겠어요. 빨리 1588-0011에 연락하시면 기사님이 아직 배달 전이라면 변경 가능할 수 있습니다."}],"resolution":"partially_resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["배송지오류","발송후","고객불만","감정대응"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-011","timestamp":"2024-08-13T16:00:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"배송지 변경하면 배송 일정도 바뀌나요?"},{"role":"agent","text":"같은 권역 내 변경이라면 배송 일정에 영향 없습니다. 다만 제주도나 도서지역으로 변경하시면 1-2일 추가 소요될 수 있어요. 어디로 변경 예정이신가요?"},{"role":"customer","text":"서울에서 서울로요"},{"role":"agent","text":"그러면 배송 일정 그대로입니다. 안심하고 변경하세요."}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["배송지변경","일정영향","서울내"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-012","timestamp":"2024-08-14T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"배송 메모 추가할 수 있나요?"},{"role":"agent","text":"주문 시 배송 메모 입력 가능합니다. 주문 완료 후에도 발송 전이라면 앱 나의 주문 > 해당 주문에서 수정 가능합니다. '문 앞에 놓아주세요', '경비실 맡겨주세요' 등 원하시는 내용 입력하시면 기사님께 전달됩니다."},{"role":"customer","text":"발송 후엔 못 바꾸죠?"},{"role":"agent","text":"발송 후에는 수정이 어렵습니다. 발송 전에 미리 입력해두세요."}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["배송메모","발송전","수정가능"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-013","timestamp":"2024-08-15T09:30:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"VIP면 발송 후에도 배송지 변경 가능한가요?"},{"role":"agent","text":"안타깝게도 발송 후 배송지 변경은 등급과 관계없이 시스템상 불가합니다. 다만 VIP 고객님께는 한진택배와 우선 협조 요청 드릴 수 있어요. 운송장번호 알려드리면서 직접 연락하시는 방법이 가장 빠릅니다."},{"role":"customer","text":"알겠어요 운송장번호 알려주세요"},{"role":"agent","text":"주문번호 주시면 바로 확인해드리겠습니다."}],"resolution":"partially_resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["발송후","VIP","배송지변경불가","등급무관"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-014","timestamp":"2024-08-16T14:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"배송지 관리에서 삭제가 안 돼요"},{"role":"agent","text":"기본 배송지로 설정된 주소는 삭제가 불가합니다."},{"role":"customer","text":"기본 배송지가 아닌데도요?"},{"role":"agent","text":"확인해보겠습니다. 다른 이유가 있을 수 있어요. 혹시 어떤 오류 메시지가 뜨나요?"},{"role":"customer","text":"'삭제할 수 없습니다' 이라고만 뜨네요"},{"role":"agent","text":"앱 버전 문제일 수 있습니다. 앱을 최신 버전으로 업데이트 후 다시 시도해보시겠어요? 그래도 안 되면 고객센터로 문의 주세요."}],"resolution":"partially_resolved","primary_intent":"set_up_shipping_address","secondary_intent":null,"tags":["배송지삭제오류","앱버전","기본배송지"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-015","timestamp":"2024-08-19T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"배송지 이름(닉네임) 설정 가능한가요? 예를 들어 '회사', '본가' 이런 식으로"},{"role":"agent","text":"네! 배송지 저장 시 별칭 입력 가능합니다. '회사', '본가', '친정' 등 원하시는 이름으로 설정하시면 주문 시 구분이 쉬워요."},{"role":"customer","text":"기존 저장된 것도 수정 가능하죠?"},{"role":"agent","text":"네, 마이페이지 > 배송지 관리에서 수정 버튼으로 별칭 포함 모든 정보 수정 가능합니다."}],"resolution":"resolved","primary_intent":"set_up_shipping_address","secondary_intent":null,"tags":["배송지별칭","닉네임","회사본가"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-016","timestamp":"2024-08-20T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"배송지 변경 요청했는데 처리가 됐는지 확인할 수 있나요?"},{"role":"agent","text":"앱 나의 주문에서 해당 주문 눌러보시면 현재 배송지 정보 확인 가능합니다. 변경됐다면 새 주소로 표시될 거예요."},{"role":"customer","text":"확인됐어요 잘 바뀌었네요 감사합니다"}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["변경확인","주문조회"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-017","timestamp":"2024-08-21T14:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"배송지를 영문으로 입력해도 되나요?"},{"role":"agent","text":"배송지는 한국 주소이므로 한글 입력을 권장드립니다. 영문도 입력은 가능하지만 배송기사님이 인식하기 어려울 수 있어요. 외국인이시거나 특별한 이유가 있으시면 한국 주소 도로명 주소 형식으로 입력해주시는 게 가장 정확합니다."}],"resolution":"resolved","primary_intent":"set_up_shipping_address","secondary_intent":null,"tags":["영문주소","한글권장","도로명주소"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-018","timestamp":"2024-08-22T09:45:00+09:00","channel":"kakaotalk","customer_tier":"plus","agent_id":"agent_choi","turns":[{"role":"customer","text":"주문 전에 배송지 설정 안 해도 주문할 때 할 수 있죠?"},{"role":"agent","text":"네, 주문 결제 단계에서 새 주소 직접 입력 가능합니다. 미리 저장 안 해도 주문마다 입력 가능해요. 다만 자주 쓰는 주소는 미리 저장해두시면 더 편리합니다."}],"resolution":"resolved","primary_intent":"set_up_shipping_address","secondary_intent":null,"tags":["주문시입력","사전설정불필요"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-019","timestamp":"2024-08-23T16:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"다른 사람 주소로 배송 가능한가요? 선물 보내려고요"},{"role":"agent","text":"네, 받는 사람 이름, 주소, 연락처를 다르게 입력하시면 됩니다. 선물 포장 옵션도 추가 가능해요 (상품당 1,500원). 배송지 관리에 미리 저장해두시면 편리합니다."},{"role":"customer","text":"선물 메시지도 넣을 수 있나요?"},{"role":"agent","text":"선물 포장 선택 시 메시지 카드 옵션이 있습니다. 원하시는 메시지 입력해두시면 카드와 함께 포장되어 배송됩니다."}],"resolution":"resolved","primary_intent":"set_up_shipping_address","secondary_intent":null,"tags":["선물배송","타인주소","선물포장","메시지"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-020","timestamp":"2024-08-24T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"준비중인데 배송지 변경 어떻게 해요"},{"role":"agent","text":"앱 나의 주문 > 해당 주문 > 주소 변경 버튼 누르시면 됩니다."},{"role":"customer","text":"그 버튼이 없어요"},{"role":"agent","text":"죄송합니다, 앱 버전에 따라 메뉴 위치가 다를 수 있어요. '주문 상세' 페이지에서 스크롤 내리다 보면 '배송 정보 변경' 섹션이 있을 거예요. 혹시 앱 버전 확인해보시겠어요?"},{"role":"customer","text":"최신 버전인데도 없네요"},{"role":"agent","text":"그러면 제가 직접 변경해드릴게요. 새 배송지 알려주시겠어요?"}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["앱버튼없음","직접변경","준비중"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-021","timestamp":"2024-08-26T10:00:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_lee","turns":[{"role":"customer","text":"배송지 일괄 변경 가능한가요? 주문이 3개인데"},{"role":"agent","text":"각 주문별로 개별 변경이 필요합니다. 일괄 변경 기능은 아직 지원하지 않습니다. 주문번호 3개 알려주시면 제가 한 번에 처리해드릴 수 있습니다."},{"role":"customer","text":"20240825-1001, 20240825-1002, 20240825-1003 세 개요"},{"role":"agent","text":"확인했습니다. 세 건 모두 준비중이에요. 변경하실 주소 알려주시면 한 번에 처리해드릴게요."},{"role":"customer","text":"경기도 성남시 분당구 판교로 123"},{"role":"agent","text":"세 주문 모두 배송지 업데이트 완료했습니다. VIP 고객님, 항상 이용해주셔서 감사합니다!"}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["다중주문","일괄변경","VIP","대행처리"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-022","timestamp":"2024-08-27T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"배송지 변경하면 취소하고 재주문 해야 하나요?"},{"role":"agent","text":"아니요! 취소 없이 직접 변경 가능합니다. 준비중 상태라면 앱에서 바로 배송지만 수정하시면 됩니다."},{"role":"customer","text":"안심이네요 감사합니다"}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["재주문불필요","직접변경"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-023","timestamp":"2024-08-28T09:15:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"배송지 변경 신청했는데 완료 문자가 안 와요"},{"role":"agent","text":"배송지 변경 시 별도 문자 안내는 발송되지 않습니다. 앱 나의 주문에서 변경된 배송지 확인하시면 됩니다. 변경이 정상 반영됐는지 확인해보시겠어요?"},{"role":"customer","text":"앱에서 보니까 잘 바뀌었어요"},{"role":"agent","text":"그러면 정상 처리된 거예요. 문자 없이 앱에서 확인하시면 됩니다."}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["변경알림없음","앱확인"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-024","timestamp":"2024-08-29T11:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"배송지에 상세주소를 안 썼어요"},{"role":"agent","text":"주문번호 알려주시면 확인해드릴게요."},{"role":"customer","text":"20240829-2201"},{"role":"agent","text":"준비중 상태입니다. 지금 바로 수정 가능해요. 상세주소 알려주시면 제가 추가해드릴게요."},{"role":"customer","text":"101동 1504호예요"},{"role":"agent","text":"배송지 상세주소 '101동 1504호' 추가 완료했습니다. 원활하게 배송 받으실 거예요!"}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["상세주소누락","수정완료"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-025","timestamp":"2024-08-30T14:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"해외 주소로 배송 가능한가요?"},{"role":"agent","text":"죄송하게도 현재 국내 배송만 지원하고 있습니다. 해외 배송은 서비스 준비 중이며 아직 제공되지 않습니다."},{"role":"customer","text":"언제 될지도 모르죠?"},{"role":"agent","text":"정확한 일정은 안내하기 어렵습니다. 서비스 출시 시 앱 알림이나 공지사항으로 안내될 예정입니다."}],"resolution":"resolved","primary_intent":"set_up_shipping_address","secondary_intent":null,"tags":["해외배송불가","국내전용"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-026","timestamp":"2024-08-31T10:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"주소 오타가 있어요 동 이름이 틀렸어요"},{"role":"agent","text":"주문번호와 현재 입력된 주소, 올바른 주소 알려주시면 바로 수정해드리겠습니다."},{"role":"customer","text":"20240831-3301 / 현재 합정동인데 망원동이 맞아요"},{"role":"agent","text":"확인했습니다. 아직 준비중이라 변경 가능합니다. 배송지를 합정동에서 망원동으로 수정해드릴게요. 도로명 주소나 상세주소도 다른 게 있으신가요?"},{"role":"customer","text":"도로명이랑 번지는 같고 동 이름만 달라요"},{"role":"agent","text":"수정 완료했습니다. 정확한 주소로 배송될 예정입니다."}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["주소오타","동이름","수정완료"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-027","timestamp":"2024-08-31T14:30:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"배송지 변경 요청하고 싶은데 고객센터 운영 시간이 언제예요?"},{"role":"agent","text":"고객센터는 평일 오전 9시~오후 6시 운영합니다. 지금 바로 저를 통해 변경 도움드릴 수 있어요!"},{"role":"customer","text":"그럼 바로 부탁드려요 / 주문번호 20240831-0501이고 새 주소는 서울시 강남구 테헤란로 100이에요"},{"role":"agent","text":"확인했습니다. 준비중 상태라 변경 가능합니다. 배송지를 서울시 강남구 테헤란로 100으로 업데이트 완료했습니다. VIP 고객님, 항상 감사드립니다!"}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":"contact_customer_service","tags":["운영시간","즉시대행","VIP"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-028","timestamp":"2024-08-31T16:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"무인 택배함에 맡겨달라고 메모 하려는데 주소에 써야 해요 메모에 써야 해요?"},{"role":"agent","text":"배송 메모에 써주시는 게 맞습니다. 주문 시 또는 발송 전에 '배송 메모' 칸에 '무인 택배함에 넣어주세요' 또는 '1층 무인 택배함'처럼 상세히 적어주시면 기사님이 확인하고 처리해드립니다."}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["무인택배함","배송메모","요청사항"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-029","timestamp":"2024-08-31T16:45:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"배송지 변경을 너무 자주 하면 불이익 있나요?"},{"role":"agent","text":"아니요, 배송지 변경 횟수에 따른 불이익은 없습니다. 단 발송 후에는 변경이 불가하니 주문 후 빠르게 확인하고 필요하면 변경하시는 게 좋습니다."}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["변경횟수제한없음","정책안내"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-08-030","timestamp":"2024-08-31T17:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"배송지 변경하면 배송비가 다시 계산되나요?"},{"role":"agent","text":"같은 배송 구역 내 변경은 배송비 변동이 없습니다. 다만 제주도, 도서산간 등 추가 운임 지역으로 변경하시는 경우 배송비 차액이 청구될 수 있어요."},{"role":"customer","text":"서울에서 경기도로 바꾸는 거예요"},{"role":"agent","text":"서울-경기도 모두 일반 배송 권역이라 배송비 변동 없습니다. 안심하고 변경하세요."}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["배송비변동","지역권역","서울경기"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2024-09.jsonl b/src/main/resources/data/layer3_chatlogs/2024-09.jsonl new file mode 100644 index 0000000..e48f000 --- /dev/null +++ b/src/main/resources/data/layer3_chatlogs/2024-09.jsonl @@ -0,0 +1,5 @@ +{"conversation_id":"CHAT-2024-09-001","timestamp":"2024-09-10T10:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"추석 연휴에도 배송이 되나요?"},{"role":"agent","text":"추석 연휴(9월 16~18일) 기간은 발송이 중단됩니다. 9월 13일 오후 1시 이후 주문은 추석 이후인 9월 19일 발송 처리됩니다. 연휴 전에 받으시려면 9월 13일 오후 1시 이전까지 주문하시는 게 좋습니다."},{"role":"customer","text":"그럼 오늘 9월 10일 주문하면?"},{"role":"agent","text":"오늘 오후 1시 이전 주문은 오늘 발송, 이후는 내일(11일) 발송입니다. 일반 배송 기준 2-4영업일이니 늦어도 9월 13일 이전에 수령 가능합니다."},{"role":"customer","text":"냉장 식품도요?"},{"role":"agent","text":"냉장 식품은 9월 11일(수) 이후 발송이 어렵습니다. 냉장 배송은 월~목만 가능하고, 추석 발송 중단 영향을 받아 9월 11일 오전 11시 이전 주문까지만 연휴 전 수령 가능합니다."}],"resolution":"resolved","primary_intent":"delivery_period","secondary_intent":"delivery_options","tags":["추석","연휴배송","냉장배송","한시적정책"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-09-002","timestamp":"2024-09-11T14:20:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"ㅠㅠ 상품이 잘못 왔어요 다른 거 왔는데"},{"role":"agent","text":"아이고 정말 불편하셨겠어요 ㅠㅠ 주문번호랑 받으신 상품 사진 보내주시면 바로 처리해드릴게요!"},{"role":"customer","text":"20240908-7721이고 사진 올릴게요"},{"role":"agent","text":"사진 확인했습니다. 오배송이 맞네요 정말 죄송합니다. 잘못 온 상품 무료 수거 후 정확한 상품 우선 배송으로 보내드릴게요. 추가로 불편 쿠폰 5,000원도 발급해드리겠습니다."},{"role":"customer","text":"빨리 받을 수 있나요?"},{"role":"agent","text":"내일 수거 예약 잡아드리고 수거 완료 당일 출고 처리해드릴게요. 모레 중에 받으실 수 있을 거예요."}],"resolution":"resolved","primary_intent":"wrong_item_received","secondary_intent":null,"tags":["오배송","비격식","이모티콘"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-09-003","timestamp":"2024-09-16T11:30:00+09:00","channel":"live_chat","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"지난 달에 구매한 냉장고 반품하려고요. 구매한지 18일 됐는데 제품에 하자가 있어요"},{"role":"agent","text":"안녕하세요 고객님. 18일이 지나셨군요. 일반 반품 기간은 14일이지만 제품 하자의 경우 VIP 고객님에 한해 예외 검토가 가능합니다. 하자 내용과 관련 사진을 나의 주문 > 불만 신고로 접수해 주시면 담당팀에서 검토 후 연락드리겠습니다."},{"role":"customer","text":"얼마나 걸려요?"},{"role":"agent","text":"영업일 기준 1-2일 내에 담당자가 연락드립니다. VIP 우선 처리라 빠르게 진행될 거예요. 혹시 대형 가전 제품이라면 방문 수거 일정도 함께 안내드릴 예정입니다."},{"role":"customer","text":"알겠어요 신고 접수할게요"}],"resolution":"escalated","primary_intent":"return_request","secondary_intent":null,"tags":["반품","14일초과","VIP예외","대형가전","에스컬레이션"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-09-004","timestamp":"2024-09-18T09:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"세금계산서 발급 요청할 수 있나요?"},{"role":"agent","text":"네 가능합니다! '나의 주문'에서 해당 주문 선택 후 '세금계산서 요청'을 탭하시면 됩니다. 사업자등록번호 입력하시면 영업일 1일 이내 이메일로 발급됩니다."},{"role":"customer","text":"저번 달 주문 건도 발급 가능한가요?"},{"role":"agent","text":"세금계산서는 구매한 당월 내에만 신청 가능합니다. 전월 주문 건은 세법상 소급 발급이 어렵습니다. 이번 달 주문부터 즉시 신청해 두시는 게 좋습니다."},{"role":"customer","text":"아 그렇군요 알겠어요"}],"resolution":"resolved","primary_intent":"check_invoice","secondary_intent":null,"tags":["세금계산서","당월","기업"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-09-005","timestamp":"2024-09-20T15:45:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_park","turns":[{"role":"customer","text":"주문 취소하고 싶은데 이미 배송 시작됐어요. 환불은 어떻게 되나요?"},{"role":"agent","text":"배송 시작 후에는 취소가 불가능합니다. 수령 후 반품 신청하셔야 합니다."},{"role":"customer","text":"반품 신청 어떻게 해요?"},{"role":"agent","text":"앱에서 나의 주문 > 해당 주문 > 반품 신청 선택하시면 됩니다. 사유 선택하고 사진 업로드 후 수거 날짜 잡으시면 됩니다."},{"role":"customer","text":"단순 변심이라 비용 드나요?"},{"role":"agent","text":"단순 변심 반품은 3,000원 처리비 차감됩니다. 결함이 있으시면 무료예요."},{"role":"customer","text":"알겠어요 받고나서 신청할게요 얼마나 걸려요?"},{"role":"agent","text":"수거 후 검수 1-2일, 카드 환불 3-5영업일, 카카오/네이버페이는 즉시 처리됩니다."}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":"return_request","tags":["취소불가","반품신청","주제전환","다중주제"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2024-10.jsonl b/src/main/resources/data/layer3_chatlogs/2024-10.jsonl new file mode 100644 index 0000000..3b341f4 --- /dev/null +++ b/src/main/resources/data/layer3_chatlogs/2024-10.jsonl @@ -0,0 +1,30 @@ +{"conversation_id":"CHAT-2024-10-001","timestamp":"2024-10-01T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"반품 기간이 얼마나 돼요?"},{"role":"agent","text":"수령일 기준 14일 이내 반품 신청 가능합니다. 단 개봉하지 않은 상품이어야 하며, 단순 변심은 왕복 배송비 3,000원이 부담됩니다. 상품 불량이라면 무료 반품입니다."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["반품기간","14일","단순변심"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-002","timestamp":"2024-10-02T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"반품 가능한 기간이 어떻게 돼요?"},{"role":"agent","text":"수령 후 7일 이내에 반품 신청하셔야 합니다."},{"role":"customer","text":"7일이요? 다른 쇼핑몰은 14일이던데"},{"role":"agent","text":"죄송합니다, 제가 잘못 안내드렸어요. 현재 정책은 수령일 기준 14일 이내입니다. 예전에 7일이었는데 지금은 14일로 변경됐습니다."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["반품기간","오답수정","agent_jung","7일→14일"],"agent_accuracy":"partially_correct","accuracy_note":"현행 반품 기간은 14일인데 agent_jung이 7일로 오안내 후 수정."} +{"conversation_id":"CHAT-2024-10-003","timestamp":"2024-10-03T09:15:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"반품하면 환불은 언제 되나요?"},{"role":"agent","text":"반품 상품 수거 후 검수 완료까지 2-3영업일, 환불 처리는 결제 수단에 따라 다릅니다. 신용카드는 3-5영업일, 카카오페이·네이버페이는 검수 완료 당일, 계좌이체는 최대 7영업일 소요됩니다."},{"role":"customer","text":"총 얼마나 걸리는 거예요?"},{"role":"agent","text":"빠르면 카카오페이 기준 반품 접수 후 3-5일, 신용카드는 1-2주 정도로 생각하시면 됩니다."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["환불기간","결제수단별","카카오페이","신용카드"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-04","timestamp":"2024-10-04T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"개봉한 상품도 반품 가능한가요?"},{"role":"agent","text":"단순 변심의 경우 개봉 상품은 반품이 어렵습니다. 다만 상품 불량이나 오배송의 경우는 개봉 후에도 반품 가능합니다."},{"role":"customer","text":"개봉해서 써보니까 마음에 안 들어요"},{"role":"agent","text":"아쉽게도 사용 흔적이 있는 경우 단순 변심 반품이 불가합니다. 상품 자체 불량이 있으시다면 불량 사진 첨부하여 반품 신청해주시면 됩니다."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["개봉상품","단순변심불가","불량반품"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-05","timestamp":"2024-10-07T11:00:00+09:00","channel":"live_chat","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"VIP는 반품 기간이 더 긴가요?"},{"role":"agent","text":"기본 반품 정책은 14일로 동일합니다. VIP 혜택에 대해 더 확인해드릴게요."},{"role":"customer","text":"일반 고객이랑 같은 거예요?"},{"role":"agent","text":"반품 기간은 14일로 동일하지만 VIP 고객님께는 반품 처리 우선 지원 및 전담 상담사 배정 혜택이 있습니다."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["VIP반품","기간동일","우선지원"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-06","timestamp":"2024-10-08T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"반품 신청은 어떻게 해요?"},{"role":"agent","text":"앱 나의 주문 > 해당 주문 선택 > '반품/교환 신청' 버튼 누르시면 됩니다. 반품 사유 선택 후 사진 첨부(불량의 경우) 하시면 완료예요. 수거 기사님이 지정일에 방문합니다."},{"role":"customer","text":"수거 날짜 제가 선택할 수 있나요?"},{"role":"agent","text":"네, 반품 신청 시 수거 희망일 선택 가능합니다. 영업일 기준 1-3일 내 날짜 중 선택하시면 됩니다."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["반품신청방법","앱","수거일지정"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-07","timestamp":"2024-10-09T10:30:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"반품 배송비가 얼마예요?"},{"role":"agent","text":"단순 변심은 왕복 배송비 3,000원이 환불 금액에서 차감됩니다. 상품 불량이나 오배송의 경우는 무료입니다."},{"role":"customer","text":"불량인지 단순 변심인지 어떻게 판단해요?"},{"role":"agent","text":"검수팀이 수거 상품 확인 후 판단합니다. 불량 의심 시 불량 부위 사진을 첨부해 신청해주시면 유리합니다. 정상 상품을 불량으로 신청해도 검수 후 단순 변심으로 처리되고 배송비가 차감될 수 있어요."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["반품배송비","불량판단","검수"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-08","timestamp":"2024-10-10T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"환불 신청했는데 언제쯤 들어와요?"},{"role":"agent","text":"주문번호 알려주시면 반품 진행 상황 확인해드릴게요."},{"role":"customer","text":"20241007-3301"},{"role":"agent","text":"확인했습니다. 어제 반품 상품 수거 완료됐고 현재 검수 중입니다. 검수는 1-2영업일 소요되고, 완료 후 카카오페이로 환불 처리됩니다. 카카오페이는 당일 환불이라 이번 주 내 받으실 수 있을 거예요."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["환불조회","검수중","카카오페이"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-09","timestamp":"2024-10-11T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"반품 접수했는데 수거를 안 오네요"},{"role":"agent","text":"불편드려 죄송합니다. 주문번호 알려주시면 수거 일정 확인해드릴게요."},{"role":"customer","text":"20241010-5501"},{"role":"agent","text":"확인했습니다. 수거 예정일이 내일로 되어 있네요. 혹시 오늘 수거 예약이었다면 기사님 방문 시간 늦어진 것 같아요. 오늘 오후 6시까지 오지 않으면 다시 문의 주세요. 일정 변경도 도와드릴 수 있습니다."},{"role":"customer","text":"내일이라고요? 오늘인 줄 알았어요"},{"role":"agent","text":"반품 신청 시 선택하신 수거일이 내일로 되어 있어요. 앱에서도 확인 가능합니다."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["수거미방문","수거일확인","반품진행"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-10","timestamp":"2024-10-14T11:00:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"쿠폰으로 할인받은 금액도 환불되나요?"},{"role":"agent","text":"쿠폰 할인 금액은 환불되지 않습니다. 실제 결제하신 금액만 환불됩니다. 단, 사용하신 쿠폰이 유효기간 내라면 반품 처리 시 복구됩니다."},{"role":"customer","text":"쿠폰이 복구된다고요? 그럼 다시 쓸 수 있어요?"},{"role":"agent","text":"네, 쿠폰 원래 만료일 내에서 복구됩니다. 이미 만료됐다면 복구가 어렵습니다."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["쿠폰환불","할인금액","쿠폰복구"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-11","timestamp":"2024-10-15T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"반품 기간 지났는데 반품 가능한가요?"},{"role":"agent","text":"반품 기간은 7일이라 지나셨으면 원칙적으로 반품이 어렵습니다."},{"role":"customer","text":"7일이요? 14일 아닌가요?"},{"role":"agent","text":"죄송합니다, 맞습니다. 현재 14일이에요. 제가 구버전 정책을 안내해버렸어요. 수령일로부터 14일 이내면 가능합니다. 언제 받으셨나요?"},{"role":"customer","text":"12일 전에요"},{"role":"agent","text":"다행히 14일 이내이시네요. 지금 바로 반품 신청 가능합니다."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["반품기간초과","오답수정","agent_jung","7일→14일"],"agent_accuracy":"partially_correct","accuracy_note":"agent_jung이 또 7일로 오안내. 현행 정책은 14일."} +{"conversation_id":"CHAT-2024-10-12","timestamp":"2024-10-16T10:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"교환도 가능한가요? 사이즈가 맞지 않아요"},{"role":"agent","text":"교환 신청은 앱 반품/교환 신청에서 '교환'을 선택하시면 됩니다. 수령 후 14일 이내, 미개봉 또는 착용 흔적이 없어야 합니다. 동일 상품 다른 사이즈로 교환하실 경우 배송비 왕복 3,000원이 추가됩니다."},{"role":"customer","text":"재고가 없으면 어떻게 되나요?"},{"role":"agent","text":"교환 요청하신 사이즈가 품절이면 교환 대신 환불 처리됩니다. 신청 시 확인해드릴게요."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["사이즈교환","교환정책","품절환불"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-13","timestamp":"2024-10-17T15:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"반품하면 포인트는 어떻게 돼요?"},{"role":"agent","text":"반품 시 해당 주문으로 적립된 포인트는 회수됩니다. 주문 시 사용하신 포인트는 복구됩니다. 단, 이미 포인트를 다른 주문에 사용하셨다면 복구된 포인트가 마이너스 처리될 수 있어요."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":"loyalty_points","tags":["반품포인트","적립회수","사용포인트복구"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-14","timestamp":"2024-10-18T11:00:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"반품 상품 수거하러 왔는데 상품을 못 찾겠대요 어떡해요"},{"role":"agent","text":"당황스러우시겠어요. 혹시 상품을 어디 두셨는지 기사님께 안내해드리셨나요? 택배 상자나 원래 포장재로 다시 포장해서 준비해두셔야 합니다."},{"role":"customer","text":"포장 다시 해야 해요?"},{"role":"agent","text":"네, 반품 시 가능하면 원래 포장재로 재포장해주시면 좋습니다. 원포장재가 없다면 박스나 비닐로 안전하게 포장해주세요. 기사님이 수거 후 운송 중 파손되면 환불이 어려울 수 있어요."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["반품수거","포장","VIP"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-15","timestamp":"2024-10-21T10:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"반품 후 환불이 너무 늦어요 2주 됐어요"},{"role":"agent","text":"많이 기다리셨겠어요. 주문번호 알려주시면 바로 확인해드릴게요."},{"role":"customer","text":"20241001-1100"},{"role":"agent","text":"확인했습니다. 검수는 10월 5일에 완료됐는데 환불 처리가 지연되고 있네요. 신용카드로 결제하셨는데 카드사 처리가 늦어진 것 같습니다. 담당팀에 긴급 처리 요청 드리겠습니다. 오늘 내로 처리 완료 예정으로 안내 받으실 거예요. 정말 죄송합니다."}],"resolution":"escalated","primary_intent":"get_refund","secondary_intent":null,"tags":["환불지연","2주","긴급처리","에스컬레이션"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-16","timestamp":"2024-10-22T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"마켓플레이스 상품도 반품 정책이 같아요?"},{"role":"agent","text":"마켓플레이스 판매자 상품은 각 판매자의 반품 정책을 따릅니다. 기본적으로 7-14일이지만 판매자마다 다를 수 있어요. 상품 페이지에서 판매자 반품 정책 확인하시는 걸 권장드립니다."},{"role":"customer","text":"판매자 정책이 14일보다 짧을 수 있어요?"},{"role":"agent","text":"네, 판매자에 따라 더 짧거나 길 수 있습니다. 분쟁이 생기면 저희 고객센터에서 중재해드릴 수 있어요."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["마켓플레이스반품","판매자정책","중재"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-17","timestamp":"2024-10-23T09:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"식품도 반품 가능한가요?"},{"role":"agent","text":"식품류는 수령 후 개봉하지 않은 경우에만 반품 가능하며, 유통기한이 충분히 남아 있어야 합니다. 신선식품, 냉동/냉장 식품은 위생상 반품이 제한될 수 있어요. 불량이나 이물 발견 시에는 사진 첨부하여 신청해주시면 됩니다."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["식품반품","신선식품","개봉전"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-18","timestamp":"2024-10-24T14:30:00+09:00","channel":"kakaotalk","customer_tier":"plus","agent_id":"agent_choi","turns":[{"role":"customer","text":"반품 신청이 자꾸 오류나요"},{"role":"agent","text":"불편드려 죄송합니다. 어떤 오류 메시지가 뜨는지 알려주시겠어요?"},{"role":"customer","text":"'반품 신청 불가' 라고만 뜨고 넘어가질 않아요"},{"role":"agent","text":"주문번호 알려주시면 제가 직접 확인해드릴게요. 반품 기간 초과나 이미 신청된 경우일 수 있어요."},{"role":"customer","text":"20241020-7712"},{"role":"agent","text":"확인했습니다. 이미 반품 신청이 접수된 건이 있어서 중복 신청이 안 되는 거예요. 기존 신청 현황 확인해드릴까요?"}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["반품오류","중복신청","기존건확인"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-19","timestamp":"2024-10-25T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"부분 반품이 가능한가요? 여러 개 시켰는데 하나만 반품하고 싶어요"},{"role":"agent","text":"네, 부분 반품 가능합니다. 앱 반품 신청에서 반품하실 상품만 선택하시면 됩니다. 선택한 상품 금액만 환불되고 나머지는 그대로 유지됩니다."},{"role":"customer","text":"배송비는 어떻게 되나요?"},{"role":"agent","text":"부분 반품도 단순 변심이면 배송비 3,000원 차감됩니다. 나머지 상품 유지 여부에 따라 무료 배송 기준이 다시 계산될 수 있어요. 예를 들어 남은 상품 금액이 2만원 미만이면 원래 무료 배송이었던 건도 배송비가 소급 청구될 수 있습니다."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["부분반품","배송비소급","선택반품"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-20","timestamp":"2024-10-28T09:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"환불은 원래 결제 수단으로 돌아와요?"},{"role":"agent","text":"네, 결제하신 수단으로 환불됩니다. 카드 결제 → 카드 환불, 카카오페이 → 카카오페이, 계좌이체 → 등록 계좌로 입금됩니다. 다른 계좌나 수단으로 변경은 어렵습니다."},{"role":"customer","text":"계좌이체로 했는데 그 계좌 없애버렸어요"},{"role":"agent","text":"그런 경우 고객센터로 문의 주시면 다른 계좌로 환불 처리 도와드릴 수 있습니다. 본인 인증이 필요할 수 있어요."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["환불수단","계좌이체","계좌변경"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-21","timestamp":"2024-10-29T14:00:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_park","turns":[{"role":"customer","text":"반품 사유를 잘못 선택했어요 단순변심으로 했는데 불량이에요"},{"role":"agent","text":"반품 신청 후 사유 변경은 수거 전에만 가능합니다. 아직 수거 전이시면 반품 신청 취소 후 불량으로 재신청하시거나 저한테 말씀해주시면 처리해드릴게요."},{"role":"customer","text":"수거가 내일인데 지금 바꿀 수 있나요?"},{"role":"agent","text":"주문번호 알려주시면 제가 불량 사유로 수정해드릴게요. 이렇게 하시면 배송비 3,000원 차감 없이 환불받으실 수 있어요."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["반품사유변경","단순변심→불량","배송비면제","VIP"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-22","timestamp":"2024-10-30T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"반품하면 적립금도 다시 써요?"},{"role":"agent","text":"반품 시 사용하신 적립금(포인트)은 복구됩니다. 단, 복구된 포인트는 유효기간이 원래 포인트 유효기간으로 적용됩니다. 반품으로 인해 포인트 유효기간이 연장되지는 않아요."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":"loyalty_points","tags":["적립금복구","유효기간","반품포인트"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-23","timestamp":"2024-10-31T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"배송 중인 상품을 반품할 수 있나요?"},{"role":"agent","text":"배송 중에는 반품 신청이 어렵습니다. 수령 후 10일 이내에 반품 신청하시면 됩니다."},{"role":"customer","text":"10일이요? 14일 아닌가요"},{"role":"agent","text":"맞습니다 죄송합니다. 14일입니다. 수령 후 14일 이내 신청하시면 됩니다. 배송 중에는 일단 받으신 후 바로 신청하시면 되겠습니다."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["배송중반품","오답수정","agent_jung","10일→14일"],"agent_accuracy":"partially_correct","accuracy_note":"agent_jung이 10일로 오안내 (구버전 v2 정책). 현행은 14일."} +{"conversation_id":"CHAT-2024-10-24","timestamp":"2024-10-31T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"반품 수거 기사님이 안 오셨어요"},{"role":"agent","text":"주문번호 알려주시면 수거 스케줄 확인해드릴게요."},{"role":"customer","text":"20241030-4401"},{"role":"agent","text":"확인했습니다. 오늘 수거 예정인데 기사님 배송 물량이 많아 늦어지는 것 같아요. 오후 7시까지 기다려보시고 안 오시면 한진 고객센터(1588-0011)에 문의하시거나 저한테 재연락 주시면 다음 날 수거로 재신청해드릴게요."}],"resolution":"partially_resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["수거미방문","재신청","대기요청"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-25","timestamp":"2024-10-31T14:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"반품 완료됐는데 환불 문자가 안 와요"},{"role":"agent","text":"반품 완료 후 환불 시 카카오 알림톡으로 안내됩니다. 알림 수신 설정 확인해보시겠어요? 혹시 주문번호 알려주시면 환불 처리 여부 직접 확인해드릴게요."},{"role":"customer","text":"20241025-2201"},{"role":"agent","text":"확인했습니다. 오늘 오전 환불 처리 완료됐어요. 플러스 등급이시라 무료 배송 건이라 전액 환불됐습니다. 카드사 처리에 2-3일 더 소요될 수 있어요."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["환불알림","처리완료","카드사처리"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-26","timestamp":"2024-10-31T16:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"구독 상품도 반품 되나요?"},{"role":"agent","text":"구독 정기 배송 상품도 수령 후 14일 이내, 미개봉 상태면 반품 가능합니다. 구독 자체를 취소하시려면 구독 관리에서 별도로 처리하셔야 해요."},{"role":"customer","text":"구독 취소랑 반품은 별개인 거죠?"},{"role":"agent","text":"네, 구독 취소는 정기 배송 자체를 멈추는 것이고, 반품은 이미 받은 상품을 돌려보내는 거예요. 둘 다 필요하시면 각각 신청하셔야 합니다."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":"subscription","tags":["구독반품","구독취소별개","14일"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-27","timestamp":"2024-10-31T17:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"반품 신청 취소할 수 있나요? 마음이 바뀌었어요"},{"role":"agent","text":"수거 전이라면 반품 신청 취소 가능합니다. 앱 나의 주문 > 해당 주문 > 반품/교환 내역에서 신청 취소하시면 됩니다. 이미 수거됐다면 취소가 어렵습니다."},{"role":"customer","text":"오늘 수거 예정인데 기사님 오기 전에 빨리 취소해야겠네요"},{"role":"agent","text":"네 맞습니다. 수거 전에 빨리 취소하세요!"}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["반품신청취소","수거전","빠른처리"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-28","timestamp":"2024-10-31T17:30:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"환불금액이 생각보다 적어요"},{"role":"agent","text":"주문번호 알려주시면 환불 내역 확인해드릴게요."},{"role":"customer","text":"20241028-0801"},{"role":"agent","text":"확인했습니다. 원주문 금액 35,000원에서 단순 변심 반품 배송비 3,000원이 차감되어 32,000원 환불 처리됐습니다. 혹시 이 차감 내용 모르고 계셨나요?"},{"role":"customer","text":"아 맞다 배송비 차감되는 거 깜빡했어요"},{"role":"agent","text":"네, 단순 변심은 3,000원 차감이 원칙입니다. 불량 반품이셨다면 전액 환불 가능했을 거예요."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["환불금액확인","배송비차감","단순변심"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-29","timestamp":"2024-10-31T18:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"한 달 됐는데 반품 가능한가요? 사정이 있었어요"},{"role":"agent","text":"안타깝게도 반품은 수령 후 14일 이내에만 가능합니다. 한 달이 지나셨다면 원칙적으로 반품이 어렵습니다."},{"role":"customer","text":"사정이 있어서 못 했는데 예외는 없나요?"},{"role":"agent","text":"일반적으로는 기간 초과 시 반품이 불가합니다. 특별한 사정(천재지변, 입원 등)이 있으시면 증빙자료와 함께 고객센터로 문의 주시면 검토는 해드릴 수 있어요. 다만 승인 보장은 어렵습니다."}],"resolution":"partially_resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["반품기간초과","예외요청","증빙"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-10-30","timestamp":"2024-10-31T19:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"오배송 받았어요 다른 상품이 왔어요"},{"role":"agent","text":"정말 불편드려 죄송합니다. 오배송은 무료로 반품 처리해드리고 올바른 상품을 발송해드립니다. 주문번호와 받으신 상품 사진 알려주시면 바로 처리해드릴게요."},{"role":"customer","text":"20241030-9901이고 제가 주문한 건 노트북 파우치인데 마우스가 왔어요"},{"role":"agent","text":"오배송 확인됐습니다. 수거 기사님 내일 방문 예약해드리겠습니다. 올바른 노트북 파우치는 수거 완료 후 바로 발송됩니다. 정말 죄송합니다."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["오배송","무료반품","교체발송"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2024-11.jsonl b/src/main/resources/data/layer3_chatlogs/2024-11.jsonl new file mode 100644 index 0000000..04aa470 --- /dev/null +++ b/src/main/resources/data/layer3_chatlogs/2024-11.jsonl @@ -0,0 +1,5 @@ +{"conversation_id":"CHAT-2024-11-001","timestamp":"2024-11-04T13:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"에코 그린 패키징 하면 포인트 더 준다고 들었는데 맞나요?"},{"role":"agent","text":"맞습니다! 결제 시 친환경 포장(Green Packaging) 선택하시면 주문당 200포인트 추가 적립됩니다. 배송 완료 7일 후 포인트 지급되고, 비용은 무료에요."},{"role":"customer","text":"친환경 포장이 따로 뭔가 다른 건가요?"},{"role":"agent","text":"친환경 포장은 플라스틱 충전재 없이 재활용 가능한 소재만 사용합니다. 박스 부피가 최대 40% 줄어들어 탄소 배출도 감소해요. 상품 보호 기능은 동일하게 유지됩니다."}],"resolution":"resolved","primary_intent":"eco_green","secondary_intent":null,"tags":["친환경포장","에코포인트","그린패키징"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-11-002","timestamp":"2024-11-06T16:20:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"VIP라는데 배송비 항상 무료인지 확인하고 싶어요"},{"role":"agent","text":"VIP 등급이시면 주문 금액에 상관없이 모든 주문에 우선 배송(Priority Shipping, 익일 정오 도착 보장)이 무료입니다. 별도 최소 주문 금액 조건 없어요."},{"role":"customer","text":"냉장 배송도요?"},{"role":"agent","text":"냉장 배송은 별도 냉장 전용 쿠리어(CJ로지스틱스 프레시)를 사용하여 고정 4,000원 부과됩니다. 이 비용은 등급과 무관하게 모든 회원에게 동일 적용됩니다. VIP 무료 배송 혜택 대상이 아닙니다."},{"role":"customer","text":"아 냉장은 따로구나 알겠어요"}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["VIP배송","냉장배송","조건부답변"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-11-003","timestamp":"2024-11-08T10:10:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"비슷한 질문 한 고객 있었나요? 주문하고 배송지 변경 됐다가 다시 원래대로 하는 거"},{"role":"agent","text":"배송지 변경은 주문 상태가 '배송 준비중'일 때만 가능합니다. 변경 후 다시 원래 주소로도 '배송 준비중' 상태면 재변경 가능하고요. '발송 완료' 이후엔 어렵습니다."},{"role":"customer","text":"지금 준비중인데 변경했다가 다시 할 수 있는 거죠?"},{"role":"agent","text":"네 맞습니다. 앱에서 나의 주문 > 주문 선택 > 주소 수정으로 가시면 됩니다. 발송 전이면 몇 번이든 변경 가능해요."}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["배송지변경","재변경","이력질문"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-11-004","timestamp":"2024-11-12T14:50:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"멤버십 등급이 플러스가 되려면 얼마를 써야 하나요?"},{"role":"agent","text":"연간 15만원 이상 구매하시면 플러스 등급이 됩니다."},{"role":"customer","text":"확실한가요?"},{"role":"agent","text":"잠깐만요, 확인해보겠습니다. 죄송합니다, 제가 잘못 안내드렸어요. 현재 기준으로 플러스는 연 20만원 이상입니다. 2024년부터 기준이 변경되었습니다."},{"role":"customer","text":"그럼 VIP는요?"},{"role":"agent","text":"VIP는 연 80만원 이상입니다."}],"resolution":"resolved","primary_intent":"membership_tiers","secondary_intent":null,"tags":["멤버십등급","상담사실수","구버전혼동"],"agent_accuracy":"partially_correct","accuracy_note":"agent_jung이 구버전(Plus=15만원) 기준으로 초기 오답. 수정 후 정확한 답변(20만원) 제공."} +{"conversation_id":"CHAT-2024-11-005","timestamp":"2024-11-15T11:25:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"주문 결제하고 카드사에서 이상하게 두 번 찍혔는데요?"},{"role":"agent","text":"결제 시 임시 승인이 두 번 표시되는 경우가 있습니다. 이는 카드사 인증 과정에서 발생하는 현상으로 실제 이중 청구가 아닙니다. 3-5영업일 내 자동 소멸됩니다."},{"role":"customer","text":"근데 둘 다 확정된 것처럼 보이는데요"},{"role":"agent","text":"주문번호 알려주시면 결제 내역 직접 확인해드리겠습니다."},{"role":"customer","text":"20241113-3301"},{"role":"agent","text":"확인했습니다. 한 건만 정상 처리되었고 다른 한 건은 취소 처리 중입니다. 아직 카드사 시스템에 반영 전이라 양쪽 다 표시되는 것 같습니다. 1-2영업일 내 하나는 사라질 거예요."},{"role":"customer","text":"알겠어요 지켜볼게요"}],"resolution":"resolved","primary_intent":"payment_issue","secondary_intent":null,"tags":["이중결제","임시승인","결제문의"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2024-12.jsonl b/src/main/resources/data/layer3_chatlogs/2024-12.jsonl new file mode 100644 index 0000000..bcab292 --- /dev/null +++ b/src/main/resources/data/layer3_chatlogs/2024-12.jsonl @@ -0,0 +1,5 @@ +{"conversation_id":"CHAT-2024-12-001","timestamp":"2024-12-02T09:30:00+09:00","channel":"live_chat","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"구독 6개월 됐는데 보너스 포인트 안 들어왔어요"},{"role":"agent","text":"구독 6개월 연속 이용 시 1만 포인트 지급됩니다. 혹시 6개월 중 구독 일시정지 기간이 있으셨나요?"},{"role":"customer","text":"한 달 잠깐 멈췄다 다시 했는데"},{"role":"agent","text":"일시정지(Pause)는 연속 개월 수 카운트에 포함됩니다. 하지만 해지(Cancel) 후 재구독은 연속 카운트가 초기화됩니다. 일시정지만 하셨다면 정지 기간도 포함해서 6개월 계산됩니다. 포인트 지급 여부를 다시 확인해드릴게요."},{"role":"customer","text":"아 정지는 했는데 해지는 안했어요"},{"role":"agent","text":"그러면 연속 카운트 유지됩니다. 구독 시작일 기준으로 정확히 6개월이 된 날로부터 영업일 1-2일 내 포인트 지급됩니다. 정확한 지급 예정일 확인해드릴게요."}],"resolution":"resolved","primary_intent":"subscription","secondary_intent":"loyalty_points","tags":["구독보너스","포인트","일시정지","다중주제"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-12-002","timestamp":"2024-12-05T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"택배가 안 왔는데요 어제 도착 예정이었어요 ;;"},{"role":"agent","text":"불편을 드려 죄송합니다. 주문번호 알려주시면 바로 확인해드릴게요."},{"role":"customer","text":"20241203-5512"},{"role":"agent","text":"확인했습니다. 한진택배에서 어제 배송 시도 후 부재중으로 가까운 보관소에 7일간 보관 중입니다. 한진택배 앱 또는 웹사이트에서 재배송 신청하시거나 직접 수령 가능합니다."},{"role":"customer","text":"재배송 어디서 신청해요?"},{"role":"agent","text":"hanjin.kr 에서 운송장번호(고객님 번호: 987654321) 입력하시면 재배송 예약 가능합니다. 앱에서도 동일하게 가능해요."}],"resolution":"resolved","primary_intent":"track_order","secondary_intent":null,"tags":["배송지연","부재중","재배송"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-12-003","timestamp":"2024-12-10T11:40:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"주문이랑 결제랑 배송 다 한번에 여쭤봐도 될까요?"},{"role":"agent","text":"물론이죠, 말씀해주세요!"},{"role":"customer","text":"일단 어제 주문한 게 언제 오는지, 그리고 이번 달에 쓴 금액이 얼마인지, 마지막으로 플러스 등급 되려면 얼마나 더 써야 하는지요"},{"role":"agent","text":"하나씩 안내드릴게요. 첫째, 어제 주문 건은 주문번호 알려주시면 배송 상태 확인해드릴게요. 둘째, 이번 달 구매 금액은 앱 나의 계정 > 구매 내역에서 확인 가능합니다. 셋째, 플러스 등급은 연 20만원 이상 구매 시 달성이고 매년 1월 1일 기준으로 갱신됩니다. 현재 연간 누적 금액은 앱 나의 계정 > 멤버십에서 확인하실 수 있어요."},{"role":"customer","text":"주문번호는 20241209-8800이에요"},{"role":"agent","text":"확인했습니다. 오늘 오전 발송 완료, 내일 오전 중 도착 예정입니다. 한진 운송장 번호는 111222333입니다."}],"resolution":"resolved","primary_intent":"track_order","secondary_intent":"membership_tiers","tags":["다중주제","배송조회","멤버십","복합문의"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-12-004","timestamp":"2024-12-16T10:20:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"마켓플레이스에서 산 거 환불받고 싶어요 판매자가 연락을 안 받아요"},{"role":"agent","text":"판매자와 직접 연락이 안 되는 경우 '나의 주문 > 분쟁 신청'을 통해 초록 바이어 보호 프로그램을 이용하실 수 있습니다."},{"role":"customer","text":"분쟁 신청하면 얼마나 걸려요?"},{"role":"agent","text":"초록에서 5영업일 내 검토 후 조치합니다. 상품 미수령이나 상품이 설명과 다른 경우 초록이 전액 환불 보장합니다."},{"role":"customer","text":"그냥 제가 맘에 안 드는 건데 판매자 정책이 3일이라 기간 지났어요"},{"role":"agent","text":"판매자 반품 기간이 지난 단순 변심의 경우 바이어 보호 대상이 아닙니다. 판매자와 직접 협의하시거나 소비자보호원을 통한 조정 신청을 고려해 보실 수 있습니다."}],"resolution":"partially_resolved","primary_intent":"get_refund","secondary_intent":"marketplace","tags":["마켓플레이스","분쟁","판매자정책","에스컬레이션제안"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2024-12-005","timestamp":"2024-12-23T14:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"연말에 적립 포인트 만료된다고 알림 왔는데 현금으로 바꿀 수 있나요?"},{"role":"agent","text":"아쉽게도 포인트는 현금 전환이 되지 않습니다. 다음 구매 시 1포인트=1원으로 사용하시거나, 탄소 포인트로 전환해서 나무 심기 기부도 가능합니다."},{"role":"customer","text":"탄소 포인트요? 그게 뭐에요?"},{"role":"agent","text":"탄소 포인트는 구매 금액 1,000원당 1탄소포인트가 적립되는 별도 포인트예요. 적립된 탄소포인트는 인증된 산림 복원 프로젝트에 기부(1포인트=나무 1그루)하거나 100포인트를 충성 포인트 100점으로 전환할 수 있습니다."},{"role":"customer","text":"그냥 쇼핑할 때 쓰는 게 나을 것 같아요"},{"role":"agent","text":"네, 만료 전에 쓰시는 게 가장 좋아요! 최소 1,000포인트부터 사용 가능합니다. 만료 임박 포인트부터 자동으로 먼저 차감됩니다."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":"eco_green","tags":["포인트만료","탄소포인트","복합문의"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2025-01.jsonl b/src/main/resources/data/layer3_chatlogs/2025-01.jsonl new file mode 100644 index 0000000..8211b9e --- /dev/null +++ b/src/main/resources/data/layer3_chatlogs/2025-01.jsonl @@ -0,0 +1,30 @@ +{"conversation_id":"CHAT-2025-01-001","timestamp":"2025-01-02T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"취소하면 수수료 있어요?"},{"role":"agent","text":"준비중 상태에서 취소하시면 수수료 없이 전액 환불됩니다. 발송 후 반품의 경우 단순 변심이면 3,000원이 차감됩니다."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":null,"tags":["취소수수료없음","준비중","발송후차이"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-002","timestamp":"2025-01-03T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"취소하면 수수료 얼마예요?"},{"role":"agent","text":"취소 수수료는 2,000원입니다."},{"role":"customer","text":"2,000원이요? 처음 듣는 얘기인데"},{"role":"agent","text":"죄송합니다, 제가 잘못 안내드렸어요. 준비중 상태 취소는 수수료가 없습니다. 전액 환불됩니다."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":null,"tags":["취소수수료","오답수정","agent_jung","수수료없음"],"agent_accuracy":"incorrect","accuracy_note":"준비중 취소는 수수료 없음. agent_jung이 2,000원이라고 완전히 잘못 안내."} +{"conversation_id":"CHAT-2025-01-003","timestamp":"2025-01-04T09:15:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"환불 상태 확인하고 싶어요"},{"role":"agent","text":"주문번호 알려주시면 환불 진행 상황 확인해드릴게요."},{"role":"customer","text":"20250102-3301"},{"role":"agent","text":"확인했습니다. 1월 2일 취소 처리 완료됐고 신용카드 환불 진행 중입니다. 카드사 처리에 3-5영업일 소요되니 1월 9일까지 확인하시면 될 것 같아요."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["환불상태","신용카드","3-5영업일"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-004","timestamp":"2025-01-06T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"취소했는데 환불이 왜 안 와요? 3일 됐어요"},{"role":"agent","text":"어떤 결제 수단으로 하셨나요?"},{"role":"customer","text":"신용카드요"},{"role":"agent","text":"신용카드는 3-5영업일 소요됩니다. 취소일 기준 영업일로 계산하시면 돼요. 주말, 공휴일은 포함되지 않습니다. 조금만 더 기다려보세요."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["환불대기","신용카드","영업일계산"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-005","timestamp":"2025-01-07T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"카카오페이로 환불받는 건 얼마나 걸려요?"},{"role":"agent","text":"카카오페이는 취소 처리 완료 즉시 환불됩니다. 보통 몇 분 내로 카카오페이 잔액에 반영돼요."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["카카오페이환불","즉시","환불기간"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-006","timestamp":"2025-01-08T14:00:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"취소 수수료 없다고 하던데 반품은요?"},{"role":"agent","text":"준비중 상태 취소는 수수료 없습니다. 발송 후 반품의 경우 단순 변심이면 왕복 배송비 3,000원이 차감됩니다. 상품 불량이나 오배송이면 무료예요."},{"role":"customer","text":"반품은 취소랑 다른 거죠?"},{"role":"agent","text":"네 맞습니다. 취소는 발송 전, 반품은 발송 후 수령한 상품을 돌려보내는 거예요."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":null,"tags":["취소vs반품","수수료차이","VIP"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-007","timestamp":"2025-01-09T10:30:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"환불이 카드 명세서에 언제 반영돼요?"},{"role":"agent","text":"카드사마다 다를 수 있지만 보통 환불 처리 후 1-3일 내에 카드 명세서에 반영됩니다. 정확한 날짜는 카드사에 문의하시는 게 좋아요. 결제 취소 문자가 먼저 오고 명세서 반영은 약간 늦을 수 있습니다."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["카드명세서","환불반영","카드사문의"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-008","timestamp":"2025-01-10T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"포인트로만 결제했을 때 취소하면 어떻게 돼요?"},{"role":"agent","text":"포인트 전액 결제 취소 시 사용하신 포인트 전액이 복구됩니다. 수수료 없이 즉시 복구되고 원래 유효기간 내에서 다시 사용 가능합니다."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":"get_refund","tags":["포인트결제","취소환불","즉시복구"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-009","timestamp":"2025-01-13T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"계좌이체 환불은 어디로 와요?"},{"role":"agent","text":"계좌이체 환불은 결제 시 사용하신 계좌로 입금됩니다. 처리에 최대 7영업일 소요됩니다."},{"role":"customer","text":"그 계좌를 지금 못 써요"},{"role":"agent","text":"계좌 변경이 필요하시면 고객센터로 문의 주세요. 본인 명의 다른 계좌로 변경 처리 도와드릴 수 있습니다. 신분증 확인이 필요합니다."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["계좌이체환불","계좌변경","7영업일"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-010","timestamp":"2025-01-14T15:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"주문 취소했는데 언제 취소 확인 문자 와요?"},{"role":"agent","text":"취소 처리 완료 직후 카카오 알림톡으로 취소 완료 안내가 발송됩니다. 혹시 카카오 알림 수신 설정 확인해보셨나요?"},{"role":"customer","text":"카카오는 받는데 취소 알림이 안 왔어요"},{"role":"agent","text":"주문번호 알려주시면 취소 처리 여부 확인해드릴게요. 취소 신청 완료와 처리 완료는 다를 수 있어요."},{"role":"customer","text":"20250114-5521"},{"role":"agent","text":"취소 처리 방금 완료됐습니다. 알림톡이 곧 도착할 거예요. 혹시 3-4분 후에도 안 오시면 앱 나의 주문에서 직접 확인 가능합니다."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["취소확인문자","알림톡","처리확인"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-011","timestamp":"2025-01-15T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"발송된 상품 취소하면 수수료 얼마예요?"},{"role":"agent","text":"취소 수수료는 없어요."},{"role":"customer","text":"발송 완료됐는데도요?"},{"role":"agent","text":"아, 발송 후에는 취소가 아니라 반품으로 처리됩니다. 단순 변심이면 3,000원이 차감되고요. 제가 제대로 안내 못 드렸네요."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":null,"tags":["발송후취소","반품전환","agent_jung","3000원"],"agent_accuracy":"partially_correct","accuracy_note":"발송 후 취소 불가, 반품으로 처리됨을 먼저 안내했어야 했으나 수수료 없다고 단순 안내 후 수정."} +{"conversation_id":"CHAT-2025-01-012","timestamp":"2025-01-16T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"환불 상태가 앱에서 어떻게 확인해요?"},{"role":"agent","text":"앱 나의 주문 > 해당 주문 선택 > '반품/취소 내역'에서 환불 진행 상태 확인 가능합니다. '환불 처리중', '환불 완료' 단계로 표시됩니다."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["환불상태확인","앱조회","환불처리중"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-013","timestamp":"2025-01-17T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"특가 상품 취소하면 수수료 있어요?"},{"role":"agent","text":"특가 상품도 준비중 상태에서 취소 시 수수료 없이 전액 환불됩니다. 단, 특가 프로모션으로 받은 추가 혜택(사은품, 추가 쿠폰 등)은 회수될 수 있어요."},{"role":"customer","text":"사은품도 돌려줘야 해요?"},{"role":"agent","text":"취소 시 사은품도 함께 반납하셔야 합니다. 이미 사용하셨다면 사은품 금액이 환불에서 차감될 수 있어요."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":null,"tags":["특가취소","사은품반납","수수료없음"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-014","timestamp":"2025-01-20T09:00:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"환불 확인이 안 돼요 영업일 5일 됐는데"},{"role":"agent","text":"주문번호 알려주시면 바로 확인해드릴게요."},{"role":"customer","text":"20250113-7712"},{"role":"agent","text":"확인했습니다. 1월 13일 취소 처리 완료됐고, 신용카드 환불 요청은 됐는데 카드사에서 아직 반영이 안 된 것 같습니다. 카드사에 직접 확인하시거나 1-2일 더 기다려보시겠어요? 그래도 안 되면 저희가 카드사에 확인 요청 드릴게요."}],"resolution":"partially_resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["환불지연","카드사확인","VIP"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-015","timestamp":"2025-01-21T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"네이버페이 환불은 어디서 확인해요?"},{"role":"agent","text":"네이버페이 환불은 네이버페이 앱이나 홈페이지에서 확인 가능합니다. 취소 처리 완료 후 거의 즉시 반영되니 네이버페이 결제 내역에서 '취소' 상태 확인하시면 됩니다."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["네이버페이환불","즉시반영","결제내역"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-016","timestamp":"2025-01-22T10:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"취소 신청하고 환불 문자가 왔는데 금액이 적어요"},{"role":"agent","text":"주문번호와 환불 예상 금액 알려주시면 확인해드릴게요."},{"role":"customer","text":"20250120-3301 / 5만원 샀는데 4만7천원만 왔어요"},{"role":"agent","text":"확인했습니다. 우선배송비 3,000원이 이미 발송 준비 중이라 차감됐습니다. 배송 준비 시작 후에는 배송비는 환불이 제한될 수 있어요."},{"role":"customer","text":"그런 규정이 있는지 몰랐어요"},{"role":"agent","text":"안내가 부족했다면 죄송합니다. 우선배송 선택 시 배송 준비 착수 후 취소하면 배송비 환불이 제한될 수 있다는 점 참고해주세요."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":"check_cancellation_fee","tags":["환불금액차이","배송비불환불","우선배송"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-017","timestamp":"2025-01-23T15:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"취소 수수료 없이 취소 가능한 시점이 언제까지예요?"},{"role":"agent","text":"상품이 '배송 준비중' 상태일 때까지 수수료 없이 취소 가능합니다. 발송 완료 이후에는 반품으로 처리되고 단순 변심이면 3,000원이 차감됩니다."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":null,"tags":["무료취소시점","준비중","발송전"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-018","timestamp":"2025-01-24T11:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"환불받은 포인트로 즉시 사용 가능한가요?"},{"role":"agent","text":"취소로 복구된 포인트는 즉시 사용 가능합니다. 앱 포인트 잔액에서 바로 확인하실 수 있어요."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":"loyalty_points","tags":["포인트복구","즉시사용","취소"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-019","timestamp":"2025-01-25T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"발송 준비중에서 발송완료로 바뀌기 직전에 취소하면 수수료 있어요?"},{"role":"agent","text":"발송완료 전까지는 수수료 없이 취소 가능하다고 알고 있어요."},{"role":"customer","text":"발송완료로 바뀌는 순간에 취소하려면요?"},{"role":"agent","text":"발송완료 상태가 되면 취소가 불가하고 반품으로만 처리됩니다. 발송완료 직전 준비중 상태에서는 수수료 없이 취소 가능합니다."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":null,"tags":["발송직전취소","상태변경","수수료"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-020","timestamp":"2025-01-27T14:00:00+09:00","channel":"kakaotalk","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"환불이 얼마나 걸릴지 알고 싶어요"},{"role":"agent","text":"결제 수단에 따라 다릅니다. 신용카드 3-5영업일, 카카오페이·네이버페이는 거의 즉시, 계좌이체는 최대 7영업일입니다. 어떤 수단으로 결제하셨나요?"},{"role":"customer","text":"신용카드요"},{"role":"agent","text":"3-5영업일이니 취소일 기준으로 주말 제외하고 계산하시면 됩니다."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["환불기간","결제수단별","신용카드"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-021","timestamp":"2025-01-28T10:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"취소했는데 포인트 적립이 됐어요 이거 어떻게 돼요?"},{"role":"agent","text":"주문 시 적립된 포인트는 배송 완료 7일 후에 최종 확정됩니다. 그 이전에 취소되면 적립 예정 포인트는 자동 소멸되고 이미 사용 가능 상태로 됐다면 회수됩니다."},{"role":"customer","text":"이미 사용했어요 ㅠ"},{"role":"agent","text":"이미 사용하셨다면 포인트 잔액이 마이너스가 될 수 있습니다. 마이너스 포인트는 다음 주문 시 먼저 차감됩니다."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":"loyalty_points","tags":["포인트회수","마이너스포인트","취소"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-022","timestamp":"2025-01-29T14:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"취소 수수료 없다고 했는데 5000원이 차감됐어요"},{"role":"agent","text":"주문번호 알려주시면 확인해드릴게요."},{"role":"customer","text":"20250128-1100"},{"role":"agent","text":"확인했습니다. 우선배송 선택하셨고 발송 준비 착수 후 취소하셔서 우선배송비 5,000원이 차감됐습니다. 상품 금액은 전액 환불됩니다."},{"role":"customer","text":"이런 설명이 없었는데요"},{"role":"agent","text":"주문 완료 시 배송비 정책 안내가 표시됩니다. 미흡하게 안내됐다면 죄송합니다. 이 경우 취소 수수료가 아닌 배송비 자체가 비환불 처리된 거예요."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":null,"tags":["배송비불환불","우선배송","취소수수료착오"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-023","timestamp":"2025-01-30T09:15:00+09:00","channel":"live_chat","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"환불 완료됐다는 알림이 왔는데 카드에 반영이 안 됐어요"},{"role":"agent","text":"저희 시스템에서 환불 요청은 완료됐고, 실제 카드 반영은 카드사 처리 일정에 따릅니다. 보통 1-3일 더 소요될 수 있어요. 혹시 지금 카드사 고객센터에 환불 취소 접수 확인을 요청해보시겠어요?"}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["환불완료","카드미반영","카드사처리","VIP"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-024","timestamp":"2025-01-30T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"부분 취소하면 수수료가 있나요?"},{"role":"agent","text":"부분 취소는 지원하지 않습니다. 전체 취소 후 원하시는 상품만 재주문하시는 방법만 가능합니다. 전체 취소도 준비중 상태면 수수료 없이 가능합니다."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":null,"tags":["부분취소불가","전체취소","수수료없음"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-025","timestamp":"2025-01-31T10:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"환불 금액을 미리 알 수 있어요?"},{"role":"agent","text":"앱 반품/취소 신청 화면에서 예상 환불 금액이 표시됩니다. 배송비 차감 여부, 사용 포인트·쿠폰 복구 내용 등 상세하게 확인 가능해요. 신청 확정 전에 금액 확인하시고 진행하시면 됩니다."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":null,"tags":["예상환불금액","사전확인","취소화면"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-026","timestamp":"2025-01-31T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"환불이 완료됐다는 게 무슨 뜻이에요?"},{"role":"agent","text":"저희 시스템에서 환불 처리가 완료됐다는 의미입니다. 실제 돈이 들어오기까지 결제 수단에 따라 추가 시간이 걸립니다. 신용카드는 1-3일, 계좌이체는 1-2일, 카카오·네이버페이는 즉시 반영됩니다."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["환불완료의미","시스템처리","결제수단별"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-027","timestamp":"2025-01-31T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"명절 연휴에 취소하면 환불이 언제 돼요?"},{"role":"agent","text":"명절 연휴는 금융기관 운영 중단으로 환불 처리가 늦어질 수 있습니다. 취소는 연중무휴 가능하지만 환불 처리는 영업일 기준이라 연휴 이후 영업일부터 카운트됩니다. 카카오·네이버페이는 연휴 중에도 즉시 처리됩니다."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["명절연휴","환불지연","영업일"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-028","timestamp":"2025-01-31T16:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"취소를 고객이 아니라 판매사가 해도 수수료 없죠?"},{"role":"agent","text":"판매사(저희) 측 사정으로 취소 처리되는 경우 당연히 고객 부담 수수료 없이 전액 환불됩니다. 지연 배송 등으로 인한 취소면 추가 보상 쿠폰도 지급될 수 있어요."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":null,"tags":["판매사취소","수수료없음","보상쿠폰"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-029","timestamp":"2025-01-31T17:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"취소 후 환불 내역서 받을 수 있나요?"},{"role":"agent","text":"네, 앱에서 취소/환불 내역 확인 및 PDF로 저장 가능합니다."},{"role":"customer","text":"이메일로 받을 수는 없나요?"},{"role":"agent","text":"현재 이메일 발송 기능은 없는 것으로 알고 있습니다만 확실하지 않아요. 고객센터에 직접 요청하시면 내역서 이메일 발송 가능한지 확인해드릴 거예요."}],"resolution":"partially_resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["환불내역서","PDF","이메일불확실"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-01-030","timestamp":"2025-01-31T18:00:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_lee","turns":[{"role":"customer","text":"취소 수수료 없다고 해서 취소했는데 포인트가 줄었어요"},{"role":"agent","text":"주문번호 알려주시면 확인해드릴게요."},{"role":"customer","text":"20250130-2201"},{"role":"agent","text":"확인했습니다. 해당 주문으로 이미 적립된 포인트 1,200원이 취소로 인해 회수됐습니다. 수수료는 없지만 적립 포인트 회수는 정상 처리입니다. 취소 수수료와 포인트 회수는 별개예요."},{"role":"customer","text":"아 그렇군요 이해했습니다"}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":"loyalty_points","tags":["포인트회수","취소수수료없음","별개","VIP"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2025-02.jsonl b/src/main/resources/data/layer3_chatlogs/2025-02.jsonl new file mode 100644 index 0000000..feae86f --- /dev/null +++ b/src/main/resources/data/layer3_chatlogs/2025-02.jsonl @@ -0,0 +1,30 @@ +{"conversation_id":"CHAT-2025-02-001","timestamp":"2025-02-03T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"어떤 결제 수단 지원해요?"},{"role":"agent","text":"신용카드/체크카드, 카카오페이, 네이버페이, 계좌이체, 포인트, 쿠폰을 지원합니다. 포인트와 쿠폰은 다른 결제 수단과 함께 사용 가능해요."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["결제수단","지원목록"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-002","timestamp":"2025-02-04T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"가상계좌 결제 되나요?"},{"role":"agent","text":"네, 가상계좌 결제 가능합니다."},{"role":"customer","text":"결제 화면에 안 보이는데요?"},{"role":"agent","text":"죄송합니다, 확인해보니 현재 가상계좌 결제는 지원하지 않습니다. 제가 잘못 안내드렸어요. 계좌이체(실시간)는 지원합니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["가상계좌","미지원","오답수정","agent_jung"],"agent_accuracy":"incorrect","accuracy_note":"가상계좌 결제 미지원인데 agent_jung이 가능하다고 잘못 안내 후 수정."} +{"conversation_id":"CHAT-2025-02-003","timestamp":"2025-02-05T09:15:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"무이자 할부 가능한가요?"},{"role":"agent","text":"네, 특정 카드사에서 무이자 할부 제공합니다. 현재 삼성카드, 신한카드, 현대카드 기준 3/6개월 무이자가 가능하며, 5만원 이상 결제 시 적용됩니다. 카드사와 프로모션 기간에 따라 달라질 수 있어요."},{"role":"customer","text":"모든 카드가 되는 건 아니죠?"},{"role":"agent","text":"맞습니다. 지원 카드사와 기간은 결제 화면에서 확인하시거나 프로모션 페이지에서 최신 정보 확인하시는 게 정확합니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["무이자할부","특정카드사","삼성신한현대"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-004","timestamp":"2025-02-06T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"결제가 안 돼요"},{"role":"agent","text":"어떤 결제 수단을 사용하셨고 어떤 오류 메시지가 나오나요?"},{"role":"customer","text":"신용카드인데 '결제 실패'라고만 떠요"},{"role":"agent","text":"카드 한도 초과, 카드 정보 오입력, 또는 카드사 일시 오류일 수 있어요. 카드 번호와 유효기간, CVC 다시 확인해보시고, 다른 결제 수단(카카오페이 등)으로 시도해보시겠어요?"},{"role":"customer","text":"다른 카드로 해볼게요"},{"role":"agent","text":"네! 그래도 안 되면 다시 말씀해주세요."}],"resolution":"resolved","primary_intent":"payment_issue","secondary_intent":null,"tags":["결제실패","신용카드","한도초과의심"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-005","timestamp":"2025-02-07T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"카카오페이로만 결제 가능한가요?"},{"role":"agent","text":"카카오페이 외에도 신용카드/체크카드, 네이버페이, 계좌이체, 포인트, 쿠폰 등 다양한 수단이 있습니다. 결제 화면에서 원하시는 방법을 선택하시면 됩니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["카카오페이","결제수단다양"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-006","timestamp":"2025-02-10T14:00:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"결제 도중에 앱이 꺼졌는데 결제가 된 건가요?"},{"role":"agent","text":"주문 내역 확인해드릴게요. 주문번호나 연락처 알려주시면 확인 가능합니다."},{"role":"customer","text":"01012345678이에요"},{"role":"agent","text":"확인했습니다. 해당 번호 기준 최근 주문에 결제 완료 건이 있습니다. 카카오 알림톡으로 주문 완료 메시지 받으셨는지 확인해보세요. 결제 됐다면 주문번호가 발급됐을 거예요."},{"role":"customer","text":"알림톡 왔어요 결제됐네요 감사합니다"}],"resolution":"resolved","primary_intent":"payment_issue","secondary_intent":null,"tags":["앱오류","결제확인","알림톡","VIP"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-007","timestamp":"2025-02-11T10:30:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"해외 카드로 결제 가능한가요?"},{"role":"agent","text":"Visa, Mastercard 등 해외 발급 카드도 결제 가능합니다. 다만 해외 카드의 경우 3D Secure 인증이 추가로 필요할 수 있어요. 결제 오류 시 카드 발급사에 해외 온라인 결제 허용 여부 확인해보세요."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["해외카드","Visa","Mastercard","3DSecure"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-008","timestamp":"2025-02-12T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"결제 중에 이중 결제가 된 것 같아요"},{"role":"agent","text":"주문 내역 확인해드릴게요. 주문번호 알려주시겠어요?"},{"role":"customer","text":"주문번호가 두 개예요 20250212-1001이랑 1002"},{"role":"agent","text":"두 건 모두 확인했습니다. 동일 상품으로 두 번 결제된 것 같네요. 중복 주문으로 판단됩니다. 하나 취소해드릴게요. 어떤 주문 남기시겠어요?"},{"role":"customer","text":"1001 남겨주세요"},{"role":"agent","text":"1002 취소 처리했습니다. 카카오페이 환불은 즉시 됩니다."}],"resolution":"resolved","primary_intent":"payment_issue","secondary_intent":"cancel_order","tags":["이중결제","중복주문","즉시취소"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-009","timestamp":"2025-02-13T14:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"무이자 할부 몇 개월까지 돼요?"},{"role":"agent","text":"12개월까지 무이자 가능합니다."},{"role":"customer","text":"12개월이요? 카드마다 다르지 않나요?"},{"role":"agent","text":"맞습니다 죄송해요. 카드사마다 다르고 일부 카드사는 6개월까지만 무이자가 적용됩니다. 결제 화면에서 카드 선택 후 무이자 옵션 확인하시는 게 정확합니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["무이자할부","카드사별","오답수정","agent_jung"],"agent_accuracy":"partially_correct","accuracy_note":"무이자 12개월은 카드사 제한이 있는데 agent_jung이 12개월 가능하다고 단순 안내 후 수정."} +{"conversation_id":"CHAT-2025-02-010","timestamp":"2025-02-14T11:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_choi","turns":[{"role":"customer","text":"포인트만으로 결제 가능한가요?"},{"role":"agent","text":"포인트 전액 결제 가능합니다. 포인트가 충분하다면 다른 결제 수단 없이 포인트만으로 주문 가능해요. 최소 사용 포인트는 1,000점이에요."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["포인트전액결제","최소1000점"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-011","timestamp":"2025-02-17T09:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"결제 실패가 계속 돼요"},{"role":"agent","text":"어떤 결제 수단으로 시도하셨나요?"},{"role":"customer","text":"카카오페이요"},{"role":"agent","text":"카카오페이 잔액이나 연결 카드를 확인해보세요. 카카오페이 앱에서 결제 한도 초과 여부도 확인하시고요. 혹시 인터넷 연결 환경도 확인해보시겠어요?"},{"role":"customer","text":"잔액은 충분한데요"},{"role":"agent","text":"카카오페이 고객센터(1577-3754)에 문의하시거나 저희 앱 캐시 삭제 후 재시도해보세요. 계속 안 되면 다른 결제 수단으로 시도해주세요."}],"resolution":"partially_resolved","primary_intent":"payment_issue","secondary_intent":null,"tags":["카카오페이실패","잔액충분","앱캐시"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-012","timestamp":"2025-02-18T14:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"현금으로 결제 가능한가요?"},{"role":"agent","text":"온라인 쇼핑몰 특성상 현금 직접 결제는 지원하지 않습니다. 계좌이체로 실시간 이체하시는 방법이 현금과 가장 유사한 방법이에요."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["현금결제불가","계좌이체대안"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-013","timestamp":"2025-02-19T10:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"결제 영수증 받을 수 있나요?"},{"role":"agent","text":"앱 나의 주문에서 해당 주문 선택 후 '결제 영수증' 확인 가능합니다. PDF 저장도 돼요. 현금영수증은 계좌이체 결제 시 신청 가능하고, 카드 결제는 카드 전표가 영수증 역할을 합니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["결제영수증","현금영수증","PDF"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-014","timestamp":"2025-02-20T15:00:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"법인카드로 결제 가능한가요?"},{"role":"agent","text":"법인카드도 일반 신용카드와 동일하게 결제 가능합니다. 다만 일부 법인카드는 온라인 결제가 제한될 수 있으니 카드사에 확인해보세요. 법인 명의 세금계산서는 별도로 발행 요청 가능합니다."},{"role":"customer","text":"세금계산서 발행은 어떻게 해요?"},{"role":"agent","text":"주문 완료 후 고객센터로 사업자등록번호와 주문번호 알려주시면 세금계산서 발행 요청 처리해드립니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":"get_invoice","tags":["법인카드","세금계산서","VIP"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-015","timestamp":"2025-02-21T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"결제 수단 변경이 가능한가요? 주문하고 나서"},{"role":"agent","text":"주문 완료 후 결제 수단 변경은 불가합니다. 현재 결제 방법을 유지하거나, 주문을 취소 후 다른 결제 수단으로 재주문하셔야 합니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["결제수단변경불가","주문후","재주문"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-016","timestamp":"2025-02-24T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"카드가 차단됐어요 결제를 못 하겠어요"},{"role":"agent","text":"카드 차단은 카드사에서 해제하셔야 합니다. 해제 후 재시도하시거나, 그 전에 다른 결제 수단(카카오페이, 계좌이체 등)으로 주문하실 수 있어요."},{"role":"customer","text":"다른 카드가 없어요"},{"role":"agent","text":"카카오페이나 네이버페이에 계좌를 연결하시면 계좌 잔액으로 결제하실 수 있습니다."}],"resolution":"resolved","primary_intent":"payment_issue","secondary_intent":null,"tags":["카드차단","대체결제","카카오페이연결"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-017","timestamp":"2025-02-25T14:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"신용카드 할부로 결제했는데 취소하면 할부도 취소되나요?"},{"role":"agent","text":"네, 전액 취소 시 할부도 전액 취소됩니다. 이미 납부하신 할부금이 있다면 카드사에서 환급 처리됩니다. 카드사마다 처리 기간이 다를 수 있어요."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":"cancel_order","tags":["할부취소","전액환급","카드사환급"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-018","timestamp":"2025-02-26T10:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"결제는 됐는데 주문이 안 잡혔어요"},{"role":"agent","text":"걱정 마세요. 결제 완료 후 주문 등록이 지연될 수 있습니다. 연락처 알려주시면 확인해드릴게요."},{"role":"customer","text":"01098765432"},{"role":"agent","text":"확인했습니다. 결제는 완료됐고 주문도 정상 접수됐습니다. 카카오 알림톡 수신 설정이 꺼져 있어서 알림을 못 받으신 것 같아요. 주문번호는 20250226-4401입니다."}],"resolution":"resolved","primary_intent":"payment_issue","secondary_intent":null,"tags":["결제후주문미확인","알림톡설정","정상처리"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-019","timestamp":"2025-02-27T14:00:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_jung","turns":[{"role":"customer","text":"페이코로 결제 가능해요?"},{"role":"agent","text":"네, 페이코도 지원합니다."},{"role":"customer","text":"결제 화면에서 찾을 수가 없어요"},{"role":"agent","text":"죄송합니다, 확인해보니 현재 페이코는 지원하지 않습니다. 제가 잘못 안내드렸어요. 지원 수단은 신용카드, 카카오페이, 네이버페이, 계좌이체, 포인트입니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["페이코미지원","오답수정","agent_jung"],"agent_accuracy":"incorrect","accuracy_note":"페이코는 지원하지 않는데 agent_jung이 가능하다고 잘못 안내 후 수정."} +{"conversation_id":"CHAT-2025-02-020","timestamp":"2025-02-28T09:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"간편결제 비밀번호 잊어버렸어요"},{"role":"agent","text":"간편결제 비밀번호는 저희 서비스가 아닌 각 간편결제사(카카오페이, 네이버페이 등) 앱에서 재설정하셔야 합니다. 해당 앱의 '비밀번호 재설정'을 이용해주세요."}],"resolution":"resolved","primary_intent":"payment_issue","secondary_intent":null,"tags":["간편결제비밀번호","외부앱","재설정"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-021","timestamp":"2025-02-28T11:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"포인트랑 카드 동시에 쓸 수 있어요?"},{"role":"agent","text":"네, 포인트와 카드 결제 동시 사용 가능합니다. 결제 화면에서 포인트 사용 금액 입력 후 나머지 금액을 카드로 결제하시면 됩니다. 포인트 최소 사용은 1,000점이에요."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["포인트카드병용","혼합결제","최소1000점"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-022","timestamp":"2025-02-28T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"결제 오류인데 상품이 품절된 건가요?"},{"role":"agent","text":"결제 오류와 품절은 다릅니다. 품절이면 결제 화면 진입 전에 '품절' 표시가 됩니다. 결제 화면에서 오류가 나면 결제 수단 문제일 가능성이 높아요. 어떤 오류 메시지가 뜨나요?"},{"role":"customer","text":"'일시적인 오류가 발생했습니다'라고 해요"},{"role":"agent","text":"일시적 서버 오류일 수 있습니다. 몇 분 후 다시 시도해보세요. 그래도 안 되면 다른 결제 수단으로 시도하시거나 고객센터로 문의 주세요."}],"resolution":"resolved","primary_intent":"payment_issue","secondary_intent":null,"tags":["결제오류vs품절","서버오류","재시도"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-023","timestamp":"2025-02-28T15:30:00+09:00","channel":"live_chat","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"VIP면 결제 혜택이 뭐가 있나요?"},{"role":"agent","text":"VIP 고객님은 우선배송 무료, 전담 상담사, 반품 우선 처리 혜택이 있습니다. 결제 수단 자체 혜택은 별도 없으나 VIP 전용 프로모션이 별도로 제공될 때 카드사 추가 할인이 적용되는 경우가 있습니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["VIP결제혜택","우선배송무료","프로모션"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-024","timestamp":"2025-02-28T16:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"체크카드도 할부 되나요?"},{"role":"agent","text":"체크카드는 할부 결제가 불가합니다. 할부는 신용카드에서만 가능합니다. 체크카드는 일시불로만 결제됩니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["체크카드할부불가","신용카드전용","일시불"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-025","timestamp":"2025-02-28T17:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"결제가 여러 번 됐어요"},{"role":"agent","text":"걱정 마세요. 바로 확인해드릴게요. 주문번호나 연락처 알려주시겠어요?"},{"role":"customer","text":"01011112222"},{"role":"agent","text":"확인했습니다. 결제 시도가 3회 있었지만 완료된 건은 1건입니다. 나머지 2건은 결제 실패 후 자동 취소됐고 카드 승인이 취소됐을 거예요. 카드 내역에 임시 승인이 보여도 1-2일 내 사라집니다."},{"role":"customer","text":"안심이네요 감사합니다"}],"resolution":"resolved","primary_intent":"payment_issue","secondary_intent":null,"tags":["다중결제시도","임시승인","자동취소확인"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-026","timestamp":"2025-02-28T17:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"쿠폰이랑 무이자 할부 같이 쓸 수 있나요?"},{"role":"agent","text":"네, 쿠폰 적용 후 남은 금액에 대해 할부 결제 가능합니다. 쿠폰 할인 → 포인트 차감 → 카드 할부 순으로 적용됩니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["쿠폰할부병용","적용순서"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-027","timestamp":"2025-02-28T18:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"삼성페이로 결제 가능해요?"},{"role":"agent","text":"삼성페이 자체 지원은 하지 않습니다만, 삼성페이에 등록된 신용카드로 카드 결제는 가능합니다."},{"role":"customer","text":"삼성페이 버튼은 없는 거죠?"},{"role":"agent","text":"네, 결제 화면에 삼성페이 전용 버튼은 없습니다. 삼성페이 연결 카드를 직접 선택해서 결제하시면 됩니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["삼성페이","연결카드사용","직접입력"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-028","timestamp":"2025-02-28T18:30:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_choi","turns":[{"role":"customer","text":"카드 정보가 저장이 안 돼요"},{"role":"agent","text":"결제 시 '카드 정보 저장' 체크박스를 선택하셨나요? 또는 마이페이지 > 결제 수단 관리에서 카드를 미리 등록해두실 수 있어요."},{"role":"customer","text":"체크했는데도 안 돼요"},{"role":"agent","text":"브라우저 쿠키 차단 설정이나 앱 캐시 문제일 수 있어요. 앱 캐시 삭제 후 다시 시도해보시겠어요? 그래도 안 되면 고객센터로 문의 주시면 기술팀에서 확인해드립니다."}],"resolution":"partially_resolved","primary_intent":"payment_issue","secondary_intent":null,"tags":["카드저장오류","캐시삭제","기술팀"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-029","timestamp":"2025-02-28T19:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"결제 한도가 있나요?"},{"role":"agent","text":"1회 주문 최대 결제 금액은 500만원입니다. 그 이상은 B2B팀 통해 별도 처리 필요합니다. 카드사별 한도는 별도로 있을 수 있어요."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["결제한도","500만원","B2B"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-02-030","timestamp":"2025-02-28T19:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"네이버페이 포인트도 쓸 수 있어요?"},{"role":"agent","text":"네이버페이로 결제 시 네이버페이 포인트 사용이 가능합니다. 다만 저희 앱 적립 포인트와 네이버페이 포인트는 별개입니다. 네이버페이 결제 화면에서 네이버페이 포인트를 직접 적용하시면 됩니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["네이버페이포인트","앱포인트별개","결제적용"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2025-03.jsonl b/src/main/resources/data/layer3_chatlogs/2025-03.jsonl new file mode 100644 index 0000000..6c78fcd --- /dev/null +++ b/src/main/resources/data/layer3_chatlogs/2025-03.jsonl @@ -0,0 +1,30 @@ +{"conversation_id":"CHAT-2025-03-001","timestamp":"2025-03-03T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"회원가입 어떻게 해요?"},{"role":"agent","text":"앱이나 웹에서 카카오, 네이버, 구글 소셜 로그인으로 간편 가입하거나 이메일로 직접 가입 가능합니다. 만 14세 이상이면 가입 가능하고, 가입 후 3,000원 쿠폰을 드립니다."}],"resolution":"resolved","primary_intent":"create_account","secondary_intent":null,"tags":["회원가입","SSO","이메일가입","14세이상"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-002","timestamp":"2025-03-04T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"회원 탈퇴하고 싶어요"},{"role":"agent","text":"앱 마이페이지 > 설정 > 회원 탈퇴에서 직접 처리 가능합니다. 탈퇴 전 진행 중인 주문이나 미처리 환불이 없는지 확인해주세요. 탈퇴 시 포인트와 쿠폰은 즉시 소멸되고 복구되지 않습니다."},{"role":"customer","text":"포인트가 소멸된다고요?"},{"role":"agent","text":"네, 탈퇴와 동시에 모든 포인트와 쿠폰이 소멸됩니다. 포인트를 먼저 사용하신 후 탈퇴하시는 걸 권장드립니다."}],"resolution":"resolved","primary_intent":"delete_account","secondary_intent":null,"tags":["회원탈퇴","포인트소멸","사전확인"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-003","timestamp":"2025-03-05T09:15:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"탈퇴하면 포인트 어떻게 되나요?"},{"role":"agent","text":"탈퇴 후에도 재가입하시면 포인트 복구 가능합니다."},{"role":"customer","text":"진짜요? 그럼 탈퇴 후 바로 재가입해도 되나요?"},{"role":"agent","text":"죄송합니다, 제가 잘못 안내드렸어요. 탈퇴 시 포인트는 즉시 소멸되고 재가입해도 복구되지 않습니다. 또한 탈퇴 후 30일 이내에는 동일 이메일로 재가입이 불가합니다."}],"resolution":"resolved","primary_intent":"delete_account","secondary_intent":null,"tags":["탈퇴포인트","오답수정","agent_jung","포인트소멸"],"agent_accuracy":"incorrect","accuracy_note":"탈퇴 시 포인트 소멸, 재가입 후 복구 불가인데 agent_jung이 복구 가능하다고 잘못 안내."} +{"conversation_id":"CHAT-2025-03-004","timestamp":"2025-03-06T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"이름 변경이 가능한가요?"},{"role":"agent","text":"앱 마이페이지 > 회원 정보 수정에서 이름, 연락처, 이메일 변경 가능합니다. 본인 인증이 필요할 수 있어요."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["이름변경","회원정보수정"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-005","timestamp":"2025-03-07T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"가입하려고 하는데 이메일 인증이 안 돼요"},{"role":"agent","text":"이메일 인증 메일이 스팸함에 있을 수 있어요. 확인해보셨나요? 또는 입력하신 이메일 주소가 맞는지 확인해보시고, 5분 후에도 안 오면 '인증 메일 재발송' 버튼을 눌러보세요."},{"role":"customer","text":"스팸함에도 없어요"},{"role":"agent","text":"혹시 이미 가입된 이메일이면 인증 메일 대신 '로그인' 안내가 오기도 해요. 해당 이메일로 로그인 시도해보시겠어요?"}],"resolution":"partially_resolved","primary_intent":"create_account","secondary_intent":null,"tags":["이메일인증","스팸함","재발송"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-006","timestamp":"2025-03-10T14:00:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"휴대폰 번호 바꾸고 싶어요"},{"role":"agent","text":"앱 마이페이지 > 회원 정보 수정 > 연락처 변경에서 새 번호로 본인 인증 후 변경 가능합니다."},{"role":"customer","text":"기존 번호로 인증이 안 돼요 번호가 없어진 번호라서"},{"role":"agent","text":"그런 경우 고객센터(전화 또는 채팅)로 문의 주시면 신분증 확인 후 연락처 변경 도와드립니다. 본인 확인 절차가 좀 더 복잡할 수 있지만 처리 가능합니다."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["휴대폰변경","기존번호없음","본인인증","VIP"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-007","timestamp":"2025-03-11T10:30:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"탈퇴 후 바로 재가입 가능한가요?"},{"role":"agent","text":"탈퇴 후 30일 이내에는 동일 이메일로 재가입이 불가합니다. 30일 이후 재가입 가능하며, 이전 포인트, 주문 내역 등은 복구되지 않습니다."},{"role":"customer","text":"30일이나 기다려야 해요?"},{"role":"agent","text":"네, 정책상 30일 대기 기간이 있습니다. 다른 이메일로는 즉시 가입 가능합니다."}],"resolution":"resolved","primary_intent":"create_account","secondary_intent":"delete_account","tags":["재가입제한","30일","이전데이터복구불가"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-008","timestamp":"2025-03-12T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"카카오로 가입했는데 이메일 가입으로 전환할 수 있나요?"},{"role":"agent","text":"소셜 로그인과 이메일 로그인 전환은 지원하지 않습니다. 소셜 계정은 계속 소셜 로그인으로만 접속하셔야 합니다. 이메일 계정이 필요하시면 다른 이메일로 별도 가입하셔야 합니다."},{"role":"customer","text":"두 계정을 합칠 수는 없나요?"},{"role":"agent","text":"현재 계정 통합 기능은 지원하지 않습니다."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["소셜이메일전환불가","계정통합불가"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-009","timestamp":"2025-03-13T14:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"비밀번호 변경하고 싶어요"},{"role":"agent","text":"앱 마이페이지 > 보안 설정 > 비밀번호 변경에서 현재 비밀번호 입력 후 새 비밀번호로 변경 가능합니다. 현재 비밀번호를 모르시면 로그인 화면에서 '비밀번호 찾기'를 이용해주세요."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["비밀번호변경","보안설정"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-010","timestamp":"2025-03-14T11:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"아이디(이메일)를 바꿀 수 있나요?"},{"role":"agent","text":"로그인용 이메일 아이디 변경은 제한이 있습니다. 이메일 주소 변경은 고객센터 문의 후 본인 인증 절차를 거쳐야 하며, 보안 정책상 연 1회까지 가능합니다."},{"role":"customer","text":"앱에서는 안 되나요?"},{"role":"agent","text":"앱에서는 연락처, 이름 수정만 가능하고 로그인 이메일 변경은 고객센터에서만 처리됩니다."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["이메일아이디변경","고객센터","연1회"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-011","timestamp":"2025-03-17T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"탈퇴하면 주문 내역도 다 사라지나요?"},{"role":"agent","text":"탈퇴 후에도 주문 내역은 3년간 보관됩니다. 필요하시면 탈퇴 전에 주문 내역 캡처나 다운로드 해두시는 게 좋아요."},{"role":"customer","text":"로그인해서 볼 수는 없겠죠?"},{"role":"agent","text":"네 맞습니다. 탈퇴 후에는 로그인이 불가하니 접근이 안 됩니다. 탈퇴 전에 필요한 내역 저장해두시길 권장합니다."}],"resolution":"resolved","primary_intent":"delete_account","secondary_intent":null,"tags":["탈퇴후주문내역","3년보관","접근불가"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-012","timestamp":"2025-03-18T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"계정이 잠겼어요"},{"role":"agent","text":"비밀번호 5회 이상 틀리면 보안상 계정이 잠깁니다. 이메일로 잠금 해제 링크가 발송됩니다. 이메일을 확인해보시거나 고객센터로 문의 주세요."},{"role":"customer","text":"이메일도 못 찾겠어요"},{"role":"agent","text":"고객센터(전화 또는 채팅)로 연락처와 주문 내역 등 본인 확인 정보를 알려주시면 계정 잠금 해제 도와드릴 수 있습니다."}],"resolution":"partially_resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["계정잠금","비밀번호5회실패","고객센터"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-013","timestamp":"2025-03-19T10:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"미성년자도 가입 가능한가요?"},{"role":"agent","text":"만 14세 이상이면 가입 가능합니다. 14세 미만은 보호자 동의 후 가입 가능하고, 19세 미만은 주류, 성인 인증 필요 상품 구매에 제한이 있습니다."}],"resolution":"resolved","primary_intent":"create_account","secondary_intent":null,"tags":["미성년자가입","14세","보호자동의"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-014","timestamp":"2025-03-20T15:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"계정 정보 변경하면 배송지도 바뀌나요?"},{"role":"agent","text":"계정 정보(이름, 연락처)를 변경해도 저장된 배송지 정보는 별도로 유지됩니다. 배송지 변경은 마이페이지 > 배송지 관리에서 따로 하셔야 합니다."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["계정정보변경","배송지별개"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-015","timestamp":"2025-03-21T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"가입 시 받는 쿠폰은 언제 사용할 수 있어요?"},{"role":"agent","text":"가입 후 즉시 사용 가능합니다. 쿠폰 유효기간은 발급일로부터 30일이에요. 앱 내 쿠폰함에서 확인하실 수 있습니다."}],"resolution":"resolved","primary_intent":"create_account","secondary_intent":null,"tags":["가입쿠폰","즉시사용","30일유효"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-016","timestamp":"2025-03-24T14:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"탈퇴 후 바로 재가입하면 등급은 유지되나요?"},{"role":"agent","text":"재가입하면 이전 구매 금액이 합산돼서 등급이 유지됩니다."},{"role":"customer","text":"정말요?"},{"role":"agent","text":"죄송합니다, 다시 확인해보니 탈퇴 후 재가입하면 모든 내역이 초기화되고 등급은 스탠다드로 시작합니다. 이전 구매 이력은 복구되지 않습니다."}],"resolution":"resolved","primary_intent":"delete_account","secondary_intent":null,"tags":["탈퇴후등급","오답수정","agent_jung","초기화"],"agent_accuracy":"incorrect","accuracy_note":"탈퇴 재가입 시 등급 초기화인데 agent_jung이 유지된다고 잘못 안내."} +{"conversation_id":"CHAT-2025-03-017","timestamp":"2025-03-25T09:00:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"이름이 바뀌었는데 실명으로 수정해야 하나요?"},{"role":"agent","text":"실명 사용을 권장하지만 강제는 아닙니다. 다만 본인 인증이 필요한 상품이나 세금계산서 발행 시 실명이 필요할 수 있어요. 앱 마이페이지에서 자유롭게 수정 가능합니다."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["이름수정","실명권장","본인인증"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-018","timestamp":"2025-03-26T14:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"계정을 일시 정지할 수 있나요?"},{"role":"agent","text":"계정 일시 정지 기능은 지원하지 않습니다. 잠시 이용을 중단하고 싶으시면 그냥 로그아웃 상태로 두시면 됩니다. 1년 이상 로그인하지 않으면 휴면 계정으로 전환될 수 있어요."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["계정일시정지불가","로그아웃","휴면계정"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-019","timestamp":"2025-03-27T11:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"휴면 계정이 됐어요 어떻게 해제해요?"},{"role":"agent","text":"앱에서 로그인 시도하시면 휴면 해제 안내가 나옵니다. 본인 인증 후 즉시 해제 가능하며, 휴면 기간 데이터는 유지됩니다. 다만 휴면 전환 시 일부 서비스가 제한됐다가 해제 후 복원됩니다."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["휴면계정해제","본인인증","데이터유지"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-020","timestamp":"2025-03-28T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"주문 중인 게 있는데 탈퇴 가능한가요?"},{"role":"agent","text":"진행 중인 주문이 있으면 탈퇴가 제한됩니다. 모든 주문이 완료되고 환불도 처리된 후 탈퇴하실 수 있어요. 주문 상태 확인해보시겠어요?"}],"resolution":"resolved","primary_intent":"delete_account","secondary_intent":null,"tags":["주문중탈퇴제한","완료후탈퇴","주문상태"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-021","timestamp":"2025-03-29T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"생년월일 수정이 가능한가요?"},{"role":"agent","text":"생년월일은 본인 인증과 연결된 정보라 일반적으로 변경이 어렵습니다. 실수로 잘못 입력하셨다면 고객센터로 신분증을 통한 본인 확인 후 수정 요청 하셔야 합니다."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["생년월일변경","고객센터","신분증"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-022","timestamp":"2025-03-30T10:00:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_park","turns":[{"role":"customer","text":"탈퇴하면 VIP 혜택도 사라지나요?"},{"role":"agent","text":"네, 탈퇴 시 계정이 소멸되므로 VIP 등급과 모든 혜택이 함께 사라집니다. 재가입 시 스탠다드 등급으로 새로 시작합니다. 구매 이력도 복구되지 않아요."},{"role":"customer","text":"몇 년치 구매 이력이 있는데 아깝네요"},{"role":"agent","text":"그렇겠지요. 탈퇴 전에 신중히 고려해보세요. 단순히 앱 알림이 많아서 탈퇴하시려면 알림 설정 조정으로 해결 가능할 수도 있어요."}],"resolution":"resolved","primary_intent":"delete_account","secondary_intent":null,"tags":["VIP탈퇴","등급소멸","이력복구불가","VIP"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-023","timestamp":"2025-03-31T09:15:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"마케팅 수신 동의 해제하고 싶어요"},{"role":"agent","text":"앱 마이페이지 > 알림 설정 > 마케팅 정보 수신에서 해제 가능합니다. 법적 의무 고지 알림(주문, 배송, 결제)은 해제가 안 되지만 이벤트/혜택 알림은 선택적으로 끄실 수 있어요."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["마케팅수신해제","알림설정","의무알림"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-024","timestamp":"2025-03-31T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"가입했는데 welcome 쿠폰을 못 받았어요"},{"role":"agent","text":"가입 완료 후 자동 발급됩니다. 앱 쿠폰함에서 확인해보세요. 혹시 비회원으로 주문하신 건 아닌가요?"},{"role":"customer","text":"회원 가입 후 주문했어요"},{"role":"agent","text":"그럼 쿠폰함에 있을 거예요. 혹시 유효기간이 만료된 건 아닌지도 확인해보세요. 그래도 없다면 고객센터로 가입 일자와 연락처 알려주시면 확인해드릴게요."}],"resolution":"partially_resolved","primary_intent":"create_account","secondary_intent":null,"tags":["가입쿠폰미발급","쿠폰함확인"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-025","timestamp":"2025-03-31T14:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"두 개 계정이 있어요 하나로 합칠 수 있나요?"},{"role":"agent","text":"아쉽게도 계정 통합은 지원하지 않습니다. 사용하시려는 계정 하나를 선택하시고 나머지는 탈퇴하시는 방법밖에 없어요. 탈퇴한 계정의 포인트, 주문 이력은 다른 계정으로 이전이 불가합니다."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":"delete_account","tags":["계정통합불가","중복계정","데이터이전불가"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-026","timestamp":"2025-03-31T15:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"탈퇴 후 즉시 재가입 가능한가요?"},{"role":"agent","text":"네, 즉시 재가입 가능합니다."},{"role":"customer","text":"같은 이메일로요?"},{"role":"agent","text":"죄송합니다, 제가 잘못 안내드렸어요. 동일 이메일로는 탈퇴 후 30일 이내 재가입이 불가합니다. 다른 이메일이나 소셜 계정으로는 즉시 가입 가능합니다."}],"resolution":"resolved","primary_intent":"delete_account","secondary_intent":"create_account","tags":["재가입제한","30일","오답수정","agent_jung"],"agent_accuracy":"partially_correct","accuracy_note":"동일 이메일 재가입 30일 제한인데 agent_jung이 즉시 가능하다고 잘못 안내 후 수정."} +{"conversation_id":"CHAT-2025-03-027","timestamp":"2025-03-31T16:00:00+09:00","channel":"kakaotalk","customer_tier":"plus","agent_id":"agent_park","turns":[{"role":"customer","text":"개인정보 동의 내용 바꿀 수 있어요?"},{"role":"agent","text":"앱 마이페이지 > 설정 > 개인정보 처리 방침 및 동의에서 선택 항목 동의 여부 변경 가능합니다. 필수 항목은 변경 불가하며 변경 시 일부 서비스 이용이 제한될 수 있어요."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["개인정보동의","선택항목변경","필수항목"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-028","timestamp":"2025-03-31T17:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"사망한 가족 계정을 정리하고 싶어요"},{"role":"agent","text":"사망자 계정 정리는 상속인 자격으로 요청 가능합니다. 고객센터로 가족관계증명서, 사망 확인서, 신청인 신분증을 준비하여 문의해주시면 처리해드립니다."}],"resolution":"resolved","primary_intent":"delete_account","secondary_intent":null,"tags":["사망자계정","상속인","가족관계증명"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-029","timestamp":"2025-03-31T18:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"SNS 로그인 연결 해제하고 싶어요"},{"role":"agent","text":"마이페이지 > 소셜 로그인 관리에서 연결된 카카오, 네이버, 구글 계정 연결 해제 가능합니다. 연결 해제 후 다른 소셜 계정 연결이나 이메일 로그인으로 전환하고 싶다면 계정 유형 전환은 지원하지 않으니 참고해주세요."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["SNS연결해제","소셜로그인관리"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-03-030","timestamp":"2025-03-31T19:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"프로필 사진 설정할 수 있나요?"},{"role":"agent","text":"현재 저희 서비스에서는 프로필 사진 설정 기능을 지원하지 않습니다. 마이페이지에서 기본 아바타로 표시됩니다."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["프로필사진","미지원","기본아바타"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2025-04.jsonl b/src/main/resources/data/layer3_chatlogs/2025-04.jsonl new file mode 100644 index 0000000..3774bb3 --- /dev/null +++ b/src/main/resources/data/layer3_chatlogs/2025-04.jsonl @@ -0,0 +1,30 @@ +{"conversation_id":"CHAT-2025-04-001","timestamp":"2025-04-01T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"비밀번호를 잊어버렸어요"},{"role":"agent","text":"로그인 화면에서 '비밀번호 찾기'를 누르시면 가입하신 이메일로 재설정 링크가 발송됩니다. 이메일 확인 후 새 비밀번호로 재설정하시면 됩니다."}],"resolution":"resolved","primary_intent":"recover_password","secondary_intent":null,"tags":["비밀번호찾기","이메일재설정"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-002","timestamp":"2025-04-02T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"고객센터 전화번호가 어떻게 되나요?"},{"role":"agent","text":"고객센터 전화번호는 1588-1234입니다. 평일 오전 9시 ~ 오후 6시 운영합니다. 주말과 공휴일은 전화 상담이 안 되고 앱 채팅 챗봇만 이용 가능합니다."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["고객센터전화","운영시간","평일9-18"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-003","timestamp":"2025-04-03T09:15:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"고객센터 몇 시까지 운영해요?"},{"role":"agent","text":"24시간 운영합니다."},{"role":"customer","text":"새벽에도 전화 가능해요?"},{"role":"agent","text":"죄송합니다, 제가 잘못 안내드렸어요. 전화와 채팅 상담은 평일 오전 9시 ~ 오후 6시에만 운영합니다. 24시간은 자동 챗봇만 이용 가능합니다."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["운영시간","오답수정","agent_jung","24시간→평일9-18"],"agent_accuracy":"incorrect","accuracy_note":"고객센터는 평일 9-18시인데 agent_jung이 24시간이라고 잘못 안내."} +{"conversation_id":"CHAT-2025-04-04","timestamp":"2025-04-04T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"카카오로 가입했는데 비밀번호 찾기가 어떻게 해요?"},{"role":"agent","text":"카카오 소셜 로그인으로 가입하셨다면 저희 서비스에 별도 비밀번호가 없습니다. 카카오 계정 비밀번호는 카카오 앱 > 설정 > 계정에서 관리하시면 됩니다."}],"resolution":"resolved","primary_intent":"recover_password","secondary_intent":null,"tags":["소셜로그인","카카오비밀번호","별도비밀번호없음"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-05","timestamp":"2025-04-07T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"상담사랑 직접 연결하고 싶어요"},{"role":"agent","text":"현재 저도 실시간 상담사입니다. 무엇이든 도와드릴게요. 혹시 챗봇과 대화하다가 넘어오신 건가요?"},{"role":"customer","text":"네 챗봇이 해결을 못해줘서요"},{"role":"agent","text":"이해합니다. 어떤 문제인지 말씀해주시면 최선을 다해 해결해드릴게요."}],"resolution":"resolved","primary_intent":"contact_human_agent","secondary_intent":null,"tags":["상담사연결","챗봇에서전환","직접상담"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-06","timestamp":"2025-04-08T14:00:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"비밀번호 재설정 메일이 안 와요"},{"role":"agent","text":"스팸 메일함 확인해보셨나요? 발송에 1-2분 소요될 수 있어요. 그래도 안 오면 가입 이메일이 맞는지 확인해주세요."},{"role":"customer","text":"스팸함에도 없고 이메일도 맞아요"},{"role":"agent","text":"이메일 서비스(네이버, 다음 등)에서 저희 도메인 메일을 차단했을 수 있어요. 혹시 다른 이메일 주소가 있으시면 고객센터로 이메일 변경 후 재발송 가능합니다. 또는 소셜 로그인(카카오, 네이버, 구글)으로 로그인 시도해보세요."}],"resolution":"partially_resolved","primary_intent":"recover_password","secondary_intent":null,"tags":["재설정메일미수신","스팸차단","소셜로그인대안","VIP"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-07","timestamp":"2025-04-09T10:30:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"이메일로 문의하고 싶은데 주소가 어떻게 되나요?"},{"role":"agent","text":"고객 문의 이메일은 cs@chorok.com입니다. 영업일 기준 1-2일 내로 답변드립니다. 주문번호나 연락처를 같이 작성해주시면 더 빠르게 처리 가능합니다."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["이메일문의","cs@chorok.com","1-2영업일답변"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-08","timestamp":"2025-04-10T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"비밀번호가 기억은 나는데 대소문자를 모르겠어요"},{"role":"agent","text":"비밀번호 입력란 옆 '표시' 아이콘을 눌러 입력 내용을 확인하시면서 시도해보세요. 여러 번 틀리면 계정이 잠길 수 있으니 5회 이하로 시도하시고, 확실하지 않으면 비밀번호 재설정을 이용하시는 게 좋아요."}],"resolution":"resolved","primary_intent":"recover_password","secondary_intent":null,"tags":["대소문자","비밀번호표시","5회제한"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-09","timestamp":"2025-04-11T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"사람이랑 얘기하고 싶어요 봇이 너무 답답해요"},{"role":"agent","text":"안녕하세요! 저는 실시간 상담사입니다. 무엇이든 말씀해주세요."},{"role":"customer","text":"아 다행이에요 / 배송 문제가 있는데"},{"role":"agent","text":"말씀해주세요. 주문번호 알려주시면 바로 확인해드릴게요."}],"resolution":"resolved","primary_intent":"contact_human_agent","secondary_intent":"track_order","tags":["봇답답","상담사요청","배송문제"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-10","timestamp":"2025-04-14T11:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"이메일 문의 답변이 너무 늦어요 3일 됐어요"},{"role":"agent","text":"불편드려 죄송합니다. 이메일 문의 내용과 이메일 주소 알려주시면 처리 상황 확인해드릴게요."},{"role":"customer","text":"cs@chorok.com 으로 보냈고 이메일은 test@gmail.com이에요"},{"role":"agent","text":"확인해보겠습니다. 영업일 기준 1-2일이 원칙이지만 지연이 있었네요. 죄송합니다. 현재 저를 통해 문제 해결해드릴 수 있으면 바로 진행하겠습니다. 어떤 내용이었나요?"}],"resolution":"escalated","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["이메일답변지연","3일","에스컬레이션"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-11","timestamp":"2025-04-15T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"이메일 답변은 보통 얼마나 걸려요?"},{"role":"agent","text":"24시간 내로 답변드립니다."},{"role":"customer","text":"주말도요?"},{"role":"agent","text":"아, 죄송합니다. 주말과 공휴일 제외 영업일 기준 1-2일입니다. 주말에 보내시면 월요일부터 처리됩니다."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["이메일답변기간","오답수정","agent_jung","24시간→1-2영업일"],"agent_accuracy":"partially_correct","accuracy_note":"이메일 답변 영업일 1-2일인데 agent_jung이 24시간 이내라고 오안내 후 수정."} +{"conversation_id":"CHAT-2025-04-12","timestamp":"2025-04-16T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"비밀번호 재설정 링크를 클릭했는데 만료됐다고 해요"},{"role":"agent","text":"비밀번호 재설정 링크는 발송 후 30분 내에 사용하셔야 합니다. 만료된 경우 '비밀번호 찾기'에서 다시 발송 요청하시면 됩니다."}],"resolution":"resolved","primary_intent":"recover_password","secondary_intent":null,"tags":["재설정링크만료","30분유효","재발송"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-13","timestamp":"2025-04-17T10:30:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"채팅 상담 대기 시간이 너무 길어요"},{"role":"agent","text":"죄송합니다. 현재 문의량이 많아 대기가 발생하고 있어요. 긴급하신 경우 전화(1588-1234, 평일 9-18시)로 연락하시거나 이메일(cs@chorok.com)로 문의하시면 됩니다. 가능하면 주문번호를 미리 준비해두시면 더 빠르게 처리됩니다."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["채팅대기","전화이메일대안","대기시간"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-14","timestamp":"2025-04-18T09:00:00+09:00","channel":"live_chat","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"VIP 전담 상담사가 있다고 했는데 연결하고 싶어요"},{"role":"agent","text":"안녕하세요! 저 자신이 VIP 전담 상담 팀입니다. VIP 고객님은 일반 대기 없이 우선 연결됩니다. 어떻게 도와드릴까요?"},{"role":"customer","text":"오 생각보다 빠르네요 배송 문제인데"},{"role":"agent","text":"VIP 고객님은 항상 우선 배정됩니다. 주문번호 알려주시면 바로 확인해드릴게요."}],"resolution":"resolved","primary_intent":"contact_human_agent","secondary_intent":null,"tags":["VIP전담","우선연결","배송문제"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-15","timestamp":"2025-04-21T14:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"새 비밀번호 설정 조건이 있나요?"},{"role":"agent","text":"비밀번호는 8자 이상, 영문 대소문자/숫자/특수문자 중 2가지 이상 조합이어야 합니다. 이전에 사용한 비밀번호와 동일하게 설정은 불가합니다."}],"resolution":"resolved","primary_intent":"recover_password","secondary_intent":null,"tags":["비밀번호조건","8자이상","조합"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-16","timestamp":"2025-04-22T11:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"주말에도 상담 받을 수 있나요?"},{"role":"agent","text":"주말과 공휴일은 전화/채팅 유인 상담이 불가합니다. 앱 내 자동 챗봇은 24시간 이용 가능하고, 이메일 문의는 가능하지만 답변은 다음 영업일부터 처리됩니다."},{"role":"customer","text":"긴급한 건인데"},{"role":"agent","text":"긴급 상황(미수령 구매 사고 등)은 이메일 제목에 '긴급'을 표기하시면 우선 처리됩니다. 또는 월요일 오전 9시 오픈 즉시 전화하시는 방법을 권장드립니다."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["주말상담불가","챗봇24시간","긴급이메일"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-17","timestamp":"2025-04-23T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"로그인이 안 되는데 계정이 없어진 건가요?"},{"role":"agent","text":"계정이 삭제되지는 않았을 거예요. 어떤 로그인 방법을 사용하셨나요?"},{"role":"customer","text":"이메일 로그인이요"},{"role":"agent","text":"비밀번호를 잘못 입력하셨거나 이메일 주소가 다를 수 있어요. 비밀번호 찾기를 시도해보시고, 그래도 안 되면 가입할 때 쓴 이메일 주소인지 확인해보세요. 계정 존재 여부는 고객센터에서 확인 가능합니다."}],"resolution":"partially_resolved","primary_intent":"recover_password","secondary_intent":"contact_customer_service","tags":["로그인실패","계정존재여부","비밀번호찾기"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-18","timestamp":"2025-04-24T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"챗봇 말고 사람이랑 연결하는 방법이 있어요?"},{"role":"agent","text":"채팅 상담창에서 '상담사 연결' 버튼을 누르시면 유인 상담으로 전환됩니다. 평일 9-18시에만 가능하며 대기가 있을 수 있어요."},{"role":"customer","text":"지금 몇 분 기다려야 해요?"},{"role":"agent","text":"현재 대기 인원이 3명이라 약 5-10분 예상됩니다."}],"resolution":"resolved","primary_intent":"contact_human_agent","secondary_intent":null,"tags":["상담사연결버튼","대기시간","5-10분"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-19","timestamp":"2025-04-25T10:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"구글 계정으로 가입했는데 비밀번호 모르겠어요"},{"role":"agent","text":"구글 계정으로 가입하셨다면 저희 서비스 비밀번호가 별도로 없어요. 구글 계정 비밀번호는 구글(accounts.google.com)에서 관리하시면 됩니다."},{"role":"customer","text":"구글 비밀번호는 기억하는데 로그인이 안 돼요"},{"role":"agent","text":"구글 계정으로 로그인 시도 시 구글 2단계 인증이 걸려있거나 구글 계정 자체에 문제가 있을 수 있어요. 구글 계정 먼저 확인해보시겠어요?"}],"resolution":"partially_resolved","primary_intent":"recover_password","secondary_intent":null,"tags":["구글계정","소셜로그인","구글비밀번호별도"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-20","timestamp":"2025-04-26T15:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"고객센터에 몇 번 전화해도 연결이 안 돼요"},{"role":"agent","text":"죄송합니다. 특히 오전 9시 오픈 직후와 점심 시간대에 혼잡합니다. 평일 오후 2-4시에 연결이 잘 되는 편이에요. 또는 채팅 상담이나 이메일로 문의 주시면 더 빠를 수 있어요."},{"role":"customer","text":"채팅으로 하면 빠를까요?"},{"role":"agent","text":"저희가 지금 채팅으로 연결 중이에요! 바로 해결해드릴게요. 문제가 무엇인지 말씀해주세요."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["전화연결실패","혼잡시간","채팅대안"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-21","timestamp":"2025-04-28T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"공휴일에도 전화 상담 돼요?"},{"role":"agent","text":"네, 공휴일에도 전화 상담 가능합니다."},{"role":"customer","text":"어제 공휴일이었는데 전화 안 됐어요"},{"role":"agent","text":"죄송합니다, 제가 잘못 안내드렸어요. 공휴일은 전화 및 채팅 상담이 운영하지 않습니다. 평일 9시-18시에만 가능합니다."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["공휴일상담","오답수정","agent_jung","운영안함"],"agent_accuracy":"incorrect","accuracy_note":"공휴일 전화 상담 운영 안 함인데 agent_jung이 가능하다고 잘못 안내."} +{"conversation_id":"CHAT-2025-04-22","timestamp":"2025-04-29T14:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"비밀번호를 너무 많이 틀렸어요"},{"role":"agent","text":"5회 이상 틀리면 계정이 30분간 잠깁니다. 30분 후 다시 시도하시거나 '비밀번호 찾기'로 재설정하시는 게 빠릅니다."}],"resolution":"resolved","primary_intent":"recover_password","secondary_intent":null,"tags":["비밀번호5회실패","30분잠금","재설정"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-23","timestamp":"2025-04-30T10:00:00+09:00","channel":"live_chat","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"상담 이력을 확인하고 싶어요"},{"role":"agent","text":"앱 마이페이지 > 상담 내역에서 최근 6개월 상담 이력 확인 가능합니다. 더 오래된 내역은 고객센터에 요청하시면 됩니다."},{"role":"customer","text":"1년 전 상담 내용도 볼 수 있나요?"},{"role":"agent","text":"1년 이상 된 내역은 앱에서 직접 조회가 어려울 수 있습니다. 고객센터(이메일 또는 전화)로 요청하시면 담당팀에서 확인해드립니다."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["상담이력","6개월조회","1년초과고객센터","VIP"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-24","timestamp":"2025-04-30T14:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"문자로 상담할 수 있나요?"},{"role":"agent","text":"문자(SMS) 상담은 지원하지 않습니다. 카카오톡, 앱 내 채팅, 전화, 이메일로 문의 가능합니다."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["SMS상담불가","지원채널","카카오채팅"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-25","timestamp":"2025-04-30T15:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"사람 상담사를 먼저 연결해달라고 요청할 수 있나요?"},{"role":"agent","text":"채팅 상담의 경우 처음 챗봇 응대 후 '상담사 연결' 요청하시거나, 전화로 바로 연결하시면 됩니다. 저도 지금 실시간 상담사로 연결되신 거예요!"}],"resolution":"resolved","primary_intent":"contact_human_agent","secondary_intent":null,"tags":["상담사우선연결","챗봇우회","전화직접"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-26","timestamp":"2025-04-30T16:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"상담 내용을 저장할 수 있나요?"},{"role":"agent","text":"채팅 상담 종료 후 '상담 내역 저장' 버튼을 누르시면 PDF나 텍스트로 저장 가능합니다. 또는 상담 종료 시 이메일로 상담 내역을 발송 받을 수도 있어요."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["상담내용저장","PDF","이메일발송"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-27","timestamp":"2025-04-30T17:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"비밀번호 재설정을 했는데 로그인이 여전히 안 돼요"},{"role":"agent","text":"재설정 후 로그인 시 새 비밀번호를 정확히 입력하셨나요? 대소문자 구분도 확인해보세요. 혹시 다른 기기에서 로그인 시도 중이시면 그 기기의 저장된 비밀번호가 아닌 새 비밀번호를 수동으로 입력해보세요."},{"role":"customer","text":"아 저장된 걸 쓰고 있었네요 수동으로 하니까 됐어요"}],"resolution":"resolved","primary_intent":"recover_password","secondary_intent":null,"tags":["재설정후로그인불가","저장비밀번호","수동입력"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-28","timestamp":"2025-04-30T17:30:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"상담사가 이전 문의 내용을 볼 수 있나요?"},{"role":"agent","text":"네, 상담사는 고객님의 최근 상담 이력과 주문 내역을 확인하며 상담합니다. 이전 문의 내용을 다시 설명하지 않으셔도 됩니다."},{"role":"customer","text":"개인정보가 다 보이는 건가요?"},{"role":"agent","text":"상담에 필요한 주문 정보, 상담 이력만 확인합니다. 결제 카드 전체 번호 등 민감 정보는 마스킹 처리되어 상담사에게 노출되지 않습니다."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["상담이력공유","개인정보마스킹","상담효율"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-04-29","timestamp":"2025-04-30T18:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"고객센터 영어 상담도 되나요?"},{"role":"agent","text":"네, 영어 상담도 가능합니다."},{"role":"customer","text":"영어 상담사 연결해주세요"},{"role":"agent","text":"죄송합니다, 확인해보니 현재 영어 전문 상담은 지원하지 않습니다. 이메일로 영문 문의 주시면 번역하여 처리해드리겠습니다."}],"resolution":"partially_resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["영어상담불가","오답수정","agent_jung","이메일대안"],"agent_accuracy":"partially_correct","accuracy_note":"영어 상담 미지원인데 agent_jung이 가능하다고 안내 후 수정."} +{"conversation_id":"CHAT-2025-04-030","timestamp":"2025-04-30T19:00:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_lee","turns":[{"role":"customer","text":"VIP는 상담 대기 시간이 없는 건가요?"},{"role":"agent","text":"VIP 고객님은 일반 대기열 앞으로 우선 배정됩니다. 완전 무대기는 아닐 수 있지만 일반 고객 대비 훨씬 빠르게 연결됩니다. 전화 상담도 VIP 전용 번호로 연결하시면 더 빠릅니다."},{"role":"customer","text":"VIP 전용 번호가 따로 있어요?"},{"role":"agent","text":"네, VIP 전용 상담 번호는 1588-1235입니다. 가입 확인 문자에 안내됐을 거예요."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["VIP우선연결","전용번호","대기단축"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2025-05.jsonl b/src/main/resources/data/layer3_chatlogs/2025-05.jsonl new file mode 100644 index 0000000..00db204 --- /dev/null +++ b/src/main/resources/data/layer3_chatlogs/2025-05.jsonl @@ -0,0 +1,30 @@ +{"conversation_id":"CHAT-2025-05-001","timestamp":"2025-05-02T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"뉴스레터 구독 어떻게 해요?"},{"role":"agent","text":"앱 마이페이지 > 알림 설정 > 뉴스레터 수신 허용으로 구독 가능합니다. 또는 메인 화면 하단에서 이메일을 입력하면 바로 구독할 수 있어요. 매주 화요일에 발송됩니다."}],"resolution":"resolved","primary_intent":"newsletter_subscription","secondary_intent":null,"tags":["뉴스레터구독","알림설정","매주화요일"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-002","timestamp":"2025-05-03T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"뉴스레터 수신 거부하고 싶어요"},{"role":"agent","text":"뉴스레터 하단의 '수신거부' 링크를 클릭하시면 즉시 해제됩니다. 앱 마이페이지 > 알림 설정에서도 해제 가능합니다."}],"resolution":"resolved","primary_intent":"newsletter_subscription","secondary_intent":null,"tags":["뉴스레터해지","수신거부","즉시해제"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-003","timestamp":"2025-05-04T09:15:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"뉴스레터 해지하고 싶어요"},{"role":"agent","text":"고객센터로 전화해서 신청하셔야 합니다."},{"role":"customer","text":"이메일 하단에 해지 링크 없나요?"},{"role":"agent","text":"맞습니다, 죄송해요. 뉴스레터 하단에 '수신거부' 링크가 있어서 클릭하시면 즉시 해제됩니다. 고객센터 연락 없이 직접 해제 가능합니다."}],"resolution":"resolved","primary_intent":"newsletter_subscription","secondary_intent":null,"tags":["뉴스레터해지","오답수정","agent_jung","링크해제"],"agent_accuracy":"partially_correct","accuracy_note":"뉴스레터 하단 링크로 즉시 해지 가능한데 agent_jung이 고객센터 전화 필요하다고 잘못 안내."} +{"conversation_id":"CHAT-2025-05-004","timestamp":"2025-05-07T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"배송이 너무 늦어서 화가 나요 어디에 불만 접수해요?"},{"role":"agent","text":"불편드려 정말 죄송합니다. 저한테 바로 말씀해주시면 처리해드릴 수 있어요. 주문번호 알려주시면 즉시 확인하겠습니다."},{"role":"customer","text":"20250506-7712"},{"role":"agent","text":"확인했습니다. 예정보다 2일 지연된 상황이네요. 물류팀에 긴급 확인 요청 드리고 지연 사과 쿠폰 3,000원 발급해드리겠습니다. 정말 죄송합니다."}],"resolution":"resolved","primary_intent":"complaint","secondary_intent":null,"tags":["배송지연불만","쿠폰보상","직접처리"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-005","timestamp":"2025-05-08T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"리뷰 어떻게 작성해요?"},{"role":"agent","text":"배송 완료 후 앱 나의 주문 > 해당 주문에서 '리뷰 작성' 버튼을 누르시면 됩니다. 별점과 텍스트, 사진을 첨부할 수 있어요. 수령 후 90일 이내에 작성 가능합니다."}],"resolution":"resolved","primary_intent":"review","secondary_intent":null,"tags":["리뷰작성","배송완료후","90일이내"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-006","timestamp":"2025-05-09T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"리뷰 쓰면 포인트 얼마나 쌓여요?"},{"role":"agent","text":"텍스트 리뷰 작성 시 100포인트, 사진 포함 시 500포인트 추가 적립됩니다. 포인트는 리뷰 작성 승인 후 1-2영업일 내에 지급됩니다."}],"resolution":"resolved","primary_intent":"review","secondary_intent":null,"tags":["리뷰포인트","텍스트100","사진500","승인후지급"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-007","timestamp":"2025-05-12T10:30:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_jung","turns":[{"role":"customer","text":"리뷰 쓰면 포인트 바로 주나요?"},{"role":"agent","text":"네, 작성하면 즉시 포인트가 적립됩니다."},{"role":"customer","text":"오늘 쓴 거 포인트가 없어요"},{"role":"agent","text":"죄송합니다, 제가 잘못 안내드렸어요. 리뷰는 운영팀 승인 후 1-2영업일 내에 포인트가 지급됩니다. 즉시 지급이 아닙니다."}],"resolution":"resolved","primary_intent":"review","secondary_intent":null,"tags":["리뷰포인트적립","오답수정","agent_jung","즉시→승인후"],"agent_accuracy":"partially_correct","accuracy_note":"리뷰 포인트는 승인 후 1-2영업일 지급인데 agent_jung이 즉시라고 오안내."} +{"conversation_id":"CHAT-2025-05-008","timestamp":"2025-05-13T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"상담사가 불친절했어요 불만 접수하고 싶어요"},{"role":"agent","text":"불편하셨다니 정말 죄송합니다. 어떤 상황이었는지 말씀해주시면 팀장에게 보고하고 해당 상담사에 대해 조치하겠습니다. 고객 만족을 최우선으로 여기고 있어서 이런 피드백이 매우 중요합니다."},{"role":"customer","text":"어제 전화 상담에서 반말을 했어요"},{"role":"agent","text":"매우 부적절한 응대였습니다. 어제 오후 몇 시 경 통화하셨는지 알려주시면 해당 통화 녹음 확인 후 조치하겠습니다. 진심으로 사과드립니다."}],"resolution":"escalated","primary_intent":"complaint","secondary_intent":null,"tags":["상담사불친절","불만접수","팀장보고","통화녹음"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-009","timestamp":"2025-05-14T14:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"리뷰를 수정하고 싶어요"},{"role":"agent","text":"앱 나의 주문 > 리뷰 내역에서 작성한 리뷰를 수정할 수 있습니다. 단 리뷰당 1회 수정 가능하고, 최초 작성 후 7일 이내에만 수정 가능합니다."}],"resolution":"resolved","primary_intent":"review","secondary_intent":null,"tags":["리뷰수정","1회수정","7일이내"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-010","timestamp":"2025-05-15T11:00:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"상품이 불량이라 너무 화가 나요"},{"role":"agent","text":"정말 죄송합니다. 불량 상품을 받으셨다면 빠르게 처리해드릴게요. 불량 부위 사진과 주문번호 알려주시면 즉시 무료 반품 및 교체 또는 전액 환불 진행해드릴게요."},{"role":"customer","text":"20250514-5501이고 사진은 이메일로 보내드릴게요"},{"role":"agent","text":"cs@chorok.com으로 사진 보내주시면 제가 바로 연결해서 처리하겠습니다. VIP 고객님이시니 우선 처리해드릴게요. 정말 죄송합니다."}],"resolution":"escalated","primary_intent":"complaint","secondary_intent":"return_request","tags":["불량상품","VIP우선처리","무료반품"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-011","timestamp":"2025-05-16T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"뉴스레터 주제가 너무 많아서 일부만 받고 싶어요"},{"role":"agent","text":"현재 뉴스레터는 일괄 구독/해지 방식이라 특정 주제만 선택 수신은 지원하지 않습니다. 전체 수신 또는 전체 해지 중 선택하셔야 합니다."}],"resolution":"resolved","primary_intent":"newsletter_subscription","secondary_intent":null,"tags":["뉴스레터선택수신불가","전체구독해지"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-012","timestamp":"2025-05-19T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"리뷰를 삭제할 수 있나요?"},{"role":"agent","text":"작성한 리뷰 삭제는 앱 나의 주문 > 리뷰 내역에서 직접 가능합니다. 다만 삭제 후 해당 리뷰 포인트는 회수됩니다."},{"role":"customer","text":"포인트가 회수된다고요?"},{"role":"agent","text":"네, 리뷰 포인트는 리뷰가 게시된 동안만 유효합니다. 삭제 시 적립된 포인트가 차감됩니다."}],"resolution":"resolved","primary_intent":"review","secondary_intent":null,"tags":["리뷰삭제","포인트회수","주의"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-013","timestamp":"2025-05-20T10:30:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"뉴스레터 이메일을 변경하고 싶어요"},{"role":"agent","text":"뉴스레터 수신 이메일은 계정 등록 이메일과 연동됩니다. 이메일 변경은 마이페이지 > 회원 정보 수정에서 가능하며, 변경 후 뉴스레터도 새 이메일로 발송됩니다."}],"resolution":"resolved","primary_intent":"newsletter_subscription","secondary_intent":"edit_account","tags":["뉴스레터이메일변경","계정이메일연동"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-014","timestamp":"2025-05-21T15:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"정식으로 불만 접수를 하고 싶어요"},{"role":"agent","text":"앱 마이페이지 > 고객의 소리 > 불만 접수에서 공식 불만 신고가 가능합니다. 영업일 2-3일 내에 담당자가 확인 후 연락드립니다. 저를 통해서도 바로 접수 도와드릴 수 있어요."},{"role":"customer","text":"두 군데 다 해도 될까요?"},{"role":"agent","text":"가능합니다. 두 경로 모두 접수하시면 더 빠르게 처리될 수 있어요."}],"resolution":"resolved","primary_intent":"complaint","secondary_intent":null,"tags":["불만접수","고객의소리","공식신고"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-015","timestamp":"2025-05-22T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"다른 사람이 내 리뷰에 악플을 달았어요"},{"role":"agent","text":"리뷰 댓글에 부적절한 내용이 있다면 해당 댓글 오른쪽 '신고' 버튼으로 신고해주시면 됩니다. 운영팀이 확인 후 조치합니다."}],"resolution":"resolved","primary_intent":"complaint","secondary_intent":"review","tags":["리뷰악플","댓글신고","운영팀조치"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-016","timestamp":"2025-05-23T14:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"리뷰를 쓸 수 없다는 메시지가 떠요"},{"role":"agent","text":"수령 후 90일이 지나셨거나 이미 해당 상품에 리뷰를 작성하셨다면 작성이 불가합니다. 주문번호 알려주시면 확인해드릴게요."},{"role":"customer","text":"20250520-3301"},{"role":"agent","text":"확인했습니다. 이미 해당 상품에 대해 리뷰가 작성돼 있어요. 1개 상품당 1개 리뷰만 가능합니다. 수정은 가능하니 나의 주문 > 리뷰 내역에서 수정해보세요."}],"resolution":"resolved","primary_intent":"review","secondary_intent":null,"tags":["리뷰작성불가","중복리뷰","1상품1리뷰"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-017","timestamp":"2025-05-26T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"뉴스레터가 스팸으로 분류돼요"},{"role":"agent","text":"이메일 서비스에서 저희 발신 도메인(chorok.com)을 수신 허용 목록에 추가해주세요. 스팸 폴더에서 해당 이메일을 선택 후 '스팸 아님'으로 표시하시면 앞으로 정상 수신됩니다."}],"resolution":"resolved","primary_intent":"newsletter_subscription","secondary_intent":null,"tags":["뉴스레터스팸","수신허용","스팸아님"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-018","timestamp":"2025-05-27T14:30:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"상담이 만족스럽지 않아서 재상담 받고 싶어요"},{"role":"agent","text":"물론이죠! 어떤 부분이 해결되지 않으셨는지 말씀해주시면 다시 도와드리겠습니다. VIP 고객님께는 팀장급 상담으로 연결해드릴 수도 있어요."},{"role":"customer","text":"반품 처리가 2주째 안 되고 있어요"},{"role":"agent","text":"2주는 너무 오래됐네요. 주문번호 알려주시면 제가 직접 해당 건 처리팀에 긴급 에스컬레이션 하겠습니다."}],"resolution":"escalated","primary_intent":"complaint","secondary_intent":"get_refund","tags":["재상담","불만족","VIP팀장","긴급에스컬레이션"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-019","timestamp":"2025-05-28T11:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"뉴스레터 해지했는데 계속 와요"},{"role":"agent","text":"수신거부 처리는 최대 7일 소요됩니다."},{"role":"customer","text":"2주 됐는데도 와요"},{"role":"agent","text":"죄송합니다, 제가 부정확하게 안내드렸어요. 수신거부는 보통 24-48시간 내 적용됩니다. 2주가 지났다면 처리가 제대로 안 된 것 같아요. 이메일 주소 알려주시면 시스템에서 직접 해지 처리해드릴게요."}],"resolution":"resolved","primary_intent":"newsletter_subscription","secondary_intent":null,"tags":["수신거부미적용","오답수정","agent_jung","7일→48시간"],"agent_accuracy":"partially_correct","accuracy_note":"수신거부는 24-48시간 내 적용인데 agent_jung이 7일이라고 오안내."} +{"conversation_id":"CHAT-2025-05-020","timestamp":"2025-05-29T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"리뷰에 사진이 안 올라가요"},{"role":"agent","text":"사진 용량이 5MB를 초과하거나 지원하지 않는 파일 형식(JPG, PNG, GIF만 가능)일 수 있어요. 사진 크기를 줄이거나 파일 형식을 확인해보시겠어요?"},{"role":"customer","text":"JPG인데도 안 돼요"},{"role":"agent","text":"앱 캐시 삭제 후 다시 시도해보세요. 그래도 안 되면 저한테 사진을 이메일로 보내주시면 제가 대신 첨부해드릴 수 있어요."}],"resolution":"partially_resolved","primary_intent":"review","secondary_intent":null,"tags":["리뷰사진업로드실패","5MB제한","JPG PNG GIF"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-021","timestamp":"2025-05-30T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"리뷰가 게시가 안 됐어요"},{"role":"agent","text":"리뷰는 작성 후 운영팀 검토를 거쳐 게시됩니다. 보통 1-2영업일 소요되고, 부적절한 내용이 포함된 경우 반려될 수 있어요."},{"role":"customer","text":"반려되면 알려줘요?"},{"role":"agent","text":"반려 시 앱 알림과 이메일로 반려 사유와 함께 안내됩니다. 사유 확인 후 수정하여 재작성 가능해요."}],"resolution":"resolved","primary_intent":"review","secondary_intent":null,"tags":["리뷰검토","1-2영업일","반려알림"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-022","timestamp":"2025-05-31T10:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"상품이 광고와 달라요 이건 어디에 신고해요?"},{"role":"agent","text":"허위 과장 광고 불만은 앱 > 해당 상품 > '신고하기'에서 접수 가능합니다. 공식 불만으로 처리 원하시면 고객의 소리에도 접수해주세요. 관련 사진과 광고 내용 증거 보관해두시면 처리에 도움이 됩니다."}],"resolution":"resolved","primary_intent":"complaint","secondary_intent":null,"tags":["광고허위과장","상품신고","증거보관"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-023","timestamp":"2025-05-31T14:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"리뷰 작성 안 해도 포인트 받는 방법이 있나요?"},{"role":"agent","text":"리뷰 외에 포인트를 받는 방법으로는 상품 구매 시 1% 적립, 이벤트 참여, 친구 초대 등이 있습니다. 리뷰 포인트(텍스트 100점, 사진 500점)가 가장 높은 편이에요."}],"resolution":"resolved","primary_intent":"review","secondary_intent":"loyalty_points","tags":["리뷰외포인트","이벤트","친구초대","구매적립"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-024","timestamp":"2025-05-31T15:30:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"동일 상품 다시 구매했는데 리뷰를 또 쓸 수 있나요?"},{"role":"agent","text":"동일 상품을 재구매한 경우 각 주문 건에 대해 별도로 리뷰 작성 가능합니다. 주문 기준이라 동일 상품이라도 주문이 다르면 각각 작성하실 수 있어요."}],"resolution":"resolved","primary_intent":"review","secondary_intent":null,"tags":["재구매리뷰","주문별작성가능","VIP"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-025","timestamp":"2025-05-31T16:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"뉴스레터 내용이 부적절해요 신고하고 싶어요"},{"role":"agent","text":"뉴스레터 하단의 '콘텐츠 신고' 링크를 통해 신고 가능합니다. 또는 cs@chorok.com으로 해당 뉴스레터 내용과 함께 신고 이유를 보내주세요. 운영팀에서 검토 후 조치합니다."}],"resolution":"resolved","primary_intent":"complaint","secondary_intent":"newsletter_subscription","tags":["뉴스레터신고","부적절콘텐츠","이메일신고"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-026","timestamp":"2025-05-31T17:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"리뷰가 허위인 것 같아요"},{"role":"agent","text":"의심 리뷰는 해당 리뷰 옆 '신고' 버튼으로 신고해주시면 됩니다. 운영팀이 검토 후 허위 리뷰로 확인되면 삭제 조치합니다."}],"resolution":"resolved","primary_intent":"complaint","secondary_intent":"review","tags":["허위리뷰신고","운영팀검토"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-027","timestamp":"2025-05-31T17:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"여러 개 구매했는데 리뷰를 한꺼번에 쓸 수 있나요?"},{"role":"agent","text":"각 상품별로 개별 리뷰 작성이 필요합니다. 한 주문 내 여러 상품을 구매하셨다면 각각 따로 작성하셔야 합니다. 앱 나의 주문 > 해당 주문에서 상품별 리뷰 작성 버튼이 있어요."}],"resolution":"resolved","primary_intent":"review","secondary_intent":null,"tags":["다수상품리뷰","개별작성","한번에불가"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-028","timestamp":"2025-05-31T18:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"반복적으로 같은 문제가 생겨서 공식 항의하고 싶어요"},{"role":"agent","text":"반복 민원은 고객 불만 시스템에 공식 접수 후 책임자 검토 대상이 됩니다. 이메일(cs@chorok.com)로 '공식 항의'라는 제목으로 발송하시면 일반 문의보다 우선 처리됩니다. 어떤 문제가 반복됐는지 구체적으로 작성해주시면 더 효과적입니다."}],"resolution":"resolved","primary_intent":"complaint","secondary_intent":null,"tags":["반복민원","공식항의","책임자검토","우선처리"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-05-029","timestamp":"2025-05-31T18:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"뉴스레터 수신거부가 며칠 안에 처리돼요?"},{"role":"agent","text":"영업일 기준 5-7일 소요됩니다."},{"role":"customer","text":"그렇게 오래 걸려요?"},{"role":"agent","text":"죄송합니다, 확인해보니 보통 24-48시간 내에 처리됩니다. 저도 기술 정책을 잘못 기억하고 있었어요."}],"resolution":"resolved","primary_intent":"newsletter_subscription","secondary_intent":null,"tags":["수신거부처리기간","오답수정","agent_jung","5-7일→48시간"],"agent_accuracy":"partially_correct","accuracy_note":"수신거부 24-48시간 처리인데 agent_jung이 5-7일이라고 오안내."} +{"conversation_id":"CHAT-2025-05-030","timestamp":"2025-05-31T19:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"리뷰 작성하면 혜택이 뭐가 있어요?"},{"role":"agent","text":"텍스트 리뷰 100포인트, 사진 포함 600포인트(텍스트 100 + 사진 500) 적립됩니다. 또한 '이달의 베스트 리뷰'에 선정되면 추가 5,000포인트와 앱 내 노출 혜택이 있어요."}],"resolution":"resolved","primary_intent":"review","secondary_intent":null,"tags":["리뷰혜택","포인트","베스트리뷰","노출혜택"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2025-06.jsonl b/src/main/resources/data/layer3_chatlogs/2025-06.jsonl new file mode 100644 index 0000000..1b5e046 --- /dev/null +++ b/src/main/resources/data/layer3_chatlogs/2025-06.jsonl @@ -0,0 +1,30 @@ +{"conversation_id":"CHAT-2025-06-001","timestamp":"2025-06-02T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"구매하면 포인트가 얼마나 쌓여요?"},{"role":"agent","text":"스탠다드 회원은 구매 금액의 1%, 플러스는 3%, VIP는 5% 적립됩니다. 포인트는 배송 완료 후 7일 뒤에 확정 적립됩니다."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["포인트적립률","1%3%5%","7일후적립"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-002","timestamp":"2025-06-03T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"포인트 적립이 얼마나 돼요?"},{"role":"agent","text":"스탠다드는 3%, 플러스는 5%, VIP는 7% 적립됩니다."},{"role":"customer","text":"3%요? 다른 데서 1%라고 봤는데"},{"role":"agent","text":"죄송합니다, 제가 구버전 정책을 말씀드렸어요. 현재는 스탠다드 1%, 플러스 3%, VIP 5%입니다. 2024년 초에 정책이 변경됐어요."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["포인트적립률","오답수정","agent_jung","3%→1%"],"agent_accuracy":"incorrect","accuracy_note":"현행 적립률은 스탠다드 1%/플러스 3%/VIP 5%인데 agent_jung이 구버전(3%/5%/7%)으로 안내."} +{"conversation_id":"CHAT-2025-06-003","timestamp":"2025-06-04T09:15:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"영수증을 다운받고 싶어요"},{"role":"agent","text":"앱 나의 주문 > 해당 주문 > '결제 상세' > '영수증 다운로드'에서 PDF로 저장 가능합니다. 이메일 발송도 가능해요."}],"resolution":"resolved","primary_intent":"get_invoice","secondary_intent":null,"tags":["영수증다운로드","PDF","이메일발송"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-004","timestamp":"2025-06-05T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"플러스 등급이 되려면 얼마나 사야 해요?"},{"role":"agent","text":"연간 누적 구매 금액 200만원 이상이면 플러스 등급으로 전환됩니다. 등급 산정은 매월 1일 기준으로 갱신됩니다."},{"role":"customer","text":"200만원이 꽤 많네요"},{"role":"agent","text":"맞습니다. 다만 플러스 등급이 되면 포인트 3% 적립, 일반 배송 무료 혜택이 있어 자주 구매하시면 혜택이 커요."}],"resolution":"resolved","primary_intent":"membership_tiers","secondary_intent":null,"tags":["플러스등급","200만원","연간기준"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-005","timestamp":"2025-06-06T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"세금계산서 발행 가능한가요?"},{"role":"agent","text":"개인사업자나 법인의 경우 세금계산서 발행 가능합니다. 주문 완료 후 고객센터(cs@chorok.com)로 사업자등록번호, 주문번호, 담당자 이메일을 보내주시면 처리해드립니다."}],"resolution":"resolved","primary_intent":"check_invoice","secondary_intent":null,"tags":["세금계산서","사업자등록번호","이메일요청"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-006","timestamp":"2025-06-09T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"플러스 등급 기준이 얼마예요?"},{"role":"agent","text":"연간 150만원 이상 구매하시면 플러스 등급이에요."},{"role":"customer","text":"150만원이요? 200만원이라고 본 것 같은데"},{"role":"agent","text":"죄송합니다, 현재 기준은 200만원입니다. 이전에 150만원이었는데 정책이 변경됐어요. 제가 예전 기준을 말씀드렸어요."}],"resolution":"resolved","primary_intent":"membership_tiers","secondary_intent":null,"tags":["플러스기준","오답수정","agent_jung","150만→200만"],"agent_accuracy":"incorrect","accuracy_note":"현행 플러스 등급은 200만원인데 agent_jung이 구버전(150만원)으로 잘못 안내."} +{"conversation_id":"CHAT-2025-06-007","timestamp":"2025-06-10T10:30:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"VIP 등급 조건이 어떻게 되나요?"},{"role":"agent","text":"연간 누적 구매 금액 800만원 이상이면 VIP 등급입니다. VIP 혜택은 포인트 5% 적립, 우선 배송 무료, 전담 상담사 배정, 반품 우선 처리예요."},{"role":"customer","text":"800만원이 기준인데 이게 맞죠?"},{"role":"agent","text":"네 맞습니다. 2024년 이전에는 기준이 달랐지만 현재는 800만원이에요."}],"resolution":"resolved","primary_intent":"membership_tiers","secondary_intent":null,"tags":["VIP등급","800만원","VIP혜택","VIP"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-008","timestamp":"2025-06-11T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"포인트 유효기간이 있나요?"},{"role":"agent","text":"포인트 유효기간은 적립일로부터 2년입니다. 만료 30일 전에 앱 알림과 이메일로 안내됩니다. 만료 예정 포인트는 마이페이지 > 포인트 내역에서 확인 가능해요."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["포인트유효기간","2년","만료알림"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-009","timestamp":"2025-06-12T14:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"현금영수증 신청하고 싶어요"},{"role":"agent","text":"계좌이체 결제 시 주문 과정에서 현금영수증 신청 가능합니다. 미리 신청하지 못하셨다면 주문 완료 후 7일 이내에 고객센터로 주문번호와 현금영수증 번호(핸드폰 번호 또는 사업자번호) 알려주시면 처리해드립니다."}],"resolution":"resolved","primary_intent":"get_invoice","secondary_intent":null,"tags":["현금영수증","계좌이체","7일이내신청"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-010","timestamp":"2025-06-13T11:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_choi","turns":[{"role":"customer","text":"플러스인데 포인트가 1%밖에 안 쌓여요"},{"role":"agent","text":"플러스 등급은 3% 적립이 맞습니다. 주문번호 알려주시면 적립 내역 확인해드릴게요."},{"role":"customer","text":"20250612-3301"},{"role":"agent","text":"확인했습니다. 이번 주문은 쿠폰 할인 적용 후 결제 금액 기준으로 3% 적립됐어요. 할인 전 금액이 아닌 실결제 금액 기준이라 적어보이실 수 있어요."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["플러스포인트3%","실결제금액기준","쿠폰할인후"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-011","timestamp":"2025-06-16T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"등급은 언제 갱신돼요?"},{"role":"agent","text":"등급은 매월 1일 기준으로 전월까지의 연간 누적 구매 금액을 계산하여 갱신됩니다. 예를 들어 6월 1일에는 전년 6월부터 5월까지의 구매 금액이 반영됩니다."}],"resolution":"resolved","primary_intent":"membership_tiers","secondary_intent":null,"tags":["등급갱신","매월1일","연간누적"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-012","timestamp":"2025-06-17T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"영수증에 상품명이 없어요"},{"role":"agent","text":"앱 영수증 기본 양식에는 주문번호, 금액, 결제 수단이 표시됩니다. 상품명이 포함된 주문 상세 내역서는 '주문 상세' 페이지에서 별도 다운로드 가능합니다."},{"role":"customer","text":"세금계산서 말하는 건 아니고요"},{"role":"agent","text":"주문 상세 내역에 상품명, 수량, 단가가 포함됩니다. 나의 주문 > 해당 주문 > '주문 내역 다운로드'에서 확인해보세요."}],"resolution":"resolved","primary_intent":"get_invoice","secondary_intent":null,"tags":["영수증상품명","주문상세내역","다운로드"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-013","timestamp":"2025-06-18T10:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"포인트를 현금으로 바꿀 수 있나요?"},{"role":"agent","text":"포인트를 현금으로 환전하는 기능은 지원하지 않습니다. 포인트는 저희 앱 결제 시에만 사용 가능합니다."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["포인트현금전환불가","내부사용만"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-014","timestamp":"2025-06-19T15:00:00+09:00","channel":"live_chat","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"VIP에서 등급이 내려갈 수도 있나요?"},{"role":"agent","text":"연간 구매 금액이 800만원 미만으로 내려가면 다음 갱신 시 등급이 조정됩니다. 다만 이전 12개월 평균을 기준으로 하고, 한 달 단위로 재산정되니 갑작스러운 등급 하락은 잘 없습니다."},{"role":"customer","text":"등급 하락 전에 알려줘요?"},{"role":"agent","text":"등급 하락 예정 30일 전에 앱 알림으로 안내됩니다. 이를 통해 추가 구매로 등급 유지하실 수 있어요."}],"resolution":"resolved","primary_intent":"membership_tiers","secondary_intent":null,"tags":["VIP등급하락","사전알림30일","VIP"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-015","timestamp":"2025-06-20T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"포인트 적립률이 VIP면 몇 %예요?"},{"role":"agent","text":"VIP는 7% 적립됩니다."},{"role":"customer","text":"5%라고 들었는데요"},{"role":"agent","text":"맞습니다, 죄송합니다. 현재 VIP 적립률은 5%입니다. 이전에 7%였는데 정책이 바뀌었어요."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["VIP포인트","오답수정","agent_jung","7%→5%"],"agent_accuracy":"incorrect","accuracy_note":"VIP 포인트 현행 5%인데 agent_jung이 구버전(7%)으로 오안내."} +{"conversation_id":"CHAT-2025-06-016","timestamp":"2025-06-23T09:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"포인트 합산해서 한 번에 쓸 수 있나요?"},{"role":"agent","text":"보유한 포인트 전체를 한 번에 사용 가능합니다. 단 최소 1,000포인트 이상 보유 시 사용 가능하고, 1포인트 = 1원 적용입니다."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["포인트합산사용","최소1000포인트","1포인트=1원"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-017","timestamp":"2025-06-24T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"영수증을 과거 주문 것도 받을 수 있나요?"},{"role":"agent","text":"앱 나의 주문에서 최근 3년 주문 내역 조회 및 영수증 다운로드 가능합니다. 3년 초과 내역은 고객센터 문의 시 처리해드릴 수 있어요."}],"resolution":"resolved","primary_intent":"get_invoice","secondary_intent":null,"tags":["과거영수증","3년이내","3년초과고객센터"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-018","timestamp":"2025-06-25T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"구독 회원은 포인트 다르게 쌓이나요?"},{"role":"agent","text":"정기 구독 상품 구매 시에도 등급에 따른 포인트 적립이 동일하게 적용됩니다. 구독 자체에 별도 추가 적립은 없지만 구독 유지 시 별도 구독 혜택(배송비 무료 등)이 있습니다."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":"subscription","tags":["구독포인트","등급동일적용","구독혜택"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-019","timestamp":"2025-06-26T15:30:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"세금계산서 발행 기간이 있나요?"},{"role":"agent","text":"세금계산서는 주문 완료 월 기준으로 당월 내 또는 다음 달 10일 이내에 요청하셔야 합니다. 해당 기간이 지나면 발행이 어려울 수 있어요."}],"resolution":"resolved","primary_intent":"check_invoice","secondary_intent":null,"tags":["세금계산서기간","당월또는다음달10일","기한"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-020","timestamp":"2025-06-27T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"등급별 혜택을 한눈에 볼 수 있어요?"},{"role":"agent","text":"앱 마이페이지 > 등급 혜택에서 스탠다드, 플러스, VIP 별 혜택 비교표를 확인하실 수 있습니다. 배송비, 포인트, 반품, 상담 혜택이 정리되어 있어요."}],"resolution":"resolved","primary_intent":"membership_tiers","secondary_intent":null,"tags":["등급혜택비교","앱마이페이지","혜택표"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-021","timestamp":"2025-06-28T09:00:00+09:00","channel":"kakaotalk","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"이번 달 얼마나 사야 플러스 유지돼요?"},{"role":"agent","text":"등급은 연간 누적 기준이라 이번 달 구매만으로 바로 계산하기 어렵습니다. 앱 마이페이지 > 내 등급 현황에서 현재 연간 누적 구매 금액과 다음 등급까지 남은 금액을 확인하실 수 있어요."}],"resolution":"resolved","primary_intent":"membership_tiers","secondary_intent":null,"tags":["플러스유지","연간누적","등급현황확인"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-022","timestamp":"2025-06-29T14:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"포인트가 만료됐어요 복구 가능한가요?"},{"role":"agent","text":"만료된 포인트는 원칙적으로 복구가 어렵습니다. 다만 만료 안내를 받지 못하신 경우나 시스템 오류가 있었다면 고객센터로 문의 주시면 검토해드릴 수 있습니다."},{"role":"customer","text":"만료 알림을 못 받았어요"},{"role":"agent","text":"앱 알림 허용 여부 확인이 필요합니다. 알림이 꺼져 있었다면 예외 복구 신청이 어려울 수 있어요. 고객센터로 자세한 상황 설명해주시면 검토해드릴게요."}],"resolution":"partially_resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["포인트만료","복구어려움","알림미수신"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-023","timestamp":"2025-06-30T10:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"가족이랑 포인트를 합칠 수 있나요?"},{"role":"agent","text":"계정 간 포인트 합산이나 이전 기능은 지원하지 않습니다. 포인트는 각 계정에서만 사용 가능합니다."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["포인트이전불가","계정간합산불가"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-024","timestamp":"2025-06-30T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"플러스랑 VIP 포인트 차이가 얼마나 나요?"},{"role":"agent","text":"플러스 5%, VIP 7%로 2% 차이납니다."},{"role":"customer","text":"플러스가 5%예요? 3%라고 봤는데"},{"role":"agent","text":"맞습니다 죄송합니다. 현재 플러스 3%, VIP 5%입니다. 이전 정책을 말씀드렸어요. 두 등급 차이는 2%포인트입니다."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":"membership_tiers","tags":["플러스VIP포인트차이","오답수정","agent_jung","구버전혼용"],"agent_accuracy":"incorrect","accuracy_note":"플러스 3%/VIP 5%인데 agent_jung이 5%/7%로 구버전 안내."} +{"conversation_id":"CHAT-2025-06-025","timestamp":"2025-06-30T14:00:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"법인 영수증과 개인 영수증 다른가요?"},{"role":"agent","text":"개인 영수증(일반 결제 영수증)은 앱에서 바로 다운로드 가능합니다. 법인의 경우 세금계산서를 추가 발행 요청하시면 부가가치세 신고에 사용 가능한 공식 세금계산서를 받으실 수 있어요."}],"resolution":"resolved","primary_intent":"check_invoice","secondary_intent":null,"tags":["법인영수증","세금계산서","개인영수증","VIP"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-026","timestamp":"2025-06-30T15:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"마켓플레이스 구매도 등급 적립에 포함되나요?"},{"role":"agent","text":"마켓플레이스 판매자 상품 구매 금액도 연간 누적 구매 금액에 포함됩니다. 포인트 적립률은 본사 상품과 동일하게 적용됩니다."}],"resolution":"resolved","primary_intent":"membership_tiers","secondary_intent":"loyalty_points","tags":["마켓플레이스등급적립","구매금액포함"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-027","timestamp":"2025-06-30T16:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"포인트가 생각보다 적게 쌓였어요"},{"role":"agent","text":"주문번호 알려주시면 적립 내역 확인해드릴게요."},{"role":"customer","text":"20250629-5501"},{"role":"agent","text":"확인했습니다. 해당 주문에서 쿠폰 3,000원 할인 적용 후 실결제 금액 17,000원의 1%(스탠다드 기준) = 170포인트가 적립됐습니다. 포인트는 할인 전 금액이 아닌 실결제 금액 기준이에요."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["포인트적립확인","실결제금액기준","쿠폰후적립"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-028","timestamp":"2025-06-30T17:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"영수증이 필요한데 주문을 취소해버렸어요"},{"role":"agent","text":"취소된 주문도 영수증 조회가 가능합니다. 앱 나의 주문 > 취소 내역에서 해당 주문 확인 후 영수증 다운로드 하시면 됩니다. 단 취소 영수증으로 환불 금액이 반영된 형태로 발급됩니다."}],"resolution":"resolved","primary_intent":"get_invoice","secondary_intent":null,"tags":["취소주문영수증","취소내역조회","환불반영"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-029","timestamp":"2025-06-30T18:00:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"플러스 등급이 됐는데 혜택이 바로 적용되나요?"},{"role":"agent","text":"등급 갱신 시점(매월 1일)부터 혜택이 적용됩니다. 갱신 전에 플러스 기준을 달성하셔도 당월 혜택은 다음 달 1일부터 적용됩니다."},{"role":"customer","text":"그럼 오늘 달성해도 7월부터인 거네요?"},{"role":"agent","text":"정확합니다. 6월에 달성하시면 7월 1일부터 플러스 혜택이 적용됩니다."}],"resolution":"resolved","primary_intent":"membership_tiers","secondary_intent":null,"tags":["등급혜택적용시점","매월1일","다음달적용"],"agent_accuracy":"correct"} +{"conversation_id":"CHAT-2025-06-030","timestamp":"2025-06-30T19:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"스탠다드에서 플러스, 플러스에서 VIP까지 올리려면 각각 얼마가 필요해요?"},{"role":"agent","text":"스탠다드에서 플러스는 연간 200만원, 플러스에서 VIP는 연간 800만원 기준입니다. VIP까지 올리시려면 연간 800만원 이상 구매하셔야 합니다. 각 등급별 포인트 적립률은 스탠다드 1%, 플러스 3%, VIP 5%예요."}],"resolution":"resolved","primary_intent":"membership_tiers","secondary_intent":"loyalty_points","tags":["등급기준전체","200만800만","1%3%5%"],"agent_accuracy":"correct"} From 28b34137cef4d50275f911311f406f4bb880002b Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sat, 9 May 2026 19:06:56 +0900 Subject: [PATCH 09/50] =?UTF-8?q?feat:=20md=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EB=B2=A1=ED=84=B0=20=EC=A0=80=EC=9E=A5=EC=86=8C=EC=97=90=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MarkdownReader로 md를 변환한 Document를 벡터 저장소에 저장. - 애플리케이션 실행하면 빈 생성 과정에서 SimpleVectorStore가 각 document에 대해 EmbeddingModel 호출하는 것 확인 가능 --- src/main/java/com/cholog/bootcamp/ChatbotController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cholog/bootcamp/ChatbotController.java b/src/main/java/com/cholog/bootcamp/ChatbotController.java index bc4b7fd..faf1b20 100644 --- a/src/main/java/com/cholog/bootcamp/ChatbotController.java +++ b/src/main/java/com/cholog/bootcamp/ChatbotController.java @@ -16,8 +16,9 @@ public class ChatbotController { private final ChatClient chatClient; - public ChatbotController(ChatClient.Builder builder, EmbeddingModel embeddingModel) { + public ChatbotController(ChatClient.Builder builder, EmbeddingModel embeddingModel, MarkdownReader markdownReader) { VectorStore vectorStore = SimpleVectorStore.builder(embeddingModel).build(); + vectorStore.add(markdownReader.loadAll()); this.chatClient = builder.defaultAdvisors( QuestionAnswerAdvisor.builder(vectorStore).build() ).build(); From 8759009e8e8647fd88d172164915d850d808b519 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sun, 10 May 2026 22:12:41 +0900 Subject: [PATCH 10/50] =?UTF-8?q?feat:=20=EC=9D=91=EB=8B=B5=20content=20ty?= =?UTF-8?q?pe=20json=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 기존에는 string 반환해 plain/text --- src/main/java/com/cholog/bootcamp/ChatbotController.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cholog/bootcamp/ChatbotController.java b/src/main/java/com/cholog/bootcamp/ChatbotController.java index faf1b20..f2706c6 100644 --- a/src/main/java/com/cholog/bootcamp/ChatbotController.java +++ b/src/main/java/com/cholog/bootcamp/ChatbotController.java @@ -1,5 +1,7 @@ package com.cholog.bootcamp; +import java.util.Map; + import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor; import org.springframework.ai.embedding.EmbeddingModel; @@ -25,10 +27,11 @@ public ChatbotController(ChatClient.Builder builder, EmbeddingModel embeddingMod } @PostMapping - public String chat(@RequestBody String question) { - return chatClient.prompt() + public Map chat(@RequestBody String question) { + String answer = chatClient.prompt() .user(question) .call() .content(); + return Map.of("answer", answer); } } From 8ec9bacec2b99983e4f7763dda1420a77c670b88 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sun, 10 May 2026 23:27:40 +0900 Subject: [PATCH 11/50] =?UTF-8?q?refactor:=20RequestBody=20dto=EB=A1=9C=20?= =?UTF-8?q?=EB=A7=A4=ED=95=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cholog/bootcamp/ChatRequest.java | 6 ++++++ src/main/java/com/cholog/bootcamp/ChatbotController.java | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/cholog/bootcamp/ChatRequest.java diff --git a/src/main/java/com/cholog/bootcamp/ChatRequest.java b/src/main/java/com/cholog/bootcamp/ChatRequest.java new file mode 100644 index 0000000..0e96272 --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/ChatRequest.java @@ -0,0 +1,6 @@ +package com.cholog.bootcamp; + +public record ChatRequest( + String question +) { +} diff --git a/src/main/java/com/cholog/bootcamp/ChatbotController.java b/src/main/java/com/cholog/bootcamp/ChatbotController.java index f2706c6..80e6f5e 100644 --- a/src/main/java/com/cholog/bootcamp/ChatbotController.java +++ b/src/main/java/com/cholog/bootcamp/ChatbotController.java @@ -27,9 +27,9 @@ public ChatbotController(ChatClient.Builder builder, EmbeddingModel embeddingMod } @PostMapping - public Map chat(@RequestBody String question) { + public Map chat(@RequestBody ChatRequest request) { String answer = chatClient.prompt() - .user(question) + .user(request.question()) .call() .content(); return Map.of("answer", answer); From d2901a6ce354a6f0b457299029bcbb6a6f38a719 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sun, 10 May 2026 23:29:12 +0900 Subject: [PATCH 12/50] =?UTF-8?q?refactor:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20incorrect=20=EC=9D=B4=EC=9C=A0=20=EA=B8=80=EC=9E=90=EC=88=98?= =?UTF-8?q?=202=EB=B0=B0=20=EC=A6=9D=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/evaluate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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: From 64ee9478a4f0dce375393a65eda23adb645a6547 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sun, 10 May 2026 23:51:24 +0900 Subject: [PATCH 13/50] =?UTF-8?q?refactor:=20topk=202=EB=B0=B0=20=EC=A6=9D?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 컨텍스트에 포함할 문서 개수를 늘려 핵심 사실을 포함할 수 있도록 수정 --- src/main/java/com/cholog/bootcamp/ChatbotController.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cholog/bootcamp/ChatbotController.java b/src/main/java/com/cholog/bootcamp/ChatbotController.java index 80e6f5e..b2e70cb 100644 --- a/src/main/java/com/cholog/bootcamp/ChatbotController.java +++ b/src/main/java/com/cholog/bootcamp/ChatbotController.java @@ -5,6 +5,7 @@ import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor; import org.springframework.ai.embedding.EmbeddingModel; +import org.springframework.ai.vectorstore.SearchRequest; import org.springframework.ai.vectorstore.SimpleVectorStore; import org.springframework.ai.vectorstore.VectorStore; import org.springframework.web.bind.annotation.PostMapping; @@ -22,7 +23,9 @@ public ChatbotController(ChatClient.Builder builder, EmbeddingModel embeddingMod VectorStore vectorStore = SimpleVectorStore.builder(embeddingModel).build(); vectorStore.add(markdownReader.loadAll()); this.chatClient = builder.defaultAdvisors( - QuestionAnswerAdvisor.builder(vectorStore).build() + QuestionAnswerAdvisor.builder(vectorStore) + .searchRequest(SearchRequest.builder().topK(8).build()) // default topK : 4 + .build() ).build(); } From aea6e109ae5cf0ec7eb858ef96dce5a515ce7140 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Mon, 11 May 2026 22:43:58 +0900 Subject: [PATCH 14/50] =?UTF-8?q?feat:=20=EB=94=94=EB=B2=84=EA=B9=85?= =?UTF-8?q?=EC=9A=A9=20=EC=97=94=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 참고한 k개 문서 정보 로그로 확인 가능 --- build.gradle | 1 + .../cholog/bootcamp/ChatbotController.java | 27 +++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 60ce723..0e77283 100644 --- a/build.gradle +++ b/build.gradle @@ -28,6 +28,7 @@ dependencies { 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.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } diff --git a/src/main/java/com/cholog/bootcamp/ChatbotController.java b/src/main/java/com/cholog/bootcamp/ChatbotController.java index b2e70cb..42e4b83 100644 --- a/src/main/java/com/cholog/bootcamp/ChatbotController.java +++ b/src/main/java/com/cholog/bootcamp/ChatbotController.java @@ -3,6 +3,7 @@ import java.util.Map; import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor; import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.vectorstore.SearchRequest; @@ -13,6 +14,9 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import lombok.extern.slf4j.Slf4j; + +@Slf4j @RequestMapping("/api/chat") @RestController public class ChatbotController { @@ -22,11 +26,12 @@ public class ChatbotController { public ChatbotController(ChatClient.Builder builder, EmbeddingModel embeddingModel, MarkdownReader markdownReader) { VectorStore vectorStore = SimpleVectorStore.builder(embeddingModel).build(); vectorStore.add(markdownReader.loadAll()); - this.chatClient = builder.defaultAdvisors( - QuestionAnswerAdvisor.builder(vectorStore) - .searchRequest(SearchRequest.builder().topK(8).build()) // default topK : 4 - .build() - ).build(); + QuestionAnswerAdvisor questionAnswerAdvisor = QuestionAnswerAdvisor.builder(vectorStore) + .searchRequest(SearchRequest.builder().topK(8).build()) + .build(); + this.chatClient = builder + .defaultAdvisors(questionAnswerAdvisor, new SimpleLoggerAdvisor()) + .build(); } @PostMapping @@ -37,4 +42,16 @@ public Map chat(@RequestBody ChatRequest request) { .content(); return Map.of("answer", answer); } + + @PostMapping("/debug") + public Map debugChat(@RequestBody ChatRequest request) { + Object RETRIEVED_DOCUMENTS = chatClient.prompt() + .user(request.question()) + .call() + .chatClientResponse() + .context() + .get(QuestionAnswerAdvisor.RETRIEVED_DOCUMENTS); + log.info("RETRIEVED_DOCUMENTS: {}", RETRIEVED_DOCUMENTS); + return Map.of("answer", "answer"); + } } From e3fe990e503a3afd2cc169b563555470c8abe837 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Mon, 11 May 2026 23:01:25 +0900 Subject: [PATCH 15/50] =?UTF-8?q?docs:=20deprecated=20=EB=AC=B8=EC=84=9C?= =?UTF-8?q?=20vector=20db=EC=97=90=EC=84=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 8개(topK) 문서 중 deprecated 문서가 섞여들어가 컨텍스트가 오염되고, 이로 인해 불필요한 정보 포함 및 정작 중요한 정보는 활용 못하는 문제 해결 --- .../deprecated/membership-tiers-final-v2.md | 34 ---------------- .../deprecated/point-earning-rules-old.md | 34 ---------------- .../deprecated/return-policy-v1.md | 40 ------------------- .../deprecated/return-policy-v2.md | 39 ------------------ .../deprecated/shipping-standard-2023.md | 36 ----------------- 5 files changed, 183 deletions(-) delete mode 100644 src/main/resources/data/layer2_policies/deprecated/membership-tiers-final-v2.md delete mode 100644 src/main/resources/data/layer2_policies/deprecated/point-earning-rules-old.md delete mode 100644 src/main/resources/data/layer2_policies/deprecated/return-policy-v1.md delete mode 100644 src/main/resources/data/layer2_policies/deprecated/return-policy-v2.md delete mode 100644 src/main/resources/data/layer2_policies/deprecated/shipping-standard-2023.md diff --git a/src/main/resources/data/layer2_policies/deprecated/membership-tiers-final-v2.md b/src/main/resources/data/layer2_policies/deprecated/membership-tiers-final-v2.md deleted file mode 100644 index e90bdb3..0000000 --- a/src/main/resources/data/layer2_policies/deprecated/membership-tiers-final-v2.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Membership Tier Policy -version: v2 -status: deprecated -effective_date: 2023-01-01 -deprecated_date: 2024-01-01 -superseded_by: membership-tiers.md -department: marketing -category: membership ---- - -# Membership Tier Policy v2 (2023) - -> ⚠️ This document is deprecated. VIP threshold was updated for 2024. See membership-tiers.md. - -## Tier Qualification (2023) - -| Tier | Annual Spending Threshold | -|------|--------------------------| -| Standard | Default | -| Plus | ≥ 150,000 won | -| VIP | ≥ 600,000 won | - -(Note: For 2024, thresholds were revised: Plus = 200,000 won, VIP = 800,000 won) - -## Benefits (2023) - -| Benefit | Standard | Plus | VIP | -|---------|---------|------|-----| -| Point rate | 1% | 3% | 5% | -| Free Economy shipping | ≥ 30,000 won | All orders | All orders | -| Free Priority shipping | — | — | All orders | - -(Note: Standard free shipping threshold was 30,000 won in 2023, reduced to 20,000 won in 2024) diff --git a/src/main/resources/data/layer2_policies/deprecated/point-earning-rules-old.md b/src/main/resources/data/layer2_policies/deprecated/point-earning-rules-old.md deleted file mode 100644 index 318ded7..0000000 --- a/src/main/resources/data/layer2_policies/deprecated/point-earning-rules-old.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Loyalty Point Earning Rules -version: v1 -status: deprecated -effective_date: 2022-01-01 -deprecated_date: 2023-06-01 -superseded_by: point-earning-rules.md -department: marketing -category: loyalty ---- - -# Loyalty Point Earning Rules v1 (Legacy) - -> ⚠️ This document is deprecated. Point rates were revised significantly in June 2023. -> Refer to point-earning-rules.md (v3) for current rates. - -## Legacy Earning Rates (Pre-June 2023) - -| Membership Tier | Earning Rate | -|----------------|--------------| -| Standard | **3%** of order subtotal | -| Gold | **5%** of order subtotal | -| VIP | **7%** of order subtotal | - -(Note: The membership tiers were renamed and restructured in 2023. "Gold" became "Plus". -Earning rates were reduced significantly to align with industry standards.) - -## Legacy Point Expiry - -Points expired **24 months** from the date earned (now reduced to 12 months). - -## Legacy Redemption - -Minimum redemption was **500 points** (now increased to 1,000 points). diff --git a/src/main/resources/data/layer2_policies/deprecated/return-policy-v1.md b/src/main/resources/data/layer2_policies/deprecated/return-policy-v1.md deleted file mode 100644 index 37a370e..0000000 --- a/src/main/resources/data/layer2_policies/deprecated/return-policy-v1.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: Return & Refund Policy -version: v1 -status: deprecated -effective_date: 2022-01-01 -deprecated_date: 2023-03-01 -superseded_by: return-policy-v2.md -department: customer_service -category: returns ---- - -# Return & Refund Policy v1 - -> ⚠️ This document is deprecated. Please refer to the current policy (return-policy-v3.md). - -## Standard Return Window - -All products may be returned within **7 calendar days** of delivery, provided the item is -unopened and in original packaging. - -### Non-Returnable Items - -- Clearance items -- Digital downloads -- Personalized items -- Food and beverages - -## Handling Fee - -Non-defect returns incur a handling fee of **5,000 won** deducted from the refund. - -## Refund Timeline - -Credit card refunds: 5–7 business days. -Bank transfer refunds: up to 10 business days. - -## Marketplace Items - -Marketplace items follow Cholog's standard 7-day return policy uniformly. -(Note: This was changed in v2 and v3 — Marketplace items now follow seller-specific policies.) diff --git a/src/main/resources/data/layer2_policies/deprecated/return-policy-v2.md b/src/main/resources/data/layer2_policies/deprecated/return-policy-v2.md deleted file mode 100644 index db5463f..0000000 --- a/src/main/resources/data/layer2_policies/deprecated/return-policy-v2.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Return & Refund Policy -version: v2 -status: deprecated -effective_date: 2023-03-01 -deprecated_date: 2024-04-01 -superseded_by: return-policy-v3.md -department: customer_service -category: returns ---- - -# Return & Refund Policy v2 - -> ⚠️ This document is deprecated. Please refer to the current policy (return-policy-v3.md). - -## Standard Return Window - -All products may be returned within **10 calendar days** of delivery. The item must be -unused with original packaging intact. - -### Exceptions - -| Category | Return Window | -|----------|--------------| -| Electronics | 7 days | -| Food & Beverages | Not returnable | -| Cosmetics | 7 days, must be unused | -| Marketplace Items | Per seller policy (3–14 days) | - -## Handling Fee - -Non-defect returns incur a handling fee of **3,000 won** deducted from the refund. -(Same as current v3 — but the return window differs.) - -## Refund Timeline - -Credit card refunds: 3–5 business days after inspection. -Kakao Pay / Naver Pay: Typically instant. -Bank transfer: Up to 7 business days. diff --git a/src/main/resources/data/layer2_policies/deprecated/shipping-standard-2023.md b/src/main/resources/data/layer2_policies/deprecated/shipping-standard-2023.md deleted file mode 100644 index e4b53ce..0000000 --- a/src/main/resources/data/layer2_policies/deprecated/shipping-standard-2023.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Standard Shipping Policy -version: v3 -status: deprecated -effective_date: 2023-01-01 -deprecated_date: 2024-01-01 -superseded_by: shipping-standard.md -department: logistics -category: shipping ---- - -# Standard Shipping Policy v3 (2023) - -> ⚠️ This document is deprecated. Free shipping threshold changed to 20,000 won effective -> 2024-01-01. Refer to the current shipping-standard.md. - -## Shipping Tiers (2023) - -| Tier | Fee | Delivery Time | -|------|-----|---------------| -| Economy | 2,500 won | 2–4 business days | -| Priority | 5,000 won | Next business day by noon | -| Same-Day | 8,000 won | Same day (Seoul/Gyeonggi) | - -## Free Shipping Threshold (2023) - -- **Standard members**: Economy shipping free on orders ≥ **30,000 won** -- **Plus members**: Economy shipping free on orders ≥ **15,000 won** -- **VIP members**: Priority shipping free on all orders - -(Note: As of 2024-01-01, Standard member threshold was reduced to 20,000 won and Plus -members now receive free Economy shipping on ALL orders with no minimum.) - -## Dispatch Cutoff - -Orders confirmed before **2 PM KST** (changed to 1 PM KST in 2024). From 071ec9bf9512eb53e2f7f581e287e30ba86b6b39 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Wed, 13 May 2026 23:26:22 +0900 Subject: [PATCH 16/50] =?UTF-8?q?refactor:=20advisor=20=EC=BB=A4=EC=8A=A4?= =?UTF-8?q?=ED=85=80=20=ED=85=9C=ED=94=8C=EB=A6=BF=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cholog/bootcamp/ChatbotController.java | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cholog/bootcamp/ChatbotController.java b/src/main/java/com/cholog/bootcamp/ChatbotController.java index 42e4b83..539969d 100644 --- a/src/main/java/com/cholog/bootcamp/ChatbotController.java +++ b/src/main/java/com/cholog/bootcamp/ChatbotController.java @@ -5,7 +5,9 @@ import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor; import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor; +import org.springframework.ai.chat.prompt.PromptTemplate; import org.springframework.ai.embedding.EmbeddingModel; +import org.springframework.ai.template.st.StTemplateRenderer; import org.springframework.ai.vectorstore.SearchRequest; import org.springframework.ai.vectorstore.SimpleVectorStore; import org.springframework.ai.vectorstore.VectorStore; @@ -24,13 +26,36 @@ public class ChatbotController { private final ChatClient chatClient; public ChatbotController(ChatClient.Builder builder, EmbeddingModel embeddingModel, MarkdownReader markdownReader) { + PromptTemplate customPromptTemplate = PromptTemplate.builder() + .renderer(StTemplateRenderer.builder().startDelimiterToken('<').endDelimiterToken('>').build()) + .template(""" + + + 아래는 컨텍스트 정보입니다. + + --------------------- + + --------------------- + + 컨텍스트 정보를 바탕으로 질문에 답하세요. + + 답변 시 아래 룰을 따르세요(예시는 예시일뿐 실제 응답은 컨텍스트 정보를 기반으로 합니다.): + 1. 사용자가 질문한 부분에 대해서만 답하기 보다는 관련 정보 중 사용자에게 유용한 정보라고 판단되면 함께 답변에 포함해주세요. + 예시) + Q. 적립 포인트 1점은 얼마의 가치인가요? + - 추천하지 않는 답변: "적립 포인트 1점의 가치는 1원입니다."와 같이 단순 정보만 제공하고 끝나는 답변. + - 추천하는 답변: 적립 포인트 모으는 방법, 적립 정책, 적립금 소멸, 적립금 가치 등 적립 포인트 관련 핵심 정보를 담은 간단명료한 답변. + """) + .build(); + VectorStore vectorStore = SimpleVectorStore.builder(embeddingModel).build(); vectorStore.add(markdownReader.loadAll()); - QuestionAnswerAdvisor questionAnswerAdvisor = QuestionAnswerAdvisor.builder(vectorStore) + QuestionAnswerAdvisor qaAdvisor = QuestionAnswerAdvisor.builder(vectorStore) + .promptTemplate(customPromptTemplate) .searchRequest(SearchRequest.builder().topK(8).build()) .build(); this.chatClient = builder - .defaultAdvisors(questionAnswerAdvisor, new SimpleLoggerAdvisor()) + .defaultAdvisors(qaAdvisor, new SimpleLoggerAdvisor()) .build(); } From 6eb21eea95335b8b91d2dfae360735f20a6948c1 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Thu, 14 May 2026 00:02:09 +0900 Subject: [PATCH 17/50] =?UTF-8?q?refactor:=20=ED=94=84=EB=A1=AC=ED=94=84?= =?UTF-8?q?=ED=8A=B8=20=EB=82=B4=20=ED=95=A0=EB=A3=A8=EC=8B=9C=EB=84=A4?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EB=B0=A9=EC=A7=80=20=EB=82=B4=EC=9A=A9=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 ++- src/main/java/com/cholog/bootcamp/ChatbotController.java | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 0e77283..273df38 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,8 @@ dependencies { 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.projectlombok:lombok' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } diff --git a/src/main/java/com/cholog/bootcamp/ChatbotController.java b/src/main/java/com/cholog/bootcamp/ChatbotController.java index 539969d..53768ca 100644 --- a/src/main/java/com/cholog/bootcamp/ChatbotController.java +++ b/src/main/java/com/cholog/bootcamp/ChatbotController.java @@ -39,8 +39,9 @@ public ChatbotController(ChatClient.Builder builder, EmbeddingModel embeddingMod 컨텍스트 정보를 바탕으로 질문에 답하세요. - 답변 시 아래 룰을 따르세요(예시는 예시일뿐 실제 응답은 컨텍스트 정보를 기반으로 합니다.): - 1. 사용자가 질문한 부분에 대해서만 답하기 보다는 관련 정보 중 사용자에게 유용한 정보라고 판단되면 함께 답변에 포함해주세요. + 답변 시 아래 룰을 따르세요: + 1. 절대 컨텍스트에 없는 내용을 추론하거나 지어내지 마세요. 응답은 컨텍스트 정보를 기반으로 확인되는 사실만 답합니다. + 2. 사용자가 질문한 부분에 대해서만 답하기 보다는 관련 정보 중 사용자에게 유용한 정보라고 판단되면 함께 답변에 포함해주세요. 예시) Q. 적립 포인트 1점은 얼마의 가치인가요? - 추천하지 않는 답변: "적립 포인트 1점의 가치는 1원입니다."와 같이 단순 정보만 제공하고 끝나는 답변. From 838f40898c9e7909e331245a23ede6fa21ff0cbe Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Fri, 15 May 2026 22:35:41 +0900 Subject: [PATCH 18/50] =?UTF-8?q?feat:=20=EC=B1=97=EB=B4=87=20=EC=9D=91?= =?UTF-8?q?=EB=8B=B5=EC=97=90=20token=20=EC=A0=95=EB=B3=B4=20=ED=8F=AC?= =?UTF-8?q?=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cholog/bootcamp/ChatbotController.java | 15 +++++++---- .../{ChatRequest.java => ChatbotRequest.java} | 2 +- .../com/cholog/bootcamp/ChatbotResponse.java | 27 +++++++++++++++++++ 3 files changed, 38 insertions(+), 6 deletions(-) rename src/main/java/com/cholog/bootcamp/{ChatRequest.java => ChatbotRequest.java} (65%) create mode 100644 src/main/java/com/cholog/bootcamp/ChatbotResponse.java diff --git a/src/main/java/com/cholog/bootcamp/ChatbotController.java b/src/main/java/com/cholog/bootcamp/ChatbotController.java index 53768ca..15deb31 100644 --- a/src/main/java/com/cholog/bootcamp/ChatbotController.java +++ b/src/main/java/com/cholog/bootcamp/ChatbotController.java @@ -5,6 +5,8 @@ import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor; import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor; +import org.springframework.ai.chat.metadata.Usage; +import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.chat.prompt.PromptTemplate; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.template.st.StTemplateRenderer; @@ -61,16 +63,19 @@ public ChatbotController(ChatClient.Builder builder, EmbeddingModel embeddingMod } @PostMapping - public Map chat(@RequestBody ChatRequest request) { - String answer = chatClient.prompt() + public ChatbotResponse chat(@RequestBody ChatbotRequest request) { + ChatResponse response = chatClient.prompt() .user(request.question()) .call() - .content(); - return Map.of("answer", answer); + .chatResponse(); + + String answer = response.getResult().getOutput().getText(); + Usage usage = response.getMetadata().getUsage(); + return ChatbotResponse.from(answer, usage); } @PostMapping("/debug") - public Map debugChat(@RequestBody ChatRequest request) { + public Map debugChat(@RequestBody ChatbotRequest request) { Object RETRIEVED_DOCUMENTS = chatClient.prompt() .user(request.question()) .call() diff --git a/src/main/java/com/cholog/bootcamp/ChatRequest.java b/src/main/java/com/cholog/bootcamp/ChatbotRequest.java similarity index 65% rename from src/main/java/com/cholog/bootcamp/ChatRequest.java rename to src/main/java/com/cholog/bootcamp/ChatbotRequest.java index 0e96272..fc45b7b 100644 --- a/src/main/java/com/cholog/bootcamp/ChatRequest.java +++ b/src/main/java/com/cholog/bootcamp/ChatbotRequest.java @@ -1,6 +1,6 @@ package com.cholog.bootcamp; -public record ChatRequest( +public record ChatbotRequest( String question ) { } diff --git a/src/main/java/com/cholog/bootcamp/ChatbotResponse.java b/src/main/java/com/cholog/bootcamp/ChatbotResponse.java new file mode 100644 index 0000000..95bc9d5 --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/ChatbotResponse.java @@ -0,0 +1,27 @@ +package com.cholog.bootcamp; + +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 + ) { + } +} From 162cb3c35fa7cb2d74e0a2ef4ff84accd1213659 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Fri, 15 May 2026 23:34:39 +0900 Subject: [PATCH 19/50] =?UTF-8?q?feat:=20=EB=94=94=EB=B2=84=EA=B9=85=20?= =?UTF-8?q?=EC=97=94=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EC=9D=91?= =?UTF-8?q?=EB=8B=B5=EC=97=90=20token=20=EC=A0=95=EB=B3=B4=20=ED=8F=AC?= =?UTF-8?q?=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cholog/bootcamp/ChatbotController.java | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/cholog/bootcamp/ChatbotController.java b/src/main/java/com/cholog/bootcamp/ChatbotController.java index 15deb31..bf734d8 100644 --- a/src/main/java/com/cholog/bootcamp/ChatbotController.java +++ b/src/main/java/com/cholog/bootcamp/ChatbotController.java @@ -1,8 +1,7 @@ package com.cholog.bootcamp; -import java.util.Map; - import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.chat.client.ChatClientResponse; import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor; import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor; import org.springframework.ai.chat.metadata.Usage; @@ -64,25 +63,29 @@ public ChatbotController(ChatClient.Builder builder, EmbeddingModel embeddingMod @PostMapping public ChatbotResponse chat(@RequestBody ChatbotRequest request) { - ChatResponse response = chatClient.prompt() + ChatResponse chatResponse = chatClient.prompt() .user(request.question()) .call() .chatResponse(); - String answer = response.getResult().getOutput().getText(); - Usage usage = response.getMetadata().getUsage(); + String answer = chatResponse.getResult().getOutput().getText(); + Usage usage = chatResponse.getMetadata().getUsage(); return ChatbotResponse.from(answer, usage); } @PostMapping("/debug") - public Map debugChat(@RequestBody ChatbotRequest request) { - Object RETRIEVED_DOCUMENTS = chatClient.prompt() + public ChatbotResponse debugChat(@RequestBody ChatbotRequest request) { + ChatClientResponse chatClientResponse = chatClient.prompt() .user(request.question()) .call() - .chatClientResponse() - .context() - .get(QuestionAnswerAdvisor.RETRIEVED_DOCUMENTS); + .chatClientResponse(); + + Object RETRIEVED_DOCUMENTS = chatClientResponse.context().get(QuestionAnswerAdvisor.RETRIEVED_DOCUMENTS); log.info("RETRIEVED_DOCUMENTS: {}", RETRIEVED_DOCUMENTS); - return Map.of("answer", "answer"); + + ChatResponse chatResponse = chatClientResponse.chatResponse(); + String answer = chatResponse.getResult().getOutput().getText(); + Usage usage = chatResponse.getMetadata().getUsage(); + return ChatbotResponse.from(answer, usage); } } From ebaab4512237589d696a0aaf2c2e6d4121ce7599 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Fri, 15 May 2026 23:38:37 +0900 Subject: [PATCH 20/50] =?UTF-8?q?refactor:=20controller=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cholog/bootcamp/MarkdownReader.java | 2 +- .../cholog/bootcamp/{ => controller}/ChatbotController.java | 6 +++++- .../bootcamp/{ => controller/dto}/ChatbotRequest.java | 2 +- .../bootcamp/{ => controller/dto}/ChatbotResponse.java | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) rename src/main/java/com/cholog/bootcamp/{ => controller}/ChatbotController.java (95%) rename src/main/java/com/cholog/bootcamp/{ => controller/dto}/ChatbotRequest.java (56%) rename src/main/java/com/cholog/bootcamp/{ => controller/dto}/ChatbotResponse.java (92%) diff --git a/src/main/java/com/cholog/bootcamp/MarkdownReader.java b/src/main/java/com/cholog/bootcamp/MarkdownReader.java index 3830d69..e6bf6c4 100644 --- a/src/main/java/com/cholog/bootcamp/MarkdownReader.java +++ b/src/main/java/com/cholog/bootcamp/MarkdownReader.java @@ -11,7 +11,7 @@ import org.springframework.stereotype.Component; @Component -class MarkdownReader { +public class MarkdownReader { private final Resource[] resources; diff --git a/src/main/java/com/cholog/bootcamp/ChatbotController.java b/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java similarity index 95% rename from src/main/java/com/cholog/bootcamp/ChatbotController.java rename to src/main/java/com/cholog/bootcamp/controller/ChatbotController.java index bf734d8..4c5fa3f 100644 --- a/src/main/java/com/cholog/bootcamp/ChatbotController.java +++ b/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java @@ -1,4 +1,4 @@ -package com.cholog.bootcamp; +package com.cholog.bootcamp.controller; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.ChatClientResponse; @@ -17,6 +17,10 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.cholog.bootcamp.controller.dto.ChatbotRequest; +import com.cholog.bootcamp.controller.dto.ChatbotResponse; +import com.cholog.bootcamp.MarkdownReader; + import lombok.extern.slf4j.Slf4j; @Slf4j diff --git a/src/main/java/com/cholog/bootcamp/ChatbotRequest.java b/src/main/java/com/cholog/bootcamp/controller/dto/ChatbotRequest.java similarity index 56% rename from src/main/java/com/cholog/bootcamp/ChatbotRequest.java rename to src/main/java/com/cholog/bootcamp/controller/dto/ChatbotRequest.java index fc45b7b..38f5e89 100644 --- a/src/main/java/com/cholog/bootcamp/ChatbotRequest.java +++ b/src/main/java/com/cholog/bootcamp/controller/dto/ChatbotRequest.java @@ -1,4 +1,4 @@ -package com.cholog.bootcamp; +package com.cholog.bootcamp.controller.dto; public record ChatbotRequest( String question diff --git a/src/main/java/com/cholog/bootcamp/ChatbotResponse.java b/src/main/java/com/cholog/bootcamp/controller/dto/ChatbotResponse.java similarity index 92% rename from src/main/java/com/cholog/bootcamp/ChatbotResponse.java rename to src/main/java/com/cholog/bootcamp/controller/dto/ChatbotResponse.java index 95bc9d5..9922d5c 100644 --- a/src/main/java/com/cholog/bootcamp/ChatbotResponse.java +++ b/src/main/java/com/cholog/bootcamp/controller/dto/ChatbotResponse.java @@ -1,4 +1,4 @@ -package com.cholog.bootcamp; +package com.cholog.bootcamp.controller.dto; import org.springframework.ai.chat.metadata.Usage; From ef3815c43a0b3ae5d50808a149262affcd566fe0 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sat, 16 May 2026 00:06:38 +0900 Subject: [PATCH 21/50] =?UTF-8?q?refactor:=20service=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ChatbotController.java | 68 +++----------- .../{controller => }/dto/ChatbotRequest.java | 2 +- .../{controller => }/dto/ChatbotResponse.java | 2 +- .../bootcamp/service/ChatbotService.java | 89 +++++++++++++++++++ 4 files changed, 101 insertions(+), 60 deletions(-) rename src/main/java/com/cholog/bootcamp/{controller => }/dto/ChatbotRequest.java (56%) rename src/main/java/com/cholog/bootcamp/{controller => }/dto/ChatbotResponse.java (92%) create mode 100644 src/main/java/com/cholog/bootcamp/service/ChatbotService.java diff --git a/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java b/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java index 4c5fa3f..dd7ce4a 100644 --- a/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java +++ b/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java @@ -1,5 +1,7 @@ package com.cholog.bootcamp.controller; +import java.util.Map; + import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.ChatClientResponse; import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor; @@ -17,79 +19,29 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.cholog.bootcamp.controller.dto.ChatbotRequest; -import com.cholog.bootcamp.controller.dto.ChatbotResponse; +import com.cholog.bootcamp.dto.ChatbotRequest; +import com.cholog.bootcamp.dto.ChatbotResponse; import com.cholog.bootcamp.MarkdownReader; +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 ChatClient chatClient; - - public ChatbotController(ChatClient.Builder builder, EmbeddingModel embeddingModel, MarkdownReader markdownReader) { - PromptTemplate customPromptTemplate = PromptTemplate.builder() - .renderer(StTemplateRenderer.builder().startDelimiterToken('<').endDelimiterToken('>').build()) - .template(""" - - - 아래는 컨텍스트 정보입니다. - - --------------------- - - --------------------- - - 컨텍스트 정보를 바탕으로 질문에 답하세요. - - 답변 시 아래 룰을 따르세요: - 1. 절대 컨텍스트에 없는 내용을 추론하거나 지어내지 마세요. 응답은 컨텍스트 정보를 기반으로 확인되는 사실만 답합니다. - 2. 사용자가 질문한 부분에 대해서만 답하기 보다는 관련 정보 중 사용자에게 유용한 정보라고 판단되면 함께 답변에 포함해주세요. - 예시) - Q. 적립 포인트 1점은 얼마의 가치인가요? - - 추천하지 않는 답변: "적립 포인트 1점의 가치는 1원입니다."와 같이 단순 정보만 제공하고 끝나는 답변. - - 추천하는 답변: 적립 포인트 모으는 방법, 적립 정책, 적립금 소멸, 적립금 가치 등 적립 포인트 관련 핵심 정보를 담은 간단명료한 답변. - """) - .build(); - - VectorStore vectorStore = SimpleVectorStore.builder(embeddingModel).build(); - vectorStore.add(markdownReader.loadAll()); - QuestionAnswerAdvisor qaAdvisor = QuestionAnswerAdvisor.builder(vectorStore) - .promptTemplate(customPromptTemplate) - .searchRequest(SearchRequest.builder().topK(8).build()) - .build(); - this.chatClient = builder - .defaultAdvisors(qaAdvisor, new SimpleLoggerAdvisor()) - .build(); - } + private final ChatbotService chatbotService; @PostMapping public ChatbotResponse chat(@RequestBody ChatbotRequest request) { - ChatResponse chatResponse = chatClient.prompt() - .user(request.question()) - .call() - .chatResponse(); - - String answer = chatResponse.getResult().getOutput().getText(); - Usage usage = chatResponse.getMetadata().getUsage(); - return ChatbotResponse.from(answer, usage); + return chatbotService.chat(request); } @PostMapping("/debug") public ChatbotResponse debugChat(@RequestBody ChatbotRequest request) { - ChatClientResponse chatClientResponse = chatClient.prompt() - .user(request.question()) - .call() - .chatClientResponse(); - - Object RETRIEVED_DOCUMENTS = chatClientResponse.context().get(QuestionAnswerAdvisor.RETRIEVED_DOCUMENTS); - log.info("RETRIEVED_DOCUMENTS: {}", RETRIEVED_DOCUMENTS); - - ChatResponse chatResponse = chatClientResponse.chatResponse(); - String answer = chatResponse.getResult().getOutput().getText(); - Usage usage = chatResponse.getMetadata().getUsage(); - return ChatbotResponse.from(answer, usage); + return chatbotService.debugChat(request); } } diff --git a/src/main/java/com/cholog/bootcamp/controller/dto/ChatbotRequest.java b/src/main/java/com/cholog/bootcamp/dto/ChatbotRequest.java similarity index 56% rename from src/main/java/com/cholog/bootcamp/controller/dto/ChatbotRequest.java rename to src/main/java/com/cholog/bootcamp/dto/ChatbotRequest.java index 38f5e89..0566ce3 100644 --- a/src/main/java/com/cholog/bootcamp/controller/dto/ChatbotRequest.java +++ b/src/main/java/com/cholog/bootcamp/dto/ChatbotRequest.java @@ -1,4 +1,4 @@ -package com.cholog.bootcamp.controller.dto; +package com.cholog.bootcamp.dto; public record ChatbotRequest( String question diff --git a/src/main/java/com/cholog/bootcamp/controller/dto/ChatbotResponse.java b/src/main/java/com/cholog/bootcamp/dto/ChatbotResponse.java similarity index 92% rename from src/main/java/com/cholog/bootcamp/controller/dto/ChatbotResponse.java rename to src/main/java/com/cholog/bootcamp/dto/ChatbotResponse.java index 9922d5c..edc1e91 100644 --- a/src/main/java/com/cholog/bootcamp/controller/dto/ChatbotResponse.java +++ b/src/main/java/com/cholog/bootcamp/dto/ChatbotResponse.java @@ -1,4 +1,4 @@ -package com.cholog.bootcamp.controller.dto; +package com.cholog.bootcamp.dto; import org.springframework.ai.chat.metadata.Usage; 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..2c78d95 --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java @@ -0,0 +1,89 @@ +package com.cholog.bootcamp.service; + +import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.chat.client.ChatClientResponse; +import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor; +import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor; +import org.springframework.ai.chat.metadata.Usage; +import org.springframework.ai.chat.model.ChatResponse; +import org.springframework.ai.chat.prompt.PromptTemplate; +import org.springframework.ai.embedding.EmbeddingModel; +import org.springframework.ai.template.st.StTemplateRenderer; +import org.springframework.ai.vectorstore.SearchRequest; +import org.springframework.ai.vectorstore.SimpleVectorStore; +import org.springframework.ai.vectorstore.VectorStore; +import org.springframework.stereotype.Service; + +import com.cholog.bootcamp.MarkdownReader; +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; + + public ChatbotService(ChatClient.Builder builder, EmbeddingModel embeddingModel, MarkdownReader markdownReader) { + PromptTemplate customPromptTemplate = PromptTemplate.builder() + .renderer(StTemplateRenderer.builder().startDelimiterToken('<').endDelimiterToken('>').build()) + .template(""" + + + 아래는 컨텍스트 정보입니다. + + --------------------- + + --------------------- + + 컨텍스트 정보를 바탕으로 질문에 답하세요. + + 답변 시 아래 룰을 따르세요: + 1. 절대 컨텍스트에 없는 내용을 추론하거나 지어내지 마세요. 응답은 컨텍스트 정보를 기반으로 확인되는 사실만 답합니다. + 2. 사용자가 질문한 부분에 대해서만 답하기 보다는 관련 정보 중 사용자에게 유용한 정보라고 판단되면 함께 답변에 포함해주세요. + 예시) + Q. 적립 포인트 1점은 얼마의 가치인가요? + - 추천하지 않는 답변: "적립 포인트 1점의 가치는 1원입니다."와 같이 단순 정보만 제공하고 끝나는 답변. + - 추천하는 답변: 적립 포인트 모으는 방법, 적립 정책, 적립금 소멸, 적립금 가치 등 적립 포인트 관련 핵심 정보를 담은 간단명료한 답변. + """) + .build(); + + VectorStore vectorStore = SimpleVectorStore.builder(embeddingModel).build(); + vectorStore.add(markdownReader.loadAll()); + QuestionAnswerAdvisor qaAdvisor = QuestionAnswerAdvisor.builder(vectorStore) + .promptTemplate(customPromptTemplate) + .searchRequest(SearchRequest.builder().topK(8).build()) + .build(); + this.chatClient = builder.defaultAdvisors(qaAdvisor, new SimpleLoggerAdvisor()).build(); + this.vectorStore = vectorStore; + } + + public ChatbotResponse chat(ChatbotRequest request) { + ChatResponse chatResponse = chatClient.prompt() + .user(request.question()) + .call() + .chatResponse(); + + String answer = chatResponse.getResult().getOutput().getText(); + Usage usage = chatResponse.getMetadata().getUsage(); + return ChatbotResponse.from(answer, usage); + } + + public ChatbotResponse debugChat(ChatbotRequest request) { + ChatClientResponse chatClientResponse = chatClient.prompt() + .user(request.question()) + .call() + .chatClientResponse(); + + Object RETRIEVED_DOCUMENTS = chatClientResponse.context().get(QuestionAnswerAdvisor.RETRIEVED_DOCUMENTS); + log.info("RETRIEVED_DOCUMENTS: {}", RETRIEVED_DOCUMENTS); + + ChatResponse chatResponse = chatClientResponse.chatResponse(); + String answer = chatResponse.getResult().getOutput().getText(); + Usage usage = chatResponse.getMetadata().getUsage(); + return ChatbotResponse.from(answer, usage); + } +} From f8f89e7d0e3478f88ade5171bcb381f160ff1def Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sat, 16 May 2026 17:23:36 +0900 Subject: [PATCH 22/50] =?UTF-8?q?feat:=20=EB=8C=80=ED=99=94=20=EB=A7=A5?= =?UTF-8?q?=EB=9D=BD=20=EC=9C=A0=EC=A7=80=EB=A5=BC=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?chatmemory=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ChatbotController.java | 38 ++++++++++--------- .../bootcamp/service/ChatbotService.java | 18 +++++++-- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java b/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java index dd7ce4a..52521f1 100644 --- a/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java +++ b/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java @@ -1,19 +1,11 @@ package com.cholog.bootcamp.controller; -import java.util.Map; - -import org.springframework.ai.chat.client.ChatClient; -import org.springframework.ai.chat.client.ChatClientResponse; -import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor; -import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor; -import org.springframework.ai.chat.metadata.Usage; -import org.springframework.ai.chat.model.ChatResponse; -import org.springframework.ai.chat.prompt.PromptTemplate; -import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.template.st.StTemplateRenderer; -import org.springframework.ai.vectorstore.SearchRequest; -import org.springframework.ai.vectorstore.SimpleVectorStore; -import org.springframework.ai.vectorstore.VectorStore; +import java.util.UUID; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseCookie; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CookieValue; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -21,7 +13,6 @@ import com.cholog.bootcamp.dto.ChatbotRequest; import com.cholog.bootcamp.dto.ChatbotResponse; -import com.cholog.bootcamp.MarkdownReader; import com.cholog.bootcamp.service.ChatbotService; import lombok.RequiredArgsConstructor; @@ -36,8 +27,21 @@ public class ChatbotController { private final ChatbotService chatbotService; @PostMapping - public ChatbotResponse chat(@RequestBody ChatbotRequest request) { - return chatbotService.chat(request); + public ResponseEntity chat( + @CookieValue(required = false) String conversationId, + @RequestBody ChatbotRequest request + ) { + if (conversationId == null) { + conversationId = UUID.randomUUID().toString(); + } + ChatbotResponse response = chatbotService.chat(conversationId, request); + ResponseCookie responseCookie = ResponseCookie.from("conversationId", conversationId) + .httpOnly(true) + .secure(true) + .build(); + return ResponseEntity.ok() + .header(HttpHeaders.SET_COOKIE, responseCookie.toString()) + .body(response); } @PostMapping("/debug") diff --git a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java index 2c78d95..e92c1d2 100644 --- a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java +++ b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java @@ -2,8 +2,10 @@ import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.ChatClientResponse; +import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor; import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor; import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor; +import org.springframework.ai.chat.memory.ChatMemory; import org.springframework.ai.chat.metadata.Usage; import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.chat.prompt.PromptTemplate; @@ -27,7 +29,12 @@ public class ChatbotService { private final ChatClient chatClient; private final VectorStore vectorStore; - public ChatbotService(ChatClient.Builder builder, EmbeddingModel embeddingModel, MarkdownReader markdownReader) { + public ChatbotService( + ChatClient.Builder builder, + EmbeddingModel embeddingModel, + MarkdownReader markdownReader, + ChatMemory chatMemory + ) { PromptTemplate customPromptTemplate = PromptTemplate.builder() .renderer(StTemplateRenderer.builder().startDelimiterToken('<').endDelimiterToken('>').build()) .template(""" @@ -57,13 +64,18 @@ public ChatbotService(ChatClient.Builder builder, EmbeddingModel embeddingModel, .promptTemplate(customPromptTemplate) .searchRequest(SearchRequest.builder().topK(8).build()) .build(); - this.chatClient = builder.defaultAdvisors(qaAdvisor, new SimpleLoggerAdvisor()).build(); + this.chatClient = builder.defaultAdvisors( + qaAdvisor, + MessageChatMemoryAdvisor.builder(chatMemory).build(), + new SimpleLoggerAdvisor() + ).build(); this.vectorStore = vectorStore; } - public ChatbotResponse chat(ChatbotRequest request) { + public ChatbotResponse chat(String conversationId, ChatbotRequest request) { ChatResponse chatResponse = chatClient.prompt() .user(request.question()) + .advisors(a -> a.param(ChatMemory.CONVERSATION_ID, conversationId)) .call() .chatResponse(); From deb627d62f03c49de5afa35a55bcf3f28762fc1c Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sat, 16 May 2026 17:46:59 +0900 Subject: [PATCH 23/50] =?UTF-8?q?feat:=20=EC=B1=97=EB=B4=87=20=EC=84=B8?= =?UTF-8?q?=EC=85=98=20=EC=8B=9C=EC=9E=91/=EC=A2=85=EB=A3=8C=20=EC=97=94?= =?UTF-8?q?=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ChatbotController.java | 38 +++++++++++++++++-- .../bootcamp/service/ChatbotService.java | 15 ++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java b/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java index 52521f1..a7e566f 100644 --- a/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java +++ b/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java @@ -1,11 +1,10 @@ package com.cholog.bootcamp.controller; -import java.util.UUID; - import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseCookie; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CookieValue; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -26,13 +25,46 @@ public class ChatbotController { private final ChatbotService chatbotService; + @PostMapping("/session") + public ResponseEntity startConversation( + @CookieValue(required = false) String conversationId + ) { + if (conversationId != null) { + chatbotService.clearConversation(conversationId); + } + ResponseCookie responseCookie = ResponseCookie.from("conversationId", chatbotService.createConversationId()) + .httpOnly(true) + .secure(true) + .build(); + return ResponseEntity.noContent() + .header(HttpHeaders.SET_COOKIE, responseCookie.toString()) + .build(); + } + + @DeleteMapping("/session") + public ResponseEntity endSession( + @CookieValue(required = false) String conversationId + ) { + if (conversationId != null) { + chatbotService.clearConversation(conversationId); + } + ResponseCookie deleteCookie = ResponseCookie.from("conversationId", conversationId) + .httpOnly(true) + .secure(true) + .maxAge(0) + .build(); + return ResponseEntity.noContent() + .header(HttpHeaders.SET_COOKIE, deleteCookie.toString()) + .build(); + } + @PostMapping public ResponseEntity chat( @CookieValue(required = false) String conversationId, @RequestBody ChatbotRequest request ) { if (conversationId == null) { - conversationId = UUID.randomUUID().toString(); + conversationId = chatbotService.createConversationId(); } ChatbotResponse response = chatbotService.chat(conversationId, request); ResponseCookie responseCookie = ResponseCookie.from("conversationId", conversationId) diff --git a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java index e92c1d2..a84d2bb 100644 --- a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java +++ b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java @@ -1,5 +1,7 @@ package com.cholog.bootcamp.service; +import java.util.UUID; + import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.ChatClientResponse; import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor; @@ -28,6 +30,7 @@ public class ChatbotService { private final ChatClient chatClient; private final VectorStore vectorStore; + private final ChatMemory chatMemory; public ChatbotService( ChatClient.Builder builder, @@ -70,6 +73,7 @@ public ChatbotService( new SimpleLoggerAdvisor() ).build(); this.vectorStore = vectorStore; + this.chatMemory = chatMemory; } public ChatbotResponse chat(String conversationId, ChatbotRequest request) { @@ -98,4 +102,15 @@ public ChatbotResponse debugChat(ChatbotRequest request) { Usage usage = chatResponse.getMetadata().getUsage(); return ChatbotResponse.from(answer, usage); } + + public String createConversationId() { + return UUID.randomUUID().toString(); + } + + public void clearConversation(String conversationId) { + if (conversationId == null) { + throw new NullPointerException("conversationId는 null일 수 없습니다."); + } + chatMemory.clear(conversationId); + } } From 2c6e04180d42d18f34dfebad0024ee678e30a24c Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sat, 16 May 2026 17:57:46 +0900 Subject: [PATCH 24/50] =?UTF-8?q?feat:=20=EC=B1=97=EB=B4=87=20=EC=84=B8?= =?UTF-8?q?=EC=85=98=20=EC=8B=9C=EC=9E=91/=EC=A2=85=EB=A3=8C=20=EC=97=94?= =?UTF-8?q?=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cholog/bootcamp/controller/ChatbotController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java b/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java index a7e566f..023e364 100644 --- a/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java +++ b/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java @@ -25,7 +25,7 @@ public class ChatbotController { private final ChatbotService chatbotService; - @PostMapping("/session") + @PostMapping("/conversation") public ResponseEntity startConversation( @CookieValue(required = false) String conversationId ) { @@ -41,8 +41,8 @@ public ResponseEntity startConversation( .build(); } - @DeleteMapping("/session") - public ResponseEntity endSession( + @DeleteMapping("/conversation") + public ResponseEntity endConversation( @CookieValue(required = false) String conversationId ) { if (conversationId != null) { From 9383c9a673c8c6638779f7f630e08c6f5406ff9f Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sat, 16 May 2026 18:16:44 +0900 Subject: [PATCH 25/50] =?UTF-8?q?refactor:=20config=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bootcamp/config/ChatClientConfig.java | 64 +++++++++++++++++++ .../bootcamp/config/VectorStoreConfig.java | 16 +++++ .../bootcamp/service/ChatbotService.java | 52 ++------------- .../{ => service}/MarkdownReader.java | 2 +- 4 files changed, 86 insertions(+), 48 deletions(-) create mode 100644 src/main/java/com/cholog/bootcamp/config/ChatClientConfig.java create mode 100644 src/main/java/com/cholog/bootcamp/config/VectorStoreConfig.java rename src/main/java/com/cholog/bootcamp/{ => service}/MarkdownReader.java (97%) diff --git a/src/main/java/com/cholog/bootcamp/config/ChatClientConfig.java b/src/main/java/com/cholog/bootcamp/config/ChatClientConfig.java new file mode 100644 index 0000000..8170cfe --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/config/ChatClientConfig.java @@ -0,0 +1,64 @@ +package com.cholog.bootcamp.config; + +import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor; +import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor; +import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor; +import org.springframework.ai.chat.memory.ChatMemory; +import org.springframework.ai.chat.prompt.PromptTemplate; +import org.springframework.ai.template.st.StTemplateRenderer; +import org.springframework.ai.vectorstore.SearchRequest; +import org.springframework.ai.vectorstore.VectorStore; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ChatClientConfig { + + @Bean + public ChatClient chatClient( + ChatClient.Builder builder, + VectorStore vectorStore, + ChatMemory chatMemory + ) { + // 프롬프트 + PromptTemplate customPromptTemplate = getPromptTemplate(); + + // 어드바이저 + QuestionAnswerAdvisor qaAdvisor = QuestionAnswerAdvisor.builder(vectorStore) + .promptTemplate(customPromptTemplate) + .searchRequest(SearchRequest.builder().topK(8).build()) + .build(); + MessageChatMemoryAdvisor messageChatMemoryAdvisor = MessageChatMemoryAdvisor.builder(chatMemory).build(); + SimpleLoggerAdvisor simpleLoggerAdvisor = new SimpleLoggerAdvisor(); + + return builder.defaultAdvisors(qaAdvisor, messageChatMemoryAdvisor, simpleLoggerAdvisor).build(); + + + } + + private PromptTemplate getPromptTemplate() { + return PromptTemplate.builder() + .renderer(StTemplateRenderer.builder().startDelimiterToken('<').endDelimiterToken('>').build()) + .template(""" + + + 아래는 컨텍스트 정보입니다. + + --------------------- + + --------------------- + + 컨텍스트 정보를 바탕으로 질문에 답하세요. + + 답변 시 아래 룰을 따르세요: + 1. 절대 컨텍스트에 없는 내용을 추론하거나 지어내지 마세요. 응답은 컨텍스트 정보를 기반으로 확인되는 사실만 답합니다. + 2. 사용자가 질문한 부분에 대해서만 답하기 보다는 관련 정보 중 사용자에게 유용한 정보라고 판단되면 함께 답변에 포함해주세요. + 예시) + Q. 적립 포인트 1점은 얼마의 가치인가요? + - 추천하지 않는 답변: "적립 포인트 1점의 가치는 1원입니다."와 같이 단순 정보만 제공하고 끝나는 답변. + - 추천하는 답변: 적립 포인트 모으는 방법, 적립 정책, 적립금 소멸, 적립금 가치 등 적립 포인트 관련 핵심 정보를 담은 간단명료한 답변. + """) + .build(); + } +} 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/service/ChatbotService.java b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java index a84d2bb..5868b10 100644 --- a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java +++ b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java @@ -4,21 +4,13 @@ import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.ChatClientResponse; -import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor; -import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor; import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor; import org.springframework.ai.chat.memory.ChatMemory; import org.springframework.ai.chat.metadata.Usage; import org.springframework.ai.chat.model.ChatResponse; -import org.springframework.ai.chat.prompt.PromptTemplate; -import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.template.st.StTemplateRenderer; -import org.springframework.ai.vectorstore.SearchRequest; -import org.springframework.ai.vectorstore.SimpleVectorStore; import org.springframework.ai.vectorstore.VectorStore; import org.springframework.stereotype.Service; -import com.cholog.bootcamp.MarkdownReader; import com.cholog.bootcamp.dto.ChatbotRequest; import com.cholog.bootcamp.dto.ChatbotResponse; @@ -29,51 +21,17 @@ public class ChatbotService { private final ChatClient chatClient; - private final VectorStore vectorStore; private final ChatMemory chatMemory; public ChatbotService( - ChatClient.Builder builder, - EmbeddingModel embeddingModel, + VectorStore vectorStore, MarkdownReader markdownReader, - ChatMemory chatMemory + ChatMemory chatMemory, + ChatClient chatClient ) { - PromptTemplate customPromptTemplate = PromptTemplate.builder() - .renderer(StTemplateRenderer.builder().startDelimiterToken('<').endDelimiterToken('>').build()) - .template(""" - - - 아래는 컨텍스트 정보입니다. - - --------------------- - - --------------------- - - 컨텍스트 정보를 바탕으로 질문에 답하세요. - - 답변 시 아래 룰을 따르세요: - 1. 절대 컨텍스트에 없는 내용을 추론하거나 지어내지 마세요. 응답은 컨텍스트 정보를 기반으로 확인되는 사실만 답합니다. - 2. 사용자가 질문한 부분에 대해서만 답하기 보다는 관련 정보 중 사용자에게 유용한 정보라고 판단되면 함께 답변에 포함해주세요. - 예시) - Q. 적립 포인트 1점은 얼마의 가치인가요? - - 추천하지 않는 답변: "적립 포인트 1점의 가치는 1원입니다."와 같이 단순 정보만 제공하고 끝나는 답변. - - 추천하는 답변: 적립 포인트 모으는 방법, 적립 정책, 적립금 소멸, 적립금 가치 등 적립 포인트 관련 핵심 정보를 담은 간단명료한 답변. - """) - .build(); - - VectorStore vectorStore = SimpleVectorStore.builder(embeddingModel).build(); - vectorStore.add(markdownReader.loadAll()); - QuestionAnswerAdvisor qaAdvisor = QuestionAnswerAdvisor.builder(vectorStore) - .promptTemplate(customPromptTemplate) - .searchRequest(SearchRequest.builder().topK(8).build()) - .build(); - this.chatClient = builder.defaultAdvisors( - qaAdvisor, - MessageChatMemoryAdvisor.builder(chatMemory).build(), - new SimpleLoggerAdvisor() - ).build(); - this.vectorStore = vectorStore; + this.chatClient = chatClient; this.chatMemory = chatMemory; + vectorStore.add(markdownReader.loadAll()); } public ChatbotResponse chat(String conversationId, ChatbotRequest request) { diff --git a/src/main/java/com/cholog/bootcamp/MarkdownReader.java b/src/main/java/com/cholog/bootcamp/service/MarkdownReader.java similarity index 97% rename from src/main/java/com/cholog/bootcamp/MarkdownReader.java rename to src/main/java/com/cholog/bootcamp/service/MarkdownReader.java index e6bf6c4..ad14246 100644 --- a/src/main/java/com/cholog/bootcamp/MarkdownReader.java +++ b/src/main/java/com/cholog/bootcamp/service/MarkdownReader.java @@ -1,4 +1,4 @@ -package com.cholog.bootcamp; +package com.cholog.bootcamp.service; import java.util.ArrayList; import java.util.List; From 3700df466314372bb09f01788544ad4fc82dceae Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sat, 16 May 2026 18:29:11 +0900 Subject: [PATCH 26/50] =?UTF-8?q?feat:=20=EC=B1=97=EB=B4=87=20ui=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + .../controller/ChatPageController.java | 23 + .../controller/ChatbotController.java | 42 +- src/main/resources/templates/chat.html | 591 ++++++++++++++++++ 4 files changed, 641 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/cholog/bootcamp/controller/ChatPageController.java create mode 100644 src/main/resources/templates/chat.html diff --git a/build.gradle b/build.gradle index 273df38..bb54183 100644 --- a/build.gradle +++ b/build.gradle @@ -25,6 +25,7 @@ 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' 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..108a331 --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/controller/ChatPageController.java @@ -0,0 +1,23 @@ +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", "안녕하세요. 초록 고객지원 챗봇입니다. 배송, 반품, 멤버십, 결제 관련 질문을 물어보세요."); + 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 index 023e364..1965552 100644 --- a/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java +++ b/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java @@ -23,19 +23,17 @@ @RestController public class ChatbotController { + private final String CONVERSATION_ID_COOKIE = "conversationId"; private final ChatbotService chatbotService; @PostMapping("/conversation") public ResponseEntity startConversation( - @CookieValue(required = false) String conversationId + @CookieValue(value = CONVERSATION_ID_COOKIE, required = false) String conversationId ) { if (conversationId != null) { chatbotService.clearConversation(conversationId); } - ResponseCookie responseCookie = ResponseCookie.from("conversationId", chatbotService.createConversationId()) - .httpOnly(true) - .secure(true) - .build(); + ResponseCookie responseCookie = createConversationCookie(chatbotService.createConversationId()); return ResponseEntity.noContent() .header(HttpHeaders.SET_COOKIE, responseCookie.toString()) .build(); @@ -43,16 +41,12 @@ public ResponseEntity startConversation( @DeleteMapping("/conversation") public ResponseEntity endConversation( - @CookieValue(required = false) String conversationId + @CookieValue(value = CONVERSATION_ID_COOKIE, required = false) String conversationId ) { if (conversationId != null) { chatbotService.clearConversation(conversationId); } - ResponseCookie deleteCookie = ResponseCookie.from("conversationId", conversationId) - .httpOnly(true) - .secure(true) - .maxAge(0) - .build(); + ResponseCookie deleteCookie = expireConversationCookie(); return ResponseEntity.noContent() .header(HttpHeaders.SET_COOKIE, deleteCookie.toString()) .build(); @@ -60,17 +54,14 @@ public ResponseEntity endConversation( @PostMapping public ResponseEntity chat( - @CookieValue(required = false) String conversationId, + @CookieValue(value = CONVERSATION_ID_COOKIE, required = false) String conversationId, @RequestBody ChatbotRequest request ) { if (conversationId == null) { conversationId = chatbotService.createConversationId(); } ChatbotResponse response = chatbotService.chat(conversationId, request); - ResponseCookie responseCookie = ResponseCookie.from("conversationId", conversationId) - .httpOnly(true) - .secure(true) - .build(); + ResponseCookie responseCookie = createConversationCookie(conversationId); return ResponseEntity.ok() .header(HttpHeaders.SET_COOKIE, responseCookie.toString()) .body(response); @@ -80,4 +71,23 @@ public ResponseEntity chat( public ChatbotResponse debugChat(@RequestBody ChatbotRequest request) { return chatbotService.debugChat(request); } + + private ResponseCookie createConversationCookie(String conversationId) { + return ResponseCookie.from(CONVERSATION_ID_COOKIE, conversationId) + .httpOnly(true) + .secure(false) + .path("/") + .sameSite("Lax") + .build(); + } + + private ResponseCookie expireConversationCookie() { + return ResponseCookie.from(CONVERSATION_ID_COOKIE, "") + .httpOnly(true) + .secure(false) + .path("/") + .sameSite("Lax") + .maxAge(0) + .build(); + } } diff --git a/src/main/resources/templates/chat.html b/src/main/resources/templates/chat.html new file mode 100644 index 0000000..208f4c0 --- /dev/null +++ b/src/main/resources/templates/chat.html @@ -0,0 +1,591 @@ + + + + + + 초록 고객지원 챗봇 + + + +
+ + +
+
+
+

상담

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

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

+
+ 지금 +
+
+ +
+ + +
+
+
+ + + + From 53caf471eaeeb1c320b389ae7738175e92c2d21c Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sat, 16 May 2026 18:53:46 +0900 Subject: [PATCH 27/50] =?UTF-8?q?feat:=20=EC=B1=97=EB=B4=87=20ui=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 자주 묻는 질문 채팅창 내로 이동 - 기본 인사 및 안내 제공 --- .../controller/ChatPageController.java | 15 ++- .../controller/ChatbotController.java | 2 +- src/main/resources/templates/chat.html | 98 ++++++++++++------- 3 files changed, 80 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/cholog/bootcamp/controller/ChatPageController.java b/src/main/java/com/cholog/bootcamp/controller/ChatPageController.java index 108a331..fc1fd71 100644 --- a/src/main/java/com/cholog/bootcamp/controller/ChatPageController.java +++ b/src/main/java/com/cholog/bootcamp/controller/ChatPageController.java @@ -12,7 +12,20 @@ public class ChatPageController { @GetMapping({"/", "/chat"}) public String chat(Model model) { model.addAttribute("pageTitle", "초록 고객지원 챗봇"); - model.addAttribute("initialMessage", "안녕하세요. 초록 고객지원 챗봇입니다. 배송, 반품, 멤버십, 결제 관련 질문을 물어보세요."); + model.addAttribute("initialMessage", """ + 안녕하세요. 초록 고객지원 챗봇입니다.🤖 + 무엇을 도와드릴까요? + + 📞 운영시간 안내 + 자동 챗봇은 24시간 이용하실 수 있습니다. + 상담사 연결 및 전화 상담은 평일 오전 9시부터 오후 6시까지 가능하며, 주말 및 공휴일에는 운영되지 않습니다. + 운영 시간 외 문의는 챗봇을 이용하시거나 이메일로 남겨주시면 다음 영업일부터 순차적으로 확인해 드리겠습니다. + + ☎️ 문의 전화: 1588-0000 + 📱 VIP 전용 전화: 1588-0002 + 📧 이메일: support@cholog.kr + 💬 카카오톡: @초록 + """); model.addAttribute("quickPrompts", List.of( "배송은 보통 얼마나 걸리나요?", "반품 신청 기준을 알려주세요.", diff --git a/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java b/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java index 1965552..8b3c125 100644 --- a/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java +++ b/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java @@ -23,7 +23,7 @@ @RestController public class ChatbotController { - private final String CONVERSATION_ID_COOKIE = "conversationId"; + private static final String CONVERSATION_ID_COOKIE = "conversationId"; private final ChatbotService chatbotService; @PostMapping("/conversation") diff --git a/src/main/resources/templates/chat.html b/src/main/resources/templates/chat.html index 208f4c0..1534990 100644 --- a/src/main/resources/templates/chat.html +++ b/src/main/resources/templates/chat.html @@ -93,12 +93,6 @@ line-height: 1.25; } - .brand__subtitle { - margin: 3px 0 0; - color: var(--muted); - font-size: 13px; - } - .new-session { display: inline-flex; width: 100%; @@ -116,20 +110,37 @@ background: #0f2a22; } + .new-session-note { + margin: 10px 0 0; + color: var(--muted); + font-size: 13px; + line-height: 1.45; + } + .prompt-list { - display: grid; - gap: 9px; - margin-top: 22px; + display: flex; + flex-wrap: wrap; + gap: 8px; + } + + .prompt-bar { + padding: 12px 16px 0; + background: #ffffff; + } + + .prompt-bar[hidden] { + display: none; } .prompt { - min-height: 42px; - padding: 10px 12px; + min-height: 38px; + padding: 9px 15px; border: 1px solid var(--line); - border-radius: 8px; + border-radius: 999px; background: #ffffff; color: var(--text); - text-align: left; + text-align: center; + white-space: nowrap; } .prompt:hover { @@ -137,15 +148,9 @@ background: #f5faf7; } - .sidebar__foot { - color: var(--muted); - font-size: 13px; - line-height: 1.55; - } - .chat { display: grid; - grid-template-rows: auto minmax(0, 1fr) auto; + grid-template-rows: auto minmax(0, 1fr) auto auto; overflow: hidden; border-radius: 8px; } @@ -290,7 +295,6 @@ grid-template-columns: minmax(0, 1fr) auto; gap: 10px; padding: 16px; - border-top: 1px solid var(--line); background: #ffffff; } @@ -366,11 +370,26 @@ .composer { grid-template-columns: 1fr; + padding-top: 12px; } .send { width: 100%; } + + .prompt-bar { + padding: 10px 12px 0; + } + + .prompt-list { + flex-wrap: nowrap; + overflow-x: auto; + padding-bottom: 2px; + } + + .prompt { + flex: 0 0 auto; + } } @@ -382,17 +401,11 @@

초록 고객지원 챗봇

-

RAG 상담 데스크

- -
- -
+ +

이전 대화 내용은 기억되지 않습니다.

-
@@ -401,7 +414,7 @@

초록 고객지원 챗봇

상담

응답 대기 중
- +
@@ -415,6 +428,14 @@

상담

+
+
+ +
+
+
@@ -431,7 +452,9 @@

상담

const question = document.querySelector("#question"); const sendButton = document.querySelector("#send-button"); const status = document.querySelector("#status"); + const quickPrompts = document.querySelector("#quick-prompts"); const initialMessage = messages.dataset.initialMessage; + function now() { return new Intl.DateTimeFormat("ko-KR", { hour: "2-digit", @@ -477,6 +500,10 @@

상담

return article; } + function showQuickPrompts(shouldShow) { + quickPrompts.hidden = !shouldShow; + } + function appendTyping() { const article = document.createElement("article"); article.className = "message message--bot"; @@ -495,6 +522,7 @@

상담

function resetMessages() { messages.replaceChildren(); appendMessage("bot", initialMessage); + showQuickPrompts(true); } function autoresize() { @@ -508,6 +536,7 @@

상담

return; } + showQuickPrompts(false); appendMessage("user", trimmed); question.value = ""; autoresize(); @@ -556,7 +585,7 @@

상담

question.value = ""; autoresize(); } catch (error) { - appendMessage("bot", "새 세션을 시작하지 못했습니다. 다시 시도해주세요.", {error: true}); + appendMessage("bot", "새 대화를 시작하지 못했습니다. 다시 시도해주세요.", {error: true}); } finally { setBusy(false); question.focus(); @@ -580,8 +609,11 @@

상담

button.addEventListener("click", startNewSession); }); - document.querySelectorAll(".prompt").forEach((button) => { - button.addEventListener("click", () => sendQuestion(button.dataset.prompt || button.textContent)); + quickPrompts.addEventListener("click", (event) => { + const promptButton = event.target.closest(".prompt"); + if (promptButton) { + sendQuestion(promptButton.dataset.prompt || promptButton.textContent); + } }); autoresize(); From 71121c4f811161f552e9721999451ce99abf6918 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sat, 16 May 2026 18:54:01 +0900 Subject: [PATCH 28/50] =?UTF-8?q?refactor:=20vip=20=EC=97=B0=EB=9D=BD?= =?UTF-8?q?=EC=88=98=EB=8B=A8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cholog/bootcamp/controller/ChatPageController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/cholog/bootcamp/controller/ChatPageController.java b/src/main/java/com/cholog/bootcamp/controller/ChatPageController.java index fc1fd71..c70e726 100644 --- a/src/main/java/com/cholog/bootcamp/controller/ChatPageController.java +++ b/src/main/java/com/cholog/bootcamp/controller/ChatPageController.java @@ -22,7 +22,6 @@ public String chat(Model model) { 운영 시간 외 문의는 챗봇을 이용하시거나 이메일로 남겨주시면 다음 영업일부터 순차적으로 확인해 드리겠습니다. ☎️ 문의 전화: 1588-0000 - 📱 VIP 전용 전화: 1588-0002 📧 이메일: support@cholog.kr 💬 카카오톡: @초록 """); From 5106f1d36815665912eac11ff2e7a0550f7e2709 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Mon, 18 May 2026 01:01:41 +0900 Subject: [PATCH 29/50] =?UTF-8?q?refactor:=20=EC=B1=97=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=20=EC=B2=AD=ED=81=AC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/layer3_chatlogs/2024-01.jsonl | 5 ---- .../data/layer3_chatlogs/2024-02.jsonl | 15 ---------- .../data/layer3_chatlogs/2024-03.jsonl | 5 ---- .../data/layer3_chatlogs/2024-04.jsonl | 15 ---------- .../data/layer3_chatlogs/2024-05.jsonl | 15 ---------- .../data/layer3_chatlogs/2024-06.jsonl | 5 ---- .../data/layer3_chatlogs/2024-07.jsonl | 15 ---------- .../data/layer3_chatlogs/2024-08.jsonl | 30 ------------------- .../data/layer3_chatlogs/2024-09.jsonl | 5 ---- .../data/layer3_chatlogs/2024-10.jsonl | 30 ------------------- .../data/layer3_chatlogs/2024-11.jsonl | 5 ---- .../data/layer3_chatlogs/2024-12.jsonl | 5 ---- .../data/layer3_chatlogs/2025-01.jsonl | 30 ------------------- .../data/layer3_chatlogs/2025-02.jsonl | 30 ------------------- .../data/layer3_chatlogs/2025-03.jsonl | 30 ------------------- .../data/layer3_chatlogs/2025-04.jsonl | 30 ------------------- .../data/layer3_chatlogs/2025-05.jsonl | 30 ------------------- .../data/layer3_chatlogs/2025-06.jsonl | 30 ------------------- 18 files changed, 330 deletions(-) delete mode 100644 src/main/resources/data/layer3_chatlogs/2024-01.jsonl delete mode 100644 src/main/resources/data/layer3_chatlogs/2024-02.jsonl delete mode 100644 src/main/resources/data/layer3_chatlogs/2024-03.jsonl delete mode 100644 src/main/resources/data/layer3_chatlogs/2024-04.jsonl delete mode 100644 src/main/resources/data/layer3_chatlogs/2024-05.jsonl delete mode 100644 src/main/resources/data/layer3_chatlogs/2024-06.jsonl delete mode 100644 src/main/resources/data/layer3_chatlogs/2024-07.jsonl delete mode 100644 src/main/resources/data/layer3_chatlogs/2024-08.jsonl delete mode 100644 src/main/resources/data/layer3_chatlogs/2024-09.jsonl delete mode 100644 src/main/resources/data/layer3_chatlogs/2024-10.jsonl delete mode 100644 src/main/resources/data/layer3_chatlogs/2024-11.jsonl delete mode 100644 src/main/resources/data/layer3_chatlogs/2024-12.jsonl delete mode 100644 src/main/resources/data/layer3_chatlogs/2025-01.jsonl delete mode 100644 src/main/resources/data/layer3_chatlogs/2025-02.jsonl delete mode 100644 src/main/resources/data/layer3_chatlogs/2025-03.jsonl delete mode 100644 src/main/resources/data/layer3_chatlogs/2025-04.jsonl delete mode 100644 src/main/resources/data/layer3_chatlogs/2025-05.jsonl delete mode 100644 src/main/resources/data/layer3_chatlogs/2025-06.jsonl diff --git a/src/main/resources/data/layer3_chatlogs/2024-01.jsonl b/src/main/resources/data/layer3_chatlogs/2024-01.jsonl deleted file mode 100644 index 707fef9..0000000 --- a/src/main/resources/data/layer3_chatlogs/2024-01.jsonl +++ /dev/null @@ -1,5 +0,0 @@ -{"conversation_id":"CHAT-2024-01-001","timestamp":"2024-01-08T10:23:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"안녕하세요 어제 주문한 건데 배송이 언제 오나요?"},{"role":"agent","text":"안녕하세요 고객님! 주문번호 알려주시면 바로 확인해드릴게요."},{"role":"customer","text":"20240107-1892요"},{"role":"agent","text":"확인했습니다. 오늘 오전 발송 완료되었고 내일 오전 중 도착 예정입니다. 한진택배 운송장번호는 123456789입니다."},{"role":"customer","text":"감사합니다!"}],"resolution":"resolved","primary_intent":"track_order","secondary_intent":null,"tags":["배송조회","일반배송"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-01-002","timestamp":"2024-01-09T14:45:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"반품 신청하려고요. 어떻게 하면 되나요?"},{"role":"agent","text":"네 고객님, 앱이나 웹사이트에서 '나의 주문' → 주문 선택 → '반품 신청' 을 탭하시면 됩니다. 사진 한 장 이상 업로드하시고 수거 날짜 선택하시면 돼요."},{"role":"customer","text":"단순 변심인데 비용이 따로 드나요?"},{"role":"agent","text":"단순 변심이나 사이즈 문제 등 고객 사유 반품의 경우 왕복 배송비 명목으로 3,000원이 환불금에서 차감됩니다."},{"role":"customer","text":"알겠어요 신청할게요"}],"resolution":"resolved","primary_intent":"return_request","secondary_intent":null,"tags":["반품","단순변심"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-01-003","timestamp":"2024-01-10T09:12:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"VIP인데 무료 배송 기준이 어떻게 되나요?"},{"role":"agent","text":"VIP 등급이시면 금액 상관없이 모든 주문에 우선 배송(Priority)이 무료로 적용됩니다. 별도 최소 금액 없이 주문하실 때마다 자동 적용돼요."},{"role":"customer","text":"구독도 하고 있는데 그것도 포함되나요?"},{"role":"agent","text":"네, 구독 중이시면 구독 혜택과 VIP 혜택 중 더 좋은 쪽이 자동 적용됩니다. 어떤 경우든 우선 배송 무료입니다."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":"subscription","tags":["배송비","VIP","구독"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-01-004","timestamp":"2024-01-11T16:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"반품 기간이 어떻게 되나요?"},{"role":"agent","text":"반품은 배송 완료 후 7일 이내에 신청 가능합니다."},{"role":"customer","text":"7일이요? 좀 짧네요"},{"role":"agent","text":"네 맞습니다, 7일 이내로 신청 부탁드립니다."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["반품기간","오답주의"],"agent_accuracy":"incorrect","accuracy_note":"현행 반품 기간은 14일(v3 정책). agent_jung이 구버전(v1, 7일) 기준으로 잘못 안내함."} -{"conversation_id":"CHAT-2024-01-005","timestamp":"2024-01-12T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"포인트 유효기간이 어떻게 되나요?"},{"role":"agent","text":"포인트는 적립일로부터 12개월 동안 유효합니다. 만료 30일 전에 앱 알림으로 안내드려요."},{"role":"customer","text":"그럼 만료되면 복구가 안되나요?"},{"role":"agent","text":"네, 만료된 포인트는 복구나 연장이 되지 않습니다. 만료 전에 꼭 사용해 주세요."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["포인트","유효기간"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2024-02.jsonl b/src/main/resources/data/layer3_chatlogs/2024-02.jsonl deleted file mode 100644 index 2e2459c..0000000 --- a/src/main/resources/data/layer3_chatlogs/2024-02.jsonl +++ /dev/null @@ -1,15 +0,0 @@ -{"conversation_id":"CHAT-2024-02-001","timestamp":"2024-02-02T10:15:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"주문 취소하고 싶어요"},{"role":"agent","text":"주문번호 알려주시면 바로 확인해드릴게요."},{"role":"customer","text":"20240201-3301"},{"role":"agent","text":"확인했습니다. 현재 '배송 준비중' 상태라 취소 가능합니다. 앱에서 나의 주문 > 주문 취소 탭하시면 즉시 처리되고 전액 환불됩니다."},{"role":"customer","text":"감사합니다"}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":null,"tags":["주문취소","즉시취소"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-02-002","timestamp":"2024-02-03T14:30:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"방금 주문했는데 취소 가능한가요? 실수로 눌렀어요"},{"role":"agent","text":"네 고객님! 주문번호 알려주시겠어요?"},{"role":"customer","text":"20240203-7712"},{"role":"agent","text":"확인했습니다. 아직 준비중 상태라 취소 가능해요. 앱 나의 주문에서 직접 취소하시거나 제가 처리해드릴게요. 어떻게 하시겠어요?"},{"role":"customer","text":"직접 할게요 감사해요"}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":null,"tags":["주문취소","실수"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-02-003","timestamp":"2024-02-05T09:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"이미 발송된 주문 취소할 수 있나요?"},{"role":"agent","text":"죄송합니다, 발송 후에는 주문 취소가 불가합니다. 수령 후 반품 신청하셔야 합니다."},{"role":"customer","text":"그럼 반품하면 배송비 드나요?"},{"role":"agent","text":"단순 변심 반품의 경우 3,000원 처리비가 차감됩니다. 제품 불량이라면 무료입니다."}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":"return_request","tags":["취소불가","발송완료","반품안내"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-02-004","timestamp":"2024-02-06T16:45:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"주문 취소 가능한 시간이 있나요?"},{"role":"agent","text":"주문 후 1시간 이내에만 취소 가능합니다."},{"role":"customer","text":"1시간 지났는데 안되나요?"},{"role":"agent","text":"죄송합니다 맞습니다, 1시간 이후엔 취소가 안됩니다."}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":null,"tags":["취소시간","오답주의"],"agent_accuracy":"incorrect","accuracy_note":"주문 취소는 1시간 제한이 아니라 '배송 준비중' 상태일 때까지 가능. agent_jung 오안내."} -{"conversation_id":"CHAT-2024-02-005","timestamp":"2024-02-07T11:20:00+09:00","channel":"live_chat","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"취소하면 환불이 언제 되나요?"},{"role":"agent","text":"취소는 즉시 처리되고요, 환불은 결제 수단에 따라 다릅니다. 신용카드는 3-5영업일, 카카오페이·네이버페이는 거의 즉시, 계좌이체는 최대 7영업일 소요됩니다. 혹시 어떤 수단으로 결제하셨나요?"},{"role":"customer","text":"카카오페이요"},{"role":"agent","text":"그러면 취소 완료 후 거의 바로 환불 처리됩니다!"}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":"get_refund","tags":["취소환불","카카오페이"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-02-006","timestamp":"2024-02-08T13:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"주문 수량 변경 가능한가요? 2개 시켰는데 1개로 바꾸고 싶어요"},{"role":"agent","text":"주문 후 수량 변경은 지원하지 않습니다. 기존 주문을 취소 후 원하시는 수량으로 다시 주문하셔야 합니다. 현재 주문 상태가 어떻게 되나요?"},{"role":"customer","text":"준비중이에요"},{"role":"agent","text":"그러면 지금 취소 가능합니다. 나의 주문에서 취소 후 1개로 재주문해주세요."}],"resolution":"resolved","primary_intent":"change_order","secondary_intent":"cancel_order","tags":["수량변경","재주문안내"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-02-007","timestamp":"2024-02-09T10:30:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"색상 변경 할 수 있나요? 검정으로 잘못 골랐어요"},{"role":"agent","text":"주문 후 색상 변경은 불가합니다. 취소 후 재주문이 필요해요. 아직 준비중 상태면 지금 바로 취소 가능해요."},{"role":"customer","text":"품절되면 어떡해요 ㅠㅠ"},{"role":"agent","text":"빨리 처리하시면 재주문 가능할 거예요! 원하시는 색상이 재고 있는지 제가 먼저 확인해드릴게요. 상품명이 어떻게 되시나요?"}],"resolution":"resolved","primary_intent":"change_order","secondary_intent":null,"tags":["색상변경","재주문","비격식"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-02-008","timestamp":"2024-02-13T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"주문 변경하고 싶은데 어떻게 해요"},{"role":"agent","text":"주문 내용 변경(상품, 수량, 색상 등)은 취소 후 재주문으로만 가능합니다. 배송지 변경은 준비중 상태에서 앱에서 수정 가능하고요."},{"role":"customer","text":"배송지만 바꾸고 싶어요"},{"role":"agent","text":"나의 주문에서 해당 주문 선택 후 주소 수정 탭으로 변경 가능합니다. 발송 전에만 가능하니 서두르세요."}],"resolution":"resolved","primary_intent":"change_order","secondary_intent":"change_shipping_address","tags":["주문변경","배송지변경"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-02-009","timestamp":"2024-02-14T09:45:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"두 개 주문했는데 하나만 취소할 수 있나요?"},{"role":"agent","text":"하나의 주문 건 내에서 일부 상품만 취소하는 부분 취소 기능은 현재 지원하지 않습니다. 전체 취소 후 원하시는 상품만 재주문하셔야 합니다. 번거로우시더라도요, 고객님."},{"role":"customer","text":"VIP라도 안되나요?"},{"role":"agent","text":"죄송하게도 등급과 관계없이 부분 취소 기능이 없습니다. 혹시 원하시면 제가 전체 취소 처리 후 재주문 안내 도와드릴게요."}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":null,"tags":["부분취소","VIP","전체취소"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-02-010","timestamp":"2024-02-16T14:10:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"야 취소 버튼이 없는데?"},{"role":"agent","text":"현재 주문 상태가 어떻게 되세요? '발송 완료'로 바뀐 경우 앱에서 취소 버튼이 사라집니다."},{"role":"customer","text":"발송완료라고 뜨네요"},{"role":"agent","text":"아 그렇군요, 발송 후에는 취소가 불가합니다. 수령 후 반품 신청 가능해요."}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":null,"tags":["취소버튼","발송완료","비격식"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-02-011","timestamp":"2024-02-19T10:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"처음 주문하는데 어떻게 하나요?"},{"role":"agent","text":"앱이나 웹사이트에서 원하시는 상품을 장바구니에 담고 결제하시면 됩니다. 회원이시면 저장된 주소와 결제 수단으로 빠르게 진행 가능해요. 혹시 회원 가입은 되어 계신가요?"},{"role":"customer","text":"네 가입은 했어요"},{"role":"agent","text":"그러면 로그인 후 상품 선택 → 장바구니 → 결제 순서로 진행하시면 됩니다. 20,000원 이상이면 배송비 무료예요!"}],"resolution":"resolved","primary_intent":"place_order","secondary_intent":null,"tags":["첫주문","주문방법"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-02-012","timestamp":"2024-02-20T16:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"비회원으로 주문 가능한가요?"},{"role":"agent","text":"비회원 주문도 가능합니다. 다만 주문 이력 조회나 포인트 적립 등 회원 혜택은 받으실 수 없어요. 가입이 간단하니 SSO로 빠르게 가입 추천드립니다."},{"role":"customer","text":"카카오로 가입 가능하죠?"},{"role":"agent","text":"네, 카카오, 네이버, 구글 SSO 모두 지원합니다. 가입 후 3,000원 쿠폰도 드려요!"}],"resolution":"resolved","primary_intent":"place_order","secondary_intent":"create_account","tags":["비회원주문","회원가입","SSO"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-02-013","timestamp":"2024-02-21T11:15:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"주문하면 포인트 바로 쌓이나요?"},{"role":"agent","text":"네, 결제 즉시 포인트 적립됩니다."},{"role":"customer","text":"얼마나 쌓여요?"},{"role":"agent","text":"구매 금액의 1% 포인트 적립됩니다."}],"resolution":"resolved","primary_intent":"place_order","secondary_intent":"loyalty_points","tags":["포인트적립","주문"],"agent_accuracy":"partially_correct","accuracy_note":"포인트는 결제 즉시가 아닌 배송 완료 후 7일 뒤 적립됨. agent_jung 오안내."} -{"conversation_id":"CHAT-2024-02-014","timestamp":"2024-02-22T09:30:00+09:00","channel":"kakaotalk","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"쿠폰이랑 포인트 같이 쓸 수 있나요?"},{"role":"agent","text":"네, 쿠폰 1개와 포인트를 함께 사용 가능합니다. 쿠폰 할인이 먼저 적용되고 나머지 금액에서 포인트가 차감됩니다. 포인트는 최소 1,000점 이상이어야 사용 가능해요."}],"resolution":"resolved","primary_intent":"place_order","secondary_intent":null,"tags":["쿠폰","포인트","중복사용"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-02-015","timestamp":"2024-02-23T14:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"장바구니에 담아놓은 거 얼마나 유지되나요?"},{"role":"agent","text":"장바구니 보관 기간은 별도로 만료되지 않습니다. 다만 상품이 품절되거나 가격이 변경될 수 있어요. 오래 두시면 가격 변동 가능성이 있으니 빨리 주문하시는 걸 추천드립니다. 상품 재고는 장바구니에 담는다고 예약되지 않아요."}],"resolution":"resolved","primary_intent":"place_order","secondary_intent":null,"tags":["장바구니","유효기간","재고"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2024-03.jsonl b/src/main/resources/data/layer3_chatlogs/2024-03.jsonl deleted file mode 100644 index a1331eb..0000000 --- a/src/main/resources/data/layer3_chatlogs/2024-03.jsonl +++ /dev/null @@ -1,5 +0,0 @@ -{"conversation_id":"CHAT-2024-03-001","timestamp":"2024-03-05T13:20:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"배송 문의인데요 오늘 주문하면 언제 와요?"},{"role":"agent","text":"안녕하세요! 오늘 오후 1시 이전 결제 확인 주문은 오늘 오후 발송되고, 이후 주문은 내일 오전 발송됩니다. 일반 배송 기준으로 수령까지 영업일 기준 2-4일 소요되고요, 우선 배송 선택하시면 다음 영업일 정오까지 도착 보장입니다. 현재 시각이 오후 1시 넘었으니 내일 오전 발송으로 처리됩니다. 배송 외에 궁금하신 점 있으실까요?"},{"role":"customer","text":"아 그럼 빨리 받고 싶어서요"},{"role":"agent","text":"빠른 수령을 원하신다면 우선 배송(5,000원)을 추천드립니다. 내일 오전 발송, 모레 정오까지 도착 보장입니다. 혹시 주문하실 상품이 냉장 상품이라면 냉장 배송은 월~목만 가능한 점 참고해 주세요!"},{"role":"customer","text":"냉장은 아니에요 그냥 일반 상품이에요 주소 변경도 되나요?"},{"role":"agent","text":"주소 변경은 주문 상태가 '배송 준비중'일 때만 가능합니다. '나의 주문'에서 주문 선택 후 '주소 수정'을 탭해주세요. 이미 '발송 완료'로 바뀐 경우엔 변경이 어렵습니다."},{"role":"customer","text":"아직 준비중이라 변경해야겠네요 감사해요"}],"resolution":"resolved","primary_intent":"delivery_period","secondary_intent":"change_shipping_address","tags":["배송기간","주소변경","주제전환"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-03-002","timestamp":"2024-03-07T10:05:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"걍 환불해주세요 ㅠㅠ 너무 맘에 안들어요"},{"role":"agent","text":"불편을 드려서 정말 죄송합니다 고객님. 어떤 상품 건인지 주문번호 알려주시면 바로 처리해드릴게요."},{"role":"customer","text":"20240301-4421"},{"role":"agent","text":"확인했습니다. 해당 상품 배송 완료일이 3월 1일이고 오늘 7일이니 아직 14일 이내라 반품 신청 가능합니다. 상품 불만족으로 접수해드릴까요? 이 경우 3,000원 처리 수수료가 환불금에서 차감됩니다."},{"role":"customer","text":"얼마나 걸려요?"},{"role":"agent","text":"수거 후 검수 완료까지 1-2영업일, 이후 결제 수단에 따라 카드 3-5일, 카카오페이는 거의 즉시 환불됩니다."},{"role":"customer","text":"카카오페이로 했어요 ㄱㄱ"}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["환불","구어체","비격식"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-03-003","timestamp":"2024-03-10T15:40:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"저 VIP인데 산 지 20일 된 상품 반품 가능한가요?"},{"role":"agent","text":"일반적으로 반품은 배송 완료 후 14일 이내이지만, VIP 고객님의 경우 사정에 따라 추가 검토가 가능합니다. 어떤 상품인지, 반품 사유가 어떻게 되시나요?"},{"role":"customer","text":"결함이 있어서요 처음엔 몰랐는데 쓰다 보니 발견했어요"},{"role":"agent","text":"결함 발견이시군요. VIP 고객님이고 결함 관련 사항이라 예외 처리 가능합니다. 결함 부위 사진을 '나의 주문 > 불만 신고'로 업로드해 주시면 검토 후 반품 처리해드리겠습니다. 처리비용은 없습니다."}],"resolution":"resolved","primary_intent":"return_request","secondary_intent":null,"tags":["VIP","반품예외","결함"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-03-004","timestamp":"2024-03-12T09:30:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_jung","turns":[{"role":"customer","text":"포인트 적립률이 어떻게 되나요? 플러스 등급인데요"},{"role":"agent","text":"플러스 등급은 구매 금액의 3% 포인트 적립됩니다."},{"role":"customer","text":"스탠다드는요?"},{"role":"agent","text":"스탠다드는 3%, 플러스는 5%, VIP는 7% 입니다."},{"role":"customer","text":"어? 방금 플러스 3%라고 하셨잖아요"},{"role":"agent","text":"죄송합니다, 제가 착각했습니다. 정확한 적립률은 스탠다드 1%, 플러스 3%, VIP 5%입니다. 처음 안내가 맞았습니다."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["포인트적립률","상담사실수","오답수정"],"agent_accuracy":"partially_correct","accuracy_note":"agent_jung이 구버전(3%/5%/7%) 적립률을 혼용함. 수정 후 최종 답변은 정확."} -{"conversation_id":"CHAT-2024-03-005","timestamp":"2024-03-15T11:55:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"주문하고 취소하려는데 가능한가요?"},{"role":"agent","text":"배송 준비중 상태라면 취소 가능합니다. '나의 주문'에서 주문 선택 후 '주문 취소'를 눌러주세요. 즉시 처리되고 전액 환불됩니다."},{"role":"customer","text":"이미 발송됐다고 나오는데요"},{"role":"agent","text":"발송 후에는 취소가 불가능합니다. 수령 후 반품 신청하셔야 합니다. 도착하면 반품 신청해 드리겠습니다."},{"role":"customer","text":"그럼 배송비도 제가 내야 하나요?"},{"role":"agent","text":"단순 변심 반품의 경우 3,000원 처리비가 차감됩니다. 제품 결함이라면 무료입니다."}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":"return_request","tags":["주문취소","반품","주제전환"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2024-04.jsonl b/src/main/resources/data/layer3_chatlogs/2024-04.jsonl deleted file mode 100644 index 12a183b..0000000 --- a/src/main/resources/data/layer3_chatlogs/2024-04.jsonl +++ /dev/null @@ -1,15 +0,0 @@ -{"conversation_id":"CHAT-2024-04-001","timestamp":"2024-04-02T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"주문 취소했는데 환불이 안 들어왔어요"},{"role":"agent","text":"취소 처리 일시 확인해드릴게요. 주문번호 알려주시겠어요?"},{"role":"customer","text":"20240401-5521"},{"role":"agent","text":"어제 오후 취소 처리됐네요. 신용카드 결제 건은 3-5영업일 소요됩니다. 오늘 기준 늦어도 다음 주 중에 들어올 거예요."},{"role":"customer","text":"알겠어요"}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":"track_refund","tags":["취소환불","환불대기"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-04-002","timestamp":"2024-04-04T13:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"주문을 두 개 했는데 하나로 합배송 되나요?"},{"role":"agent","text":"30분 이내 동일 주소로 주문하신 경우 자동 합배송될 수 있습니다. 수동 합배송 요청은 첫 주문이 발송 전에 고객센터로 문의주세요."},{"role":"customer","text":"우선배송이랑 일반배송인데도 합배송 가능한가요?"},{"role":"agent","text":"우선배송과 일반배송 혼합 합배송은 불가합니다. 각각 별도 발송됩니다."}],"resolution":"resolved","primary_intent":"place_order","secondary_intent":null,"tags":["합배송","배송방식혼합"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-04-003","timestamp":"2024-04-08T09:15:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"주문 취소하면 쿠폰 복구되나요?"},{"role":"agent","text":"네! 주문 취소 시 사용하셨던 쿠폰은 원래 만료일 내에서 복구됩니다. 다만 쿠폰 유효기간이 이미 만료된 경우엔 복구가 어렵습니다."},{"role":"customer","text":"포인트도요?"},{"role":"agent","text":"포인트도 사용하신 만큼 복구됩니다. 단, 해당 주문으로 적립된 포인트는 취소와 함께 차감됩니다."}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":null,"tags":["취소후쿠폰","포인트복구"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-04-010","timestamp":"2024-04-10T15:20:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"ㅠㅠ 실수로 두 번 주문했어요"},{"role":"agent","text":"아이고! 주문번호 두 개 알려주시면 확인해드릴게요."},{"role":"customer","text":"20240410-1122 랑 20240410-1123이요"},{"role":"agent","text":"두 건 다 아직 준비중이에요. 중복 건 하나 취소해드릴게요. 어떤 걸 남기실 건가요?"},{"role":"customer","text":"1122 남겨주세요"},{"role":"agent","text":"1123 취소 처리했습니다. 카카오페이 환불은 거의 즉시 됩니다!"}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":null,"tags":["중복주문","비격식","즉시취소"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-04-011","timestamp":"2024-04-12T11:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_choi","turns":[{"role":"customer","text":"주문할 때 할인코드 적용을 못 했어요, 환불 후 재주문해야 하나요?"},{"role":"agent","text":"아쉽게도 주문 완료 후에는 쿠폰이나 할인코드 사후 적용이 불가합니다. 현재 주문 상태가 준비중이라면 취소 후 할인코드 적용하여 재주문하시는 방법밖에 없습니다. 현재 상태 확인해드릴까요?"},{"role":"customer","text":"준비중이에요"},{"role":"agent","text":"그러면 취소 후 재주문 권장드립니다. 할인코드 절약 금액이 크시면 특히요."}],"resolution":"resolved","primary_intent":"change_order","secondary_intent":"cancel_order","tags":["할인코드","사후적용불가","재주문"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-04-012","timestamp":"2024-04-15T14:45:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"취소 신청했는데 언제 처리돼요?"},{"role":"agent","text":"취소는 영업일 1-2일 내 처리됩니다."},{"role":"customer","text":"바로 안되나요?"},{"role":"agent","text":"죄송합니다, 확인해보니 준비중 상태면 즉시 취소 됩니다. 제가 잘못 안내드렸어요. 취소 신청 후 바로 완료 문자 받으셨나요?"}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":null,"tags":["취소처리시간","오답수정","agent_jung"],"agent_accuracy":"partially_correct","accuracy_note":"준비중 취소는 즉시 처리. agent_jung이 1-2일이라 오안내 후 수정."} -{"conversation_id":"CHAT-2024-04-013","timestamp":"2024-04-18T10:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"미성년자도 주문 가능한가요?"},{"role":"agent","text":"만 14세 이상이면 보호자 동의 없이 기본 상품 구매 가능합니다. 다만 19세 이상 인증이 필요한 상품(주류 관련 용품, 일부 보충제 등)은 성인 인증이 필요합니다."}],"resolution":"resolved","primary_intent":"place_order","secondary_intent":null,"tags":["미성년자","연령제한","주문자격"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-04-014","timestamp":"2024-04-22T16:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"주문 완료 문자가 안 와요"},{"role":"agent","text":"주문번호 알려주시면 확인해드릴게요."},{"role":"customer","text":"20240422-9901"},{"role":"agent","text":"주문 정상 접수됐습니다! 문자 대신 카카오 알림톡으로 발송됩니다. 카카오 알림 허용 여부 확인해보시겠어요?"},{"role":"customer","text":"아 카카오로 왔네요 ㅎㅎ"}],"resolution":"resolved","primary_intent":"place_order","secondary_intent":null,"tags":["주문확인","알림톡","비격식"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-04-015","timestamp":"2024-04-25T11:30:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"장바구니 20개 상품 한번에 주문 가능한가요?"},{"role":"agent","text":"네, 장바구니 상품 전체 한 번에 주문 가능합니다. 다만 한 주문당 최대 금액은 500만원이고, 그 이상은 B2B팀 통해 별도 처리 필요합니다. 또 마켓플레이스 판매자 상품이 섞여 있다면 판매자별로 별도 주문 처리됩니다."}],"resolution":"resolved","primary_intent":"place_order","secondary_intent":null,"tags":["대량주문","장바구니","마켓플레이스"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-05-001","timestamp":"2024-05-03T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"주문 변경하고 싶은데 이미 발송됐어요"},{"role":"agent","text":"발송 후에는 주문 내용 변경이 불가합니다. 수령 후 반품하고 재주문하셔야 합니다."},{"role":"customer","text":"배송지라도 바꿀 수 있나요?"},{"role":"agent","text":"발송 후 배송지 변경도 어렵습니다. 택배사(한진)에 직접 연락해보시면 가능한 경우도 있긴 한데 보장은 어렵습니다."}],"resolution":"partially_resolved","primary_intent":"change_order","secondary_intent":"change_shipping_address","tags":["발송후변경불가","배송지","주제전환"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-05-002","timestamp":"2024-05-07T14:20:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"주문 취소하면 포인트는 어떻게 돼요?"},{"role":"agent","text":"주문 시 사용한 포인트는 취소 즉시 복구됩니다. 해당 주문으로 적립 예정이었던 포인트는 취소와 함께 소멸됩니다. 이미 배송 완료 후 7일이 지나 포인트가 지급됐다면, 취소 처리 시 회수됩니다."}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":"loyalty_points","tags":["취소포인트","복구","회수"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-05-003","timestamp":"2024-05-10T09:45:00+09:00","channel":"kakaotalk","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"앱이랑 웹이랑 가격 달라요?"},{"role":"agent","text":"기본 가격은 동일하지만 앱 전용 특가 상품이 있어서 앱에서 5-10% 저렴한 경우가 있어요. 앱 전용 딜은 매주 월요일 오전 10시에 업데이트됩니다."}],"resolution":"resolved","primary_intent":"place_order","secondary_intent":null,"tags":["앱전용","가격차이"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-05-011","timestamp":"2024-05-14T15:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"선물 포장으로 주문하고 싶은데 취소하면 포장비도 환불되나요?"},{"role":"agent","text":"선물 포장비(상품당 1,500원)는 주문 취소 시 전액 환불됩니다. 이미 포장 작업이 진행된 경우에는 환불이 어려울 수 있는데, 그런 경우는 거의 없습니다. 취소 즉시 전액 환불이 원칙입니다."}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":null,"tags":["선물포장","포장비환불"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-05-012","timestamp":"2024-05-17T11:10:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"주문번호가 뭔지 모르겠어요"},{"role":"agent","text":"주문번호는 주문 완료 문자나 카카오 알림톡에서 확인하거나, 앱 나의 주문에서 확인 가능합니다."},{"role":"customer","text":"앱 어디에 있어요?"},{"role":"agent","text":"앱 하단 메뉴에서 '나의 주문' 탭을 누르시면 전체 주문 이력이 나옵니다."}],"resolution":"resolved","primary_intent":"place_order","secondary_intent":null,"tags":["주문번호조회","앱사용법"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-05-013","timestamp":"2024-05-22T16:40:00+09:00","channel":"live_chat","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"VIP인데 주문 취소 우선 처리 되나요?"},{"role":"agent","text":"취소 처리 자체는 고객님이 직접 앱에서 즉시 가능하기 때문에 별도 우선 처리 개념은 없습니다. 다만 환불 처리나 복잡한 케이스에서 VIP는 우선 지원 받으실 수 있어요."},{"role":"customer","text":"직접 하면 바로 되는거죠?"},{"role":"agent","text":"네, 준비중 상태면 버튼 하나로 즉시 취소됩니다."}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":null,"tags":["VIP","즉시취소","우선처리"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2024-05.jsonl b/src/main/resources/data/layer3_chatlogs/2024-05.jsonl deleted file mode 100644 index 1f074f8..0000000 --- a/src/main/resources/data/layer3_chatlogs/2024-05.jsonl +++ /dev/null @@ -1,15 +0,0 @@ -{"conversation_id":"CHAT-2024-05-101","timestamp":"2024-05-02T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"배송 조회 어디서 해요?"},{"role":"agent","text":"앱 나의 주문에서 해당 주문 선택 후 '배송 추적' 버튼을 누르시면 됩니다. 발송 후 한진택배 운송장번호가 발급되면 한진 앱이나 홈페이지에서도 조회 가능해요."}],"resolution":"resolved","primary_intent":"track_order","secondary_intent":null,"tags":["배송조회","운송장"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-05-102","timestamp":"2024-05-03T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"운송장 번호가 어디 있어요? 문자에 없는데"},{"role":"agent","text":"발송 후 카카오 알림톡으로 운송장번호가 발송됩니다. 혹시 카카오 알림톡 수신 허용이 안 되어 있다면 앱 나의 주문에서 확인 가능해요. 주문번호 알려주시면 제가 직접 알려드릴게요."},{"role":"customer","text":"20240502-3341"},{"role":"agent","text":"운송장번호는 456789123입니다. 한진택배 기준 내일 오전 중 도착 예정이에요."}],"resolution":"resolved","primary_intent":"track_order","secondary_intent":null,"tags":["운송장번호","알림톡"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-05-103","timestamp":"2024-05-06T09:20:00+09:00","channel":"kakaotalk","customer_tier":"plus","agent_id":"agent_park","turns":[{"role":"customer","text":"배송이 3일째인데 아직도 안 왔어요"},{"role":"agent","text":"불편드려 죄송합니다. 주문번호 알려주시면 배송 현황 확인해드릴게요."},{"role":"customer","text":"20240503-7712"},{"role":"agent","text":"확인했습니다. 어제 오후 발송됐고 현재 배송 중 상태입니다. 도서산간 지역이나 물량 증가 시 1-2일 지연될 수 있습니다. 혹시 제주도나 도서지역 주소인가요?"},{"role":"customer","text":"아뇨 서울이에요"},{"role":"agent","text":"서울인데 지연되고 있네요. 한진택배 고객센터(1588-0011)에 문의하시거나 제가 물류팀에 확인 요청 드릴게요."}],"resolution":"escalated","primary_intent":"track_order","secondary_intent":null,"tags":["배송지연","서울","에스컬레이션"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-05-104","timestamp":"2024-05-08T15:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"배송 상태가 계속 '배송 중'인데 안 움직여요. 어제부터요"},{"role":"agent","text":"배송 중 상태에서 업데이트가 없는 경우 허브 보관 중이거나 배송기사 할당 대기 상태일 수 있습니다. 오늘 오후까지 업데이트가 없으면 한진택배 고객센터(1588-0011)에 운송장번호로 직접 문의하시는 걸 권장드립니다. 제가 운송장번호 알려드릴까요?"},{"role":"customer","text":"네 알려주세요"},{"role":"agent","text":"주문번호 주시면 확인해드리겠습니다."}],"resolution":"partially_resolved","primary_intent":"track_order","secondary_intent":null,"tags":["배송중정체","허브","운송장"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-05-105","timestamp":"2024-05-09T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"배송 얼마나 걸려요?"},{"role":"agent","text":"일반 배송 기준 2-3일 소요됩니다."},{"role":"customer","text":"2-3일이요? 웹에는 2-4일이라고 나오는데"},{"role":"agent","text":"죄송합니다, 정확히는 영업일 기준 2-4일입니다. 제가 잘못 안내드렸어요."}],"resolution":"resolved","primary_intent":"delivery_period","secondary_intent":null,"tags":["배송기간","오답수정"],"agent_accuracy":"partially_correct","accuracy_note":"일반배송은 2-4영업일. agent_jung이 2-3일로 오안내 후 수정."} -{"conversation_id":"CHAT-2024-05-106","timestamp":"2024-05-13T16:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"오늘 주문하면 내일 받을 수 있나요?"},{"role":"agent","text":"오늘 오후 1시 이전에 주문하셨다면 오늘 발송, 일반 배송으로 내일 받으실 수 있습니다. 1시 이후라면 내일 발송, 모레 도착입니다. 빠르게 받으시려면 우선배송(5,000원)이면 다음 영업일 정오까지 보장됩니다."}],"resolution":"resolved","primary_intent":"delivery_period","secondary_intent":"delivery_options","tags":["당일발송","우선배송","주제전환"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-05-107","timestamp":"2024-05-16T10:30:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_lee","turns":[{"role":"customer","text":"VIP 우선배송 무료 맞죠?"},{"role":"agent","text":"네 맞습니다! VIP 등급이시면 우선배송이 무료로 자동 적용됩니다. 주문 금액에 상관없이요."},{"role":"customer","text":"오늘 3시에 주문하면 모레 받을 수 있겠네요?"},{"role":"agent","text":"오늘 오후 1시가 넘었으니 내일 오전 발송, 모레 정오까지 도착 보장입니다."}],"resolution":"resolved","primary_intent":"delivery_period","secondary_intent":null,"tags":["VIP무료배송","우선배송","도착시간"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-05-108","timestamp":"2024-05-20T14:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"제주도로 배송 얼마나 걸려요?"},{"role":"agent","text":"제주도는 일반 배송에서 1-2일 추가 소요됩니다. 일반 배송 기준 3-6영업일 정도 예상하시면 됩니다. 배송비 추가는 없어요."}],"resolution":"resolved","primary_intent":"delivery_period","secondary_intent":null,"tags":["제주배송","도서지역","배송기간"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-05-109","timestamp":"2024-05-23T09:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"당일 배송 어떻게 신청해요?"},{"role":"agent","text":"당일 배송은 서울, 인천, 경기 지역에서 오전 10시 이전 주문 시 가능합니다. 배송비는 8,000원이며 주문 시 '당일 배송' 옵션을 선택하시면 됩니다. 주말, 공휴일, 대형 상품은 불가합니다."},{"role":"customer","text":"지금 11시인데 안되겠네요"},{"role":"agent","text":"아쉽게도 오늘은 당일 배송이 어렵습니다. 우선 배송(5,000원)으로 내일 정오까지 받으시는 게 가장 빠른 방법이에요."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["당일배송","시간초과","우선배송"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-05-110","timestamp":"2024-05-27T15:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"배송비 무료 되는 기준이 뭔가요?"},{"role":"agent","text":"스탠다드 회원은 2만원 이상 주문 시 일반 배송 무료입니다. 플러스는 금액 무관 무료, VIP는 우선배송까지 무료, 구독 회원은 금액 무관 무료입니다."},{"role":"customer","text":"예전에 3만원이었던 것 같던데요"},{"role":"agent","text":"2024년 1월부터 2만원으로 낮아졌습니다. 예전엔 3만원이었어요."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["배송비","무료기준","버전변경"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-05-111","timestamp":"2024-05-29T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"배송 예약 가능한가요? 다음 주 목요일에 받고 싶어요"},{"role":"agent","text":"네! 주문 시 '예약 배송'을 선택하면 최대 14일 이내 날짜로 예약 가능합니다. 일반 배송, 우선 배송 모두 가능하고 당일 배송은 예약 불가입니다."},{"role":"customer","text":"추가 비용 있나요?"},{"role":"agent","text":"예약 배송 자체는 추가 비용 없습니다. 선택하신 배송 방식 요금만 적용돼요."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["예약배송","날짜지정","무료"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-05-112","timestamp":"2024-05-30T16:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_park","turns":[{"role":"customer","text":"편의점 수령 가능한가요?"},{"role":"agent","text":"네, CU편의점 픽업 서비스 이용 가능합니다. 주문 시 'CU편의점 수령'을 선택하고 가까운 CU 지점을 고르시면 됩니다. 보관 기간은 5일이고 그 이후엔 반송 처리됩니다."},{"role":"customer","text":"보관료 따로 드나요?"},{"role":"agent","text":"보관료는 없습니다. 무료로 5일간 보관됩니다."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["편의점수령","CU","보관기간"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-05-113","timestamp":"2024-05-31T10:15:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"배송 시간대 지정 할 수 있나요?"},{"role":"agent","text":"네, 우선 배송 선택 시 2시간 단위 배송 시간대 지정 가능합니다. 오전 9시부터 오후 9시 사이에서 선택하시면 됩니다."},{"role":"customer","text":"일반 배송도 되나요?"},{"role":"agent","text":"일반 배송은 시간대 지정이 안 됩니다. 우선 배송에서만 가능합니다."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["시간대지정","우선배송"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-05-114","timestamp":"2024-05-31T14:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"부재중이면 어떻게 되나요?"},{"role":"agent","text":"배송기사가 2회 배송 시도 후 근처 한진택배 보관소에 7일간 보관됩니다. 보관소 위치는 한진 앱이나 문자로 안내되고, 직접 수령하거나 재배송 신청 가능합니다. 7일 내 미수령 시 반송 처리됩니다."},{"role":"customer","text":"재배송 신청 어디서 해요?"},{"role":"agent","text":"한진택배 앱이나 hanjin.kr에서 운송장번호로 재배송 신청 가능합니다."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":"track_order","tags":["부재중","재배송","보관소"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-05-115","timestamp":"2024-05-31T16:30:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"배송 추적이 안 돼요 오류남"},{"role":"agent","text":"불편드려 죄송합니다. 주문번호와 사용 중인 기기 정보 알려주시면 확인해드릴게요."},{"role":"customer","text":"20240530-9812, 아이폰이에요"},{"role":"agent","text":"확인했습니다. 운송장번호는 789012345입니다. 앱 오류는 캐시 삭제 후 재시작해보시고, 그래도 안 되면 한진 사이트에서 직접 조회 가능합니다. 현재 '배송 중'으로 오늘 오후 도착 예정입니다."}],"resolution":"resolved","primary_intent":"track_order","secondary_intent":null,"tags":["앱오류","배송추적","VIP"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2024-06.jsonl b/src/main/resources/data/layer3_chatlogs/2024-06.jsonl deleted file mode 100644 index 72b5b4a..0000000 --- a/src/main/resources/data/layer3_chatlogs/2024-06.jsonl +++ /dev/null @@ -1,5 +0,0 @@ -{"conversation_id":"CHAT-2024-06-001","timestamp":"2024-06-03T14:10:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"무료배송 기준이 얼마부터예요?"},{"role":"agent","text":"스탠다드 회원이시면 2만원 이상 주문 시 일반 배송(Economy) 무료 적용됩니다!"},{"role":"customer","text":"예전에 3만원이라고 들은 것 같은데요?"},{"role":"agent","text":"2024년 1월부터 2만원으로 기준이 변경되었습니다! 예전에는 3만원이었는데 지금은 2만원이에요. 구독 회원이시면 금액 상관없이 배송비 무료입니다."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["무료배송","기준변경","버전충돌"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-06-002","timestamp":"2024-06-05T10:25:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"신선 식품 주문하려는데 오늘 주문하면 금요일에 올 수 있나요?"},{"role":"agent","text":"신선/냉장 상품은 CJ로지스틱스 프레시로 발송되는데요, 냉장 배송은 주말 운송 품질 문제로 월요일~목요일만 발송 가능합니다. 오늘이 수요일이니 오늘 오전 11시 이전 주문 건은 오늘 발송되어 내일 목요일 수령 가능하고요, 오늘 11시 이후나 내일 목요일 이후 주문은 다음 주 월요일 발송입니다."},{"role":"customer","text":"아 그럼 오늘 11시 이후에 주문하면 다음주 월요일 발송이군요"},{"role":"agent","text":"네 맞습니다. 냉장 배송료는 주문 금액과 상관없이 4,000원 별도 청구됩니다. 일반 무료 배송 혜택과는 별개예요."},{"role":"customer","text":"알겠어요 그냥 다음주에 주문할게요"}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["냉장배송","배송일정","특수배송"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-06-003","timestamp":"2024-06-08T16:00:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"마켓플레이스 상품도 14일 반품 되나요?"},{"role":"agent","text":"아닙니다 고객님. 마켓플레이스 상품은 초록 코퍼레이션 기본 정책이 아닌 각 판매자의 반품 정책을 따릅니다. 판매자마다 3일~30일로 다양하게 설정되어 있어요."},{"role":"customer","text":"그럼 판매자가 7일이라고 하면 7일이 맞는 건가요?"},{"role":"agent","text":"맞습니다. 상품 페이지에 판매자 반품 정책이 명시되어 있습니다. 다만 '상품 미수령'이나 '상품이 설명과 현저히 다른 경우'는 판매자 정책에 관계없이 초록 바이어 보호 정책이 적용됩니다."},{"role":"customer","text":"VIP면 예외 없나요?"},{"role":"agent","text":"마켓플레이스 상품의 경우 VIP 예외도 판매자 정책을 우선합니다. 단, 결함이나 오배송 건은 VIP 우선 처리해드릴 수 있어요."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["마켓플레이스","반품정책","VIP"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-06-004","timestamp":"2024-06-10T09:45:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"주문하고 결제도 했는데 결제 실패라고 뜨는데요?"},{"role":"agent","text":"결제 실패 시 주문이 접수되지 않고 청구도 되지 않습니다. 카드 잔액 부족, 한도 초과, 카드 만료 등이 원인일 수 있어요. 카드 정보 확인 후 다시 시도해보시거나 다른 결제 수단 이용해 보세요."},{"role":"customer","text":"그럼 돈이 나가지 않은 건 맞죠?"},{"role":"agent","text":"네 맞습니다. 결제 실패 시 금액 청구 없습니다. 혹시 카드 명세서에 '승인 취소'나 '임시 승인' 표시가 보이신다면 3-5영업일 내 자동 소멸됩니다."},{"role":"customer","text":"다른 카드로 다시 결제해볼게요"}],"resolution":"resolved","primary_intent":"payment_issue","secondary_intent":null,"tags":["결제실패","결제문의"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-06-005","timestamp":"2024-06-12T13:30:00+09:00","channel":"kakaotalk","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"구독하면 일반 주문도 배송비 무료인가요?"},{"role":"agent","text":"네! 활성 구독 회원이시면 구독 외 일반 주문에도 배송비 무료 혜택이 적용됩니다. 금액 제한 없이요."},{"role":"customer","text":"와 그럼 스탠다드보다 구독이 훨씬 낫겠네요"},{"role":"agent","text":"맞아요! 구독 시 일반 배송 무료 + 일반 구매 10% 할인 + 구독 배송 포인트 2배 + VIP 수준의 신상품 얼리 엑세스도 혜택이에요."},{"role":"customer","text":"좋다 구독 신청해야겠어요"}],"resolution":"resolved","primary_intent":"subscription","secondary_intent":"delivery_options","tags":["구독혜택","배송비","주제전환"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2024-07.jsonl b/src/main/resources/data/layer3_chatlogs/2024-07.jsonl deleted file mode 100644 index 02bdfac..0000000 --- a/src/main/resources/data/layer3_chatlogs/2024-07.jsonl +++ /dev/null @@ -1,15 +0,0 @@ -{"conversation_id":"CHAT-2024-07-001","timestamp":"2024-07-01T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"배송 왔는데 문 잠겨있어서 못 받았어요"},{"role":"agent","text":"한진택배 앱이나 문자로 보관소 위치 안내 받으셨나요?"},{"role":"customer","text":"문자 왔는데 보관소가 어딘지 모르겠어요"},{"role":"agent","text":"문자에 있는 운송장번호로 hanjin.kr 에서 보관소 위치 확인 가능합니다. 7일 이내 수령하셔야 해요."}],"resolution":"resolved","primary_intent":"track_order","secondary_intent":null,"tags":["부재중","보관소위치"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-07-002","timestamp":"2024-07-03T14:15:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"배송 중이라고만 뜨고 이틀째 업데이트가 없어요"},{"role":"agent","text":"주문번호 알려주시면 확인해드릴게요."},{"role":"customer","text":"20240701-4421"},{"role":"agent","text":"확인했습니다. 허브 통관 중인 것 같습니다. 물량이 많은 시기에 허브에서 지연이 생길 수 있어요. 오늘 오후까지 움직임이 없으면 한진 고객센터(1588-0011) 문의 권장드립니다."}],"resolution":"partially_resolved","primary_intent":"track_order","secondary_intent":null,"tags":["배송지연","허브","이틀째"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-07-003","timestamp":"2024-07-05T09:30:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"우선배송이랑 일반배송 차이가 뭐예요?"},{"role":"agent","text":"일반 배송은 2,500원으로 영업일 2-4일 소요됩니다. 우선 배송은 5,000원이고 다음 영업일 정오까지 도착 보장입니다. 2시간 단위 시간대도 지정 가능하고요. 플러스 등급이시면 일반 배송은 무료이고 우선 배송만 요금이 부과됩니다."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["배송비교","일반우선","플러스"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-07-004","timestamp":"2024-07-08T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"주말에 배송 되나요?"},{"role":"agent","text":"한진택배는 토요일 배송이 가능합니다. 일요일과 공휴일은 배송 없습니다. 당일 배송은 주말 불가입니다."},{"role":"customer","text":"일요일 배송도 해달라고 할 수 없나요?"},{"role":"agent","text":"죄송하게도 일요일 배송은 택배사 정책상 지원하지 않습니다."}],"resolution":"resolved","primary_intent":"delivery_period","secondary_intent":null,"tags":["주말배송","일요일","택배사정책"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-07-005","timestamp":"2024-07-10T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"대형 가전도 배송 해주나요?"},{"role":"agent","text":"네! 20kg 이상이나 '대형 상품'으로 분류된 상품은 롯데글로벌로지스 2인 배송팀이 방문합니다. 지정 장소 배치도 해드려요. 다만 계단 있거나 엘리베이터 제한 건물이면 층당 15,000원 추가 요금이 발생할 수 있습니다."},{"role":"customer","text":"아파트인데 엘리베이터 있어요"},{"role":"agent","text":"그러면 추가 요금 없이 원하시는 층에 배치해드립니다."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["대형가전","2인배송","계단요금"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-07-006","timestamp":"2024-07-12T09:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"울릉도도 배송 돼요?"},{"role":"agent","text":"울릉도는 배송 불가 지역입니다."},{"role":"customer","text":"진짜요? 다른 쇼핑몰은 된다던데"},{"role":"agent","text":"잠깐만요, 확인해보겠습니다. 죄송합니다, 울릉도 포함 주요 도서 지역은 배송 가능합니다. 다만 1-2일 추가 소요됩니다. 잘못 안내드렸습니다."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["울릉도","도서지역","오답수정"],"agent_accuracy":"partially_correct","accuracy_note":"울릉도 배송 가능한데 agent_jung이 불가라고 오안내 후 수정."} -{"conversation_id":"CHAT-2024-07-007","timestamp":"2024-07-15T14:30:00+09:00","channel":"live_chat","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"배송 조회하는데 '준비 중'에서 안 바뀌어요 이틀째"},{"role":"agent","text":"주문번호 알려주시면 확인해드릴게요."},{"role":"customer","text":"20240713-5501"},{"role":"agent","text":"확인했습니다. 재고 확보 지연으로 발송이 늦어지고 있는 상황입니다. 오늘 오후 발송 예정이고, 불편드려 대단히 죄송합니다. 지연 사과 쿠폰 2,000원 발급해드리겠습니다."},{"role":"customer","text":"감사해요"}],"resolution":"resolved","primary_intent":"track_order","secondary_intent":null,"tags":["발송지연","재고부족","사과쿠폰","VIP"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-07-008","timestamp":"2024-07-17T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"오늘 오후 1시 10분에 주문했어요 오늘 발송 되나요?"},{"role":"agent","text":"아쉽게도 발송 마감이 오후 1시라 10분 차이로 내일 오전 발송입니다. 우선 배송 선택하셨다면 내일 오전 발송, 모레 정오까지 도착 보장입니다."},{"role":"customer","text":"ㅠㅠ 1시 딱 맞춰 주문할 걸"},{"role":"agent","text":"아쉽지만 내일 오전 일찍 발송될 거예요!"}],"resolution":"resolved","primary_intent":"delivery_period","secondary_intent":null,"tags":["발송마감","1시","비격식"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-07-009","timestamp":"2024-07-19T15:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_park","turns":[{"role":"customer","text":"구독 상품이랑 일반 상품 같이 주문했는데 따로 와요?"},{"role":"agent","text":"구독 배송과 일반 주문은 별도로 발송됩니다. 같은 날 배송될 수도 있고 다를 수도 있어요. 합배송은 현재 지원하지 않습니다."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":"subscription","tags":["구독배송","합배송","별도발송"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-07-010","timestamp":"2024-07-22T11:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"배송 분리해서 올 수 있나요? 받는 날 다르게"},{"role":"agent","text":"같은 주문 건의 분리 배송은 기본적으로 지원하지 않습니다. 다만 다른 날 받으시려면 주문을 두 번에 나눠서 각각 예약 배송을 설정하시면 됩니다."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["분리배송","예약배송","날짜분리"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-07-011","timestamp":"2024-07-24T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"배송 기사님 연락처 알 수 있나요?"},{"role":"agent","text":"배송 기사 직접 연락처는 개인정보 보호상 안내드리기 어렵습니다. 대신 한진택배 앱에서 '배달 당일' 기사님과 메시지 주고받기 기능이 있어요. 운송장번호로 로그인하시면 됩니다."}],"resolution":"resolved","primary_intent":"track_order","secondary_intent":null,"tags":["배송기사","연락처","개인정보"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-07-012","timestamp":"2024-07-26T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"배송비 청구가 잘못된 것 같아요 2만원 이상 샀는데"},{"role":"agent","text":"주문번호 알려주시면 확인해드릴게요."},{"role":"customer","text":"20240726-1100"},{"role":"agent","text":"확인했습니다. 주문 금액이 18,500원으로 2만원 미만이라 배송비 2,500원이 정상 청구됐습니다."},{"role":"customer","text":"아 할인 적용하니까 줄었군요"},{"role":"agent","text":"네 맞습니다. 배송비 기준은 쿠폰/포인트 적용 후 최종 결제 금액이 아닌 상품 정가 기준입니다. 이 점 참고해 주세요."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["배송비","할인후금액","기준"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-07-013","timestamp":"2024-07-29T10:30:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"실시간 GPS 추적이 된다고 하던데요?"},{"role":"agent","text":"네, 우선 배송 이용 시 실시간 GPS 추적이 가능합니다. 일반 배송은 GPS 추적이 지원되지 않고 단계별 상태 업데이트만 제공됩니다. VIP이시면 우선 배송이 무료이니 항상 GPS 추적 이용 가능합니다."}],"resolution":"resolved","primary_intent":"track_order","secondary_intent":null,"tags":["GPS추적","우선배송","VIP"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-07-014","timestamp":"2024-07-30T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"오피스텔로 배송 될까요?"},{"role":"agent","text":"오피스텔 포함 유효한 한국 주소는 모두 배송 가능합니다. 건물명, 호수 정확히 입력해주시면 됩니다. 다만 경비실이나 무인 택배함에 맡길 수도 있으니 배송 메모에 특이사항 적어두시면 좋습니다."}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["오피스텔","배송주소","배송메모"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-07-015","timestamp":"2024-07-31T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"주문하고 얼마 뒤에 발송 알림 와요?"},{"role":"agent","text":"보통 당일이나 다음 날 발송됩니다."},{"role":"customer","text":"알림은 어떻게 와요?"},{"role":"agent","text":"카카오 알림톡으로 발송 완료와 운송장번호 안내됩니다. 카카오 알림 수신 설정 되어 있어야 받을 수 있어요."}],"resolution":"resolved","primary_intent":"track_order","secondary_intent":null,"tags":["발송알림","카카오알림톡"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2024-08.jsonl b/src/main/resources/data/layer3_chatlogs/2024-08.jsonl deleted file mode 100644 index 4cce878..0000000 --- a/src/main/resources/data/layer3_chatlogs/2024-08.jsonl +++ /dev/null @@ -1,30 +0,0 @@ -{"conversation_id":"CHAT-2024-08-001","timestamp":"2024-08-01T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"배송지를 바꾸고 싶어요"},{"role":"agent","text":"주문번호 알려주시면 확인해드릴게요."},{"role":"customer","text":"20240801-2201"},{"role":"agent","text":"확인했습니다. 현재 '준비중' 상태라 배송지 변경 가능합니다. 앱 나의 주문 > 해당 주문 선택 > 배송지 수정에서 변경하시거나 변경하실 주소 알려주시면 제가 처리해드릴게요."},{"role":"customer","text":"직접 바꿀게요 감사합니다"}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["배송지변경","준비중","즉시가능"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-002","timestamp":"2024-08-02T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"주문 배송지 바꿀 수 있나요?"},{"role":"agent","text":"주문번호 알려주시면 확인해드릴게요."},{"role":"customer","text":"20240801-3310"},{"role":"agent","text":"확인했습니다. 안타깝게도 이미 발송 완료 상태라 배송지 변경이 불가합니다. 발송 후에는 시스템상 변경이 어렵습니다."},{"role":"customer","text":"택배사에 직접 연락하면 어떻게 안 되나요?"},{"role":"agent","text":"한진택배 고객센터(1588-0011)에 운송장번호로 문의하시면 가능한 경우도 있습니다. 다만 배송 진행 중이면 어려울 수 있어요. 운송장번호 알려드릴까요?"},{"role":"customer","text":"네 알려주세요"},{"role":"agent","text":"운송장번호는 123456789입니다. 빠르게 연락해보세요!"}],"resolution":"partially_resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["배송지변경","발송완료","택배사직접"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-003","timestamp":"2024-08-03T09:15:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"배송지 저장을 여러 개 해두고 싶은데 어떻게 해요?"},{"role":"agent","text":"앱 마이페이지 > 배송지 관리에서 최대 10개까지 저장 가능합니다. 추가 버튼 눌러 주소, 수령인, 연락처 입력하시면 됩니다. 자주 쓰는 주소는 '기본 배송지'로 설정해두시면 편해요."}],"resolution":"resolved","primary_intent":"set_up_shipping_address","secondary_intent":null,"tags":["배송지저장","여러개","기본배송지"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-004","timestamp":"2024-08-05T15:00:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_choi","turns":[{"role":"customer","text":"기본 배송지 변경은 어디서 해요?"},{"role":"agent","text":"앱 마이페이지 > 배송지 관리에서 원하시는 주소 옆 '기본 설정' 버튼을 누르시면 됩니다. 주문 시 자동으로 해당 주소가 선택됩니다."},{"role":"customer","text":"주문할 때마다 바꾸는 것도 되죠?"},{"role":"agent","text":"네, 주문 결제 단계에서 저장된 배송지 중 선택하거나 새 주소 직접 입력도 가능합니다. 매 주문마다 유연하게 선택하실 수 있어요."}],"resolution":"resolved","primary_intent":"set_up_shipping_address","secondary_intent":null,"tags":["기본배송지","변경방법"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-005","timestamp":"2024-08-06T11:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"발송됐는데 배송지 바꿀 수 있어요?"},{"role":"agent","text":"잠깐만요, 주문번호 주시면 확인해드리겠습니다."},{"role":"customer","text":"20240805-4401"},{"role":"agent","text":"발송 완료 상태이긴 한데 배송지 변경 요청 넣어드릴게요. 가능할 수도 있어요."},{"role":"customer","text":"그럼 바꿔주세요 / 서울시 마포구 합정동 123-45로 부탁해요"},{"role":"agent","text":"죄송합니다, 다시 확인해보니 발송 후에는 시스템상 배송지 변경이 불가합니다. 제가 잘못 안내드렸어요. 한진 고객센터(1588-0011)에 직접 운송장번호로 문의해보시는 방법밖에 없습니다."}],"resolution":"partially_resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["배송지변경","발송완료","오답수정","agent_jung"],"agent_accuracy":"partially_correct","accuracy_note":"발송 후 배송지 변경 불가인데 agent_jung이 가능할 수도 있다고 오안내 후 수정."} -{"conversation_id":"CHAT-2024-08-006","timestamp":"2024-08-07T10:30:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"이사를 해서 배송지 업데이트 해야 해요"},{"role":"agent","text":"앱 마이페이지 > 배송지 관리에서 기존 주소 수정하시거나 새 주소 추가 후 기본 배송지로 설정하시면 됩니다. 이미 주문된 건이 있다면 별도로 수정 필요하고요."},{"role":"customer","text":"주문된 것도 있는데요"},{"role":"agent","text":"주문번호 알려주시면 해당 건 배송지 변경 가능 여부 확인해드릴게요. 아직 발송 전이면 변경 가능합니다."},{"role":"customer","text":"20240807-1001"},{"role":"agent","text":"확인했습니다. 준비중 상태라 변경 가능합니다. 새 주소 알려주시면 제가 업데이트해드릴게요."},{"role":"customer","text":"서울시 용산구 한강대로 400 / 감사합니다"},{"role":"agent","text":"배송지 업데이트 완료했습니다. 새 주소로 배송될 예정이에요!"}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":"set_up_shipping_address","tags":["이사","배송지업데이트","VIP"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-007","timestamp":"2024-08-08T14:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"주소 잘못 입력했어요 ㅠㅠ 어떡하죠"},{"role":"agent","text":"아이고! 주문번호 알려주시면 바로 확인해드릴게요."},{"role":"customer","text":"20240808-5521"},{"role":"agent","text":"아직 준비중이에요. 지금 바로 변경 가능합니다! 앱 나의 주문에서 직접 수정하시거나 올바른 주소 알려주시면 제가 처리해드릴게요."},{"role":"customer","text":"직접 바꿀게요 빨리요 ㅠ"},{"role":"agent","text":"네! 빨리 바꾸세요. 잘 받으실 수 있을 거예요 😊"}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["주소오류","준비중","비격식"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-008","timestamp":"2024-08-09T09:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"배송지 몇 개까지 저장돼요?"},{"role":"agent","text":"최대 10개까지 저장 가능합니다."},{"role":"customer","text":"10개 다 채웠는데 추가하려면 어떻게 해요?"},{"role":"agent","text":"기존 배송지 중 하나를 삭제하면 새 배송지 추가 가능합니다. 마이페이지 > 배송지 관리에서 삭제 후 추가하시면 됩니다."}],"resolution":"resolved","primary_intent":"set_up_shipping_address","secondary_intent":null,"tags":["배송지한도","10개","삭제후추가"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-009","timestamp":"2024-08-10T15:30:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"직장 주소랑 집 주소 둘 다 자주 써요 어떻게 설정하면 좋을까요"},{"role":"agent","text":"배송지 관리에서 두 주소 모두 저장하시고, 더 자주 쓰시는 쪽을 기본 배송지로 설정하시면 됩니다. 주문할 때마다 결제 단계에서 다른 저장 주소로 변경도 쉽게 가능하니 편하게 쓰실 수 있어요."},{"role":"customer","text":"주문마다 선택할 수 있는 거죠?"},{"role":"agent","text":"네 맞습니다. 매 주문 시 저장된 주소 중 선택하시거나 새 주소 입력 가능합니다."}],"resolution":"resolved","primary_intent":"set_up_shipping_address","secondary_intent":null,"tags":["복수배송지","직장집","주문시선택"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-010","timestamp":"2024-08-12T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"택배가 엉뚱한 데 가고 있어요 배송지가 틀려요"},{"role":"agent","text":"걱정 마세요! 주문번호 알려주시면 바로 확인해드릴게요."},{"role":"customer","text":"20240811-7702"},{"role":"agent","text":"확인했습니다. 어제 발송 완료됐고 현재 배송 중입니다. 발송 후에는 시스템 변경이 어렵지만 한진택배 고객센터(1588-0011)에 운송장번호 234567890으로 즉시 문의해보세요. 배송 중 변경은 택배사에서만 처리 가능합니다."},{"role":"customer","text":"왜 확인을 안 한 거지 진짜"},{"role":"agent","text":"정말 불편하고 걱정되시겠어요. 빨리 1588-0011에 연락하시면 기사님이 아직 배달 전이라면 변경 가능할 수 있습니다."}],"resolution":"partially_resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["배송지오류","발송후","고객불만","감정대응"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-011","timestamp":"2024-08-13T16:00:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"배송지 변경하면 배송 일정도 바뀌나요?"},{"role":"agent","text":"같은 권역 내 변경이라면 배송 일정에 영향 없습니다. 다만 제주도나 도서지역으로 변경하시면 1-2일 추가 소요될 수 있어요. 어디로 변경 예정이신가요?"},{"role":"customer","text":"서울에서 서울로요"},{"role":"agent","text":"그러면 배송 일정 그대로입니다. 안심하고 변경하세요."}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["배송지변경","일정영향","서울내"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-012","timestamp":"2024-08-14T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"배송 메모 추가할 수 있나요?"},{"role":"agent","text":"주문 시 배송 메모 입력 가능합니다. 주문 완료 후에도 발송 전이라면 앱 나의 주문 > 해당 주문에서 수정 가능합니다. '문 앞에 놓아주세요', '경비실 맡겨주세요' 등 원하시는 내용 입력하시면 기사님께 전달됩니다."},{"role":"customer","text":"발송 후엔 못 바꾸죠?"},{"role":"agent","text":"발송 후에는 수정이 어렵습니다. 발송 전에 미리 입력해두세요."}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["배송메모","발송전","수정가능"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-013","timestamp":"2024-08-15T09:30:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"VIP면 발송 후에도 배송지 변경 가능한가요?"},{"role":"agent","text":"안타깝게도 발송 후 배송지 변경은 등급과 관계없이 시스템상 불가합니다. 다만 VIP 고객님께는 한진택배와 우선 협조 요청 드릴 수 있어요. 운송장번호 알려드리면서 직접 연락하시는 방법이 가장 빠릅니다."},{"role":"customer","text":"알겠어요 운송장번호 알려주세요"},{"role":"agent","text":"주문번호 주시면 바로 확인해드리겠습니다."}],"resolution":"partially_resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["발송후","VIP","배송지변경불가","등급무관"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-014","timestamp":"2024-08-16T14:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"배송지 관리에서 삭제가 안 돼요"},{"role":"agent","text":"기본 배송지로 설정된 주소는 삭제가 불가합니다."},{"role":"customer","text":"기본 배송지가 아닌데도요?"},{"role":"agent","text":"확인해보겠습니다. 다른 이유가 있을 수 있어요. 혹시 어떤 오류 메시지가 뜨나요?"},{"role":"customer","text":"'삭제할 수 없습니다' 이라고만 뜨네요"},{"role":"agent","text":"앱 버전 문제일 수 있습니다. 앱을 최신 버전으로 업데이트 후 다시 시도해보시겠어요? 그래도 안 되면 고객센터로 문의 주세요."}],"resolution":"partially_resolved","primary_intent":"set_up_shipping_address","secondary_intent":null,"tags":["배송지삭제오류","앱버전","기본배송지"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-015","timestamp":"2024-08-19T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"배송지 이름(닉네임) 설정 가능한가요? 예를 들어 '회사', '본가' 이런 식으로"},{"role":"agent","text":"네! 배송지 저장 시 별칭 입력 가능합니다. '회사', '본가', '친정' 등 원하시는 이름으로 설정하시면 주문 시 구분이 쉬워요."},{"role":"customer","text":"기존 저장된 것도 수정 가능하죠?"},{"role":"agent","text":"네, 마이페이지 > 배송지 관리에서 수정 버튼으로 별칭 포함 모든 정보 수정 가능합니다."}],"resolution":"resolved","primary_intent":"set_up_shipping_address","secondary_intent":null,"tags":["배송지별칭","닉네임","회사본가"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-016","timestamp":"2024-08-20T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"배송지 변경 요청했는데 처리가 됐는지 확인할 수 있나요?"},{"role":"agent","text":"앱 나의 주문에서 해당 주문 눌러보시면 현재 배송지 정보 확인 가능합니다. 변경됐다면 새 주소로 표시될 거예요."},{"role":"customer","text":"확인됐어요 잘 바뀌었네요 감사합니다"}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["변경확인","주문조회"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-017","timestamp":"2024-08-21T14:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"배송지를 영문으로 입력해도 되나요?"},{"role":"agent","text":"배송지는 한국 주소이므로 한글 입력을 권장드립니다. 영문도 입력은 가능하지만 배송기사님이 인식하기 어려울 수 있어요. 외국인이시거나 특별한 이유가 있으시면 한국 주소 도로명 주소 형식으로 입력해주시는 게 가장 정확합니다."}],"resolution":"resolved","primary_intent":"set_up_shipping_address","secondary_intent":null,"tags":["영문주소","한글권장","도로명주소"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-018","timestamp":"2024-08-22T09:45:00+09:00","channel":"kakaotalk","customer_tier":"plus","agent_id":"agent_choi","turns":[{"role":"customer","text":"주문 전에 배송지 설정 안 해도 주문할 때 할 수 있죠?"},{"role":"agent","text":"네, 주문 결제 단계에서 새 주소 직접 입력 가능합니다. 미리 저장 안 해도 주문마다 입력 가능해요. 다만 자주 쓰는 주소는 미리 저장해두시면 더 편리합니다."}],"resolution":"resolved","primary_intent":"set_up_shipping_address","secondary_intent":null,"tags":["주문시입력","사전설정불필요"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-019","timestamp":"2024-08-23T16:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"다른 사람 주소로 배송 가능한가요? 선물 보내려고요"},{"role":"agent","text":"네, 받는 사람 이름, 주소, 연락처를 다르게 입력하시면 됩니다. 선물 포장 옵션도 추가 가능해요 (상품당 1,500원). 배송지 관리에 미리 저장해두시면 편리합니다."},{"role":"customer","text":"선물 메시지도 넣을 수 있나요?"},{"role":"agent","text":"선물 포장 선택 시 메시지 카드 옵션이 있습니다. 원하시는 메시지 입력해두시면 카드와 함께 포장되어 배송됩니다."}],"resolution":"resolved","primary_intent":"set_up_shipping_address","secondary_intent":null,"tags":["선물배송","타인주소","선물포장","메시지"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-020","timestamp":"2024-08-24T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"준비중인데 배송지 변경 어떻게 해요"},{"role":"agent","text":"앱 나의 주문 > 해당 주문 > 주소 변경 버튼 누르시면 됩니다."},{"role":"customer","text":"그 버튼이 없어요"},{"role":"agent","text":"죄송합니다, 앱 버전에 따라 메뉴 위치가 다를 수 있어요. '주문 상세' 페이지에서 스크롤 내리다 보면 '배송 정보 변경' 섹션이 있을 거예요. 혹시 앱 버전 확인해보시겠어요?"},{"role":"customer","text":"최신 버전인데도 없네요"},{"role":"agent","text":"그러면 제가 직접 변경해드릴게요. 새 배송지 알려주시겠어요?"}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["앱버튼없음","직접변경","준비중"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-021","timestamp":"2024-08-26T10:00:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_lee","turns":[{"role":"customer","text":"배송지 일괄 변경 가능한가요? 주문이 3개인데"},{"role":"agent","text":"각 주문별로 개별 변경이 필요합니다. 일괄 변경 기능은 아직 지원하지 않습니다. 주문번호 3개 알려주시면 제가 한 번에 처리해드릴 수 있습니다."},{"role":"customer","text":"20240825-1001, 20240825-1002, 20240825-1003 세 개요"},{"role":"agent","text":"확인했습니다. 세 건 모두 준비중이에요. 변경하실 주소 알려주시면 한 번에 처리해드릴게요."},{"role":"customer","text":"경기도 성남시 분당구 판교로 123"},{"role":"agent","text":"세 주문 모두 배송지 업데이트 완료했습니다. VIP 고객님, 항상 이용해주셔서 감사합니다!"}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["다중주문","일괄변경","VIP","대행처리"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-022","timestamp":"2024-08-27T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"배송지 변경하면 취소하고 재주문 해야 하나요?"},{"role":"agent","text":"아니요! 취소 없이 직접 변경 가능합니다. 준비중 상태라면 앱에서 바로 배송지만 수정하시면 됩니다."},{"role":"customer","text":"안심이네요 감사합니다"}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["재주문불필요","직접변경"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-023","timestamp":"2024-08-28T09:15:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"배송지 변경 신청했는데 완료 문자가 안 와요"},{"role":"agent","text":"배송지 변경 시 별도 문자 안내는 발송되지 않습니다. 앱 나의 주문에서 변경된 배송지 확인하시면 됩니다. 변경이 정상 반영됐는지 확인해보시겠어요?"},{"role":"customer","text":"앱에서 보니까 잘 바뀌었어요"},{"role":"agent","text":"그러면 정상 처리된 거예요. 문자 없이 앱에서 확인하시면 됩니다."}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["변경알림없음","앱확인"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-024","timestamp":"2024-08-29T11:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"배송지에 상세주소를 안 썼어요"},{"role":"agent","text":"주문번호 알려주시면 확인해드릴게요."},{"role":"customer","text":"20240829-2201"},{"role":"agent","text":"준비중 상태입니다. 지금 바로 수정 가능해요. 상세주소 알려주시면 제가 추가해드릴게요."},{"role":"customer","text":"101동 1504호예요"},{"role":"agent","text":"배송지 상세주소 '101동 1504호' 추가 완료했습니다. 원활하게 배송 받으실 거예요!"}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["상세주소누락","수정완료"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-025","timestamp":"2024-08-30T14:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"해외 주소로 배송 가능한가요?"},{"role":"agent","text":"죄송하게도 현재 국내 배송만 지원하고 있습니다. 해외 배송은 서비스 준비 중이며 아직 제공되지 않습니다."},{"role":"customer","text":"언제 될지도 모르죠?"},{"role":"agent","text":"정확한 일정은 안내하기 어렵습니다. 서비스 출시 시 앱 알림이나 공지사항으로 안내될 예정입니다."}],"resolution":"resolved","primary_intent":"set_up_shipping_address","secondary_intent":null,"tags":["해외배송불가","국내전용"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-026","timestamp":"2024-08-31T10:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"주소 오타가 있어요 동 이름이 틀렸어요"},{"role":"agent","text":"주문번호와 현재 입력된 주소, 올바른 주소 알려주시면 바로 수정해드리겠습니다."},{"role":"customer","text":"20240831-3301 / 현재 합정동인데 망원동이 맞아요"},{"role":"agent","text":"확인했습니다. 아직 준비중이라 변경 가능합니다. 배송지를 합정동에서 망원동으로 수정해드릴게요. 도로명 주소나 상세주소도 다른 게 있으신가요?"},{"role":"customer","text":"도로명이랑 번지는 같고 동 이름만 달라요"},{"role":"agent","text":"수정 완료했습니다. 정확한 주소로 배송될 예정입니다."}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["주소오타","동이름","수정완료"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-027","timestamp":"2024-08-31T14:30:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"배송지 변경 요청하고 싶은데 고객센터 운영 시간이 언제예요?"},{"role":"agent","text":"고객센터는 평일 오전 9시~오후 6시 운영합니다. 지금 바로 저를 통해 변경 도움드릴 수 있어요!"},{"role":"customer","text":"그럼 바로 부탁드려요 / 주문번호 20240831-0501이고 새 주소는 서울시 강남구 테헤란로 100이에요"},{"role":"agent","text":"확인했습니다. 준비중 상태라 변경 가능합니다. 배송지를 서울시 강남구 테헤란로 100으로 업데이트 완료했습니다. VIP 고객님, 항상 감사드립니다!"}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":"contact_customer_service","tags":["운영시간","즉시대행","VIP"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-028","timestamp":"2024-08-31T16:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"무인 택배함에 맡겨달라고 메모 하려는데 주소에 써야 해요 메모에 써야 해요?"},{"role":"agent","text":"배송 메모에 써주시는 게 맞습니다. 주문 시 또는 발송 전에 '배송 메모' 칸에 '무인 택배함에 넣어주세요' 또는 '1층 무인 택배함'처럼 상세히 적어주시면 기사님이 확인하고 처리해드립니다."}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["무인택배함","배송메모","요청사항"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-029","timestamp":"2024-08-31T16:45:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"배송지 변경을 너무 자주 하면 불이익 있나요?"},{"role":"agent","text":"아니요, 배송지 변경 횟수에 따른 불이익은 없습니다. 단 발송 후에는 변경이 불가하니 주문 후 빠르게 확인하고 필요하면 변경하시는 게 좋습니다."}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["변경횟수제한없음","정책안내"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-08-030","timestamp":"2024-08-31T17:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"배송지 변경하면 배송비가 다시 계산되나요?"},{"role":"agent","text":"같은 배송 구역 내 변경은 배송비 변동이 없습니다. 다만 제주도, 도서산간 등 추가 운임 지역으로 변경하시는 경우 배송비 차액이 청구될 수 있어요."},{"role":"customer","text":"서울에서 경기도로 바꾸는 거예요"},{"role":"agent","text":"서울-경기도 모두 일반 배송 권역이라 배송비 변동 없습니다. 안심하고 변경하세요."}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["배송비변동","지역권역","서울경기"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2024-09.jsonl b/src/main/resources/data/layer3_chatlogs/2024-09.jsonl deleted file mode 100644 index e48f000..0000000 --- a/src/main/resources/data/layer3_chatlogs/2024-09.jsonl +++ /dev/null @@ -1,5 +0,0 @@ -{"conversation_id":"CHAT-2024-09-001","timestamp":"2024-09-10T10:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"추석 연휴에도 배송이 되나요?"},{"role":"agent","text":"추석 연휴(9월 16~18일) 기간은 발송이 중단됩니다. 9월 13일 오후 1시 이후 주문은 추석 이후인 9월 19일 발송 처리됩니다. 연휴 전에 받으시려면 9월 13일 오후 1시 이전까지 주문하시는 게 좋습니다."},{"role":"customer","text":"그럼 오늘 9월 10일 주문하면?"},{"role":"agent","text":"오늘 오후 1시 이전 주문은 오늘 발송, 이후는 내일(11일) 발송입니다. 일반 배송 기준 2-4영업일이니 늦어도 9월 13일 이전에 수령 가능합니다."},{"role":"customer","text":"냉장 식품도요?"},{"role":"agent","text":"냉장 식품은 9월 11일(수) 이후 발송이 어렵습니다. 냉장 배송은 월~목만 가능하고, 추석 발송 중단 영향을 받아 9월 11일 오전 11시 이전 주문까지만 연휴 전 수령 가능합니다."}],"resolution":"resolved","primary_intent":"delivery_period","secondary_intent":"delivery_options","tags":["추석","연휴배송","냉장배송","한시적정책"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-09-002","timestamp":"2024-09-11T14:20:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"ㅠㅠ 상품이 잘못 왔어요 다른 거 왔는데"},{"role":"agent","text":"아이고 정말 불편하셨겠어요 ㅠㅠ 주문번호랑 받으신 상품 사진 보내주시면 바로 처리해드릴게요!"},{"role":"customer","text":"20240908-7721이고 사진 올릴게요"},{"role":"agent","text":"사진 확인했습니다. 오배송이 맞네요 정말 죄송합니다. 잘못 온 상품 무료 수거 후 정확한 상품 우선 배송으로 보내드릴게요. 추가로 불편 쿠폰 5,000원도 발급해드리겠습니다."},{"role":"customer","text":"빨리 받을 수 있나요?"},{"role":"agent","text":"내일 수거 예약 잡아드리고 수거 완료 당일 출고 처리해드릴게요. 모레 중에 받으실 수 있을 거예요."}],"resolution":"resolved","primary_intent":"wrong_item_received","secondary_intent":null,"tags":["오배송","비격식","이모티콘"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-09-003","timestamp":"2024-09-16T11:30:00+09:00","channel":"live_chat","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"지난 달에 구매한 냉장고 반품하려고요. 구매한지 18일 됐는데 제품에 하자가 있어요"},{"role":"agent","text":"안녕하세요 고객님. 18일이 지나셨군요. 일반 반품 기간은 14일이지만 제품 하자의 경우 VIP 고객님에 한해 예외 검토가 가능합니다. 하자 내용과 관련 사진을 나의 주문 > 불만 신고로 접수해 주시면 담당팀에서 검토 후 연락드리겠습니다."},{"role":"customer","text":"얼마나 걸려요?"},{"role":"agent","text":"영업일 기준 1-2일 내에 담당자가 연락드립니다. VIP 우선 처리라 빠르게 진행될 거예요. 혹시 대형 가전 제품이라면 방문 수거 일정도 함께 안내드릴 예정입니다."},{"role":"customer","text":"알겠어요 신고 접수할게요"}],"resolution":"escalated","primary_intent":"return_request","secondary_intent":null,"tags":["반품","14일초과","VIP예외","대형가전","에스컬레이션"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-09-004","timestamp":"2024-09-18T09:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"세금계산서 발급 요청할 수 있나요?"},{"role":"agent","text":"네 가능합니다! '나의 주문'에서 해당 주문 선택 후 '세금계산서 요청'을 탭하시면 됩니다. 사업자등록번호 입력하시면 영업일 1일 이내 이메일로 발급됩니다."},{"role":"customer","text":"저번 달 주문 건도 발급 가능한가요?"},{"role":"agent","text":"세금계산서는 구매한 당월 내에만 신청 가능합니다. 전월 주문 건은 세법상 소급 발급이 어렵습니다. 이번 달 주문부터 즉시 신청해 두시는 게 좋습니다."},{"role":"customer","text":"아 그렇군요 알겠어요"}],"resolution":"resolved","primary_intent":"check_invoice","secondary_intent":null,"tags":["세금계산서","당월","기업"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-09-005","timestamp":"2024-09-20T15:45:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_park","turns":[{"role":"customer","text":"주문 취소하고 싶은데 이미 배송 시작됐어요. 환불은 어떻게 되나요?"},{"role":"agent","text":"배송 시작 후에는 취소가 불가능합니다. 수령 후 반품 신청하셔야 합니다."},{"role":"customer","text":"반품 신청 어떻게 해요?"},{"role":"agent","text":"앱에서 나의 주문 > 해당 주문 > 반품 신청 선택하시면 됩니다. 사유 선택하고 사진 업로드 후 수거 날짜 잡으시면 됩니다."},{"role":"customer","text":"단순 변심이라 비용 드나요?"},{"role":"agent","text":"단순 변심 반품은 3,000원 처리비 차감됩니다. 결함이 있으시면 무료예요."},{"role":"customer","text":"알겠어요 받고나서 신청할게요 얼마나 걸려요?"},{"role":"agent","text":"수거 후 검수 1-2일, 카드 환불 3-5영업일, 카카오/네이버페이는 즉시 처리됩니다."}],"resolution":"resolved","primary_intent":"cancel_order","secondary_intent":"return_request","tags":["취소불가","반품신청","주제전환","다중주제"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2024-10.jsonl b/src/main/resources/data/layer3_chatlogs/2024-10.jsonl deleted file mode 100644 index 3b341f4..0000000 --- a/src/main/resources/data/layer3_chatlogs/2024-10.jsonl +++ /dev/null @@ -1,30 +0,0 @@ -{"conversation_id":"CHAT-2024-10-001","timestamp":"2024-10-01T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"반품 기간이 얼마나 돼요?"},{"role":"agent","text":"수령일 기준 14일 이내 반품 신청 가능합니다. 단 개봉하지 않은 상품이어야 하며, 단순 변심은 왕복 배송비 3,000원이 부담됩니다. 상품 불량이라면 무료 반품입니다."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["반품기간","14일","단순변심"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-002","timestamp":"2024-10-02T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"반품 가능한 기간이 어떻게 돼요?"},{"role":"agent","text":"수령 후 7일 이내에 반품 신청하셔야 합니다."},{"role":"customer","text":"7일이요? 다른 쇼핑몰은 14일이던데"},{"role":"agent","text":"죄송합니다, 제가 잘못 안내드렸어요. 현재 정책은 수령일 기준 14일 이내입니다. 예전에 7일이었는데 지금은 14일로 변경됐습니다."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["반품기간","오답수정","agent_jung","7일→14일"],"agent_accuracy":"partially_correct","accuracy_note":"현행 반품 기간은 14일인데 agent_jung이 7일로 오안내 후 수정."} -{"conversation_id":"CHAT-2024-10-003","timestamp":"2024-10-03T09:15:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"반품하면 환불은 언제 되나요?"},{"role":"agent","text":"반품 상품 수거 후 검수 완료까지 2-3영업일, 환불 처리는 결제 수단에 따라 다릅니다. 신용카드는 3-5영업일, 카카오페이·네이버페이는 검수 완료 당일, 계좌이체는 최대 7영업일 소요됩니다."},{"role":"customer","text":"총 얼마나 걸리는 거예요?"},{"role":"agent","text":"빠르면 카카오페이 기준 반품 접수 후 3-5일, 신용카드는 1-2주 정도로 생각하시면 됩니다."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["환불기간","결제수단별","카카오페이","신용카드"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-04","timestamp":"2024-10-04T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"개봉한 상품도 반품 가능한가요?"},{"role":"agent","text":"단순 변심의 경우 개봉 상품은 반품이 어렵습니다. 다만 상품 불량이나 오배송의 경우는 개봉 후에도 반품 가능합니다."},{"role":"customer","text":"개봉해서 써보니까 마음에 안 들어요"},{"role":"agent","text":"아쉽게도 사용 흔적이 있는 경우 단순 변심 반품이 불가합니다. 상품 자체 불량이 있으시다면 불량 사진 첨부하여 반품 신청해주시면 됩니다."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["개봉상품","단순변심불가","불량반품"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-05","timestamp":"2024-10-07T11:00:00+09:00","channel":"live_chat","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"VIP는 반품 기간이 더 긴가요?"},{"role":"agent","text":"기본 반품 정책은 14일로 동일합니다. VIP 혜택에 대해 더 확인해드릴게요."},{"role":"customer","text":"일반 고객이랑 같은 거예요?"},{"role":"agent","text":"반품 기간은 14일로 동일하지만 VIP 고객님께는 반품 처리 우선 지원 및 전담 상담사 배정 혜택이 있습니다."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["VIP반품","기간동일","우선지원"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-06","timestamp":"2024-10-08T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"반품 신청은 어떻게 해요?"},{"role":"agent","text":"앱 나의 주문 > 해당 주문 선택 > '반품/교환 신청' 버튼 누르시면 됩니다. 반품 사유 선택 후 사진 첨부(불량의 경우) 하시면 완료예요. 수거 기사님이 지정일에 방문합니다."},{"role":"customer","text":"수거 날짜 제가 선택할 수 있나요?"},{"role":"agent","text":"네, 반품 신청 시 수거 희망일 선택 가능합니다. 영업일 기준 1-3일 내 날짜 중 선택하시면 됩니다."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["반품신청방법","앱","수거일지정"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-07","timestamp":"2024-10-09T10:30:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"반품 배송비가 얼마예요?"},{"role":"agent","text":"단순 변심은 왕복 배송비 3,000원이 환불 금액에서 차감됩니다. 상품 불량이나 오배송의 경우는 무료입니다."},{"role":"customer","text":"불량인지 단순 변심인지 어떻게 판단해요?"},{"role":"agent","text":"검수팀이 수거 상품 확인 후 판단합니다. 불량 의심 시 불량 부위 사진을 첨부해 신청해주시면 유리합니다. 정상 상품을 불량으로 신청해도 검수 후 단순 변심으로 처리되고 배송비가 차감될 수 있어요."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["반품배송비","불량판단","검수"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-08","timestamp":"2024-10-10T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"환불 신청했는데 언제쯤 들어와요?"},{"role":"agent","text":"주문번호 알려주시면 반품 진행 상황 확인해드릴게요."},{"role":"customer","text":"20241007-3301"},{"role":"agent","text":"확인했습니다. 어제 반품 상품 수거 완료됐고 현재 검수 중입니다. 검수는 1-2영업일 소요되고, 완료 후 카카오페이로 환불 처리됩니다. 카카오페이는 당일 환불이라 이번 주 내 받으실 수 있을 거예요."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["환불조회","검수중","카카오페이"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-09","timestamp":"2024-10-11T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"반품 접수했는데 수거를 안 오네요"},{"role":"agent","text":"불편드려 죄송합니다. 주문번호 알려주시면 수거 일정 확인해드릴게요."},{"role":"customer","text":"20241010-5501"},{"role":"agent","text":"확인했습니다. 수거 예정일이 내일로 되어 있네요. 혹시 오늘 수거 예약이었다면 기사님 방문 시간 늦어진 것 같아요. 오늘 오후 6시까지 오지 않으면 다시 문의 주세요. 일정 변경도 도와드릴 수 있습니다."},{"role":"customer","text":"내일이라고요? 오늘인 줄 알았어요"},{"role":"agent","text":"반품 신청 시 선택하신 수거일이 내일로 되어 있어요. 앱에서도 확인 가능합니다."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["수거미방문","수거일확인","반품진행"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-10","timestamp":"2024-10-14T11:00:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"쿠폰으로 할인받은 금액도 환불되나요?"},{"role":"agent","text":"쿠폰 할인 금액은 환불되지 않습니다. 실제 결제하신 금액만 환불됩니다. 단, 사용하신 쿠폰이 유효기간 내라면 반품 처리 시 복구됩니다."},{"role":"customer","text":"쿠폰이 복구된다고요? 그럼 다시 쓸 수 있어요?"},{"role":"agent","text":"네, 쿠폰 원래 만료일 내에서 복구됩니다. 이미 만료됐다면 복구가 어렵습니다."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["쿠폰환불","할인금액","쿠폰복구"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-11","timestamp":"2024-10-15T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"반품 기간 지났는데 반품 가능한가요?"},{"role":"agent","text":"반품 기간은 7일이라 지나셨으면 원칙적으로 반품이 어렵습니다."},{"role":"customer","text":"7일이요? 14일 아닌가요?"},{"role":"agent","text":"죄송합니다, 맞습니다. 현재 14일이에요. 제가 구버전 정책을 안내해버렸어요. 수령일로부터 14일 이내면 가능합니다. 언제 받으셨나요?"},{"role":"customer","text":"12일 전에요"},{"role":"agent","text":"다행히 14일 이내이시네요. 지금 바로 반품 신청 가능합니다."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["반품기간초과","오답수정","agent_jung","7일→14일"],"agent_accuracy":"partially_correct","accuracy_note":"agent_jung이 또 7일로 오안내. 현행 정책은 14일."} -{"conversation_id":"CHAT-2024-10-12","timestamp":"2024-10-16T10:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"교환도 가능한가요? 사이즈가 맞지 않아요"},{"role":"agent","text":"교환 신청은 앱 반품/교환 신청에서 '교환'을 선택하시면 됩니다. 수령 후 14일 이내, 미개봉 또는 착용 흔적이 없어야 합니다. 동일 상품 다른 사이즈로 교환하실 경우 배송비 왕복 3,000원이 추가됩니다."},{"role":"customer","text":"재고가 없으면 어떻게 되나요?"},{"role":"agent","text":"교환 요청하신 사이즈가 품절이면 교환 대신 환불 처리됩니다. 신청 시 확인해드릴게요."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["사이즈교환","교환정책","품절환불"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-13","timestamp":"2024-10-17T15:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"반품하면 포인트는 어떻게 돼요?"},{"role":"agent","text":"반품 시 해당 주문으로 적립된 포인트는 회수됩니다. 주문 시 사용하신 포인트는 복구됩니다. 단, 이미 포인트를 다른 주문에 사용하셨다면 복구된 포인트가 마이너스 처리될 수 있어요."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":"loyalty_points","tags":["반품포인트","적립회수","사용포인트복구"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-14","timestamp":"2024-10-18T11:00:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"반품 상품 수거하러 왔는데 상품을 못 찾겠대요 어떡해요"},{"role":"agent","text":"당황스러우시겠어요. 혹시 상품을 어디 두셨는지 기사님께 안내해드리셨나요? 택배 상자나 원래 포장재로 다시 포장해서 준비해두셔야 합니다."},{"role":"customer","text":"포장 다시 해야 해요?"},{"role":"agent","text":"네, 반품 시 가능하면 원래 포장재로 재포장해주시면 좋습니다. 원포장재가 없다면 박스나 비닐로 안전하게 포장해주세요. 기사님이 수거 후 운송 중 파손되면 환불이 어려울 수 있어요."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["반품수거","포장","VIP"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-15","timestamp":"2024-10-21T10:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"반품 후 환불이 너무 늦어요 2주 됐어요"},{"role":"agent","text":"많이 기다리셨겠어요. 주문번호 알려주시면 바로 확인해드릴게요."},{"role":"customer","text":"20241001-1100"},{"role":"agent","text":"확인했습니다. 검수는 10월 5일에 완료됐는데 환불 처리가 지연되고 있네요. 신용카드로 결제하셨는데 카드사 처리가 늦어진 것 같습니다. 담당팀에 긴급 처리 요청 드리겠습니다. 오늘 내로 처리 완료 예정으로 안내 받으실 거예요. 정말 죄송합니다."}],"resolution":"escalated","primary_intent":"get_refund","secondary_intent":null,"tags":["환불지연","2주","긴급처리","에스컬레이션"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-16","timestamp":"2024-10-22T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"마켓플레이스 상품도 반품 정책이 같아요?"},{"role":"agent","text":"마켓플레이스 판매자 상품은 각 판매자의 반품 정책을 따릅니다. 기본적으로 7-14일이지만 판매자마다 다를 수 있어요. 상품 페이지에서 판매자 반품 정책 확인하시는 걸 권장드립니다."},{"role":"customer","text":"판매자 정책이 14일보다 짧을 수 있어요?"},{"role":"agent","text":"네, 판매자에 따라 더 짧거나 길 수 있습니다. 분쟁이 생기면 저희 고객센터에서 중재해드릴 수 있어요."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["마켓플레이스반품","판매자정책","중재"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-17","timestamp":"2024-10-23T09:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"식품도 반품 가능한가요?"},{"role":"agent","text":"식품류는 수령 후 개봉하지 않은 경우에만 반품 가능하며, 유통기한이 충분히 남아 있어야 합니다. 신선식품, 냉동/냉장 식품은 위생상 반품이 제한될 수 있어요. 불량이나 이물 발견 시에는 사진 첨부하여 신청해주시면 됩니다."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["식품반품","신선식품","개봉전"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-18","timestamp":"2024-10-24T14:30:00+09:00","channel":"kakaotalk","customer_tier":"plus","agent_id":"agent_choi","turns":[{"role":"customer","text":"반품 신청이 자꾸 오류나요"},{"role":"agent","text":"불편드려 죄송합니다. 어떤 오류 메시지가 뜨는지 알려주시겠어요?"},{"role":"customer","text":"'반품 신청 불가' 라고만 뜨고 넘어가질 않아요"},{"role":"agent","text":"주문번호 알려주시면 제가 직접 확인해드릴게요. 반품 기간 초과나 이미 신청된 경우일 수 있어요."},{"role":"customer","text":"20241020-7712"},{"role":"agent","text":"확인했습니다. 이미 반품 신청이 접수된 건이 있어서 중복 신청이 안 되는 거예요. 기존 신청 현황 확인해드릴까요?"}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["반품오류","중복신청","기존건확인"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-19","timestamp":"2024-10-25T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"부분 반품이 가능한가요? 여러 개 시켰는데 하나만 반품하고 싶어요"},{"role":"agent","text":"네, 부분 반품 가능합니다. 앱 반품 신청에서 반품하실 상품만 선택하시면 됩니다. 선택한 상품 금액만 환불되고 나머지는 그대로 유지됩니다."},{"role":"customer","text":"배송비는 어떻게 되나요?"},{"role":"agent","text":"부분 반품도 단순 변심이면 배송비 3,000원 차감됩니다. 나머지 상품 유지 여부에 따라 무료 배송 기준이 다시 계산될 수 있어요. 예를 들어 남은 상품 금액이 2만원 미만이면 원래 무료 배송이었던 건도 배송비가 소급 청구될 수 있습니다."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["부분반품","배송비소급","선택반품"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-20","timestamp":"2024-10-28T09:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"환불은 원래 결제 수단으로 돌아와요?"},{"role":"agent","text":"네, 결제하신 수단으로 환불됩니다. 카드 결제 → 카드 환불, 카카오페이 → 카카오페이, 계좌이체 → 등록 계좌로 입금됩니다. 다른 계좌나 수단으로 변경은 어렵습니다."},{"role":"customer","text":"계좌이체로 했는데 그 계좌 없애버렸어요"},{"role":"agent","text":"그런 경우 고객센터로 문의 주시면 다른 계좌로 환불 처리 도와드릴 수 있습니다. 본인 인증이 필요할 수 있어요."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["환불수단","계좌이체","계좌변경"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-21","timestamp":"2024-10-29T14:00:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_park","turns":[{"role":"customer","text":"반품 사유를 잘못 선택했어요 단순변심으로 했는데 불량이에요"},{"role":"agent","text":"반품 신청 후 사유 변경은 수거 전에만 가능합니다. 아직 수거 전이시면 반품 신청 취소 후 불량으로 재신청하시거나 저한테 말씀해주시면 처리해드릴게요."},{"role":"customer","text":"수거가 내일인데 지금 바꿀 수 있나요?"},{"role":"agent","text":"주문번호 알려주시면 제가 불량 사유로 수정해드릴게요. 이렇게 하시면 배송비 3,000원 차감 없이 환불받으실 수 있어요."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["반품사유변경","단순변심→불량","배송비면제","VIP"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-22","timestamp":"2024-10-30T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"반품하면 적립금도 다시 써요?"},{"role":"agent","text":"반품 시 사용하신 적립금(포인트)은 복구됩니다. 단, 복구된 포인트는 유효기간이 원래 포인트 유효기간으로 적용됩니다. 반품으로 인해 포인트 유효기간이 연장되지는 않아요."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":"loyalty_points","tags":["적립금복구","유효기간","반품포인트"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-23","timestamp":"2024-10-31T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"배송 중인 상품을 반품할 수 있나요?"},{"role":"agent","text":"배송 중에는 반품 신청이 어렵습니다. 수령 후 10일 이내에 반품 신청하시면 됩니다."},{"role":"customer","text":"10일이요? 14일 아닌가요"},{"role":"agent","text":"맞습니다 죄송합니다. 14일입니다. 수령 후 14일 이내 신청하시면 됩니다. 배송 중에는 일단 받으신 후 바로 신청하시면 되겠습니다."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["배송중반품","오답수정","agent_jung","10일→14일"],"agent_accuracy":"partially_correct","accuracy_note":"agent_jung이 10일로 오안내 (구버전 v2 정책). 현행은 14일."} -{"conversation_id":"CHAT-2024-10-24","timestamp":"2024-10-31T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"반품 수거 기사님이 안 오셨어요"},{"role":"agent","text":"주문번호 알려주시면 수거 스케줄 확인해드릴게요."},{"role":"customer","text":"20241030-4401"},{"role":"agent","text":"확인했습니다. 오늘 수거 예정인데 기사님 배송 물량이 많아 늦어지는 것 같아요. 오후 7시까지 기다려보시고 안 오시면 한진 고객센터(1588-0011)에 문의하시거나 저한테 재연락 주시면 다음 날 수거로 재신청해드릴게요."}],"resolution":"partially_resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["수거미방문","재신청","대기요청"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-25","timestamp":"2024-10-31T14:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"반품 완료됐는데 환불 문자가 안 와요"},{"role":"agent","text":"반품 완료 후 환불 시 카카오 알림톡으로 안내됩니다. 알림 수신 설정 확인해보시겠어요? 혹시 주문번호 알려주시면 환불 처리 여부 직접 확인해드릴게요."},{"role":"customer","text":"20241025-2201"},{"role":"agent","text":"확인했습니다. 오늘 오전 환불 처리 완료됐어요. 플러스 등급이시라 무료 배송 건이라 전액 환불됐습니다. 카드사 처리에 2-3일 더 소요될 수 있어요."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["환불알림","처리완료","카드사처리"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-26","timestamp":"2024-10-31T16:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"구독 상품도 반품 되나요?"},{"role":"agent","text":"구독 정기 배송 상품도 수령 후 14일 이내, 미개봉 상태면 반품 가능합니다. 구독 자체를 취소하시려면 구독 관리에서 별도로 처리하셔야 해요."},{"role":"customer","text":"구독 취소랑 반품은 별개인 거죠?"},{"role":"agent","text":"네, 구독 취소는 정기 배송 자체를 멈추는 것이고, 반품은 이미 받은 상품을 돌려보내는 거예요. 둘 다 필요하시면 각각 신청하셔야 합니다."}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":"subscription","tags":["구독반품","구독취소별개","14일"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-27","timestamp":"2024-10-31T17:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"반품 신청 취소할 수 있나요? 마음이 바뀌었어요"},{"role":"agent","text":"수거 전이라면 반품 신청 취소 가능합니다. 앱 나의 주문 > 해당 주문 > 반품/교환 내역에서 신청 취소하시면 됩니다. 이미 수거됐다면 취소가 어렵습니다."},{"role":"customer","text":"오늘 수거 예정인데 기사님 오기 전에 빨리 취소해야겠네요"},{"role":"agent","text":"네 맞습니다. 수거 전에 빨리 취소하세요!"}],"resolution":"resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["반품신청취소","수거전","빠른처리"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-28","timestamp":"2024-10-31T17:30:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"환불금액이 생각보다 적어요"},{"role":"agent","text":"주문번호 알려주시면 환불 내역 확인해드릴게요."},{"role":"customer","text":"20241028-0801"},{"role":"agent","text":"확인했습니다. 원주문 금액 35,000원에서 단순 변심 반품 배송비 3,000원이 차감되어 32,000원 환불 처리됐습니다. 혹시 이 차감 내용 모르고 계셨나요?"},{"role":"customer","text":"아 맞다 배송비 차감되는 거 깜빡했어요"},{"role":"agent","text":"네, 단순 변심은 3,000원 차감이 원칙입니다. 불량 반품이셨다면 전액 환불 가능했을 거예요."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["환불금액확인","배송비차감","단순변심"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-29","timestamp":"2024-10-31T18:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"한 달 됐는데 반품 가능한가요? 사정이 있었어요"},{"role":"agent","text":"안타깝게도 반품은 수령 후 14일 이내에만 가능합니다. 한 달이 지나셨다면 원칙적으로 반품이 어렵습니다."},{"role":"customer","text":"사정이 있어서 못 했는데 예외는 없나요?"},{"role":"agent","text":"일반적으로는 기간 초과 시 반품이 불가합니다. 특별한 사정(천재지변, 입원 등)이 있으시면 증빙자료와 함께 고객센터로 문의 주시면 검토는 해드릴 수 있어요. 다만 승인 보장은 어렵습니다."}],"resolution":"partially_resolved","primary_intent":"check_refund_policy","secondary_intent":null,"tags":["반품기간초과","예외요청","증빙"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-10-30","timestamp":"2024-10-31T19:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"오배송 받았어요 다른 상품이 왔어요"},{"role":"agent","text":"정말 불편드려 죄송합니다. 오배송은 무료로 반품 처리해드리고 올바른 상품을 발송해드립니다. 주문번호와 받으신 상품 사진 알려주시면 바로 처리해드릴게요."},{"role":"customer","text":"20241030-9901이고 제가 주문한 건 노트북 파우치인데 마우스가 왔어요"},{"role":"agent","text":"오배송 확인됐습니다. 수거 기사님 내일 방문 예약해드리겠습니다. 올바른 노트북 파우치는 수거 완료 후 바로 발송됩니다. 정말 죄송합니다."}],"resolution":"resolved","primary_intent":"get_refund","secondary_intent":null,"tags":["오배송","무료반품","교체발송"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2024-11.jsonl b/src/main/resources/data/layer3_chatlogs/2024-11.jsonl deleted file mode 100644 index 04aa470..0000000 --- a/src/main/resources/data/layer3_chatlogs/2024-11.jsonl +++ /dev/null @@ -1,5 +0,0 @@ -{"conversation_id":"CHAT-2024-11-001","timestamp":"2024-11-04T13:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"에코 그린 패키징 하면 포인트 더 준다고 들었는데 맞나요?"},{"role":"agent","text":"맞습니다! 결제 시 친환경 포장(Green Packaging) 선택하시면 주문당 200포인트 추가 적립됩니다. 배송 완료 7일 후 포인트 지급되고, 비용은 무료에요."},{"role":"customer","text":"친환경 포장이 따로 뭔가 다른 건가요?"},{"role":"agent","text":"친환경 포장은 플라스틱 충전재 없이 재활용 가능한 소재만 사용합니다. 박스 부피가 최대 40% 줄어들어 탄소 배출도 감소해요. 상품 보호 기능은 동일하게 유지됩니다."}],"resolution":"resolved","primary_intent":"eco_green","secondary_intent":null,"tags":["친환경포장","에코포인트","그린패키징"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-11-002","timestamp":"2024-11-06T16:20:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"VIP라는데 배송비 항상 무료인지 확인하고 싶어요"},{"role":"agent","text":"VIP 등급이시면 주문 금액에 상관없이 모든 주문에 우선 배송(Priority Shipping, 익일 정오 도착 보장)이 무료입니다. 별도 최소 주문 금액 조건 없어요."},{"role":"customer","text":"냉장 배송도요?"},{"role":"agent","text":"냉장 배송은 별도 냉장 전용 쿠리어(CJ로지스틱스 프레시)를 사용하여 고정 4,000원 부과됩니다. 이 비용은 등급과 무관하게 모든 회원에게 동일 적용됩니다. VIP 무료 배송 혜택 대상이 아닙니다."},{"role":"customer","text":"아 냉장은 따로구나 알겠어요"}],"resolution":"resolved","primary_intent":"delivery_options","secondary_intent":null,"tags":["VIP배송","냉장배송","조건부답변"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-11-003","timestamp":"2024-11-08T10:10:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"비슷한 질문 한 고객 있었나요? 주문하고 배송지 변경 됐다가 다시 원래대로 하는 거"},{"role":"agent","text":"배송지 변경은 주문 상태가 '배송 준비중'일 때만 가능합니다. 변경 후 다시 원래 주소로도 '배송 준비중' 상태면 재변경 가능하고요. '발송 완료' 이후엔 어렵습니다."},{"role":"customer","text":"지금 준비중인데 변경했다가 다시 할 수 있는 거죠?"},{"role":"agent","text":"네 맞습니다. 앱에서 나의 주문 > 주문 선택 > 주소 수정으로 가시면 됩니다. 발송 전이면 몇 번이든 변경 가능해요."}],"resolution":"resolved","primary_intent":"change_shipping_address","secondary_intent":null,"tags":["배송지변경","재변경","이력질문"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-11-004","timestamp":"2024-11-12T14:50:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"멤버십 등급이 플러스가 되려면 얼마를 써야 하나요?"},{"role":"agent","text":"연간 15만원 이상 구매하시면 플러스 등급이 됩니다."},{"role":"customer","text":"확실한가요?"},{"role":"agent","text":"잠깐만요, 확인해보겠습니다. 죄송합니다, 제가 잘못 안내드렸어요. 현재 기준으로 플러스는 연 20만원 이상입니다. 2024년부터 기준이 변경되었습니다."},{"role":"customer","text":"그럼 VIP는요?"},{"role":"agent","text":"VIP는 연 80만원 이상입니다."}],"resolution":"resolved","primary_intent":"membership_tiers","secondary_intent":null,"tags":["멤버십등급","상담사실수","구버전혼동"],"agent_accuracy":"partially_correct","accuracy_note":"agent_jung이 구버전(Plus=15만원) 기준으로 초기 오답. 수정 후 정확한 답변(20만원) 제공."} -{"conversation_id":"CHAT-2024-11-005","timestamp":"2024-11-15T11:25:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"주문 결제하고 카드사에서 이상하게 두 번 찍혔는데요?"},{"role":"agent","text":"결제 시 임시 승인이 두 번 표시되는 경우가 있습니다. 이는 카드사 인증 과정에서 발생하는 현상으로 실제 이중 청구가 아닙니다. 3-5영업일 내 자동 소멸됩니다."},{"role":"customer","text":"근데 둘 다 확정된 것처럼 보이는데요"},{"role":"agent","text":"주문번호 알려주시면 결제 내역 직접 확인해드리겠습니다."},{"role":"customer","text":"20241113-3301"},{"role":"agent","text":"확인했습니다. 한 건만 정상 처리되었고 다른 한 건은 취소 처리 중입니다. 아직 카드사 시스템에 반영 전이라 양쪽 다 표시되는 것 같습니다. 1-2영업일 내 하나는 사라질 거예요."},{"role":"customer","text":"알겠어요 지켜볼게요"}],"resolution":"resolved","primary_intent":"payment_issue","secondary_intent":null,"tags":["이중결제","임시승인","결제문의"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2024-12.jsonl b/src/main/resources/data/layer3_chatlogs/2024-12.jsonl deleted file mode 100644 index bcab292..0000000 --- a/src/main/resources/data/layer3_chatlogs/2024-12.jsonl +++ /dev/null @@ -1,5 +0,0 @@ -{"conversation_id":"CHAT-2024-12-001","timestamp":"2024-12-02T09:30:00+09:00","channel":"live_chat","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"구독 6개월 됐는데 보너스 포인트 안 들어왔어요"},{"role":"agent","text":"구독 6개월 연속 이용 시 1만 포인트 지급됩니다. 혹시 6개월 중 구독 일시정지 기간이 있으셨나요?"},{"role":"customer","text":"한 달 잠깐 멈췄다 다시 했는데"},{"role":"agent","text":"일시정지(Pause)는 연속 개월 수 카운트에 포함됩니다. 하지만 해지(Cancel) 후 재구독은 연속 카운트가 초기화됩니다. 일시정지만 하셨다면 정지 기간도 포함해서 6개월 계산됩니다. 포인트 지급 여부를 다시 확인해드릴게요."},{"role":"customer","text":"아 정지는 했는데 해지는 안했어요"},{"role":"agent","text":"그러면 연속 카운트 유지됩니다. 구독 시작일 기준으로 정확히 6개월이 된 날로부터 영업일 1-2일 내 포인트 지급됩니다. 정확한 지급 예정일 확인해드릴게요."}],"resolution":"resolved","primary_intent":"subscription","secondary_intent":"loyalty_points","tags":["구독보너스","포인트","일시정지","다중주제"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-12-002","timestamp":"2024-12-05T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"택배가 안 왔는데요 어제 도착 예정이었어요 ;;"},{"role":"agent","text":"불편을 드려 죄송합니다. 주문번호 알려주시면 바로 확인해드릴게요."},{"role":"customer","text":"20241203-5512"},{"role":"agent","text":"확인했습니다. 한진택배에서 어제 배송 시도 후 부재중으로 가까운 보관소에 7일간 보관 중입니다. 한진택배 앱 또는 웹사이트에서 재배송 신청하시거나 직접 수령 가능합니다."},{"role":"customer","text":"재배송 어디서 신청해요?"},{"role":"agent","text":"hanjin.kr 에서 운송장번호(고객님 번호: 987654321) 입력하시면 재배송 예약 가능합니다. 앱에서도 동일하게 가능해요."}],"resolution":"resolved","primary_intent":"track_order","secondary_intent":null,"tags":["배송지연","부재중","재배송"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-12-003","timestamp":"2024-12-10T11:40:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"주문이랑 결제랑 배송 다 한번에 여쭤봐도 될까요?"},{"role":"agent","text":"물론이죠, 말씀해주세요!"},{"role":"customer","text":"일단 어제 주문한 게 언제 오는지, 그리고 이번 달에 쓴 금액이 얼마인지, 마지막으로 플러스 등급 되려면 얼마나 더 써야 하는지요"},{"role":"agent","text":"하나씩 안내드릴게요. 첫째, 어제 주문 건은 주문번호 알려주시면 배송 상태 확인해드릴게요. 둘째, 이번 달 구매 금액은 앱 나의 계정 > 구매 내역에서 확인 가능합니다. 셋째, 플러스 등급은 연 20만원 이상 구매 시 달성이고 매년 1월 1일 기준으로 갱신됩니다. 현재 연간 누적 금액은 앱 나의 계정 > 멤버십에서 확인하실 수 있어요."},{"role":"customer","text":"주문번호는 20241209-8800이에요"},{"role":"agent","text":"확인했습니다. 오늘 오전 발송 완료, 내일 오전 중 도착 예정입니다. 한진 운송장 번호는 111222333입니다."}],"resolution":"resolved","primary_intent":"track_order","secondary_intent":"membership_tiers","tags":["다중주제","배송조회","멤버십","복합문의"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-12-004","timestamp":"2024-12-16T10:20:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"마켓플레이스에서 산 거 환불받고 싶어요 판매자가 연락을 안 받아요"},{"role":"agent","text":"판매자와 직접 연락이 안 되는 경우 '나의 주문 > 분쟁 신청'을 통해 초록 바이어 보호 프로그램을 이용하실 수 있습니다."},{"role":"customer","text":"분쟁 신청하면 얼마나 걸려요?"},{"role":"agent","text":"초록에서 5영업일 내 검토 후 조치합니다. 상품 미수령이나 상품이 설명과 다른 경우 초록이 전액 환불 보장합니다."},{"role":"customer","text":"그냥 제가 맘에 안 드는 건데 판매자 정책이 3일이라 기간 지났어요"},{"role":"agent","text":"판매자 반품 기간이 지난 단순 변심의 경우 바이어 보호 대상이 아닙니다. 판매자와 직접 협의하시거나 소비자보호원을 통한 조정 신청을 고려해 보실 수 있습니다."}],"resolution":"partially_resolved","primary_intent":"get_refund","secondary_intent":"marketplace","tags":["마켓플레이스","분쟁","판매자정책","에스컬레이션제안"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2024-12-005","timestamp":"2024-12-23T14:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"연말에 적립 포인트 만료된다고 알림 왔는데 현금으로 바꿀 수 있나요?"},{"role":"agent","text":"아쉽게도 포인트는 현금 전환이 되지 않습니다. 다음 구매 시 1포인트=1원으로 사용하시거나, 탄소 포인트로 전환해서 나무 심기 기부도 가능합니다."},{"role":"customer","text":"탄소 포인트요? 그게 뭐에요?"},{"role":"agent","text":"탄소 포인트는 구매 금액 1,000원당 1탄소포인트가 적립되는 별도 포인트예요. 적립된 탄소포인트는 인증된 산림 복원 프로젝트에 기부(1포인트=나무 1그루)하거나 100포인트를 충성 포인트 100점으로 전환할 수 있습니다."},{"role":"customer","text":"그냥 쇼핑할 때 쓰는 게 나을 것 같아요"},{"role":"agent","text":"네, 만료 전에 쓰시는 게 가장 좋아요! 최소 1,000포인트부터 사용 가능합니다. 만료 임박 포인트부터 자동으로 먼저 차감됩니다."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":"eco_green","tags":["포인트만료","탄소포인트","복합문의"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2025-01.jsonl b/src/main/resources/data/layer3_chatlogs/2025-01.jsonl deleted file mode 100644 index 8211b9e..0000000 --- a/src/main/resources/data/layer3_chatlogs/2025-01.jsonl +++ /dev/null @@ -1,30 +0,0 @@ -{"conversation_id":"CHAT-2025-01-001","timestamp":"2025-01-02T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"취소하면 수수료 있어요?"},{"role":"agent","text":"준비중 상태에서 취소하시면 수수료 없이 전액 환불됩니다. 발송 후 반품의 경우 단순 변심이면 3,000원이 차감됩니다."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":null,"tags":["취소수수료없음","준비중","발송후차이"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-002","timestamp":"2025-01-03T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"취소하면 수수료 얼마예요?"},{"role":"agent","text":"취소 수수료는 2,000원입니다."},{"role":"customer","text":"2,000원이요? 처음 듣는 얘기인데"},{"role":"agent","text":"죄송합니다, 제가 잘못 안내드렸어요. 준비중 상태 취소는 수수료가 없습니다. 전액 환불됩니다."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":null,"tags":["취소수수료","오답수정","agent_jung","수수료없음"],"agent_accuracy":"incorrect","accuracy_note":"준비중 취소는 수수료 없음. agent_jung이 2,000원이라고 완전히 잘못 안내."} -{"conversation_id":"CHAT-2025-01-003","timestamp":"2025-01-04T09:15:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"환불 상태 확인하고 싶어요"},{"role":"agent","text":"주문번호 알려주시면 환불 진행 상황 확인해드릴게요."},{"role":"customer","text":"20250102-3301"},{"role":"agent","text":"확인했습니다. 1월 2일 취소 처리 완료됐고 신용카드 환불 진행 중입니다. 카드사 처리에 3-5영업일 소요되니 1월 9일까지 확인하시면 될 것 같아요."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["환불상태","신용카드","3-5영업일"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-004","timestamp":"2025-01-06T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"취소했는데 환불이 왜 안 와요? 3일 됐어요"},{"role":"agent","text":"어떤 결제 수단으로 하셨나요?"},{"role":"customer","text":"신용카드요"},{"role":"agent","text":"신용카드는 3-5영업일 소요됩니다. 취소일 기준 영업일로 계산하시면 돼요. 주말, 공휴일은 포함되지 않습니다. 조금만 더 기다려보세요."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["환불대기","신용카드","영업일계산"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-005","timestamp":"2025-01-07T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"카카오페이로 환불받는 건 얼마나 걸려요?"},{"role":"agent","text":"카카오페이는 취소 처리 완료 즉시 환불됩니다. 보통 몇 분 내로 카카오페이 잔액에 반영돼요."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["카카오페이환불","즉시","환불기간"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-006","timestamp":"2025-01-08T14:00:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"취소 수수료 없다고 하던데 반품은요?"},{"role":"agent","text":"준비중 상태 취소는 수수료 없습니다. 발송 후 반품의 경우 단순 변심이면 왕복 배송비 3,000원이 차감됩니다. 상품 불량이나 오배송이면 무료예요."},{"role":"customer","text":"반품은 취소랑 다른 거죠?"},{"role":"agent","text":"네 맞습니다. 취소는 발송 전, 반품은 발송 후 수령한 상품을 돌려보내는 거예요."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":null,"tags":["취소vs반품","수수료차이","VIP"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-007","timestamp":"2025-01-09T10:30:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"환불이 카드 명세서에 언제 반영돼요?"},{"role":"agent","text":"카드사마다 다를 수 있지만 보통 환불 처리 후 1-3일 내에 카드 명세서에 반영됩니다. 정확한 날짜는 카드사에 문의하시는 게 좋아요. 결제 취소 문자가 먼저 오고 명세서 반영은 약간 늦을 수 있습니다."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["카드명세서","환불반영","카드사문의"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-008","timestamp":"2025-01-10T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"포인트로만 결제했을 때 취소하면 어떻게 돼요?"},{"role":"agent","text":"포인트 전액 결제 취소 시 사용하신 포인트 전액이 복구됩니다. 수수료 없이 즉시 복구되고 원래 유효기간 내에서 다시 사용 가능합니다."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":"get_refund","tags":["포인트결제","취소환불","즉시복구"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-009","timestamp":"2025-01-13T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"계좌이체 환불은 어디로 와요?"},{"role":"agent","text":"계좌이체 환불은 결제 시 사용하신 계좌로 입금됩니다. 처리에 최대 7영업일 소요됩니다."},{"role":"customer","text":"그 계좌를 지금 못 써요"},{"role":"agent","text":"계좌 변경이 필요하시면 고객센터로 문의 주세요. 본인 명의 다른 계좌로 변경 처리 도와드릴 수 있습니다. 신분증 확인이 필요합니다."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["계좌이체환불","계좌변경","7영업일"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-010","timestamp":"2025-01-14T15:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"주문 취소했는데 언제 취소 확인 문자 와요?"},{"role":"agent","text":"취소 처리 완료 직후 카카오 알림톡으로 취소 완료 안내가 발송됩니다. 혹시 카카오 알림 수신 설정 확인해보셨나요?"},{"role":"customer","text":"카카오는 받는데 취소 알림이 안 왔어요"},{"role":"agent","text":"주문번호 알려주시면 취소 처리 여부 확인해드릴게요. 취소 신청 완료와 처리 완료는 다를 수 있어요."},{"role":"customer","text":"20250114-5521"},{"role":"agent","text":"취소 처리 방금 완료됐습니다. 알림톡이 곧 도착할 거예요. 혹시 3-4분 후에도 안 오시면 앱 나의 주문에서 직접 확인 가능합니다."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["취소확인문자","알림톡","처리확인"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-011","timestamp":"2025-01-15T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"발송된 상품 취소하면 수수료 얼마예요?"},{"role":"agent","text":"취소 수수료는 없어요."},{"role":"customer","text":"발송 완료됐는데도요?"},{"role":"agent","text":"아, 발송 후에는 취소가 아니라 반품으로 처리됩니다. 단순 변심이면 3,000원이 차감되고요. 제가 제대로 안내 못 드렸네요."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":null,"tags":["발송후취소","반품전환","agent_jung","3000원"],"agent_accuracy":"partially_correct","accuracy_note":"발송 후 취소 불가, 반품으로 처리됨을 먼저 안내했어야 했으나 수수료 없다고 단순 안내 후 수정."} -{"conversation_id":"CHAT-2025-01-012","timestamp":"2025-01-16T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"환불 상태가 앱에서 어떻게 확인해요?"},{"role":"agent","text":"앱 나의 주문 > 해당 주문 선택 > '반품/취소 내역'에서 환불 진행 상태 확인 가능합니다. '환불 처리중', '환불 완료' 단계로 표시됩니다."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["환불상태확인","앱조회","환불처리중"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-013","timestamp":"2025-01-17T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"특가 상품 취소하면 수수료 있어요?"},{"role":"agent","text":"특가 상품도 준비중 상태에서 취소 시 수수료 없이 전액 환불됩니다. 단, 특가 프로모션으로 받은 추가 혜택(사은품, 추가 쿠폰 등)은 회수될 수 있어요."},{"role":"customer","text":"사은품도 돌려줘야 해요?"},{"role":"agent","text":"취소 시 사은품도 함께 반납하셔야 합니다. 이미 사용하셨다면 사은품 금액이 환불에서 차감될 수 있어요."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":null,"tags":["특가취소","사은품반납","수수료없음"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-014","timestamp":"2025-01-20T09:00:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"환불 확인이 안 돼요 영업일 5일 됐는데"},{"role":"agent","text":"주문번호 알려주시면 바로 확인해드릴게요."},{"role":"customer","text":"20250113-7712"},{"role":"agent","text":"확인했습니다. 1월 13일 취소 처리 완료됐고, 신용카드 환불 요청은 됐는데 카드사에서 아직 반영이 안 된 것 같습니다. 카드사에 직접 확인하시거나 1-2일 더 기다려보시겠어요? 그래도 안 되면 저희가 카드사에 확인 요청 드릴게요."}],"resolution":"partially_resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["환불지연","카드사확인","VIP"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-015","timestamp":"2025-01-21T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"네이버페이 환불은 어디서 확인해요?"},{"role":"agent","text":"네이버페이 환불은 네이버페이 앱이나 홈페이지에서 확인 가능합니다. 취소 처리 완료 후 거의 즉시 반영되니 네이버페이 결제 내역에서 '취소' 상태 확인하시면 됩니다."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["네이버페이환불","즉시반영","결제내역"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-016","timestamp":"2025-01-22T10:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"취소 신청하고 환불 문자가 왔는데 금액이 적어요"},{"role":"agent","text":"주문번호와 환불 예상 금액 알려주시면 확인해드릴게요."},{"role":"customer","text":"20250120-3301 / 5만원 샀는데 4만7천원만 왔어요"},{"role":"agent","text":"확인했습니다. 우선배송비 3,000원이 이미 발송 준비 중이라 차감됐습니다. 배송 준비 시작 후에는 배송비는 환불이 제한될 수 있어요."},{"role":"customer","text":"그런 규정이 있는지 몰랐어요"},{"role":"agent","text":"안내가 부족했다면 죄송합니다. 우선배송 선택 시 배송 준비 착수 후 취소하면 배송비 환불이 제한될 수 있다는 점 참고해주세요."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":"check_cancellation_fee","tags":["환불금액차이","배송비불환불","우선배송"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-017","timestamp":"2025-01-23T15:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"취소 수수료 없이 취소 가능한 시점이 언제까지예요?"},{"role":"agent","text":"상품이 '배송 준비중' 상태일 때까지 수수료 없이 취소 가능합니다. 발송 완료 이후에는 반품으로 처리되고 단순 변심이면 3,000원이 차감됩니다."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":null,"tags":["무료취소시점","준비중","발송전"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-018","timestamp":"2025-01-24T11:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"환불받은 포인트로 즉시 사용 가능한가요?"},{"role":"agent","text":"취소로 복구된 포인트는 즉시 사용 가능합니다. 앱 포인트 잔액에서 바로 확인하실 수 있어요."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":"loyalty_points","tags":["포인트복구","즉시사용","취소"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-019","timestamp":"2025-01-25T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"발송 준비중에서 발송완료로 바뀌기 직전에 취소하면 수수료 있어요?"},{"role":"agent","text":"발송완료 전까지는 수수료 없이 취소 가능하다고 알고 있어요."},{"role":"customer","text":"발송완료로 바뀌는 순간에 취소하려면요?"},{"role":"agent","text":"발송완료 상태가 되면 취소가 불가하고 반품으로만 처리됩니다. 발송완료 직전 준비중 상태에서는 수수료 없이 취소 가능합니다."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":null,"tags":["발송직전취소","상태변경","수수료"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-020","timestamp":"2025-01-27T14:00:00+09:00","channel":"kakaotalk","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"환불이 얼마나 걸릴지 알고 싶어요"},{"role":"agent","text":"결제 수단에 따라 다릅니다. 신용카드 3-5영업일, 카카오페이·네이버페이는 거의 즉시, 계좌이체는 최대 7영업일입니다. 어떤 수단으로 결제하셨나요?"},{"role":"customer","text":"신용카드요"},{"role":"agent","text":"3-5영업일이니 취소일 기준으로 주말 제외하고 계산하시면 됩니다."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["환불기간","결제수단별","신용카드"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-021","timestamp":"2025-01-28T10:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"취소했는데 포인트 적립이 됐어요 이거 어떻게 돼요?"},{"role":"agent","text":"주문 시 적립된 포인트는 배송 완료 7일 후에 최종 확정됩니다. 그 이전에 취소되면 적립 예정 포인트는 자동 소멸되고 이미 사용 가능 상태로 됐다면 회수됩니다."},{"role":"customer","text":"이미 사용했어요 ㅠ"},{"role":"agent","text":"이미 사용하셨다면 포인트 잔액이 마이너스가 될 수 있습니다. 마이너스 포인트는 다음 주문 시 먼저 차감됩니다."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":"loyalty_points","tags":["포인트회수","마이너스포인트","취소"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-022","timestamp":"2025-01-29T14:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"취소 수수료 없다고 했는데 5000원이 차감됐어요"},{"role":"agent","text":"주문번호 알려주시면 확인해드릴게요."},{"role":"customer","text":"20250128-1100"},{"role":"agent","text":"확인했습니다. 우선배송 선택하셨고 발송 준비 착수 후 취소하셔서 우선배송비 5,000원이 차감됐습니다. 상품 금액은 전액 환불됩니다."},{"role":"customer","text":"이런 설명이 없었는데요"},{"role":"agent","text":"주문 완료 시 배송비 정책 안내가 표시됩니다. 미흡하게 안내됐다면 죄송합니다. 이 경우 취소 수수료가 아닌 배송비 자체가 비환불 처리된 거예요."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":null,"tags":["배송비불환불","우선배송","취소수수료착오"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-023","timestamp":"2025-01-30T09:15:00+09:00","channel":"live_chat","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"환불 완료됐다는 알림이 왔는데 카드에 반영이 안 됐어요"},{"role":"agent","text":"저희 시스템에서 환불 요청은 완료됐고, 실제 카드 반영은 카드사 처리 일정에 따릅니다. 보통 1-3일 더 소요될 수 있어요. 혹시 지금 카드사 고객센터에 환불 취소 접수 확인을 요청해보시겠어요?"}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["환불완료","카드미반영","카드사처리","VIP"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-024","timestamp":"2025-01-30T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"부분 취소하면 수수료가 있나요?"},{"role":"agent","text":"부분 취소는 지원하지 않습니다. 전체 취소 후 원하시는 상품만 재주문하시는 방법만 가능합니다. 전체 취소도 준비중 상태면 수수료 없이 가능합니다."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":null,"tags":["부분취소불가","전체취소","수수료없음"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-025","timestamp":"2025-01-31T10:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"환불 금액을 미리 알 수 있어요?"},{"role":"agent","text":"앱 반품/취소 신청 화면에서 예상 환불 금액이 표시됩니다. 배송비 차감 여부, 사용 포인트·쿠폰 복구 내용 등 상세하게 확인 가능해요. 신청 확정 전에 금액 확인하시고 진행하시면 됩니다."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":null,"tags":["예상환불금액","사전확인","취소화면"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-026","timestamp":"2025-01-31T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"환불이 완료됐다는 게 무슨 뜻이에요?"},{"role":"agent","text":"저희 시스템에서 환불 처리가 완료됐다는 의미입니다. 실제 돈이 들어오기까지 결제 수단에 따라 추가 시간이 걸립니다. 신용카드는 1-3일, 계좌이체는 1-2일, 카카오·네이버페이는 즉시 반영됩니다."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["환불완료의미","시스템처리","결제수단별"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-027","timestamp":"2025-01-31T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"명절 연휴에 취소하면 환불이 언제 돼요?"},{"role":"agent","text":"명절 연휴는 금융기관 운영 중단으로 환불 처리가 늦어질 수 있습니다. 취소는 연중무휴 가능하지만 환불 처리는 영업일 기준이라 연휴 이후 영업일부터 카운트됩니다. 카카오·네이버페이는 연휴 중에도 즉시 처리됩니다."}],"resolution":"resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["명절연휴","환불지연","영업일"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-028","timestamp":"2025-01-31T16:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"취소를 고객이 아니라 판매사가 해도 수수료 없죠?"},{"role":"agent","text":"판매사(저희) 측 사정으로 취소 처리되는 경우 당연히 고객 부담 수수료 없이 전액 환불됩니다. 지연 배송 등으로 인한 취소면 추가 보상 쿠폰도 지급될 수 있어요."}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":null,"tags":["판매사취소","수수료없음","보상쿠폰"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-029","timestamp":"2025-01-31T17:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"취소 후 환불 내역서 받을 수 있나요?"},{"role":"agent","text":"네, 앱에서 취소/환불 내역 확인 및 PDF로 저장 가능합니다."},{"role":"customer","text":"이메일로 받을 수는 없나요?"},{"role":"agent","text":"현재 이메일 발송 기능은 없는 것으로 알고 있습니다만 확실하지 않아요. 고객센터에 직접 요청하시면 내역서 이메일 발송 가능한지 확인해드릴 거예요."}],"resolution":"partially_resolved","primary_intent":"track_refund","secondary_intent":null,"tags":["환불내역서","PDF","이메일불확실"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-01-030","timestamp":"2025-01-31T18:00:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_lee","turns":[{"role":"customer","text":"취소 수수료 없다고 해서 취소했는데 포인트가 줄었어요"},{"role":"agent","text":"주문번호 알려주시면 확인해드릴게요."},{"role":"customer","text":"20250130-2201"},{"role":"agent","text":"확인했습니다. 해당 주문으로 이미 적립된 포인트 1,200원이 취소로 인해 회수됐습니다. 수수료는 없지만 적립 포인트 회수는 정상 처리입니다. 취소 수수료와 포인트 회수는 별개예요."},{"role":"customer","text":"아 그렇군요 이해했습니다"}],"resolution":"resolved","primary_intent":"check_cancellation_fee","secondary_intent":"loyalty_points","tags":["포인트회수","취소수수료없음","별개","VIP"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2025-02.jsonl b/src/main/resources/data/layer3_chatlogs/2025-02.jsonl deleted file mode 100644 index feae86f..0000000 --- a/src/main/resources/data/layer3_chatlogs/2025-02.jsonl +++ /dev/null @@ -1,30 +0,0 @@ -{"conversation_id":"CHAT-2025-02-001","timestamp":"2025-02-03T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"어떤 결제 수단 지원해요?"},{"role":"agent","text":"신용카드/체크카드, 카카오페이, 네이버페이, 계좌이체, 포인트, 쿠폰을 지원합니다. 포인트와 쿠폰은 다른 결제 수단과 함께 사용 가능해요."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["결제수단","지원목록"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-002","timestamp":"2025-02-04T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"가상계좌 결제 되나요?"},{"role":"agent","text":"네, 가상계좌 결제 가능합니다."},{"role":"customer","text":"결제 화면에 안 보이는데요?"},{"role":"agent","text":"죄송합니다, 확인해보니 현재 가상계좌 결제는 지원하지 않습니다. 제가 잘못 안내드렸어요. 계좌이체(실시간)는 지원합니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["가상계좌","미지원","오답수정","agent_jung"],"agent_accuracy":"incorrect","accuracy_note":"가상계좌 결제 미지원인데 agent_jung이 가능하다고 잘못 안내 후 수정."} -{"conversation_id":"CHAT-2025-02-003","timestamp":"2025-02-05T09:15:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"무이자 할부 가능한가요?"},{"role":"agent","text":"네, 특정 카드사에서 무이자 할부 제공합니다. 현재 삼성카드, 신한카드, 현대카드 기준 3/6개월 무이자가 가능하며, 5만원 이상 결제 시 적용됩니다. 카드사와 프로모션 기간에 따라 달라질 수 있어요."},{"role":"customer","text":"모든 카드가 되는 건 아니죠?"},{"role":"agent","text":"맞습니다. 지원 카드사와 기간은 결제 화면에서 확인하시거나 프로모션 페이지에서 최신 정보 확인하시는 게 정확합니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["무이자할부","특정카드사","삼성신한현대"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-004","timestamp":"2025-02-06T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"결제가 안 돼요"},{"role":"agent","text":"어떤 결제 수단을 사용하셨고 어떤 오류 메시지가 나오나요?"},{"role":"customer","text":"신용카드인데 '결제 실패'라고만 떠요"},{"role":"agent","text":"카드 한도 초과, 카드 정보 오입력, 또는 카드사 일시 오류일 수 있어요. 카드 번호와 유효기간, CVC 다시 확인해보시고, 다른 결제 수단(카카오페이 등)으로 시도해보시겠어요?"},{"role":"customer","text":"다른 카드로 해볼게요"},{"role":"agent","text":"네! 그래도 안 되면 다시 말씀해주세요."}],"resolution":"resolved","primary_intent":"payment_issue","secondary_intent":null,"tags":["결제실패","신용카드","한도초과의심"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-005","timestamp":"2025-02-07T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"카카오페이로만 결제 가능한가요?"},{"role":"agent","text":"카카오페이 외에도 신용카드/체크카드, 네이버페이, 계좌이체, 포인트, 쿠폰 등 다양한 수단이 있습니다. 결제 화면에서 원하시는 방법을 선택하시면 됩니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["카카오페이","결제수단다양"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-006","timestamp":"2025-02-10T14:00:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"결제 도중에 앱이 꺼졌는데 결제가 된 건가요?"},{"role":"agent","text":"주문 내역 확인해드릴게요. 주문번호나 연락처 알려주시면 확인 가능합니다."},{"role":"customer","text":"01012345678이에요"},{"role":"agent","text":"확인했습니다. 해당 번호 기준 최근 주문에 결제 완료 건이 있습니다. 카카오 알림톡으로 주문 완료 메시지 받으셨는지 확인해보세요. 결제 됐다면 주문번호가 발급됐을 거예요."},{"role":"customer","text":"알림톡 왔어요 결제됐네요 감사합니다"}],"resolution":"resolved","primary_intent":"payment_issue","secondary_intent":null,"tags":["앱오류","결제확인","알림톡","VIP"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-007","timestamp":"2025-02-11T10:30:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"해외 카드로 결제 가능한가요?"},{"role":"agent","text":"Visa, Mastercard 등 해외 발급 카드도 결제 가능합니다. 다만 해외 카드의 경우 3D Secure 인증이 추가로 필요할 수 있어요. 결제 오류 시 카드 발급사에 해외 온라인 결제 허용 여부 확인해보세요."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["해외카드","Visa","Mastercard","3DSecure"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-008","timestamp":"2025-02-12T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"결제 중에 이중 결제가 된 것 같아요"},{"role":"agent","text":"주문 내역 확인해드릴게요. 주문번호 알려주시겠어요?"},{"role":"customer","text":"주문번호가 두 개예요 20250212-1001이랑 1002"},{"role":"agent","text":"두 건 모두 확인했습니다. 동일 상품으로 두 번 결제된 것 같네요. 중복 주문으로 판단됩니다. 하나 취소해드릴게요. 어떤 주문 남기시겠어요?"},{"role":"customer","text":"1001 남겨주세요"},{"role":"agent","text":"1002 취소 처리했습니다. 카카오페이 환불은 즉시 됩니다."}],"resolution":"resolved","primary_intent":"payment_issue","secondary_intent":"cancel_order","tags":["이중결제","중복주문","즉시취소"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-009","timestamp":"2025-02-13T14:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"무이자 할부 몇 개월까지 돼요?"},{"role":"agent","text":"12개월까지 무이자 가능합니다."},{"role":"customer","text":"12개월이요? 카드마다 다르지 않나요?"},{"role":"agent","text":"맞습니다 죄송해요. 카드사마다 다르고 일부 카드사는 6개월까지만 무이자가 적용됩니다. 결제 화면에서 카드 선택 후 무이자 옵션 확인하시는 게 정확합니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["무이자할부","카드사별","오답수정","agent_jung"],"agent_accuracy":"partially_correct","accuracy_note":"무이자 12개월은 카드사 제한이 있는데 agent_jung이 12개월 가능하다고 단순 안내 후 수정."} -{"conversation_id":"CHAT-2025-02-010","timestamp":"2025-02-14T11:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_choi","turns":[{"role":"customer","text":"포인트만으로 결제 가능한가요?"},{"role":"agent","text":"포인트 전액 결제 가능합니다. 포인트가 충분하다면 다른 결제 수단 없이 포인트만으로 주문 가능해요. 최소 사용 포인트는 1,000점이에요."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["포인트전액결제","최소1000점"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-011","timestamp":"2025-02-17T09:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"결제 실패가 계속 돼요"},{"role":"agent","text":"어떤 결제 수단으로 시도하셨나요?"},{"role":"customer","text":"카카오페이요"},{"role":"agent","text":"카카오페이 잔액이나 연결 카드를 확인해보세요. 카카오페이 앱에서 결제 한도 초과 여부도 확인하시고요. 혹시 인터넷 연결 환경도 확인해보시겠어요?"},{"role":"customer","text":"잔액은 충분한데요"},{"role":"agent","text":"카카오페이 고객센터(1577-3754)에 문의하시거나 저희 앱 캐시 삭제 후 재시도해보세요. 계속 안 되면 다른 결제 수단으로 시도해주세요."}],"resolution":"partially_resolved","primary_intent":"payment_issue","secondary_intent":null,"tags":["카카오페이실패","잔액충분","앱캐시"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-012","timestamp":"2025-02-18T14:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"현금으로 결제 가능한가요?"},{"role":"agent","text":"온라인 쇼핑몰 특성상 현금 직접 결제는 지원하지 않습니다. 계좌이체로 실시간 이체하시는 방법이 현금과 가장 유사한 방법이에요."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["현금결제불가","계좌이체대안"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-013","timestamp":"2025-02-19T10:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"결제 영수증 받을 수 있나요?"},{"role":"agent","text":"앱 나의 주문에서 해당 주문 선택 후 '결제 영수증' 확인 가능합니다. PDF 저장도 돼요. 현금영수증은 계좌이체 결제 시 신청 가능하고, 카드 결제는 카드 전표가 영수증 역할을 합니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["결제영수증","현금영수증","PDF"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-014","timestamp":"2025-02-20T15:00:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"법인카드로 결제 가능한가요?"},{"role":"agent","text":"법인카드도 일반 신용카드와 동일하게 결제 가능합니다. 다만 일부 법인카드는 온라인 결제가 제한될 수 있으니 카드사에 확인해보세요. 법인 명의 세금계산서는 별도로 발행 요청 가능합니다."},{"role":"customer","text":"세금계산서 발행은 어떻게 해요?"},{"role":"agent","text":"주문 완료 후 고객센터로 사업자등록번호와 주문번호 알려주시면 세금계산서 발행 요청 처리해드립니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":"get_invoice","tags":["법인카드","세금계산서","VIP"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-015","timestamp":"2025-02-21T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"결제 수단 변경이 가능한가요? 주문하고 나서"},{"role":"agent","text":"주문 완료 후 결제 수단 변경은 불가합니다. 현재 결제 방법을 유지하거나, 주문을 취소 후 다른 결제 수단으로 재주문하셔야 합니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["결제수단변경불가","주문후","재주문"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-016","timestamp":"2025-02-24T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"카드가 차단됐어요 결제를 못 하겠어요"},{"role":"agent","text":"카드 차단은 카드사에서 해제하셔야 합니다. 해제 후 재시도하시거나, 그 전에 다른 결제 수단(카카오페이, 계좌이체 등)으로 주문하실 수 있어요."},{"role":"customer","text":"다른 카드가 없어요"},{"role":"agent","text":"카카오페이나 네이버페이에 계좌를 연결하시면 계좌 잔액으로 결제하실 수 있습니다."}],"resolution":"resolved","primary_intent":"payment_issue","secondary_intent":null,"tags":["카드차단","대체결제","카카오페이연결"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-017","timestamp":"2025-02-25T14:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"신용카드 할부로 결제했는데 취소하면 할부도 취소되나요?"},{"role":"agent","text":"네, 전액 취소 시 할부도 전액 취소됩니다. 이미 납부하신 할부금이 있다면 카드사에서 환급 처리됩니다. 카드사마다 처리 기간이 다를 수 있어요."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":"cancel_order","tags":["할부취소","전액환급","카드사환급"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-018","timestamp":"2025-02-26T10:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"결제는 됐는데 주문이 안 잡혔어요"},{"role":"agent","text":"걱정 마세요. 결제 완료 후 주문 등록이 지연될 수 있습니다. 연락처 알려주시면 확인해드릴게요."},{"role":"customer","text":"01098765432"},{"role":"agent","text":"확인했습니다. 결제는 완료됐고 주문도 정상 접수됐습니다. 카카오 알림톡 수신 설정이 꺼져 있어서 알림을 못 받으신 것 같아요. 주문번호는 20250226-4401입니다."}],"resolution":"resolved","primary_intent":"payment_issue","secondary_intent":null,"tags":["결제후주문미확인","알림톡설정","정상처리"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-019","timestamp":"2025-02-27T14:00:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_jung","turns":[{"role":"customer","text":"페이코로 결제 가능해요?"},{"role":"agent","text":"네, 페이코도 지원합니다."},{"role":"customer","text":"결제 화면에서 찾을 수가 없어요"},{"role":"agent","text":"죄송합니다, 확인해보니 현재 페이코는 지원하지 않습니다. 제가 잘못 안내드렸어요. 지원 수단은 신용카드, 카카오페이, 네이버페이, 계좌이체, 포인트입니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["페이코미지원","오답수정","agent_jung"],"agent_accuracy":"incorrect","accuracy_note":"페이코는 지원하지 않는데 agent_jung이 가능하다고 잘못 안내 후 수정."} -{"conversation_id":"CHAT-2025-02-020","timestamp":"2025-02-28T09:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"간편결제 비밀번호 잊어버렸어요"},{"role":"agent","text":"간편결제 비밀번호는 저희 서비스가 아닌 각 간편결제사(카카오페이, 네이버페이 등) 앱에서 재설정하셔야 합니다. 해당 앱의 '비밀번호 재설정'을 이용해주세요."}],"resolution":"resolved","primary_intent":"payment_issue","secondary_intent":null,"tags":["간편결제비밀번호","외부앱","재설정"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-021","timestamp":"2025-02-28T11:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"포인트랑 카드 동시에 쓸 수 있어요?"},{"role":"agent","text":"네, 포인트와 카드 결제 동시 사용 가능합니다. 결제 화면에서 포인트 사용 금액 입력 후 나머지 금액을 카드로 결제하시면 됩니다. 포인트 최소 사용은 1,000점이에요."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["포인트카드병용","혼합결제","최소1000점"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-022","timestamp":"2025-02-28T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"결제 오류인데 상품이 품절된 건가요?"},{"role":"agent","text":"결제 오류와 품절은 다릅니다. 품절이면 결제 화면 진입 전에 '품절' 표시가 됩니다. 결제 화면에서 오류가 나면 결제 수단 문제일 가능성이 높아요. 어떤 오류 메시지가 뜨나요?"},{"role":"customer","text":"'일시적인 오류가 발생했습니다'라고 해요"},{"role":"agent","text":"일시적 서버 오류일 수 있습니다. 몇 분 후 다시 시도해보세요. 그래도 안 되면 다른 결제 수단으로 시도하시거나 고객센터로 문의 주세요."}],"resolution":"resolved","primary_intent":"payment_issue","secondary_intent":null,"tags":["결제오류vs품절","서버오류","재시도"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-023","timestamp":"2025-02-28T15:30:00+09:00","channel":"live_chat","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"VIP면 결제 혜택이 뭐가 있나요?"},{"role":"agent","text":"VIP 고객님은 우선배송 무료, 전담 상담사, 반품 우선 처리 혜택이 있습니다. 결제 수단 자체 혜택은 별도 없으나 VIP 전용 프로모션이 별도로 제공될 때 카드사 추가 할인이 적용되는 경우가 있습니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["VIP결제혜택","우선배송무료","프로모션"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-024","timestamp":"2025-02-28T16:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"체크카드도 할부 되나요?"},{"role":"agent","text":"체크카드는 할부 결제가 불가합니다. 할부는 신용카드에서만 가능합니다. 체크카드는 일시불로만 결제됩니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["체크카드할부불가","신용카드전용","일시불"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-025","timestamp":"2025-02-28T17:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"결제가 여러 번 됐어요"},{"role":"agent","text":"걱정 마세요. 바로 확인해드릴게요. 주문번호나 연락처 알려주시겠어요?"},{"role":"customer","text":"01011112222"},{"role":"agent","text":"확인했습니다. 결제 시도가 3회 있었지만 완료된 건은 1건입니다. 나머지 2건은 결제 실패 후 자동 취소됐고 카드 승인이 취소됐을 거예요. 카드 내역에 임시 승인이 보여도 1-2일 내 사라집니다."},{"role":"customer","text":"안심이네요 감사합니다"}],"resolution":"resolved","primary_intent":"payment_issue","secondary_intent":null,"tags":["다중결제시도","임시승인","자동취소확인"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-026","timestamp":"2025-02-28T17:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"쿠폰이랑 무이자 할부 같이 쓸 수 있나요?"},{"role":"agent","text":"네, 쿠폰 적용 후 남은 금액에 대해 할부 결제 가능합니다. 쿠폰 할인 → 포인트 차감 → 카드 할부 순으로 적용됩니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["쿠폰할부병용","적용순서"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-027","timestamp":"2025-02-28T18:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"삼성페이로 결제 가능해요?"},{"role":"agent","text":"삼성페이 자체 지원은 하지 않습니다만, 삼성페이에 등록된 신용카드로 카드 결제는 가능합니다."},{"role":"customer","text":"삼성페이 버튼은 없는 거죠?"},{"role":"agent","text":"네, 결제 화면에 삼성페이 전용 버튼은 없습니다. 삼성페이 연결 카드를 직접 선택해서 결제하시면 됩니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["삼성페이","연결카드사용","직접입력"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-028","timestamp":"2025-02-28T18:30:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_choi","turns":[{"role":"customer","text":"카드 정보가 저장이 안 돼요"},{"role":"agent","text":"결제 시 '카드 정보 저장' 체크박스를 선택하셨나요? 또는 마이페이지 > 결제 수단 관리에서 카드를 미리 등록해두실 수 있어요."},{"role":"customer","text":"체크했는데도 안 돼요"},{"role":"agent","text":"브라우저 쿠키 차단 설정이나 앱 캐시 문제일 수 있어요. 앱 캐시 삭제 후 다시 시도해보시겠어요? 그래도 안 되면 고객센터로 문의 주시면 기술팀에서 확인해드립니다."}],"resolution":"partially_resolved","primary_intent":"payment_issue","secondary_intent":null,"tags":["카드저장오류","캐시삭제","기술팀"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-029","timestamp":"2025-02-28T19:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"결제 한도가 있나요?"},{"role":"agent","text":"1회 주문 최대 결제 금액은 500만원입니다. 그 이상은 B2B팀 통해 별도 처리 필요합니다. 카드사별 한도는 별도로 있을 수 있어요."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["결제한도","500만원","B2B"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-02-030","timestamp":"2025-02-28T19:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"네이버페이 포인트도 쓸 수 있어요?"},{"role":"agent","text":"네이버페이로 결제 시 네이버페이 포인트 사용이 가능합니다. 다만 저희 앱 적립 포인트와 네이버페이 포인트는 별개입니다. 네이버페이 결제 화면에서 네이버페이 포인트를 직접 적용하시면 됩니다."}],"resolution":"resolved","primary_intent":"check_payment_methods","secondary_intent":null,"tags":["네이버페이포인트","앱포인트별개","결제적용"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2025-03.jsonl b/src/main/resources/data/layer3_chatlogs/2025-03.jsonl deleted file mode 100644 index 6c78fcd..0000000 --- a/src/main/resources/data/layer3_chatlogs/2025-03.jsonl +++ /dev/null @@ -1,30 +0,0 @@ -{"conversation_id":"CHAT-2025-03-001","timestamp":"2025-03-03T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"회원가입 어떻게 해요?"},{"role":"agent","text":"앱이나 웹에서 카카오, 네이버, 구글 소셜 로그인으로 간편 가입하거나 이메일로 직접 가입 가능합니다. 만 14세 이상이면 가입 가능하고, 가입 후 3,000원 쿠폰을 드립니다."}],"resolution":"resolved","primary_intent":"create_account","secondary_intent":null,"tags":["회원가입","SSO","이메일가입","14세이상"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-002","timestamp":"2025-03-04T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"회원 탈퇴하고 싶어요"},{"role":"agent","text":"앱 마이페이지 > 설정 > 회원 탈퇴에서 직접 처리 가능합니다. 탈퇴 전 진행 중인 주문이나 미처리 환불이 없는지 확인해주세요. 탈퇴 시 포인트와 쿠폰은 즉시 소멸되고 복구되지 않습니다."},{"role":"customer","text":"포인트가 소멸된다고요?"},{"role":"agent","text":"네, 탈퇴와 동시에 모든 포인트와 쿠폰이 소멸됩니다. 포인트를 먼저 사용하신 후 탈퇴하시는 걸 권장드립니다."}],"resolution":"resolved","primary_intent":"delete_account","secondary_intent":null,"tags":["회원탈퇴","포인트소멸","사전확인"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-003","timestamp":"2025-03-05T09:15:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"탈퇴하면 포인트 어떻게 되나요?"},{"role":"agent","text":"탈퇴 후에도 재가입하시면 포인트 복구 가능합니다."},{"role":"customer","text":"진짜요? 그럼 탈퇴 후 바로 재가입해도 되나요?"},{"role":"agent","text":"죄송합니다, 제가 잘못 안내드렸어요. 탈퇴 시 포인트는 즉시 소멸되고 재가입해도 복구되지 않습니다. 또한 탈퇴 후 30일 이내에는 동일 이메일로 재가입이 불가합니다."}],"resolution":"resolved","primary_intent":"delete_account","secondary_intent":null,"tags":["탈퇴포인트","오답수정","agent_jung","포인트소멸"],"agent_accuracy":"incorrect","accuracy_note":"탈퇴 시 포인트 소멸, 재가입 후 복구 불가인데 agent_jung이 복구 가능하다고 잘못 안내."} -{"conversation_id":"CHAT-2025-03-004","timestamp":"2025-03-06T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"이름 변경이 가능한가요?"},{"role":"agent","text":"앱 마이페이지 > 회원 정보 수정에서 이름, 연락처, 이메일 변경 가능합니다. 본인 인증이 필요할 수 있어요."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["이름변경","회원정보수정"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-005","timestamp":"2025-03-07T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"가입하려고 하는데 이메일 인증이 안 돼요"},{"role":"agent","text":"이메일 인증 메일이 스팸함에 있을 수 있어요. 확인해보셨나요? 또는 입력하신 이메일 주소가 맞는지 확인해보시고, 5분 후에도 안 오면 '인증 메일 재발송' 버튼을 눌러보세요."},{"role":"customer","text":"스팸함에도 없어요"},{"role":"agent","text":"혹시 이미 가입된 이메일이면 인증 메일 대신 '로그인' 안내가 오기도 해요. 해당 이메일로 로그인 시도해보시겠어요?"}],"resolution":"partially_resolved","primary_intent":"create_account","secondary_intent":null,"tags":["이메일인증","스팸함","재발송"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-006","timestamp":"2025-03-10T14:00:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"휴대폰 번호 바꾸고 싶어요"},{"role":"agent","text":"앱 마이페이지 > 회원 정보 수정 > 연락처 변경에서 새 번호로 본인 인증 후 변경 가능합니다."},{"role":"customer","text":"기존 번호로 인증이 안 돼요 번호가 없어진 번호라서"},{"role":"agent","text":"그런 경우 고객센터(전화 또는 채팅)로 문의 주시면 신분증 확인 후 연락처 변경 도와드립니다. 본인 확인 절차가 좀 더 복잡할 수 있지만 처리 가능합니다."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["휴대폰변경","기존번호없음","본인인증","VIP"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-007","timestamp":"2025-03-11T10:30:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"탈퇴 후 바로 재가입 가능한가요?"},{"role":"agent","text":"탈퇴 후 30일 이내에는 동일 이메일로 재가입이 불가합니다. 30일 이후 재가입 가능하며, 이전 포인트, 주문 내역 등은 복구되지 않습니다."},{"role":"customer","text":"30일이나 기다려야 해요?"},{"role":"agent","text":"네, 정책상 30일 대기 기간이 있습니다. 다른 이메일로는 즉시 가입 가능합니다."}],"resolution":"resolved","primary_intent":"create_account","secondary_intent":"delete_account","tags":["재가입제한","30일","이전데이터복구불가"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-008","timestamp":"2025-03-12T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"카카오로 가입했는데 이메일 가입으로 전환할 수 있나요?"},{"role":"agent","text":"소셜 로그인과 이메일 로그인 전환은 지원하지 않습니다. 소셜 계정은 계속 소셜 로그인으로만 접속하셔야 합니다. 이메일 계정이 필요하시면 다른 이메일로 별도 가입하셔야 합니다."},{"role":"customer","text":"두 계정을 합칠 수는 없나요?"},{"role":"agent","text":"현재 계정 통합 기능은 지원하지 않습니다."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["소셜이메일전환불가","계정통합불가"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-009","timestamp":"2025-03-13T14:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"비밀번호 변경하고 싶어요"},{"role":"agent","text":"앱 마이페이지 > 보안 설정 > 비밀번호 변경에서 현재 비밀번호 입력 후 새 비밀번호로 변경 가능합니다. 현재 비밀번호를 모르시면 로그인 화면에서 '비밀번호 찾기'를 이용해주세요."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["비밀번호변경","보안설정"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-010","timestamp":"2025-03-14T11:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"아이디(이메일)를 바꿀 수 있나요?"},{"role":"agent","text":"로그인용 이메일 아이디 변경은 제한이 있습니다. 이메일 주소 변경은 고객센터 문의 후 본인 인증 절차를 거쳐야 하며, 보안 정책상 연 1회까지 가능합니다."},{"role":"customer","text":"앱에서는 안 되나요?"},{"role":"agent","text":"앱에서는 연락처, 이름 수정만 가능하고 로그인 이메일 변경은 고객센터에서만 처리됩니다."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["이메일아이디변경","고객센터","연1회"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-011","timestamp":"2025-03-17T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"탈퇴하면 주문 내역도 다 사라지나요?"},{"role":"agent","text":"탈퇴 후에도 주문 내역은 3년간 보관됩니다. 필요하시면 탈퇴 전에 주문 내역 캡처나 다운로드 해두시는 게 좋아요."},{"role":"customer","text":"로그인해서 볼 수는 없겠죠?"},{"role":"agent","text":"네 맞습니다. 탈퇴 후에는 로그인이 불가하니 접근이 안 됩니다. 탈퇴 전에 필요한 내역 저장해두시길 권장합니다."}],"resolution":"resolved","primary_intent":"delete_account","secondary_intent":null,"tags":["탈퇴후주문내역","3년보관","접근불가"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-012","timestamp":"2025-03-18T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"계정이 잠겼어요"},{"role":"agent","text":"비밀번호 5회 이상 틀리면 보안상 계정이 잠깁니다. 이메일로 잠금 해제 링크가 발송됩니다. 이메일을 확인해보시거나 고객센터로 문의 주세요."},{"role":"customer","text":"이메일도 못 찾겠어요"},{"role":"agent","text":"고객센터(전화 또는 채팅)로 연락처와 주문 내역 등 본인 확인 정보를 알려주시면 계정 잠금 해제 도와드릴 수 있습니다."}],"resolution":"partially_resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["계정잠금","비밀번호5회실패","고객센터"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-013","timestamp":"2025-03-19T10:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"미성년자도 가입 가능한가요?"},{"role":"agent","text":"만 14세 이상이면 가입 가능합니다. 14세 미만은 보호자 동의 후 가입 가능하고, 19세 미만은 주류, 성인 인증 필요 상품 구매에 제한이 있습니다."}],"resolution":"resolved","primary_intent":"create_account","secondary_intent":null,"tags":["미성년자가입","14세","보호자동의"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-014","timestamp":"2025-03-20T15:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"계정 정보 변경하면 배송지도 바뀌나요?"},{"role":"agent","text":"계정 정보(이름, 연락처)를 변경해도 저장된 배송지 정보는 별도로 유지됩니다. 배송지 변경은 마이페이지 > 배송지 관리에서 따로 하셔야 합니다."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["계정정보변경","배송지별개"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-015","timestamp":"2025-03-21T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"가입 시 받는 쿠폰은 언제 사용할 수 있어요?"},{"role":"agent","text":"가입 후 즉시 사용 가능합니다. 쿠폰 유효기간은 발급일로부터 30일이에요. 앱 내 쿠폰함에서 확인하실 수 있습니다."}],"resolution":"resolved","primary_intent":"create_account","secondary_intent":null,"tags":["가입쿠폰","즉시사용","30일유효"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-016","timestamp":"2025-03-24T14:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"탈퇴 후 바로 재가입하면 등급은 유지되나요?"},{"role":"agent","text":"재가입하면 이전 구매 금액이 합산돼서 등급이 유지됩니다."},{"role":"customer","text":"정말요?"},{"role":"agent","text":"죄송합니다, 다시 확인해보니 탈퇴 후 재가입하면 모든 내역이 초기화되고 등급은 스탠다드로 시작합니다. 이전 구매 이력은 복구되지 않습니다."}],"resolution":"resolved","primary_intent":"delete_account","secondary_intent":null,"tags":["탈퇴후등급","오답수정","agent_jung","초기화"],"agent_accuracy":"incorrect","accuracy_note":"탈퇴 재가입 시 등급 초기화인데 agent_jung이 유지된다고 잘못 안내."} -{"conversation_id":"CHAT-2025-03-017","timestamp":"2025-03-25T09:00:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"이름이 바뀌었는데 실명으로 수정해야 하나요?"},{"role":"agent","text":"실명 사용을 권장하지만 강제는 아닙니다. 다만 본인 인증이 필요한 상품이나 세금계산서 발행 시 실명이 필요할 수 있어요. 앱 마이페이지에서 자유롭게 수정 가능합니다."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["이름수정","실명권장","본인인증"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-018","timestamp":"2025-03-26T14:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"계정을 일시 정지할 수 있나요?"},{"role":"agent","text":"계정 일시 정지 기능은 지원하지 않습니다. 잠시 이용을 중단하고 싶으시면 그냥 로그아웃 상태로 두시면 됩니다. 1년 이상 로그인하지 않으면 휴면 계정으로 전환될 수 있어요."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["계정일시정지불가","로그아웃","휴면계정"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-019","timestamp":"2025-03-27T11:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"휴면 계정이 됐어요 어떻게 해제해요?"},{"role":"agent","text":"앱에서 로그인 시도하시면 휴면 해제 안내가 나옵니다. 본인 인증 후 즉시 해제 가능하며, 휴면 기간 데이터는 유지됩니다. 다만 휴면 전환 시 일부 서비스가 제한됐다가 해제 후 복원됩니다."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["휴면계정해제","본인인증","데이터유지"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-020","timestamp":"2025-03-28T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"주문 중인 게 있는데 탈퇴 가능한가요?"},{"role":"agent","text":"진행 중인 주문이 있으면 탈퇴가 제한됩니다. 모든 주문이 완료되고 환불도 처리된 후 탈퇴하실 수 있어요. 주문 상태 확인해보시겠어요?"}],"resolution":"resolved","primary_intent":"delete_account","secondary_intent":null,"tags":["주문중탈퇴제한","완료후탈퇴","주문상태"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-021","timestamp":"2025-03-29T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"생년월일 수정이 가능한가요?"},{"role":"agent","text":"생년월일은 본인 인증과 연결된 정보라 일반적으로 변경이 어렵습니다. 실수로 잘못 입력하셨다면 고객센터로 신분증을 통한 본인 확인 후 수정 요청 하셔야 합니다."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["생년월일변경","고객센터","신분증"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-022","timestamp":"2025-03-30T10:00:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_park","turns":[{"role":"customer","text":"탈퇴하면 VIP 혜택도 사라지나요?"},{"role":"agent","text":"네, 탈퇴 시 계정이 소멸되므로 VIP 등급과 모든 혜택이 함께 사라집니다. 재가입 시 스탠다드 등급으로 새로 시작합니다. 구매 이력도 복구되지 않아요."},{"role":"customer","text":"몇 년치 구매 이력이 있는데 아깝네요"},{"role":"agent","text":"그렇겠지요. 탈퇴 전에 신중히 고려해보세요. 단순히 앱 알림이 많아서 탈퇴하시려면 알림 설정 조정으로 해결 가능할 수도 있어요."}],"resolution":"resolved","primary_intent":"delete_account","secondary_intent":null,"tags":["VIP탈퇴","등급소멸","이력복구불가","VIP"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-023","timestamp":"2025-03-31T09:15:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"마케팅 수신 동의 해제하고 싶어요"},{"role":"agent","text":"앱 마이페이지 > 알림 설정 > 마케팅 정보 수신에서 해제 가능합니다. 법적 의무 고지 알림(주문, 배송, 결제)은 해제가 안 되지만 이벤트/혜택 알림은 선택적으로 끄실 수 있어요."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["마케팅수신해제","알림설정","의무알림"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-024","timestamp":"2025-03-31T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"가입했는데 welcome 쿠폰을 못 받았어요"},{"role":"agent","text":"가입 완료 후 자동 발급됩니다. 앱 쿠폰함에서 확인해보세요. 혹시 비회원으로 주문하신 건 아닌가요?"},{"role":"customer","text":"회원 가입 후 주문했어요"},{"role":"agent","text":"그럼 쿠폰함에 있을 거예요. 혹시 유효기간이 만료된 건 아닌지도 확인해보세요. 그래도 없다면 고객센터로 가입 일자와 연락처 알려주시면 확인해드릴게요."}],"resolution":"partially_resolved","primary_intent":"create_account","secondary_intent":null,"tags":["가입쿠폰미발급","쿠폰함확인"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-025","timestamp":"2025-03-31T14:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"두 개 계정이 있어요 하나로 합칠 수 있나요?"},{"role":"agent","text":"아쉽게도 계정 통합은 지원하지 않습니다. 사용하시려는 계정 하나를 선택하시고 나머지는 탈퇴하시는 방법밖에 없어요. 탈퇴한 계정의 포인트, 주문 이력은 다른 계정으로 이전이 불가합니다."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":"delete_account","tags":["계정통합불가","중복계정","데이터이전불가"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-026","timestamp":"2025-03-31T15:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"탈퇴 후 즉시 재가입 가능한가요?"},{"role":"agent","text":"네, 즉시 재가입 가능합니다."},{"role":"customer","text":"같은 이메일로요?"},{"role":"agent","text":"죄송합니다, 제가 잘못 안내드렸어요. 동일 이메일로는 탈퇴 후 30일 이내 재가입이 불가합니다. 다른 이메일이나 소셜 계정으로는 즉시 가입 가능합니다."}],"resolution":"resolved","primary_intent":"delete_account","secondary_intent":"create_account","tags":["재가입제한","30일","오답수정","agent_jung"],"agent_accuracy":"partially_correct","accuracy_note":"동일 이메일 재가입 30일 제한인데 agent_jung이 즉시 가능하다고 잘못 안내 후 수정."} -{"conversation_id":"CHAT-2025-03-027","timestamp":"2025-03-31T16:00:00+09:00","channel":"kakaotalk","customer_tier":"plus","agent_id":"agent_park","turns":[{"role":"customer","text":"개인정보 동의 내용 바꿀 수 있어요?"},{"role":"agent","text":"앱 마이페이지 > 설정 > 개인정보 처리 방침 및 동의에서 선택 항목 동의 여부 변경 가능합니다. 필수 항목은 변경 불가하며 변경 시 일부 서비스 이용이 제한될 수 있어요."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["개인정보동의","선택항목변경","필수항목"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-028","timestamp":"2025-03-31T17:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"사망한 가족 계정을 정리하고 싶어요"},{"role":"agent","text":"사망자 계정 정리는 상속인 자격으로 요청 가능합니다. 고객센터로 가족관계증명서, 사망 확인서, 신청인 신분증을 준비하여 문의해주시면 처리해드립니다."}],"resolution":"resolved","primary_intent":"delete_account","secondary_intent":null,"tags":["사망자계정","상속인","가족관계증명"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-029","timestamp":"2025-03-31T18:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"SNS 로그인 연결 해제하고 싶어요"},{"role":"agent","text":"마이페이지 > 소셜 로그인 관리에서 연결된 카카오, 네이버, 구글 계정 연결 해제 가능합니다. 연결 해제 후 다른 소셜 계정 연결이나 이메일 로그인으로 전환하고 싶다면 계정 유형 전환은 지원하지 않으니 참고해주세요."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["SNS연결해제","소셜로그인관리"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-03-030","timestamp":"2025-03-31T19:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"프로필 사진 설정할 수 있나요?"},{"role":"agent","text":"현재 저희 서비스에서는 프로필 사진 설정 기능을 지원하지 않습니다. 마이페이지에서 기본 아바타로 표시됩니다."}],"resolution":"resolved","primary_intent":"edit_account","secondary_intent":null,"tags":["프로필사진","미지원","기본아바타"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2025-04.jsonl b/src/main/resources/data/layer3_chatlogs/2025-04.jsonl deleted file mode 100644 index 3774bb3..0000000 --- a/src/main/resources/data/layer3_chatlogs/2025-04.jsonl +++ /dev/null @@ -1,30 +0,0 @@ -{"conversation_id":"CHAT-2025-04-001","timestamp":"2025-04-01T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"비밀번호를 잊어버렸어요"},{"role":"agent","text":"로그인 화면에서 '비밀번호 찾기'를 누르시면 가입하신 이메일로 재설정 링크가 발송됩니다. 이메일 확인 후 새 비밀번호로 재설정하시면 됩니다."}],"resolution":"resolved","primary_intent":"recover_password","secondary_intent":null,"tags":["비밀번호찾기","이메일재설정"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-002","timestamp":"2025-04-02T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"고객센터 전화번호가 어떻게 되나요?"},{"role":"agent","text":"고객센터 전화번호는 1588-1234입니다. 평일 오전 9시 ~ 오후 6시 운영합니다. 주말과 공휴일은 전화 상담이 안 되고 앱 채팅 챗봇만 이용 가능합니다."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["고객센터전화","운영시간","평일9-18"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-003","timestamp":"2025-04-03T09:15:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"고객센터 몇 시까지 운영해요?"},{"role":"agent","text":"24시간 운영합니다."},{"role":"customer","text":"새벽에도 전화 가능해요?"},{"role":"agent","text":"죄송합니다, 제가 잘못 안내드렸어요. 전화와 채팅 상담은 평일 오전 9시 ~ 오후 6시에만 운영합니다. 24시간은 자동 챗봇만 이용 가능합니다."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["운영시간","오답수정","agent_jung","24시간→평일9-18"],"agent_accuracy":"incorrect","accuracy_note":"고객센터는 평일 9-18시인데 agent_jung이 24시간이라고 잘못 안내."} -{"conversation_id":"CHAT-2025-04-04","timestamp":"2025-04-04T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"카카오로 가입했는데 비밀번호 찾기가 어떻게 해요?"},{"role":"agent","text":"카카오 소셜 로그인으로 가입하셨다면 저희 서비스에 별도 비밀번호가 없습니다. 카카오 계정 비밀번호는 카카오 앱 > 설정 > 계정에서 관리하시면 됩니다."}],"resolution":"resolved","primary_intent":"recover_password","secondary_intent":null,"tags":["소셜로그인","카카오비밀번호","별도비밀번호없음"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-05","timestamp":"2025-04-07T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"상담사랑 직접 연결하고 싶어요"},{"role":"agent","text":"현재 저도 실시간 상담사입니다. 무엇이든 도와드릴게요. 혹시 챗봇과 대화하다가 넘어오신 건가요?"},{"role":"customer","text":"네 챗봇이 해결을 못해줘서요"},{"role":"agent","text":"이해합니다. 어떤 문제인지 말씀해주시면 최선을 다해 해결해드릴게요."}],"resolution":"resolved","primary_intent":"contact_human_agent","secondary_intent":null,"tags":["상담사연결","챗봇에서전환","직접상담"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-06","timestamp":"2025-04-08T14:00:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"비밀번호 재설정 메일이 안 와요"},{"role":"agent","text":"스팸 메일함 확인해보셨나요? 발송에 1-2분 소요될 수 있어요. 그래도 안 오면 가입 이메일이 맞는지 확인해주세요."},{"role":"customer","text":"스팸함에도 없고 이메일도 맞아요"},{"role":"agent","text":"이메일 서비스(네이버, 다음 등)에서 저희 도메인 메일을 차단했을 수 있어요. 혹시 다른 이메일 주소가 있으시면 고객센터로 이메일 변경 후 재발송 가능합니다. 또는 소셜 로그인(카카오, 네이버, 구글)으로 로그인 시도해보세요."}],"resolution":"partially_resolved","primary_intent":"recover_password","secondary_intent":null,"tags":["재설정메일미수신","스팸차단","소셜로그인대안","VIP"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-07","timestamp":"2025-04-09T10:30:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"이메일로 문의하고 싶은데 주소가 어떻게 되나요?"},{"role":"agent","text":"고객 문의 이메일은 cs@chorok.com입니다. 영업일 기준 1-2일 내로 답변드립니다. 주문번호나 연락처를 같이 작성해주시면 더 빠르게 처리 가능합니다."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["이메일문의","cs@chorok.com","1-2영업일답변"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-08","timestamp":"2025-04-10T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"비밀번호가 기억은 나는데 대소문자를 모르겠어요"},{"role":"agent","text":"비밀번호 입력란 옆 '표시' 아이콘을 눌러 입력 내용을 확인하시면서 시도해보세요. 여러 번 틀리면 계정이 잠길 수 있으니 5회 이하로 시도하시고, 확실하지 않으면 비밀번호 재설정을 이용하시는 게 좋아요."}],"resolution":"resolved","primary_intent":"recover_password","secondary_intent":null,"tags":["대소문자","비밀번호표시","5회제한"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-09","timestamp":"2025-04-11T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"사람이랑 얘기하고 싶어요 봇이 너무 답답해요"},{"role":"agent","text":"안녕하세요! 저는 실시간 상담사입니다. 무엇이든 말씀해주세요."},{"role":"customer","text":"아 다행이에요 / 배송 문제가 있는데"},{"role":"agent","text":"말씀해주세요. 주문번호 알려주시면 바로 확인해드릴게요."}],"resolution":"resolved","primary_intent":"contact_human_agent","secondary_intent":"track_order","tags":["봇답답","상담사요청","배송문제"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-10","timestamp":"2025-04-14T11:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"이메일 문의 답변이 너무 늦어요 3일 됐어요"},{"role":"agent","text":"불편드려 죄송합니다. 이메일 문의 내용과 이메일 주소 알려주시면 처리 상황 확인해드릴게요."},{"role":"customer","text":"cs@chorok.com 으로 보냈고 이메일은 test@gmail.com이에요"},{"role":"agent","text":"확인해보겠습니다. 영업일 기준 1-2일이 원칙이지만 지연이 있었네요. 죄송합니다. 현재 저를 통해 문제 해결해드릴 수 있으면 바로 진행하겠습니다. 어떤 내용이었나요?"}],"resolution":"escalated","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["이메일답변지연","3일","에스컬레이션"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-11","timestamp":"2025-04-15T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"이메일 답변은 보통 얼마나 걸려요?"},{"role":"agent","text":"24시간 내로 답변드립니다."},{"role":"customer","text":"주말도요?"},{"role":"agent","text":"아, 죄송합니다. 주말과 공휴일 제외 영업일 기준 1-2일입니다. 주말에 보내시면 월요일부터 처리됩니다."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["이메일답변기간","오답수정","agent_jung","24시간→1-2영업일"],"agent_accuracy":"partially_correct","accuracy_note":"이메일 답변 영업일 1-2일인데 agent_jung이 24시간 이내라고 오안내 후 수정."} -{"conversation_id":"CHAT-2025-04-12","timestamp":"2025-04-16T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"비밀번호 재설정 링크를 클릭했는데 만료됐다고 해요"},{"role":"agent","text":"비밀번호 재설정 링크는 발송 후 30분 내에 사용하셔야 합니다. 만료된 경우 '비밀번호 찾기'에서 다시 발송 요청하시면 됩니다."}],"resolution":"resolved","primary_intent":"recover_password","secondary_intent":null,"tags":["재설정링크만료","30분유효","재발송"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-13","timestamp":"2025-04-17T10:30:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"채팅 상담 대기 시간이 너무 길어요"},{"role":"agent","text":"죄송합니다. 현재 문의량이 많아 대기가 발생하고 있어요. 긴급하신 경우 전화(1588-1234, 평일 9-18시)로 연락하시거나 이메일(cs@chorok.com)로 문의하시면 됩니다. 가능하면 주문번호를 미리 준비해두시면 더 빠르게 처리됩니다."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["채팅대기","전화이메일대안","대기시간"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-14","timestamp":"2025-04-18T09:00:00+09:00","channel":"live_chat","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"VIP 전담 상담사가 있다고 했는데 연결하고 싶어요"},{"role":"agent","text":"안녕하세요! 저 자신이 VIP 전담 상담 팀입니다. VIP 고객님은 일반 대기 없이 우선 연결됩니다. 어떻게 도와드릴까요?"},{"role":"customer","text":"오 생각보다 빠르네요 배송 문제인데"},{"role":"agent","text":"VIP 고객님은 항상 우선 배정됩니다. 주문번호 알려주시면 바로 확인해드릴게요."}],"resolution":"resolved","primary_intent":"contact_human_agent","secondary_intent":null,"tags":["VIP전담","우선연결","배송문제"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-15","timestamp":"2025-04-21T14:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"새 비밀번호 설정 조건이 있나요?"},{"role":"agent","text":"비밀번호는 8자 이상, 영문 대소문자/숫자/특수문자 중 2가지 이상 조합이어야 합니다. 이전에 사용한 비밀번호와 동일하게 설정은 불가합니다."}],"resolution":"resolved","primary_intent":"recover_password","secondary_intent":null,"tags":["비밀번호조건","8자이상","조합"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-16","timestamp":"2025-04-22T11:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"주말에도 상담 받을 수 있나요?"},{"role":"agent","text":"주말과 공휴일은 전화/채팅 유인 상담이 불가합니다. 앱 내 자동 챗봇은 24시간 이용 가능하고, 이메일 문의는 가능하지만 답변은 다음 영업일부터 처리됩니다."},{"role":"customer","text":"긴급한 건인데"},{"role":"agent","text":"긴급 상황(미수령 구매 사고 등)은 이메일 제목에 '긴급'을 표기하시면 우선 처리됩니다. 또는 월요일 오전 9시 오픈 즉시 전화하시는 방법을 권장드립니다."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["주말상담불가","챗봇24시간","긴급이메일"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-17","timestamp":"2025-04-23T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"로그인이 안 되는데 계정이 없어진 건가요?"},{"role":"agent","text":"계정이 삭제되지는 않았을 거예요. 어떤 로그인 방법을 사용하셨나요?"},{"role":"customer","text":"이메일 로그인이요"},{"role":"agent","text":"비밀번호를 잘못 입력하셨거나 이메일 주소가 다를 수 있어요. 비밀번호 찾기를 시도해보시고, 그래도 안 되면 가입할 때 쓴 이메일 주소인지 확인해보세요. 계정 존재 여부는 고객센터에서 확인 가능합니다."}],"resolution":"partially_resolved","primary_intent":"recover_password","secondary_intent":"contact_customer_service","tags":["로그인실패","계정존재여부","비밀번호찾기"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-18","timestamp":"2025-04-24T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"챗봇 말고 사람이랑 연결하는 방법이 있어요?"},{"role":"agent","text":"채팅 상담창에서 '상담사 연결' 버튼을 누르시면 유인 상담으로 전환됩니다. 평일 9-18시에만 가능하며 대기가 있을 수 있어요."},{"role":"customer","text":"지금 몇 분 기다려야 해요?"},{"role":"agent","text":"현재 대기 인원이 3명이라 약 5-10분 예상됩니다."}],"resolution":"resolved","primary_intent":"contact_human_agent","secondary_intent":null,"tags":["상담사연결버튼","대기시간","5-10분"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-19","timestamp":"2025-04-25T10:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"구글 계정으로 가입했는데 비밀번호 모르겠어요"},{"role":"agent","text":"구글 계정으로 가입하셨다면 저희 서비스 비밀번호가 별도로 없어요. 구글 계정 비밀번호는 구글(accounts.google.com)에서 관리하시면 됩니다."},{"role":"customer","text":"구글 비밀번호는 기억하는데 로그인이 안 돼요"},{"role":"agent","text":"구글 계정으로 로그인 시도 시 구글 2단계 인증이 걸려있거나 구글 계정 자체에 문제가 있을 수 있어요. 구글 계정 먼저 확인해보시겠어요?"}],"resolution":"partially_resolved","primary_intent":"recover_password","secondary_intent":null,"tags":["구글계정","소셜로그인","구글비밀번호별도"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-20","timestamp":"2025-04-26T15:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"고객센터에 몇 번 전화해도 연결이 안 돼요"},{"role":"agent","text":"죄송합니다. 특히 오전 9시 오픈 직후와 점심 시간대에 혼잡합니다. 평일 오후 2-4시에 연결이 잘 되는 편이에요. 또는 채팅 상담이나 이메일로 문의 주시면 더 빠를 수 있어요."},{"role":"customer","text":"채팅으로 하면 빠를까요?"},{"role":"agent","text":"저희가 지금 채팅으로 연결 중이에요! 바로 해결해드릴게요. 문제가 무엇인지 말씀해주세요."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["전화연결실패","혼잡시간","채팅대안"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-21","timestamp":"2025-04-28T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"공휴일에도 전화 상담 돼요?"},{"role":"agent","text":"네, 공휴일에도 전화 상담 가능합니다."},{"role":"customer","text":"어제 공휴일이었는데 전화 안 됐어요"},{"role":"agent","text":"죄송합니다, 제가 잘못 안내드렸어요. 공휴일은 전화 및 채팅 상담이 운영하지 않습니다. 평일 9시-18시에만 가능합니다."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["공휴일상담","오답수정","agent_jung","운영안함"],"agent_accuracy":"incorrect","accuracy_note":"공휴일 전화 상담 운영 안 함인데 agent_jung이 가능하다고 잘못 안내."} -{"conversation_id":"CHAT-2025-04-22","timestamp":"2025-04-29T14:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"비밀번호를 너무 많이 틀렸어요"},{"role":"agent","text":"5회 이상 틀리면 계정이 30분간 잠깁니다. 30분 후 다시 시도하시거나 '비밀번호 찾기'로 재설정하시는 게 빠릅니다."}],"resolution":"resolved","primary_intent":"recover_password","secondary_intent":null,"tags":["비밀번호5회실패","30분잠금","재설정"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-23","timestamp":"2025-04-30T10:00:00+09:00","channel":"live_chat","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"상담 이력을 확인하고 싶어요"},{"role":"agent","text":"앱 마이페이지 > 상담 내역에서 최근 6개월 상담 이력 확인 가능합니다. 더 오래된 내역은 고객센터에 요청하시면 됩니다."},{"role":"customer","text":"1년 전 상담 내용도 볼 수 있나요?"},{"role":"agent","text":"1년 이상 된 내역은 앱에서 직접 조회가 어려울 수 있습니다. 고객센터(이메일 또는 전화)로 요청하시면 담당팀에서 확인해드립니다."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["상담이력","6개월조회","1년초과고객센터","VIP"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-24","timestamp":"2025-04-30T14:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"문자로 상담할 수 있나요?"},{"role":"agent","text":"문자(SMS) 상담은 지원하지 않습니다. 카카오톡, 앱 내 채팅, 전화, 이메일로 문의 가능합니다."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["SMS상담불가","지원채널","카카오채팅"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-25","timestamp":"2025-04-30T15:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"사람 상담사를 먼저 연결해달라고 요청할 수 있나요?"},{"role":"agent","text":"채팅 상담의 경우 처음 챗봇 응대 후 '상담사 연결' 요청하시거나, 전화로 바로 연결하시면 됩니다. 저도 지금 실시간 상담사로 연결되신 거예요!"}],"resolution":"resolved","primary_intent":"contact_human_agent","secondary_intent":null,"tags":["상담사우선연결","챗봇우회","전화직접"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-26","timestamp":"2025-04-30T16:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"상담 내용을 저장할 수 있나요?"},{"role":"agent","text":"채팅 상담 종료 후 '상담 내역 저장' 버튼을 누르시면 PDF나 텍스트로 저장 가능합니다. 또는 상담 종료 시 이메일로 상담 내역을 발송 받을 수도 있어요."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["상담내용저장","PDF","이메일발송"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-27","timestamp":"2025-04-30T17:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"비밀번호 재설정을 했는데 로그인이 여전히 안 돼요"},{"role":"agent","text":"재설정 후 로그인 시 새 비밀번호를 정확히 입력하셨나요? 대소문자 구분도 확인해보세요. 혹시 다른 기기에서 로그인 시도 중이시면 그 기기의 저장된 비밀번호가 아닌 새 비밀번호를 수동으로 입력해보세요."},{"role":"customer","text":"아 저장된 걸 쓰고 있었네요 수동으로 하니까 됐어요"}],"resolution":"resolved","primary_intent":"recover_password","secondary_intent":null,"tags":["재설정후로그인불가","저장비밀번호","수동입력"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-28","timestamp":"2025-04-30T17:30:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"상담사가 이전 문의 내용을 볼 수 있나요?"},{"role":"agent","text":"네, 상담사는 고객님의 최근 상담 이력과 주문 내역을 확인하며 상담합니다. 이전 문의 내용을 다시 설명하지 않으셔도 됩니다."},{"role":"customer","text":"개인정보가 다 보이는 건가요?"},{"role":"agent","text":"상담에 필요한 주문 정보, 상담 이력만 확인합니다. 결제 카드 전체 번호 등 민감 정보는 마스킹 처리되어 상담사에게 노출되지 않습니다."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["상담이력공유","개인정보마스킹","상담효율"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-04-29","timestamp":"2025-04-30T18:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"고객센터 영어 상담도 되나요?"},{"role":"agent","text":"네, 영어 상담도 가능합니다."},{"role":"customer","text":"영어 상담사 연결해주세요"},{"role":"agent","text":"죄송합니다, 확인해보니 현재 영어 전문 상담은 지원하지 않습니다. 이메일로 영문 문의 주시면 번역하여 처리해드리겠습니다."}],"resolution":"partially_resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["영어상담불가","오답수정","agent_jung","이메일대안"],"agent_accuracy":"partially_correct","accuracy_note":"영어 상담 미지원인데 agent_jung이 가능하다고 안내 후 수정."} -{"conversation_id":"CHAT-2025-04-030","timestamp":"2025-04-30T19:00:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_lee","turns":[{"role":"customer","text":"VIP는 상담 대기 시간이 없는 건가요?"},{"role":"agent","text":"VIP 고객님은 일반 대기열 앞으로 우선 배정됩니다. 완전 무대기는 아닐 수 있지만 일반 고객 대비 훨씬 빠르게 연결됩니다. 전화 상담도 VIP 전용 번호로 연결하시면 더 빠릅니다."},{"role":"customer","text":"VIP 전용 번호가 따로 있어요?"},{"role":"agent","text":"네, VIP 전용 상담 번호는 1588-1235입니다. 가입 확인 문자에 안내됐을 거예요."}],"resolution":"resolved","primary_intent":"contact_customer_service","secondary_intent":null,"tags":["VIP우선연결","전용번호","대기단축"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2025-05.jsonl b/src/main/resources/data/layer3_chatlogs/2025-05.jsonl deleted file mode 100644 index 00db204..0000000 --- a/src/main/resources/data/layer3_chatlogs/2025-05.jsonl +++ /dev/null @@ -1,30 +0,0 @@ -{"conversation_id":"CHAT-2025-05-001","timestamp":"2025-05-02T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"뉴스레터 구독 어떻게 해요?"},{"role":"agent","text":"앱 마이페이지 > 알림 설정 > 뉴스레터 수신 허용으로 구독 가능합니다. 또는 메인 화면 하단에서 이메일을 입력하면 바로 구독할 수 있어요. 매주 화요일에 발송됩니다."}],"resolution":"resolved","primary_intent":"newsletter_subscription","secondary_intent":null,"tags":["뉴스레터구독","알림설정","매주화요일"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-002","timestamp":"2025-05-03T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"뉴스레터 수신 거부하고 싶어요"},{"role":"agent","text":"뉴스레터 하단의 '수신거부' 링크를 클릭하시면 즉시 해제됩니다. 앱 마이페이지 > 알림 설정에서도 해제 가능합니다."}],"resolution":"resolved","primary_intent":"newsletter_subscription","secondary_intent":null,"tags":["뉴스레터해지","수신거부","즉시해제"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-003","timestamp":"2025-05-04T09:15:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"뉴스레터 해지하고 싶어요"},{"role":"agent","text":"고객센터로 전화해서 신청하셔야 합니다."},{"role":"customer","text":"이메일 하단에 해지 링크 없나요?"},{"role":"agent","text":"맞습니다, 죄송해요. 뉴스레터 하단에 '수신거부' 링크가 있어서 클릭하시면 즉시 해제됩니다. 고객센터 연락 없이 직접 해제 가능합니다."}],"resolution":"resolved","primary_intent":"newsletter_subscription","secondary_intent":null,"tags":["뉴스레터해지","오답수정","agent_jung","링크해제"],"agent_accuracy":"partially_correct","accuracy_note":"뉴스레터 하단 링크로 즉시 해지 가능한데 agent_jung이 고객센터 전화 필요하다고 잘못 안내."} -{"conversation_id":"CHAT-2025-05-004","timestamp":"2025-05-07T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"배송이 너무 늦어서 화가 나요 어디에 불만 접수해요?"},{"role":"agent","text":"불편드려 정말 죄송합니다. 저한테 바로 말씀해주시면 처리해드릴 수 있어요. 주문번호 알려주시면 즉시 확인하겠습니다."},{"role":"customer","text":"20250506-7712"},{"role":"agent","text":"확인했습니다. 예정보다 2일 지연된 상황이네요. 물류팀에 긴급 확인 요청 드리고 지연 사과 쿠폰 3,000원 발급해드리겠습니다. 정말 죄송합니다."}],"resolution":"resolved","primary_intent":"complaint","secondary_intent":null,"tags":["배송지연불만","쿠폰보상","직접처리"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-005","timestamp":"2025-05-08T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"리뷰 어떻게 작성해요?"},{"role":"agent","text":"배송 완료 후 앱 나의 주문 > 해당 주문에서 '리뷰 작성' 버튼을 누르시면 됩니다. 별점과 텍스트, 사진을 첨부할 수 있어요. 수령 후 90일 이내에 작성 가능합니다."}],"resolution":"resolved","primary_intent":"review","secondary_intent":null,"tags":["리뷰작성","배송완료후","90일이내"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-006","timestamp":"2025-05-09T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"리뷰 쓰면 포인트 얼마나 쌓여요?"},{"role":"agent","text":"텍스트 리뷰 작성 시 100포인트, 사진 포함 시 500포인트 추가 적립됩니다. 포인트는 리뷰 작성 승인 후 1-2영업일 내에 지급됩니다."}],"resolution":"resolved","primary_intent":"review","secondary_intent":null,"tags":["리뷰포인트","텍스트100","사진500","승인후지급"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-007","timestamp":"2025-05-12T10:30:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_jung","turns":[{"role":"customer","text":"리뷰 쓰면 포인트 바로 주나요?"},{"role":"agent","text":"네, 작성하면 즉시 포인트가 적립됩니다."},{"role":"customer","text":"오늘 쓴 거 포인트가 없어요"},{"role":"agent","text":"죄송합니다, 제가 잘못 안내드렸어요. 리뷰는 운영팀 승인 후 1-2영업일 내에 포인트가 지급됩니다. 즉시 지급이 아닙니다."}],"resolution":"resolved","primary_intent":"review","secondary_intent":null,"tags":["리뷰포인트적립","오답수정","agent_jung","즉시→승인후"],"agent_accuracy":"partially_correct","accuracy_note":"리뷰 포인트는 승인 후 1-2영업일 지급인데 agent_jung이 즉시라고 오안내."} -{"conversation_id":"CHAT-2025-05-008","timestamp":"2025-05-13T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"상담사가 불친절했어요 불만 접수하고 싶어요"},{"role":"agent","text":"불편하셨다니 정말 죄송합니다. 어떤 상황이었는지 말씀해주시면 팀장에게 보고하고 해당 상담사에 대해 조치하겠습니다. 고객 만족을 최우선으로 여기고 있어서 이런 피드백이 매우 중요합니다."},{"role":"customer","text":"어제 전화 상담에서 반말을 했어요"},{"role":"agent","text":"매우 부적절한 응대였습니다. 어제 오후 몇 시 경 통화하셨는지 알려주시면 해당 통화 녹음 확인 후 조치하겠습니다. 진심으로 사과드립니다."}],"resolution":"escalated","primary_intent":"complaint","secondary_intent":null,"tags":["상담사불친절","불만접수","팀장보고","통화녹음"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-009","timestamp":"2025-05-14T14:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"리뷰를 수정하고 싶어요"},{"role":"agent","text":"앱 나의 주문 > 리뷰 내역에서 작성한 리뷰를 수정할 수 있습니다. 단 리뷰당 1회 수정 가능하고, 최초 작성 후 7일 이내에만 수정 가능합니다."}],"resolution":"resolved","primary_intent":"review","secondary_intent":null,"tags":["리뷰수정","1회수정","7일이내"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-010","timestamp":"2025-05-15T11:00:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"상품이 불량이라 너무 화가 나요"},{"role":"agent","text":"정말 죄송합니다. 불량 상품을 받으셨다면 빠르게 처리해드릴게요. 불량 부위 사진과 주문번호 알려주시면 즉시 무료 반품 및 교체 또는 전액 환불 진행해드릴게요."},{"role":"customer","text":"20250514-5501이고 사진은 이메일로 보내드릴게요"},{"role":"agent","text":"cs@chorok.com으로 사진 보내주시면 제가 바로 연결해서 처리하겠습니다. VIP 고객님이시니 우선 처리해드릴게요. 정말 죄송합니다."}],"resolution":"escalated","primary_intent":"complaint","secondary_intent":"return_request","tags":["불량상품","VIP우선처리","무료반품"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-011","timestamp":"2025-05-16T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"뉴스레터 주제가 너무 많아서 일부만 받고 싶어요"},{"role":"agent","text":"현재 뉴스레터는 일괄 구독/해지 방식이라 특정 주제만 선택 수신은 지원하지 않습니다. 전체 수신 또는 전체 해지 중 선택하셔야 합니다."}],"resolution":"resolved","primary_intent":"newsletter_subscription","secondary_intent":null,"tags":["뉴스레터선택수신불가","전체구독해지"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-012","timestamp":"2025-05-19T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"리뷰를 삭제할 수 있나요?"},{"role":"agent","text":"작성한 리뷰 삭제는 앱 나의 주문 > 리뷰 내역에서 직접 가능합니다. 다만 삭제 후 해당 리뷰 포인트는 회수됩니다."},{"role":"customer","text":"포인트가 회수된다고요?"},{"role":"agent","text":"네, 리뷰 포인트는 리뷰가 게시된 동안만 유효합니다. 삭제 시 적립된 포인트가 차감됩니다."}],"resolution":"resolved","primary_intent":"review","secondary_intent":null,"tags":["리뷰삭제","포인트회수","주의"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-013","timestamp":"2025-05-20T10:30:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"뉴스레터 이메일을 변경하고 싶어요"},{"role":"agent","text":"뉴스레터 수신 이메일은 계정 등록 이메일과 연동됩니다. 이메일 변경은 마이페이지 > 회원 정보 수정에서 가능하며, 변경 후 뉴스레터도 새 이메일로 발송됩니다."}],"resolution":"resolved","primary_intent":"newsletter_subscription","secondary_intent":"edit_account","tags":["뉴스레터이메일변경","계정이메일연동"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-014","timestamp":"2025-05-21T15:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"정식으로 불만 접수를 하고 싶어요"},{"role":"agent","text":"앱 마이페이지 > 고객의 소리 > 불만 접수에서 공식 불만 신고가 가능합니다. 영업일 2-3일 내에 담당자가 확인 후 연락드립니다. 저를 통해서도 바로 접수 도와드릴 수 있어요."},{"role":"customer","text":"두 군데 다 해도 될까요?"},{"role":"agent","text":"가능합니다. 두 경로 모두 접수하시면 더 빠르게 처리될 수 있어요."}],"resolution":"resolved","primary_intent":"complaint","secondary_intent":null,"tags":["불만접수","고객의소리","공식신고"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-015","timestamp":"2025-05-22T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"다른 사람이 내 리뷰에 악플을 달았어요"},{"role":"agent","text":"리뷰 댓글에 부적절한 내용이 있다면 해당 댓글 오른쪽 '신고' 버튼으로 신고해주시면 됩니다. 운영팀이 확인 후 조치합니다."}],"resolution":"resolved","primary_intent":"complaint","secondary_intent":"review","tags":["리뷰악플","댓글신고","운영팀조치"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-016","timestamp":"2025-05-23T14:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"리뷰를 쓸 수 없다는 메시지가 떠요"},{"role":"agent","text":"수령 후 90일이 지나셨거나 이미 해당 상품에 리뷰를 작성하셨다면 작성이 불가합니다. 주문번호 알려주시면 확인해드릴게요."},{"role":"customer","text":"20250520-3301"},{"role":"agent","text":"확인했습니다. 이미 해당 상품에 대해 리뷰가 작성돼 있어요. 1개 상품당 1개 리뷰만 가능합니다. 수정은 가능하니 나의 주문 > 리뷰 내역에서 수정해보세요."}],"resolution":"resolved","primary_intent":"review","secondary_intent":null,"tags":["리뷰작성불가","중복리뷰","1상품1리뷰"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-017","timestamp":"2025-05-26T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"뉴스레터가 스팸으로 분류돼요"},{"role":"agent","text":"이메일 서비스에서 저희 발신 도메인(chorok.com)을 수신 허용 목록에 추가해주세요. 스팸 폴더에서 해당 이메일을 선택 후 '스팸 아님'으로 표시하시면 앞으로 정상 수신됩니다."}],"resolution":"resolved","primary_intent":"newsletter_subscription","secondary_intent":null,"tags":["뉴스레터스팸","수신허용","스팸아님"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-018","timestamp":"2025-05-27T14:30:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"상담이 만족스럽지 않아서 재상담 받고 싶어요"},{"role":"agent","text":"물론이죠! 어떤 부분이 해결되지 않으셨는지 말씀해주시면 다시 도와드리겠습니다. VIP 고객님께는 팀장급 상담으로 연결해드릴 수도 있어요."},{"role":"customer","text":"반품 처리가 2주째 안 되고 있어요"},{"role":"agent","text":"2주는 너무 오래됐네요. 주문번호 알려주시면 제가 직접 해당 건 처리팀에 긴급 에스컬레이션 하겠습니다."}],"resolution":"escalated","primary_intent":"complaint","secondary_intent":"get_refund","tags":["재상담","불만족","VIP팀장","긴급에스컬레이션"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-019","timestamp":"2025-05-28T11:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"뉴스레터 해지했는데 계속 와요"},{"role":"agent","text":"수신거부 처리는 최대 7일 소요됩니다."},{"role":"customer","text":"2주 됐는데도 와요"},{"role":"agent","text":"죄송합니다, 제가 부정확하게 안내드렸어요. 수신거부는 보통 24-48시간 내 적용됩니다. 2주가 지났다면 처리가 제대로 안 된 것 같아요. 이메일 주소 알려주시면 시스템에서 직접 해지 처리해드릴게요."}],"resolution":"resolved","primary_intent":"newsletter_subscription","secondary_intent":null,"tags":["수신거부미적용","오답수정","agent_jung","7일→48시간"],"agent_accuracy":"partially_correct","accuracy_note":"수신거부는 24-48시간 내 적용인데 agent_jung이 7일이라고 오안내."} -{"conversation_id":"CHAT-2025-05-020","timestamp":"2025-05-29T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"리뷰에 사진이 안 올라가요"},{"role":"agent","text":"사진 용량이 5MB를 초과하거나 지원하지 않는 파일 형식(JPG, PNG, GIF만 가능)일 수 있어요. 사진 크기를 줄이거나 파일 형식을 확인해보시겠어요?"},{"role":"customer","text":"JPG인데도 안 돼요"},{"role":"agent","text":"앱 캐시 삭제 후 다시 시도해보세요. 그래도 안 되면 저한테 사진을 이메일로 보내주시면 제가 대신 첨부해드릴 수 있어요."}],"resolution":"partially_resolved","primary_intent":"review","secondary_intent":null,"tags":["리뷰사진업로드실패","5MB제한","JPG PNG GIF"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-021","timestamp":"2025-05-30T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"리뷰가 게시가 안 됐어요"},{"role":"agent","text":"리뷰는 작성 후 운영팀 검토를 거쳐 게시됩니다. 보통 1-2영업일 소요되고, 부적절한 내용이 포함된 경우 반려될 수 있어요."},{"role":"customer","text":"반려되면 알려줘요?"},{"role":"agent","text":"반려 시 앱 알림과 이메일로 반려 사유와 함께 안내됩니다. 사유 확인 후 수정하여 재작성 가능해요."}],"resolution":"resolved","primary_intent":"review","secondary_intent":null,"tags":["리뷰검토","1-2영업일","반려알림"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-022","timestamp":"2025-05-31T10:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"상품이 광고와 달라요 이건 어디에 신고해요?"},{"role":"agent","text":"허위 과장 광고 불만은 앱 > 해당 상품 > '신고하기'에서 접수 가능합니다. 공식 불만으로 처리 원하시면 고객의 소리에도 접수해주세요. 관련 사진과 광고 내용 증거 보관해두시면 처리에 도움이 됩니다."}],"resolution":"resolved","primary_intent":"complaint","secondary_intent":null,"tags":["광고허위과장","상품신고","증거보관"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-023","timestamp":"2025-05-31T14:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"리뷰 작성 안 해도 포인트 받는 방법이 있나요?"},{"role":"agent","text":"리뷰 외에 포인트를 받는 방법으로는 상품 구매 시 1% 적립, 이벤트 참여, 친구 초대 등이 있습니다. 리뷰 포인트(텍스트 100점, 사진 500점)가 가장 높은 편이에요."}],"resolution":"resolved","primary_intent":"review","secondary_intent":"loyalty_points","tags":["리뷰외포인트","이벤트","친구초대","구매적립"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-024","timestamp":"2025-05-31T15:30:00+09:00","channel":"kakaotalk","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"동일 상품 다시 구매했는데 리뷰를 또 쓸 수 있나요?"},{"role":"agent","text":"동일 상품을 재구매한 경우 각 주문 건에 대해 별도로 리뷰 작성 가능합니다. 주문 기준이라 동일 상품이라도 주문이 다르면 각각 작성하실 수 있어요."}],"resolution":"resolved","primary_intent":"review","secondary_intent":null,"tags":["재구매리뷰","주문별작성가능","VIP"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-025","timestamp":"2025-05-31T16:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"뉴스레터 내용이 부적절해요 신고하고 싶어요"},{"role":"agent","text":"뉴스레터 하단의 '콘텐츠 신고' 링크를 통해 신고 가능합니다. 또는 cs@chorok.com으로 해당 뉴스레터 내용과 함께 신고 이유를 보내주세요. 운영팀에서 검토 후 조치합니다."}],"resolution":"resolved","primary_intent":"complaint","secondary_intent":"newsletter_subscription","tags":["뉴스레터신고","부적절콘텐츠","이메일신고"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-026","timestamp":"2025-05-31T17:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"리뷰가 허위인 것 같아요"},{"role":"agent","text":"의심 리뷰는 해당 리뷰 옆 '신고' 버튼으로 신고해주시면 됩니다. 운영팀이 검토 후 허위 리뷰로 확인되면 삭제 조치합니다."}],"resolution":"resolved","primary_intent":"complaint","secondary_intent":"review","tags":["허위리뷰신고","운영팀검토"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-027","timestamp":"2025-05-31T17:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"여러 개 구매했는데 리뷰를 한꺼번에 쓸 수 있나요?"},{"role":"agent","text":"각 상품별로 개별 리뷰 작성이 필요합니다. 한 주문 내 여러 상품을 구매하셨다면 각각 따로 작성하셔야 합니다. 앱 나의 주문 > 해당 주문에서 상품별 리뷰 작성 버튼이 있어요."}],"resolution":"resolved","primary_intent":"review","secondary_intent":null,"tags":["다수상품리뷰","개별작성","한번에불가"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-028","timestamp":"2025-05-31T18:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"반복적으로 같은 문제가 생겨서 공식 항의하고 싶어요"},{"role":"agent","text":"반복 민원은 고객 불만 시스템에 공식 접수 후 책임자 검토 대상이 됩니다. 이메일(cs@chorok.com)로 '공식 항의'라는 제목으로 발송하시면 일반 문의보다 우선 처리됩니다. 어떤 문제가 반복됐는지 구체적으로 작성해주시면 더 효과적입니다."}],"resolution":"resolved","primary_intent":"complaint","secondary_intent":null,"tags":["반복민원","공식항의","책임자검토","우선처리"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-05-029","timestamp":"2025-05-31T18:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"뉴스레터 수신거부가 며칠 안에 처리돼요?"},{"role":"agent","text":"영업일 기준 5-7일 소요됩니다."},{"role":"customer","text":"그렇게 오래 걸려요?"},{"role":"agent","text":"죄송합니다, 확인해보니 보통 24-48시간 내에 처리됩니다. 저도 기술 정책을 잘못 기억하고 있었어요."}],"resolution":"resolved","primary_intent":"newsletter_subscription","secondary_intent":null,"tags":["수신거부처리기간","오답수정","agent_jung","5-7일→48시간"],"agent_accuracy":"partially_correct","accuracy_note":"수신거부 24-48시간 처리인데 agent_jung이 5-7일이라고 오안내."} -{"conversation_id":"CHAT-2025-05-030","timestamp":"2025-05-31T19:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"리뷰 작성하면 혜택이 뭐가 있어요?"},{"role":"agent","text":"텍스트 리뷰 100포인트, 사진 포함 600포인트(텍스트 100 + 사진 500) 적립됩니다. 또한 '이달의 베스트 리뷰'에 선정되면 추가 5,000포인트와 앱 내 노출 혜택이 있어요."}],"resolution":"resolved","primary_intent":"review","secondary_intent":null,"tags":["리뷰혜택","포인트","베스트리뷰","노출혜택"],"agent_accuracy":"correct"} diff --git a/src/main/resources/data/layer3_chatlogs/2025-06.jsonl b/src/main/resources/data/layer3_chatlogs/2025-06.jsonl deleted file mode 100644 index 1b5e046..0000000 --- a/src/main/resources/data/layer3_chatlogs/2025-06.jsonl +++ /dev/null @@ -1,30 +0,0 @@ -{"conversation_id":"CHAT-2025-06-001","timestamp":"2025-06-02T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"구매하면 포인트가 얼마나 쌓여요?"},{"role":"agent","text":"스탠다드 회원은 구매 금액의 1%, 플러스는 3%, VIP는 5% 적립됩니다. 포인트는 배송 완료 후 7일 뒤에 확정 적립됩니다."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["포인트적립률","1%3%5%","7일후적립"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-002","timestamp":"2025-06-03T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"포인트 적립이 얼마나 돼요?"},{"role":"agent","text":"스탠다드는 3%, 플러스는 5%, VIP는 7% 적립됩니다."},{"role":"customer","text":"3%요? 다른 데서 1%라고 봤는데"},{"role":"agent","text":"죄송합니다, 제가 구버전 정책을 말씀드렸어요. 현재는 스탠다드 1%, 플러스 3%, VIP 5%입니다. 2024년 초에 정책이 변경됐어요."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["포인트적립률","오답수정","agent_jung","3%→1%"],"agent_accuracy":"incorrect","accuracy_note":"현행 적립률은 스탠다드 1%/플러스 3%/VIP 5%인데 agent_jung이 구버전(3%/5%/7%)으로 안내."} -{"conversation_id":"CHAT-2025-06-003","timestamp":"2025-06-04T09:15:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"영수증을 다운받고 싶어요"},{"role":"agent","text":"앱 나의 주문 > 해당 주문 > '결제 상세' > '영수증 다운로드'에서 PDF로 저장 가능합니다. 이메일 발송도 가능해요."}],"resolution":"resolved","primary_intent":"get_invoice","secondary_intent":null,"tags":["영수증다운로드","PDF","이메일발송"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-004","timestamp":"2025-06-05T15:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"플러스 등급이 되려면 얼마나 사야 해요?"},{"role":"agent","text":"연간 누적 구매 금액 200만원 이상이면 플러스 등급으로 전환됩니다. 등급 산정은 매월 1일 기준으로 갱신됩니다."},{"role":"customer","text":"200만원이 꽤 많네요"},{"role":"agent","text":"맞습니다. 다만 플러스 등급이 되면 포인트 3% 적립, 일반 배송 무료 혜택이 있어 자주 구매하시면 혜택이 커요."}],"resolution":"resolved","primary_intent":"membership_tiers","secondary_intent":null,"tags":["플러스등급","200만원","연간기준"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-005","timestamp":"2025-06-06T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"세금계산서 발행 가능한가요?"},{"role":"agent","text":"개인사업자나 법인의 경우 세금계산서 발행 가능합니다. 주문 완료 후 고객센터(cs@chorok.com)로 사업자등록번호, 주문번호, 담당자 이메일을 보내주시면 처리해드립니다."}],"resolution":"resolved","primary_intent":"check_invoice","secondary_intent":null,"tags":["세금계산서","사업자등록번호","이메일요청"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-006","timestamp":"2025-06-09T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"플러스 등급 기준이 얼마예요?"},{"role":"agent","text":"연간 150만원 이상 구매하시면 플러스 등급이에요."},{"role":"customer","text":"150만원이요? 200만원이라고 본 것 같은데"},{"role":"agent","text":"죄송합니다, 현재 기준은 200만원입니다. 이전에 150만원이었는데 정책이 변경됐어요. 제가 예전 기준을 말씀드렸어요."}],"resolution":"resolved","primary_intent":"membership_tiers","secondary_intent":null,"tags":["플러스기준","오답수정","agent_jung","150만→200만"],"agent_accuracy":"incorrect","accuracy_note":"현행 플러스 등급은 200만원인데 agent_jung이 구버전(150만원)으로 잘못 안내."} -{"conversation_id":"CHAT-2025-06-007","timestamp":"2025-06-10T10:30:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"VIP 등급 조건이 어떻게 되나요?"},{"role":"agent","text":"연간 누적 구매 금액 800만원 이상이면 VIP 등급입니다. VIP 혜택은 포인트 5% 적립, 우선 배송 무료, 전담 상담사 배정, 반품 우선 처리예요."},{"role":"customer","text":"800만원이 기준인데 이게 맞죠?"},{"role":"agent","text":"네 맞습니다. 2024년 이전에는 기준이 달랐지만 현재는 800만원이에요."}],"resolution":"resolved","primary_intent":"membership_tiers","secondary_intent":null,"tags":["VIP등급","800만원","VIP혜택","VIP"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-008","timestamp":"2025-06-11T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"포인트 유효기간이 있나요?"},{"role":"agent","text":"포인트 유효기간은 적립일로부터 2년입니다. 만료 30일 전에 앱 알림과 이메일로 안내됩니다. 만료 예정 포인트는 마이페이지 > 포인트 내역에서 확인 가능해요."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["포인트유효기간","2년","만료알림"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-009","timestamp":"2025-06-12T14:30:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"현금영수증 신청하고 싶어요"},{"role":"agent","text":"계좌이체 결제 시 주문 과정에서 현금영수증 신청 가능합니다. 미리 신청하지 못하셨다면 주문 완료 후 7일 이내에 고객센터로 주문번호와 현금영수증 번호(핸드폰 번호 또는 사업자번호) 알려주시면 처리해드립니다."}],"resolution":"resolved","primary_intent":"get_invoice","secondary_intent":null,"tags":["현금영수증","계좌이체","7일이내신청"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-010","timestamp":"2025-06-13T11:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_choi","turns":[{"role":"customer","text":"플러스인데 포인트가 1%밖에 안 쌓여요"},{"role":"agent","text":"플러스 등급은 3% 적립이 맞습니다. 주문번호 알려주시면 적립 내역 확인해드릴게요."},{"role":"customer","text":"20250612-3301"},{"role":"agent","text":"확인했습니다. 이번 주문은 쿠폰 할인 적용 후 결제 금액 기준으로 3% 적립됐어요. 할인 전 금액이 아닌 실결제 금액 기준이라 적어보이실 수 있어요."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["플러스포인트3%","실결제금액기준","쿠폰할인후"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-011","timestamp":"2025-06-16T09:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"등급은 언제 갱신돼요?"},{"role":"agent","text":"등급은 매월 1일 기준으로 전월까지의 연간 누적 구매 금액을 계산하여 갱신됩니다. 예를 들어 6월 1일에는 전년 6월부터 5월까지의 구매 금액이 반영됩니다."}],"resolution":"resolved","primary_intent":"membership_tiers","secondary_intent":null,"tags":["등급갱신","매월1일","연간누적"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-012","timestamp":"2025-06-17T14:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"영수증에 상품명이 없어요"},{"role":"agent","text":"앱 영수증 기본 양식에는 주문번호, 금액, 결제 수단이 표시됩니다. 상품명이 포함된 주문 상세 내역서는 '주문 상세' 페이지에서 별도 다운로드 가능합니다."},{"role":"customer","text":"세금계산서 말하는 건 아니고요"},{"role":"agent","text":"주문 상세 내역에 상품명, 수량, 단가가 포함됩니다. 나의 주문 > 해당 주문 > '주문 내역 다운로드'에서 확인해보세요."}],"resolution":"resolved","primary_intent":"get_invoice","secondary_intent":null,"tags":["영수증상품명","주문상세내역","다운로드"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-013","timestamp":"2025-06-18T10:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"포인트를 현금으로 바꿀 수 있나요?"},{"role":"agent","text":"포인트를 현금으로 환전하는 기능은 지원하지 않습니다. 포인트는 저희 앱 결제 시에만 사용 가능합니다."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["포인트현금전환불가","내부사용만"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-014","timestamp":"2025-06-19T15:00:00+09:00","channel":"live_chat","customer_tier":"vip","agent_id":"agent_choi","turns":[{"role":"customer","text":"VIP에서 등급이 내려갈 수도 있나요?"},{"role":"agent","text":"연간 구매 금액이 800만원 미만으로 내려가면 다음 갱신 시 등급이 조정됩니다. 다만 이전 12개월 평균을 기준으로 하고, 한 달 단위로 재산정되니 갑작스러운 등급 하락은 잘 없습니다."},{"role":"customer","text":"등급 하락 전에 알려줘요?"},{"role":"agent","text":"등급 하락 예정 30일 전에 앱 알림으로 안내됩니다. 이를 통해 추가 구매로 등급 유지하실 수 있어요."}],"resolution":"resolved","primary_intent":"membership_tiers","secondary_intent":null,"tags":["VIP등급하락","사전알림30일","VIP"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-015","timestamp":"2025-06-20T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"포인트 적립률이 VIP면 몇 %예요?"},{"role":"agent","text":"VIP는 7% 적립됩니다."},{"role":"customer","text":"5%라고 들었는데요"},{"role":"agent","text":"맞습니다, 죄송합니다. 현재 VIP 적립률은 5%입니다. 이전에 7%였는데 정책이 바뀌었어요."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["VIP포인트","오답수정","agent_jung","7%→5%"],"agent_accuracy":"incorrect","accuracy_note":"VIP 포인트 현행 5%인데 agent_jung이 구버전(7%)으로 오안내."} -{"conversation_id":"CHAT-2025-06-016","timestamp":"2025-06-23T09:00:00+09:00","channel":"phone","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"포인트 합산해서 한 번에 쓸 수 있나요?"},{"role":"agent","text":"보유한 포인트 전체를 한 번에 사용 가능합니다. 단 최소 1,000포인트 이상 보유 시 사용 가능하고, 1포인트 = 1원 적용입니다."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["포인트합산사용","최소1000포인트","1포인트=1원"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-017","timestamp":"2025-06-24T14:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"영수증을 과거 주문 것도 받을 수 있나요?"},{"role":"agent","text":"앱 나의 주문에서 최근 3년 주문 내역 조회 및 영수증 다운로드 가능합니다. 3년 초과 내역은 고객센터 문의 시 처리해드릴 수 있어요."}],"resolution":"resolved","primary_intent":"get_invoice","secondary_intent":null,"tags":["과거영수증","3년이내","3년초과고객센터"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-018","timestamp":"2025-06-25T10:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"구독 회원은 포인트 다르게 쌓이나요?"},{"role":"agent","text":"정기 구독 상품 구매 시에도 등급에 따른 포인트 적립이 동일하게 적용됩니다. 구독 자체에 별도 추가 적립은 없지만 구독 유지 시 별도 구독 혜택(배송비 무료 등)이 있습니다."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":"subscription","tags":["구독포인트","등급동일적용","구독혜택"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-019","timestamp":"2025-06-26T15:30:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"세금계산서 발행 기간이 있나요?"},{"role":"agent","text":"세금계산서는 주문 완료 월 기준으로 당월 내 또는 다음 달 10일 이내에 요청하셔야 합니다. 해당 기간이 지나면 발행이 어려울 수 있어요."}],"resolution":"resolved","primary_intent":"check_invoice","secondary_intent":null,"tags":["세금계산서기간","당월또는다음달10일","기한"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-020","timestamp":"2025-06-27T11:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_kim","turns":[{"role":"customer","text":"등급별 혜택을 한눈에 볼 수 있어요?"},{"role":"agent","text":"앱 마이페이지 > 등급 혜택에서 스탠다드, 플러스, VIP 별 혜택 비교표를 확인하실 수 있습니다. 배송비, 포인트, 반품, 상담 혜택이 정리되어 있어요."}],"resolution":"resolved","primary_intent":"membership_tiers","secondary_intent":null,"tags":["등급혜택비교","앱마이페이지","혜택표"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-021","timestamp":"2025-06-28T09:00:00+09:00","channel":"kakaotalk","customer_tier":"plus","agent_id":"agent_lee","turns":[{"role":"customer","text":"이번 달 얼마나 사야 플러스 유지돼요?"},{"role":"agent","text":"등급은 연간 누적 기준이라 이번 달 구매만으로 바로 계산하기 어렵습니다. 앱 마이페이지 > 내 등급 현황에서 현재 연간 누적 구매 금액과 다음 등급까지 남은 금액을 확인하실 수 있어요."}],"resolution":"resolved","primary_intent":"membership_tiers","secondary_intent":null,"tags":["플러스유지","연간누적","등급현황확인"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-022","timestamp":"2025-06-29T14:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"포인트가 만료됐어요 복구 가능한가요?"},{"role":"agent","text":"만료된 포인트는 원칙적으로 복구가 어렵습니다. 다만 만료 안내를 받지 못하신 경우나 시스템 오류가 있었다면 고객센터로 문의 주시면 검토해드릴 수 있습니다."},{"role":"customer","text":"만료 알림을 못 받았어요"},{"role":"agent","text":"앱 알림 허용 여부 확인이 필요합니다. 알림이 꺼져 있었다면 예외 복구 신청이 어려울 수 있어요. 고객센터로 자세한 상황 설명해주시면 검토해드릴게요."}],"resolution":"partially_resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["포인트만료","복구어려움","알림미수신"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-023","timestamp":"2025-06-30T10:00:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"가족이랑 포인트를 합칠 수 있나요?"},{"role":"agent","text":"계정 간 포인트 합산이나 이전 기능은 지원하지 않습니다. 포인트는 각 계정에서만 사용 가능합니다."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["포인트이전불가","계정간합산불가"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-024","timestamp":"2025-06-30T11:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_jung","turns":[{"role":"customer","text":"플러스랑 VIP 포인트 차이가 얼마나 나요?"},{"role":"agent","text":"플러스 5%, VIP 7%로 2% 차이납니다."},{"role":"customer","text":"플러스가 5%예요? 3%라고 봤는데"},{"role":"agent","text":"맞습니다 죄송합니다. 현재 플러스 3%, VIP 5%입니다. 이전 정책을 말씀드렸어요. 두 등급 차이는 2%포인트입니다."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":"membership_tiers","tags":["플러스VIP포인트차이","오답수정","agent_jung","구버전혼용"],"agent_accuracy":"incorrect","accuracy_note":"플러스 3%/VIP 5%인데 agent_jung이 5%/7%로 구버전 안내."} -{"conversation_id":"CHAT-2025-06-025","timestamp":"2025-06-30T14:00:00+09:00","channel":"phone","customer_tier":"vip","agent_id":"agent_kim","turns":[{"role":"customer","text":"법인 영수증과 개인 영수증 다른가요?"},{"role":"agent","text":"개인 영수증(일반 결제 영수증)은 앱에서 바로 다운로드 가능합니다. 법인의 경우 세금계산서를 추가 발행 요청하시면 부가가치세 신고에 사용 가능한 공식 세금계산서를 받으실 수 있어요."}],"resolution":"resolved","primary_intent":"check_invoice","secondary_intent":null,"tags":["법인영수증","세금계산서","개인영수증","VIP"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-026","timestamp":"2025-06-30T15:30:00+09:00","channel":"live_chat","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"마켓플레이스 구매도 등급 적립에 포함되나요?"},{"role":"agent","text":"마켓플레이스 판매자 상품 구매 금액도 연간 누적 구매 금액에 포함됩니다. 포인트 적립률은 본사 상품과 동일하게 적용됩니다."}],"resolution":"resolved","primary_intent":"membership_tiers","secondary_intent":"loyalty_points","tags":["마켓플레이스등급적립","구매금액포함"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-027","timestamp":"2025-06-30T16:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_park","turns":[{"role":"customer","text":"포인트가 생각보다 적게 쌓였어요"},{"role":"agent","text":"주문번호 알려주시면 적립 내역 확인해드릴게요."},{"role":"customer","text":"20250629-5501"},{"role":"agent","text":"확인했습니다. 해당 주문에서 쿠폰 3,000원 할인 적용 후 실결제 금액 17,000원의 1%(스탠다드 기준) = 170포인트가 적립됐습니다. 포인트는 할인 전 금액이 아닌 실결제 금액 기준이에요."}],"resolution":"resolved","primary_intent":"loyalty_points","secondary_intent":null,"tags":["포인트적립확인","실결제금액기준","쿠폰후적립"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-028","timestamp":"2025-06-30T17:00:00+09:00","channel":"phone","customer_tier":"standard","agent_id":"agent_choi","turns":[{"role":"customer","text":"영수증이 필요한데 주문을 취소해버렸어요"},{"role":"agent","text":"취소된 주문도 영수증 조회가 가능합니다. 앱 나의 주문 > 취소 내역에서 해당 주문 확인 후 영수증 다운로드 하시면 됩니다. 단 취소 영수증으로 환불 금액이 반영된 형태로 발급됩니다."}],"resolution":"resolved","primary_intent":"get_invoice","secondary_intent":null,"tags":["취소주문영수증","취소내역조회","환불반영"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-029","timestamp":"2025-06-30T18:00:00+09:00","channel":"live_chat","customer_tier":"plus","agent_id":"agent_kim","turns":[{"role":"customer","text":"플러스 등급이 됐는데 혜택이 바로 적용되나요?"},{"role":"agent","text":"등급 갱신 시점(매월 1일)부터 혜택이 적용됩니다. 갱신 전에 플러스 기준을 달성하셔도 당월 혜택은 다음 달 1일부터 적용됩니다."},{"role":"customer","text":"그럼 오늘 달성해도 7월부터인 거네요?"},{"role":"agent","text":"정확합니다. 6월에 달성하시면 7월 1일부터 플러스 혜택이 적용됩니다."}],"resolution":"resolved","primary_intent":"membership_tiers","secondary_intent":null,"tags":["등급혜택적용시점","매월1일","다음달적용"],"agent_accuracy":"correct"} -{"conversation_id":"CHAT-2025-06-030","timestamp":"2025-06-30T19:00:00+09:00","channel":"kakaotalk","customer_tier":"standard","agent_id":"agent_lee","turns":[{"role":"customer","text":"스탠다드에서 플러스, 플러스에서 VIP까지 올리려면 각각 얼마가 필요해요?"},{"role":"agent","text":"스탠다드에서 플러스는 연간 200만원, 플러스에서 VIP는 연간 800만원 기준입니다. VIP까지 올리시려면 연간 800만원 이상 구매하셔야 합니다. 각 등급별 포인트 적립률은 스탠다드 1%, 플러스 3%, VIP 5%예요."}],"resolution":"resolved","primary_intent":"membership_tiers","secondary_intent":"loyalty_points","tags":["등급기준전체","200만800만","1%3%5%"],"agent_accuracy":"correct"} From ea159caf72567175bb6c45f57b6ea0a593280503 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Mon, 18 May 2026 01:01:55 +0900 Subject: [PATCH 30/50] =?UTF-8?q?chore:=20ai=20rag=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index bb54183..7309f0d 100644 --- a/build.gradle +++ b/build.gradle @@ -29,6 +29,7 @@ dependencies { 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' From 918edd4c6a25581bf74302d33504f266de1d85fa Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Mon, 18 May 2026 09:31:20 +0900 Subject: [PATCH 31/50] =?UTF-8?q?refactor:=20qa=20=EC=96=B4=EB=93=9C?= =?UTF-8?q?=EB=B0=94=EC=9D=B4=EC=A0=80=20=EB=AF=B8=EC=82=AC=EC=9A=A9=20?= =?UTF-8?q?=EB=B0=8F=20=EC=BF=BC=EB=A6=AC=20=ED=99=95=EC=9E=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bootcamp/config/ChatClientConfig.java | 38 ++++---- .../bootcamp/service/ChatbotService.java | 86 ++++++++++++++++++- .../bootcamp/service/MarkdownReader.java | 11 +++ 3 files changed, 114 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/cholog/bootcamp/config/ChatClientConfig.java b/src/main/java/com/cholog/bootcamp/config/ChatClientConfig.java index 8170cfe..074bd68 100644 --- a/src/main/java/com/cholog/bootcamp/config/ChatClientConfig.java +++ b/src/main/java/com/cholog/bootcamp/config/ChatClientConfig.java @@ -27,7 +27,7 @@ public ChatClient chatClient( // 어드바이저 QuestionAnswerAdvisor qaAdvisor = QuestionAnswerAdvisor.builder(vectorStore) .promptTemplate(customPromptTemplate) - .searchRequest(SearchRequest.builder().topK(8).build()) + .searchRequest(SearchRequest.builder().topK(6).build()) .build(); MessageChatMemoryAdvisor messageChatMemoryAdvisor = MessageChatMemoryAdvisor.builder(chatMemory).build(); SimpleLoggerAdvisor simpleLoggerAdvisor = new SimpleLoggerAdvisor(); @@ -41,23 +41,25 @@ private PromptTemplate getPromptTemplate() { return PromptTemplate.builder() .renderer(StTemplateRenderer.builder().startDelimiterToken('<').endDelimiterToken('>').build()) .template(""" - - - 아래는 컨텍스트 정보입니다. - - --------------------- - - --------------------- - - 컨텍스트 정보를 바탕으로 질문에 답하세요. - - 답변 시 아래 룰을 따르세요: - 1. 절대 컨텍스트에 없는 내용을 추론하거나 지어내지 마세요. 응답은 컨텍스트 정보를 기반으로 확인되는 사실만 답합니다. - 2. 사용자가 질문한 부분에 대해서만 답하기 보다는 관련 정보 중 사용자에게 유용한 정보라고 판단되면 함께 답변에 포함해주세요. - 예시) - Q. 적립 포인트 1점은 얼마의 가치인가요? - - 추천하지 않는 답변: "적립 포인트 1점의 가치는 1원입니다."와 같이 단순 정보만 제공하고 끝나는 답변. - - 추천하는 답변: 적립 포인트 모으는 방법, 적립 정책, 적립금 소멸, 적립금 가치 등 적립 포인트 관련 핵심 정보를 담은 간단명료한 답변. + 당신은 초록 고객센터의 챗봇입니다. + 다음 주어진 내용을 참고해 [사용자의 질문]에 답변해주세요. + + 답변 규칙 + - 만약 주어진 내용으로 답변할 수 없다면 모르겠다고 안내하세요. + - 내용이 충돌하는 경우 다음 우선순위를 따라 답변 합니다. + - 질문 도메인과 가장 근접한 내용 + - 더 구체적인 상황을 다루는 내용 + - 더 최신 버전의 내용 + + --- + + [관련 내용] + + + --- + + [사용자 질문] + """) .build(); } diff --git a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java index 5868b10..949dccb 100644 --- a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java +++ b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java @@ -1,13 +1,26 @@ package com.cholog.bootcamp.service; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.ChatClientResponse; +import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor; import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor; import org.springframework.ai.chat.memory.ChatMemory; import org.springframework.ai.chat.metadata.Usage; import org.springframework.ai.chat.model.ChatResponse; +import org.springframework.ai.document.Document; +import org.springframework.ai.rag.Query; +import org.springframework.ai.rag.preretrieval.query.expansion.MultiQueryExpander; +import org.springframework.ai.vectorstore.SearchRequest; import org.springframework.ai.vectorstore.VectorStore; import org.springframework.stereotype.Service; @@ -22,21 +35,46 @@ public class ChatbotService { private final ChatClient chatClient; private final ChatMemory chatMemory; + private final VectorStore vectorStore; + private final ChatClient.Builder chatClientBuilder; public ChatbotService( VectorStore vectorStore, MarkdownReader markdownReader, ChatMemory chatMemory, - ChatClient chatClient + ChatClient.Builder chatClientBuilder ) { - this.chatClient = chatClient; + MessageChatMemoryAdvisor messageChatMemoryAdvisor = MessageChatMemoryAdvisor.builder(chatMemory).build(); + this.chatClient = chatClientBuilder.defaultAdvisors(messageChatMemoryAdvisor).build(); this.chatMemory = chatMemory; + this.chatClientBuilder = chatClientBuilder; + this.vectorStore = vectorStore; vectorStore.add(markdownReader.loadAll()); } public ChatbotResponse chat(String conversationId, ChatbotRequest request) { + List documents = getDocumentsWithQueryExpansion(request.question()); + String context = getContext(documents); + log.info("context: {}", context); ChatResponse chatResponse = chatClient.prompt() - .user(request.question()) + .system(""" + 당신은 초록 고객센터의 챗봇입니다. + 주어진 [컨텍스트]를 기반으로 [사용자 질문]에 답변해주세요. + + 답변 규칙 + - 만약 주어진 컨텍스트로 답변할 수 없다면 모르겠다고 안내하세요. + - 내용이 충돌하는 경우 다음 우선순위를 따라 답변 합니다. + - 질문 도메인과 가장 근접한 내용 + - 더 구체적인 상황을 다루는 내용 + - 더 최신 버전의 내용 + """) + .user(""" + [사용자 질문] + %s + + [컨텍스트] + %s + """.formatted(request.question(), context)) .advisors(a -> a.param(ChatMemory.CONVERSATION_ID, conversationId)) .call() .chatResponse(); @@ -46,6 +84,42 @@ public ChatbotResponse chat(String conversationId, ChatbotRequest request) { return ChatbotResponse.from(answer, usage); } + private static String getContext(List documents) { + String context = documents.stream() + .map(Document::getText) + .collect(Collectors.joining("\n\n")); + return context; + } + + private List getDocumentsWithQueryExpansion(String question) { + MultiQueryExpander queryExpander = MultiQueryExpander.builder() + .chatClientBuilder(chatClientBuilder) + .numberOfQueries(4) + .build(); + List queries = queryExpander.expand(new Query(question)); + log.info("query expansion(4): "); + for (Query query : queries) { + log.info("query: {}", query.text()); + } + List rawDocuments = queries.stream() + .flatMap(query -> vectorStore.similaritySearch(getSearchRequest(query.text())).stream()) + .toList(); + Map bestScoreByText = rawDocuments.stream() + .collect(Collectors.toMap( + Document::getText, + Function.identity(), + (d1, d2) -> d1.getScore() >= d2.getScore() ? d1 : d2 // 충돌 시 높은 score 선택 + )); + return new ArrayList<>(bestScoreByText.values()); + } + + private SearchRequest getSearchRequest(String query) { + return SearchRequest.builder() + .query(query) + .topK(4) + .build(); + } + public ChatbotResponse debugChat(ChatbotRequest request) { ChatClientResponse chatClientResponse = chatClient.prompt() .user(request.question()) @@ -71,4 +145,10 @@ public void clearConversation(String conversationId) { } chatMemory.clear(conversationId); } + + public static Predicate distinctByKey(Function keyExtractor) { + Set seen = ConcurrentHashMap.newKeySet(); + return t -> seen.add(keyExtractor.apply(t)); + } + } diff --git a/src/main/java/com/cholog/bootcamp/service/MarkdownReader.java b/src/main/java/com/cholog/bootcamp/service/MarkdownReader.java index ad14246..a4719ab 100644 --- a/src/main/java/com/cholog/bootcamp/service/MarkdownReader.java +++ b/src/main/java/com/cholog/bootcamp/service/MarkdownReader.java @@ -10,6 +10,9 @@ import org.springframework.core.io.Resource; import org.springframework.stereotype.Component; +import lombok.extern.slf4j.Slf4j; + +@Slf4j @Component public class MarkdownReader { @@ -32,6 +35,14 @@ public List loadAll() { 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; } } From d35b780c64c81a15e6b29eaf841d52632bf3a5be Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Mon, 18 May 2026 09:32:42 +0900 Subject: [PATCH 32/50] =?UTF-8?q?refactor:=20=EB=AF=B8=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EC=A0=9C=EA=B1=B0(=EB=94=94=EB=B2=84?= =?UTF-8?q?=EA=B9=85=20=EC=97=94=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ChatbotController.java | 5 ---- .../bootcamp/service/ChatbotService.java | 26 ------------------- 2 files changed, 31 deletions(-) diff --git a/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java b/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java index 8b3c125..7920a02 100644 --- a/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java +++ b/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java @@ -67,11 +67,6 @@ public ResponseEntity chat( .body(response); } - @PostMapping("/debug") - public ChatbotResponse debugChat(@RequestBody ChatbotRequest request) { - return chatbotService.debugChat(request); - } - private ResponseCookie createConversationCookie(String conversationId) { return ResponseCookie.from(CONVERSATION_ID_COOKIE, conversationId) .httpOnly(true) diff --git a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java index 949dccb..311daab 100644 --- a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java +++ b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java @@ -3,17 +3,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; -import java.util.function.Predicate; import java.util.stream.Collectors; import org.springframework.ai.chat.client.ChatClient; -import org.springframework.ai.chat.client.ChatClientResponse; import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor; -import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor; import org.springframework.ai.chat.memory.ChatMemory; import org.springframework.ai.chat.metadata.Usage; import org.springframework.ai.chat.model.ChatResponse; @@ -120,21 +115,6 @@ private SearchRequest getSearchRequest(String query) { .build(); } - public ChatbotResponse debugChat(ChatbotRequest request) { - ChatClientResponse chatClientResponse = chatClient.prompt() - .user(request.question()) - .call() - .chatClientResponse(); - - Object RETRIEVED_DOCUMENTS = chatClientResponse.context().get(QuestionAnswerAdvisor.RETRIEVED_DOCUMENTS); - log.info("RETRIEVED_DOCUMENTS: {}", RETRIEVED_DOCUMENTS); - - ChatResponse chatResponse = chatClientResponse.chatResponse(); - String answer = chatResponse.getResult().getOutput().getText(); - Usage usage = chatResponse.getMetadata().getUsage(); - return ChatbotResponse.from(answer, usage); - } - public String createConversationId() { return UUID.randomUUID().toString(); } @@ -145,10 +125,4 @@ public void clearConversation(String conversationId) { } chatMemory.clear(conversationId); } - - public static Predicate distinctByKey(Function keyExtractor) { - Set seen = ConcurrentHashMap.newKeySet(); - return t -> seen.add(keyExtractor.apply(t)); - } - } From 0d96e856330ac58bc7a22162b7f0d9bf8d73e3cd Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Mon, 18 May 2026 22:18:33 +0900 Subject: [PATCH 33/50] =?UTF-8?q?feat:=20=EB=A6=AC=EB=9E=AD=ED=81=AC=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/MutiQueryExpanderConfig.java | 19 ++++++ .../bootcamp/service/ChatbotService.java | 28 ++++++-- .../service/RerankDocumentPostProcessor.java | 67 +++++++++++++++++++ 3 files changed, 107 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/cholog/bootcamp/config/MutiQueryExpanderConfig.java create mode 100644 src/main/java/com/cholog/bootcamp/service/RerankDocumentPostProcessor.java diff --git a/src/main/java/com/cholog/bootcamp/config/MutiQueryExpanderConfig.java b/src/main/java/com/cholog/bootcamp/config/MutiQueryExpanderConfig.java new file mode 100644 index 0000000..40cb69f --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/config/MutiQueryExpanderConfig.java @@ -0,0 +1,19 @@ +package com.cholog.bootcamp.config; + +import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.rag.preretrieval.query.expansion.MultiQueryExpander; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class MutiQueryExpanderConfig { + + @Bean + MultiQueryExpander multiQueryExpander(ChatClient.Builder chatClientBuilder) { + return MultiQueryExpander.builder() + .chatClientBuilder(chatClientBuilder) + .numberOfQueries(3) + .includeOriginal(Boolean.TRUE) + .build(); + } +} diff --git a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java index 311daab..cc119ac 100644 --- a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java +++ b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java @@ -14,6 +14,7 @@ import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.document.Document; import org.springframework.ai.rag.Query; +import org.springframework.ai.rag.postretrieval.document.DocumentPostProcessor; import org.springframework.ai.rag.preretrieval.query.expansion.MultiQueryExpander; import org.springframework.ai.vectorstore.SearchRequest; import org.springframework.ai.vectorstore.VectorStore; @@ -32,25 +33,38 @@ public class ChatbotService { private final ChatMemory chatMemory; private final VectorStore vectorStore; private final ChatClient.Builder chatClientBuilder; + private final DocumentPostProcessor documentPostProcessor; public ChatbotService( VectorStore vectorStore, MarkdownReader markdownReader, ChatMemory chatMemory, - ChatClient.Builder chatClientBuilder + ChatClient.Builder chatClientBuilder, + DocumentPostProcessor documentPostProcessor ) { MessageChatMemoryAdvisor messageChatMemoryAdvisor = MessageChatMemoryAdvisor.builder(chatMemory).build(); this.chatClient = chatClientBuilder.defaultAdvisors(messageChatMemoryAdvisor).build(); this.chatMemory = chatMemory; this.chatClientBuilder = chatClientBuilder; + this.documentPostProcessor = documentPostProcessor; this.vectorStore = vectorStore; vectorStore.add(markdownReader.loadAll()); } public ChatbotResponse chat(String conversationId, ChatbotRequest request) { - List documents = getDocumentsWithQueryExpansion(request.question()); - String context = getContext(documents); - log.info("context: {}", context); + // List documents = getDocumentsWithQueryExpansion(request.question()); + SearchRequest searchRequest = getSearchRequest(request.question(), 10); + List documents = vectorStore.similaritySearch(searchRequest); + documents = documentPostProcessor.apply(Query.builder().text(request.question()).build(), documents); + List subList = documents.subList(0, Math.min(documents.size(), 4)); + String context = getContext(subList); + System.out.println("=========="); + for (Document document : subList) { + System.out.println(document.getMetadata().get("filename")); + System.out.println(document.getText()); + System.out.println(); + } + System.out.println("=========="); ChatResponse chatResponse = chatClient.prompt() .system(""" 당신은 초록 고객센터의 챗봇입니다. @@ -97,7 +111,7 @@ private List getDocumentsWithQueryExpansion(String question) { log.info("query: {}", query.text()); } List rawDocuments = queries.stream() - .flatMap(query -> vectorStore.similaritySearch(getSearchRequest(query.text())).stream()) + .flatMap(query -> vectorStore.similaritySearch(getSearchRequest(query.text(), 4)).stream()) .toList(); Map bestScoreByText = rawDocuments.stream() .collect(Collectors.toMap( @@ -108,10 +122,10 @@ private List getDocumentsWithQueryExpansion(String question) { return new ArrayList<>(bestScoreByText.values()); } - private SearchRequest getSearchRequest(String query) { + private SearchRequest getSearchRequest(String query, int k) { return SearchRequest.builder() .query(query) - .topK(4) + .topK(k) .build(); } diff --git a/src/main/java/com/cholog/bootcamp/service/RerankDocumentPostProcessor.java b/src/main/java/com/cholog/bootcamp/service/RerankDocumentPostProcessor.java new file mode 100644 index 0000000..5330345 --- /dev/null +++ b/src/main/java/com/cholog/bootcamp/service/RerankDocumentPostProcessor.java @@ -0,0 +1,67 @@ +package com.cholog.bootcamp.service; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.document.Document; +import org.springframework.ai.rag.Query; +import org.springframework.ai.rag.postretrieval.document.DocumentPostProcessor; +import org.springframework.stereotype.Component; + +@Component +public class RerankDocumentPostProcessor implements DocumentPostProcessor { + + private final ChatClient rerankClient; + + public RerankDocumentPostProcessor(ChatClient.Builder builder) { + this.rerankClient = builder.build(); + } + + @Override + public List process(Query query, List documents) { + String documentsText = documents.stream() + .map(document -> "[[%s]] %s".formatted(document.getId(), document.getText())) + .collect(Collectors.joining("\n\n")); + + String result = rerankClient.prompt(""" + # 개요 + 당신은 문서들을 재정렬하는 rerank 전문가입니다. + 주어진 질문을 확인하고, 각 문서의 내용이 질문에 답하기 위해 얼마나 필요한 핵심 정보인지를 판단하세요. + 그리고 우선순위를 기준으로 내림차순 정렬하세요. + + 문서 간에 내용이 상반될 경우, 더 구체적이고 세부적인 정보를 담은 문서를 우선순위로 판단하세요. + 관련성이 동일한 경우 원래 순서를 유지하세요. + + # 질문 + %s + + # 문서들 (형식 : [[문서 id]] 문서내용) + %s + + # 출력 형식 + 문서 id를 내림차순으로 `, `로 구분하여 출력하세요. + 문서 id와 구분자 외에 다른 문자는 절대 출력하지 않습니다. + + 예시) id4, id2, id3, id1 + """.formatted(query.text(), documentsText)).call() + .chatResponse() + .getResult() + .getOutput() + .getText(); + + System.out.println("========"); + System.out.println(result); + System.out.println("========"); + + Map documentMap = documents.stream() + .collect(Collectors.toMap(Document::getId, Function.identity())); + + return Arrays.stream(result.split(", ")) + .map(documentMap::get) + .toList(); + } +} From 9f1ec402a9991a86f75af29c9279c2ab7ba44710 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Tue, 19 May 2026 08:59:55 +0900 Subject: [PATCH 34/50] =?UTF-8?q?refactor:=20=EB=A6=AC=EB=9E=AD=ED=81=AC?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EB=94=94=EB=B2=84=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/RerankDocumentPostProcessor.java | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/cholog/bootcamp/service/RerankDocumentPostProcessor.java b/src/main/java/com/cholog/bootcamp/service/RerankDocumentPostProcessor.java index 5330345..f0490f5 100644 --- a/src/main/java/com/cholog/bootcamp/service/RerankDocumentPostProcessor.java +++ b/src/main/java/com/cholog/bootcamp/service/RerankDocumentPostProcessor.java @@ -23,23 +23,42 @@ public RerankDocumentPostProcessor(ChatClient.Builder builder) { @Override public List process(Query query, List documents) { + System.out.println("========"); + for (Document document : documents) { + System.out.println(document.getMetadata().get("filename") + " " + document.getText()); + } + System.out.println("========"); String documentsText = documents.stream() - .map(document -> "[[%s]] %s".formatted(document.getId(), document.getText())) + .map(document -> """ + [[%s]] + source: %s + title: %s + text: + %s + """ + .formatted( + document.getId(), + document.getMetadata().get("filename"), + document.getMetadata().get("title"), + document.getText() + )) .collect(Collectors.joining("\n\n")); String result = rerankClient.prompt(""" # 개요 당신은 문서들을 재정렬하는 rerank 전문가입니다. 주어진 질문을 확인하고, 각 문서의 내용이 질문에 답하기 위해 얼마나 필요한 핵심 정보인지를 판단하세요. - 그리고 우선순위를 기준으로 내림차순 정렬하세요. + 그리고 우선순위를 기준으로 내림차순 정렬하세요.(우선순위가 높은게 앞에 오게) - 문서 간에 내용이 상반될 경우, 더 구체적이고 세부적인 정보를 담은 문서를 우선순위로 판단하세요. - 관련성이 동일한 경우 원래 순서를 유지하세요. + # **주의사항** + - 문서 간 내용이 상반되거나 충돌할 경우, 더 구체적이고 특수한 조건(예외, 제한사항 등)을 다루는 문서를 일반적인 내용보다 반드시 우선시하세요. + 일반 규칙보다 예외 규칙이 항상 높은 우선순위를 가집니다. + - 문서 id를 임의로 누락하지 마세요. 당신은 재정렬만 수행합니다. # 질문 %s - # 문서들 (형식 : [[문서 id]] 문서내용) + # 문서들 [[문서 id]] %s # 출력 형식 From f287a6d6fded9dc12aa1561d0ef365d444930fbe Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Tue, 19 May 2026 10:38:37 +0900 Subject: [PATCH 35/50] =?UTF-8?q?refactor:=20=EA=B2=80=EC=83=89=EB=90=98?= =?UTF-8?q?=20=EC=B2=AD=ED=81=AC=EC=97=90=20=ED=95=B4=EB=8B=B9=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=AC=B8=EC=84=9C=20=EC=A0=84=EC=B2=B4=EB=A5=BC=20?= =?UTF-8?q?=EC=BB=A8=ED=85=8D=EC=8A=A4=ED=8A=B8=EC=97=90=20=ED=8F=AC?= =?UTF-8?q?=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bootcamp/service/ChatbotService.java | 72 +++++++++++-------- 1 file changed, 42 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java index cc119ac..c4ff8f5 100644 --- a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java +++ b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java @@ -1,5 +1,6 @@ package com.cholog.bootcamp.service; +import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -16,8 +17,11 @@ import org.springframework.ai.rag.Query; import org.springframework.ai.rag.postretrieval.document.DocumentPostProcessor; import org.springframework.ai.rag.preretrieval.query.expansion.MultiQueryExpander; +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; @@ -34,6 +38,7 @@ public class ChatbotService { private final VectorStore vectorStore; private final ChatClient.Builder chatClientBuilder; private final DocumentPostProcessor documentPostProcessor; + private final ResourcePatternResolver resolver; public ChatbotService( VectorStore vectorStore, @@ -49,28 +54,35 @@ public ChatbotService( this.documentPostProcessor = documentPostProcessor; this.vectorStore = vectorStore; vectorStore.add(markdownReader.loadAll()); + this.resolver = new PathMatchingResourcePatternResolver(); } public ChatbotResponse chat(String conversationId, ChatbotRequest request) { - // List documents = getDocumentsWithQueryExpansion(request.question()); - SearchRequest searchRequest = getSearchRequest(request.question(), 10); + SearchRequest searchRequest = getSearchRequest(request.question(), 4); List documents = vectorStore.similaritySearch(searchRequest); - documents = documentPostProcessor.apply(Query.builder().text(request.question()).build(), documents); - List subList = documents.subList(0, Math.min(documents.size(), 4)); - String context = getContext(subList); - System.out.println("=========="); - for (Document document : subList) { - System.out.println(document.getMetadata().get("filename")); - System.out.println(document.getText()); - System.out.println(); - } - System.out.println("=========="); + documents = 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(); + + String context = getContext(documents); + System.out.println(context); ChatResponse chatResponse = chatClient.prompt() .system(""" 당신은 초록 고객센터의 챗봇입니다. 주어진 [컨텍스트]를 기반으로 [사용자 질문]에 답변해주세요. 답변 규칙 + - 제공된 컨텍스트를 기반으로만 답변하세요. 절대 일반 상식으로 추론하지 마세요. - 만약 주어진 컨텍스트로 답변할 수 없다면 모르겠다고 안내하세요. - 내용이 충돌하는 경우 다음 우선순위를 따라 답변 합니다. - 질문 도메인과 가장 근접한 내용 @@ -100,6 +112,24 @@ private static String getContext(List documents) { return context; } + private SearchRequest getSearchRequest(String query, int k) { + return SearchRequest.builder() + .query(query) + .topK(k) + .build(); + } + + public String createConversationId() { + return UUID.randomUUID().toString(); + } + + public void clearConversation(String conversationId) { + if (conversationId == null) { + throw new NullPointerException("conversationId는 null일 수 없습니다."); + } + chatMemory.clear(conversationId); + } + private List getDocumentsWithQueryExpansion(String question) { MultiQueryExpander queryExpander = MultiQueryExpander.builder() .chatClientBuilder(chatClientBuilder) @@ -121,22 +151,4 @@ private List getDocumentsWithQueryExpansion(String question) { )); return new ArrayList<>(bestScoreByText.values()); } - - private SearchRequest getSearchRequest(String query, int k) { - return SearchRequest.builder() - .query(query) - .topK(k) - .build(); - } - - public String createConversationId() { - return UUID.randomUUID().toString(); - } - - public void clearConversation(String conversationId) { - if (conversationId == null) { - throw new NullPointerException("conversationId는 null일 수 없습니다."); - } - chatMemory.clear(conversationId); - } } From 24f09c99563236e59fa8f8880840bd63fb25147b Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Tue, 19 May 2026 10:39:04 +0900 Subject: [PATCH 36/50] =?UTF-8?q?refactor:=20=EB=A9=94=EB=AA=A8=EB=A6=AC?= =?UTF-8?q?=20=EC=96=B4=EB=93=9C=EB=B0=94=EC=9D=B4=EC=A0=80=20=EC=9E=84?= =?UTF-8?q?=EC=8B=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cholog/bootcamp/service/ChatbotService.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java index c4ff8f5..cf6c19c 100644 --- a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java +++ b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java @@ -48,7 +48,9 @@ public ChatbotService( DocumentPostProcessor documentPostProcessor ) { MessageChatMemoryAdvisor messageChatMemoryAdvisor = MessageChatMemoryAdvisor.builder(chatMemory).build(); - this.chatClient = chatClientBuilder.defaultAdvisors(messageChatMemoryAdvisor).build(); + this.chatClient = chatClientBuilder + // .defaultAdvisors(messageChatMemoryAdvisor) + .build(); this.chatMemory = chatMemory; this.chatClientBuilder = chatClientBuilder; this.documentPostProcessor = documentPostProcessor; @@ -96,7 +98,7 @@ public ChatbotResponse chat(String conversationId, ChatbotRequest request) { [컨텍스트] %s """.formatted(request.question(), context)) - .advisors(a -> a.param(ChatMemory.CONVERSATION_ID, conversationId)) + // .advisors(a -> a.param(ChatMemory.CONVERSATION_ID, conversationId)) .call() .chatResponse(); From 5f0b94cc2eade5d3a819c847dd66321d8f572744 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Wed, 20 May 2026 09:03:48 +0900 Subject: [PATCH 37/50] =?UTF-8?q?refactor:=20=EB=AF=B8=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bootcamp/config/ChatClientConfig.java | 66 -------------- .../config/MutiQueryExpanderConfig.java | 19 ---- .../controller/ChatbotController.java | 61 +------------ .../bootcamp/service/ChatbotService.java | 60 +------------ .../service/RerankDocumentPostProcessor.java | 86 ------------------- 5 files changed, 5 insertions(+), 287 deletions(-) delete mode 100644 src/main/java/com/cholog/bootcamp/config/ChatClientConfig.java delete mode 100644 src/main/java/com/cholog/bootcamp/config/MutiQueryExpanderConfig.java delete mode 100644 src/main/java/com/cholog/bootcamp/service/RerankDocumentPostProcessor.java diff --git a/src/main/java/com/cholog/bootcamp/config/ChatClientConfig.java b/src/main/java/com/cholog/bootcamp/config/ChatClientConfig.java deleted file mode 100644 index 074bd68..0000000 --- a/src/main/java/com/cholog/bootcamp/config/ChatClientConfig.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.cholog.bootcamp.config; - -import org.springframework.ai.chat.client.ChatClient; -import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor; -import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor; -import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor; -import org.springframework.ai.chat.memory.ChatMemory; -import org.springframework.ai.chat.prompt.PromptTemplate; -import org.springframework.ai.template.st.StTemplateRenderer; -import org.springframework.ai.vectorstore.SearchRequest; -import org.springframework.ai.vectorstore.VectorStore; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class ChatClientConfig { - - @Bean - public ChatClient chatClient( - ChatClient.Builder builder, - VectorStore vectorStore, - ChatMemory chatMemory - ) { - // 프롬프트 - PromptTemplate customPromptTemplate = getPromptTemplate(); - - // 어드바이저 - QuestionAnswerAdvisor qaAdvisor = QuestionAnswerAdvisor.builder(vectorStore) - .promptTemplate(customPromptTemplate) - .searchRequest(SearchRequest.builder().topK(6).build()) - .build(); - MessageChatMemoryAdvisor messageChatMemoryAdvisor = MessageChatMemoryAdvisor.builder(chatMemory).build(); - SimpleLoggerAdvisor simpleLoggerAdvisor = new SimpleLoggerAdvisor(); - - return builder.defaultAdvisors(qaAdvisor, messageChatMemoryAdvisor, simpleLoggerAdvisor).build(); - - - } - - private PromptTemplate getPromptTemplate() { - return PromptTemplate.builder() - .renderer(StTemplateRenderer.builder().startDelimiterToken('<').endDelimiterToken('>').build()) - .template(""" - 당신은 초록 고객센터의 챗봇입니다. - 다음 주어진 내용을 참고해 [사용자의 질문]에 답변해주세요. - - 답변 규칙 - - 만약 주어진 내용으로 답변할 수 없다면 모르겠다고 안내하세요. - - 내용이 충돌하는 경우 다음 우선순위를 따라 답변 합니다. - - 질문 도메인과 가장 근접한 내용 - - 더 구체적인 상황을 다루는 내용 - - 더 최신 버전의 내용 - - --- - - [관련 내용] - - - --- - - [사용자 질문] - - """) - .build(); - } -} diff --git a/src/main/java/com/cholog/bootcamp/config/MutiQueryExpanderConfig.java b/src/main/java/com/cholog/bootcamp/config/MutiQueryExpanderConfig.java deleted file mode 100644 index 40cb69f..0000000 --- a/src/main/java/com/cholog/bootcamp/config/MutiQueryExpanderConfig.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.cholog.bootcamp.config; - -import org.springframework.ai.chat.client.ChatClient; -import org.springframework.ai.rag.preretrieval.query.expansion.MultiQueryExpander; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class MutiQueryExpanderConfig { - - @Bean - MultiQueryExpander multiQueryExpander(ChatClient.Builder chatClientBuilder) { - return MultiQueryExpander.builder() - .chatClientBuilder(chatClientBuilder) - .numberOfQueries(3) - .includeOriginal(Boolean.TRUE) - .build(); - } -} diff --git a/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java b/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java index 7920a02..b2a361b 100644 --- a/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java +++ b/src/main/java/com/cholog/bootcamp/controller/ChatbotController.java @@ -1,10 +1,6 @@ package com.cholog.bootcamp.controller; -import org.springframework.http.HttpHeaders; -import org.springframework.http.ResponseCookie; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.CookieValue; -import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -23,66 +19,13 @@ @RestController public class ChatbotController { - private static final String CONVERSATION_ID_COOKIE = "conversationId"; private final ChatbotService chatbotService; - @PostMapping("/conversation") - public ResponseEntity startConversation( - @CookieValue(value = CONVERSATION_ID_COOKIE, required = false) String conversationId - ) { - if (conversationId != null) { - chatbotService.clearConversation(conversationId); - } - ResponseCookie responseCookie = createConversationCookie(chatbotService.createConversationId()); - return ResponseEntity.noContent() - .header(HttpHeaders.SET_COOKIE, responseCookie.toString()) - .build(); - } - - @DeleteMapping("/conversation") - public ResponseEntity endConversation( - @CookieValue(value = CONVERSATION_ID_COOKIE, required = false) String conversationId - ) { - if (conversationId != null) { - chatbotService.clearConversation(conversationId); - } - ResponseCookie deleteCookie = expireConversationCookie(); - return ResponseEntity.noContent() - .header(HttpHeaders.SET_COOKIE, deleteCookie.toString()) - .build(); - } - @PostMapping public ResponseEntity chat( - @CookieValue(value = CONVERSATION_ID_COOKIE, required = false) String conversationId, @RequestBody ChatbotRequest request ) { - if (conversationId == null) { - conversationId = chatbotService.createConversationId(); - } - ChatbotResponse response = chatbotService.chat(conversationId, request); - ResponseCookie responseCookie = createConversationCookie(conversationId); - return ResponseEntity.ok() - .header(HttpHeaders.SET_COOKIE, responseCookie.toString()) - .body(response); - } - - private ResponseCookie createConversationCookie(String conversationId) { - return ResponseCookie.from(CONVERSATION_ID_COOKIE, conversationId) - .httpOnly(true) - .secure(false) - .path("/") - .sameSite("Lax") - .build(); - } - - private ResponseCookie expireConversationCookie() { - return ResponseCookie.from(CONVERSATION_ID_COOKIE, "") - .httpOnly(true) - .secure(false) - .path("/") - .sameSite("Lax") - .maxAge(0) - .build(); + ChatbotResponse response = chatbotService.chat(request); + return ResponseEntity.ok().body(response); } } diff --git a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java index cf6c19c..79becc5 100644 --- a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java +++ b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java @@ -1,22 +1,13 @@ package com.cholog.bootcamp.service; import java.io.IOException; -import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.function.Function; import java.util.stream.Collectors; import org.springframework.ai.chat.client.ChatClient; -import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor; -import org.springframework.ai.chat.memory.ChatMemory; import org.springframework.ai.chat.metadata.Usage; import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.document.Document; -import org.springframework.ai.rag.Query; -import org.springframework.ai.rag.postretrieval.document.DocumentPostProcessor; -import org.springframework.ai.rag.preretrieval.query.expansion.MultiQueryExpander; import org.springframework.ai.reader.TextReader; import org.springframework.ai.vectorstore.SearchRequest; import org.springframework.ai.vectorstore.VectorStore; @@ -34,32 +25,21 @@ public class ChatbotService { private final ChatClient chatClient; - private final ChatMemory chatMemory; private final VectorStore vectorStore; - private final ChatClient.Builder chatClientBuilder; - private final DocumentPostProcessor documentPostProcessor; private final ResourcePatternResolver resolver; public ChatbotService( VectorStore vectorStore, MarkdownReader markdownReader, - ChatMemory chatMemory, - ChatClient.Builder chatClientBuilder, - DocumentPostProcessor documentPostProcessor + ChatClient.Builder chatClientBuilder ) { - MessageChatMemoryAdvisor messageChatMemoryAdvisor = MessageChatMemoryAdvisor.builder(chatMemory).build(); - this.chatClient = chatClientBuilder - // .defaultAdvisors(messageChatMemoryAdvisor) - .build(); - this.chatMemory = chatMemory; - this.chatClientBuilder = chatClientBuilder; - this.documentPostProcessor = documentPostProcessor; + this.chatClient = chatClientBuilder.build(); this.vectorStore = vectorStore; vectorStore.add(markdownReader.loadAll()); this.resolver = new PathMatchingResourcePatternResolver(); } - public ChatbotResponse chat(String conversationId, ChatbotRequest request) { + public ChatbotResponse chat(ChatbotRequest request) { SearchRequest searchRequest = getSearchRequest(request.question(), 4); List documents = vectorStore.similaritySearch(searchRequest); documents = documents.stream() @@ -98,7 +78,6 @@ public ChatbotResponse chat(String conversationId, ChatbotRequest request) { [컨텍스트] %s """.formatted(request.question(), context)) - // .advisors(a -> a.param(ChatMemory.CONVERSATION_ID, conversationId)) .call() .chatResponse(); @@ -120,37 +99,4 @@ private SearchRequest getSearchRequest(String query, int k) { .topK(k) .build(); } - - public String createConversationId() { - return UUID.randomUUID().toString(); - } - - public void clearConversation(String conversationId) { - if (conversationId == null) { - throw new NullPointerException("conversationId는 null일 수 없습니다."); - } - chatMemory.clear(conversationId); - } - - private List getDocumentsWithQueryExpansion(String question) { - MultiQueryExpander queryExpander = MultiQueryExpander.builder() - .chatClientBuilder(chatClientBuilder) - .numberOfQueries(4) - .build(); - List queries = queryExpander.expand(new Query(question)); - log.info("query expansion(4): "); - for (Query query : queries) { - log.info("query: {}", query.text()); - } - List rawDocuments = queries.stream() - .flatMap(query -> vectorStore.similaritySearch(getSearchRequest(query.text(), 4)).stream()) - .toList(); - Map bestScoreByText = rawDocuments.stream() - .collect(Collectors.toMap( - Document::getText, - Function.identity(), - (d1, d2) -> d1.getScore() >= d2.getScore() ? d1 : d2 // 충돌 시 높은 score 선택 - )); - return new ArrayList<>(bestScoreByText.values()); - } } diff --git a/src/main/java/com/cholog/bootcamp/service/RerankDocumentPostProcessor.java b/src/main/java/com/cholog/bootcamp/service/RerankDocumentPostProcessor.java deleted file mode 100644 index f0490f5..0000000 --- a/src/main/java/com/cholog/bootcamp/service/RerankDocumentPostProcessor.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.cholog.bootcamp.service; - -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.stream.Collectors; - -import org.springframework.ai.chat.client.ChatClient; -import org.springframework.ai.document.Document; -import org.springframework.ai.rag.Query; -import org.springframework.ai.rag.postretrieval.document.DocumentPostProcessor; -import org.springframework.stereotype.Component; - -@Component -public class RerankDocumentPostProcessor implements DocumentPostProcessor { - - private final ChatClient rerankClient; - - public RerankDocumentPostProcessor(ChatClient.Builder builder) { - this.rerankClient = builder.build(); - } - - @Override - public List process(Query query, List documents) { - System.out.println("========"); - for (Document document : documents) { - System.out.println(document.getMetadata().get("filename") + " " + document.getText()); - } - System.out.println("========"); - String documentsText = documents.stream() - .map(document -> """ - [[%s]] - source: %s - title: %s - text: - %s - """ - .formatted( - document.getId(), - document.getMetadata().get("filename"), - document.getMetadata().get("title"), - document.getText() - )) - .collect(Collectors.joining("\n\n")); - - String result = rerankClient.prompt(""" - # 개요 - 당신은 문서들을 재정렬하는 rerank 전문가입니다. - 주어진 질문을 확인하고, 각 문서의 내용이 질문에 답하기 위해 얼마나 필요한 핵심 정보인지를 판단하세요. - 그리고 우선순위를 기준으로 내림차순 정렬하세요.(우선순위가 높은게 앞에 오게) - - # **주의사항** - - 문서 간 내용이 상반되거나 충돌할 경우, 더 구체적이고 특수한 조건(예외, 제한사항 등)을 다루는 문서를 일반적인 내용보다 반드시 우선시하세요. - 일반 규칙보다 예외 규칙이 항상 높은 우선순위를 가집니다. - - 문서 id를 임의로 누락하지 마세요. 당신은 재정렬만 수행합니다. - - # 질문 - %s - - # 문서들 [[문서 id]] - %s - - # 출력 형식 - 문서 id를 내림차순으로 `, `로 구분하여 출력하세요. - 문서 id와 구분자 외에 다른 문자는 절대 출력하지 않습니다. - - 예시) id4, id2, id3, id1 - """.formatted(query.text(), documentsText)).call() - .chatResponse() - .getResult() - .getOutput() - .getText(); - - System.out.println("========"); - System.out.println(result); - System.out.println("========"); - - Map documentMap = documents.stream() - .collect(Collectors.toMap(Document::getId, Function.identity())); - - return Arrays.stream(result.split(", ")) - .map(documentMap::get) - .toList(); - } -} From c5bb94177f0b9d21e1dd94f11fd76fa0f06ee374 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Wed, 20 May 2026 09:06:43 +0900 Subject: [PATCH 38/50] =?UTF-8?q?refactor:=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bootcamp/service/ChatbotService.java | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java index 79becc5..c803442 100644 --- a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java +++ b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java @@ -40,24 +40,13 @@ public ChatbotService( } public ChatbotResponse chat(ChatbotRequest request) { + // 검색 SearchRequest searchRequest = getSearchRequest(request.question(), 4); List documents = vectorStore.similaritySearch(searchRequest); - documents = 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(); + // 증강 & 생성 + documents = getFullDocuments(documents); String context = getContext(documents); - System.out.println(context); ChatResponse chatResponse = chatClient.prompt() .system(""" 당신은 초록 고객센터의 챗봇입니다. @@ -86,11 +75,26 @@ public ChatbotResponse chat(ChatbotRequest request) { 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) { - String context = documents.stream() + return documents.stream() .map(Document::getText) .collect(Collectors.joining("\n\n")); - return context; } private SearchRequest getSearchRequest(String query, int k) { From 165f724eb99156f837748716a8738c8d0d7a1abf Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Wed, 20 May 2026 20:29:57 +0900 Subject: [PATCH 39/50] =?UTF-8?q?docs:=20=EB=B2=BD=20=EB=A6=AC=ED=8F=AC?= =?UTF-8?q?=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mission/wall-report.md | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) 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. 개선하고 싶은 것 > 시간이 더 있었다면 시도해보고 싶은 개선점을 적어주세요. -- +- 답변의 말투를 개선하고 싶습니다. 현재는 같은 내용을 반복하거나, 사용자가 응?할만한 말투를 구사합니다. + 또한 내부 컨텍스트 문서의 존재를 답변에 포함하기도 합니다. +- 대화 맥락을 보존해 더욱 고객 응대에 능한 챗봇을 만들고 싶습니다. +- 인메모리 외 인프라를 구축해 정말 실무의 챗봇과 유사하게 만들어보고 싶습니다. +- 평가 방식을 개선해 모델의 성능을 제대로 측정하고 반복 개선해나가보고 싶습니다. 현재 평가는 이걸 왜 틀렸다고 하는거지?싶은 부분이 많습니다. + 챗봇의 목적마다 평가 방식이 다르니 제가 만들고자 하는 챗봇을 명확히 정의하고 그에 맞는 평가 방식을 새로 만들어보고 싶습니다. +- 챗 로그, 이력을 관리하고 활용해보고 싶습니다. 주어진 데이터셋의 챗 로그는 컨텍스트에 넣지 않고 가장 많이 묻는 질문과 같은 운영 통계 목적으로 활용했습니다. + 다른 방향으로 활용할 수 있다면 참고해 챗 로그까지 활용해 데이터 축적에 따른 성능 향상을 이루고 싶습니다. +- 구버전 문서도 마찬가지로 필요 없다고 느껴 제거했는데 필요하다면 포함해 응답 수준을 높여보고 싶습니다. From d7f6d68b2f98ab99c533685b844c94823b6b0d89 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Thu, 28 May 2026 09:59:36 +0900 Subject: [PATCH 40/50] =?UTF-8?q?refactor:=20vector=20store=20=EC=9E=84?= =?UTF-8?q?=EB=B2=A0=EB=94=A9=20runner=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CommandLineRunner와 ApplicationRunner 중 인자 파싱이 용이한 ApplicationRunner 선택 - 별도 클래스 생성 없이 VectorStoreConfig에서 임베딩 일괄 관리 --- .../bootcamp/config/VectorStoreConfig.java | 39 +++++++++++++++++++ .../bootcamp/service/ChatbotService.java | 2 - 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cholog/bootcamp/config/VectorStoreConfig.java b/src/main/java/com/cholog/bootcamp/config/VectorStoreConfig.java index e7ca9e7..c379050 100644 --- a/src/main/java/com/cholog/bootcamp/config/VectorStoreConfig.java +++ b/src/main/java/com/cholog/bootcamp/config/VectorStoreConfig.java @@ -1,16 +1,55 @@ package com.cholog.bootcamp.config; +import java.util.List; + import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.vectorstore.SimpleVectorStore; import org.springframework.ai.vectorstore.VectorStore; +import org.springframework.boot.ApplicationRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import com.cholog.bootcamp.service.MarkdownReader; + @Configuration public class VectorStoreConfig { + private static final String MODE_OPTION = "mode"; + private static final String EMBEDDING_MODE = "embedding"; + @Bean public VectorStore 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(VectorStore vectorStore, MarkdownReader markdownReader) { + return args -> { + List options = args.getOptionValues(MODE_OPTION); + if (options == null || options.isEmpty()) { + return; + } + + for (String option : options) { + if (option.equals(EMBEDDING_MODE)) { + doEmbedding(vectorStore, markdownReader); + break; + } + } + }; + } + + private void doEmbedding(VectorStore vectorStore, MarkdownReader markdownReader) { + vectorStore.add(markdownReader.loadAll()); + } } diff --git a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java index c803442..5eca0d4 100644 --- a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java +++ b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java @@ -30,12 +30,10 @@ public class ChatbotService { public ChatbotService( VectorStore vectorStore, - MarkdownReader markdownReader, ChatClient.Builder chatClientBuilder ) { this.chatClient = chatClientBuilder.build(); this.vectorStore = vectorStore; - vectorStore.add(markdownReader.loadAll()); this.resolver = new PathMatchingResourcePatternResolver(); } From 83f9f419fb05c3531e1fb7a92b091f63c0cf91a0 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Thu, 28 May 2026 10:00:15 +0900 Subject: [PATCH 41/50] =?UTF-8?q?docs:=20=EB=AF=B8=EC=85=98=20readme?= =?UTF-8?q?=EC=99=80=20=EC=B1=97=EB=B4=87=20readme=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BASE-README.md | 92 ++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 94 +++++++------------------------------------------- SYLLABUS.md | 2 +- 3 files changed, 105 insertions(+), 83 deletions(-) create mode 100644 BASE-README.md 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/README.md b/README.md index 17b9d19..64cd05b 100644 --- a/README.md +++ b/README.md @@ -1,92 +1,22 @@ -# 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도 가능) | +애플리케이션 실행 시 VectorStore 임베딩을 수행하려면 인자로 --mode=embedding 옵션을 주어야합니다. -- 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)를 여세요. 거기서부터 시작입니다. - ---- - -## 평가 +# bootrun 실행 시 +./gradlew bootrun +./gradlew bootrun --args='--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 +# jar 실행 시 +java -jar +java -jar --mode=embedding ``` - ---- - -## 프로젝트 구조 - -``` -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/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#필요한-것)를 참고하세요. --- From 0f3cc39aea21cef1d0042675c1e02796a1072d53 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Thu, 28 May 2026 10:02:41 +0900 Subject: [PATCH 42/50] =?UTF-8?q?style:=20=EC=B4=88=EB=A1=9D=20=ED=9A=8C?= =?UTF-8?q?=EC=82=AC=EB=AA=85=20=EC=9E=88=EC=96=B4=EB=B3=B4=EC=9D=B4?= =?UTF-8?q?=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 64cd05b..7cfd32c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 프로젝트 개요 -주식회사 초록의 고객 응대 챗봇입니다. +초록코퍼레이션 고객 응대 챗봇입니다. # 애플리케이션 실행 From d20992d0673cf8bc73e9f247c381e8eb2ed955c3 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Thu, 28 May 2026 10:18:45 +0900 Subject: [PATCH 43/50] =?UTF-8?q?docs:=20readme=20=EC=8B=A4=ED=96=89=20?= =?UTF-8?q?=EC=84=B9=EC=85=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7cfd32c..368e19b 100644 --- a/README.md +++ b/README.md @@ -6,11 +6,10 @@ ## 실행 옵션 - -애플리케이션 실행 시 VectorStore 임베딩을 수행하려면 인자로 --mode=embedding 옵션을 주어야합니다. - +애플리케이션 실행 시 VectorStore 임베딩을 수행하려면 인자로 --mode=embedding 옵션을 주어야합니다. 임베딩 수행하지 않을 경우 옵션을 제외합니다. +## 실행 명령어 ```bash # bootrun 실행 시 ./gradlew bootrun From da03e4561a20cdeb43dfd097b331daa983fcf583 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Fri, 29 May 2026 22:38:10 +0900 Subject: [PATCH 44/50] =?UTF-8?q?refactor:=20=EC=9E=84=EB=B2=A0=EB=94=A9?= =?UTF-8?q?=20=EB=B2=A1=ED=84=B0=20=EC=98=81=EC=86=8D=ED=99=94=20=EB=B0=8F?= =?UTF-8?q?=20=EC=9E=84=EB=B2=A0=EB=94=A9=20=EB=A1=9C=EC=A7=81=20runner?= =?UTF-8?q?=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{service => config}/MarkdownReader.java | 2 +- ...nfig.java => SimpleVectorStoreConfig.java} | 40 ++++++++++++++----- 2 files changed, 30 insertions(+), 12 deletions(-) rename src/main/java/com/cholog/bootcamp/{service => config}/MarkdownReader.java (97%) rename src/main/java/com/cholog/bootcamp/config/{VectorStoreConfig.java => SimpleVectorStoreConfig.java} (50%) diff --git a/src/main/java/com/cholog/bootcamp/service/MarkdownReader.java b/src/main/java/com/cholog/bootcamp/config/MarkdownReader.java similarity index 97% rename from src/main/java/com/cholog/bootcamp/service/MarkdownReader.java rename to src/main/java/com/cholog/bootcamp/config/MarkdownReader.java index a4719ab..33c7619 100644 --- a/src/main/java/com/cholog/bootcamp/service/MarkdownReader.java +++ b/src/main/java/com/cholog/bootcamp/config/MarkdownReader.java @@ -1,4 +1,4 @@ -package com.cholog.bootcamp.service; +package com.cholog.bootcamp.config; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/cholog/bootcamp/config/VectorStoreConfig.java b/src/main/java/com/cholog/bootcamp/config/SimpleVectorStoreConfig.java similarity index 50% rename from src/main/java/com/cholog/bootcamp/config/VectorStoreConfig.java rename to src/main/java/com/cholog/bootcamp/config/SimpleVectorStoreConfig.java index c379050..ba597d1 100644 --- a/src/main/java/com/cholog/bootcamp/config/VectorStoreConfig.java +++ b/src/main/java/com/cholog/bootcamp/config/SimpleVectorStoreConfig.java @@ -1,30 +1,31 @@ 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.ai.vectorstore.VectorStore; import org.springframework.boot.ApplicationRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.cholog.bootcamp.service.MarkdownReader; - @Configuration -public class VectorStoreConfig { +public class SimpleVectorStoreConfig { private static final String MODE_OPTION = "mode"; private static final String EMBEDDING_MODE = "embedding"; @Bean - public VectorStore vectorStore(EmbeddingModel embeddingModel) { + public SimpleVectorStore vectorStore(EmbeddingModel embeddingModel) { return SimpleVectorStore.builder(embeddingModel).build(); } /** * VectorStore 임베딩 runner - * 애플리케이션 실행 시 --mode=embedding 옵션이 존재하면 임베딩을 수행한다. + * 애플리케이션 실행 시 --mode=embedding 옵션이 존재하면 임베딩을 새로 수행한다. * * bootrun 실행 시 * `./gradlew bootrun --args='--mode=embedding' @@ -33,23 +34,40 @@ public VectorStore vectorStore(EmbeddingModel embeddingModel) { * `java -jar --mode=embedding` */ @Bean - public ApplicationRunner applicationRunner(VectorStore vectorStore, MarkdownReader markdownReader) { + 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); - break; + doEmbedding(vectorStore, markdownReader, vectorFile); + return; } } + + vectorStore.load(vectorFile); }; } - private void doEmbedding(VectorStore vectorStore, MarkdownReader markdownReader) { - vectorStore.add(markdownReader.loadAll()); + 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); + } } } From e01ede4b40d0e901332b086b7f0fe932e4120f3f Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Fri, 29 May 2026 22:38:50 +0900 Subject: [PATCH 45/50] =?UTF-8?q?feat:=20vector=20=ED=8C=8C=EC=9D=BC=20git?= =?UTF-8?q?ignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 23c550a..87af2cb 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,5 @@ __pycache__/ # Matrix metadata **/.omc/ + +data/vector-store.json From 42b267fd57cb5a57f17645f91db82d1768697654 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sat, 30 May 2026 17:02:48 +0900 Subject: [PATCH 46/50] =?UTF-8?q?docs:=20KPI=20=EB=AC=B8=EC=84=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KPI.md | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 KPI.md 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 | 표준 어투로 이해하기 쉽고 일관되며 명확한 답변을 제공한다. | 일부 표현이 모호하거나 일관되지 않아 이해에 약간의 어려움이 있다. | 과도한 전문 용어, 모호한 표현, 불명확한 구조로 인해 이해하거나 활용하기 어렵다. | From 9a93fe15f0440a8998944a7c1f10603bfd27c852 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sat, 30 May 2026 17:03:43 +0900 Subject: [PATCH 47/50] =?UTF-8?q?docs:=20=EC=A7=81=EC=A0=91=20=EA=B2=80?= =?UTF-8?q?=EC=88=98=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EC=85=8B=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - tier, wall_type 골고루 분포 --- data/evaluate2.py | 292 ++++++++++++++++++++++++++++++ data/manual_review_questions.json | 252 ++++++++++++++++++++++++++ 2 files changed, 544 insertions(+) create mode 100644 data/evaluate2.py create mode 100644 data/manual_review_questions.json diff --git a/data/evaluate2.py b/data/evaluate2.py new file mode 100644 index 0000000..233f710 --- /dev/null +++ b/data/evaluate2.py @@ -0,0 +1,292 @@ +""" +챗봇 품질 평가 스크립트 + +실행 중인 서버(localhost:8080)에 테스트 질문을 보내고, +LLM 판정으로 정확도를 측정합니다. + +사전 준비: + python -m venv .venv + .venv/bin/pip install openai python-dotenv requests + +실행: + # 서버가 localhost:8080에서 실행 중이어야 합니다 + .venv/bin/python evaluate2.py + .venv/bin/python evaluate2.py --verbose # 질문별 상세 출력 + .venv/bin/python evaluate2.py --limit 10 # 처음 10개만 평가 + +비용: + judge 모델(gpt-4o-mini) 사용, 100문항 기준 약 $0.3~0.5 +""" + +import json +import os +import argparse +import time +from pathlib import Path + +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 + + +# ─── LLM 판정 ───────────────────────────────────────────────────────────────── + +def judge_answer(question: str, expected: str, actual: str) -> dict: + """LLM으로 답변의 사실적 일치도를 판정합니다.""" + prompt = f"""당신은 FAQ 챗봇 답변의 품질을 평가하는 판정자입니다. + +질문: {question} + +기대 답변 (정답): {expected} + +실제 답변 (챗봇): {actual} + +실제 답변이 기대 답변과 사실적으로 일치하는지 평가하세요. +- 표현이 달라도 핵심 사실이 같으면 정답입니다 +- 핵심 사실이 빠져있거나 틀렸으면 오답입니다 +- 부분적으로만 맞으면 오답으로 처리하세요 + +JSON으로만 응답하세요: +{{"score": 1, "reason": "..."}} (정답) +{{"score": 0, "reason": "..."}} (오답) +""" + + resp = openai_client.chat.completions.create( + model=JUDGE_MODEL, + messages=[{"role": "user", "content": prompt}], + temperature=0, + response_format={"type": "json_object"}, + ) + + try: + return json.loads(resp.choices[0].message.content) + except json.JSONDecodeError: + return {"score": 0, "reason": "판정 파싱 실패"} + + +# ─── 메인 ───────────────────────────────────────────────────────────────────── + +# questions_filename = "test_questions.json" +questions_filename = "manual_review_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 + + elapsed_times = {} + actual_answers = {} + 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"] # 질문 + + # 서버에 질문 + request_start_time = time.time() + 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 + + elapsed = time.time() - request_start_time # 답변 소요 시간 + elapsed_times[qid] = elapsed + + actual_answer = response.get("answer", "") # 실제 답변 + actual_answers[qid] = actual_answer + + # 결과 저장 + total_elapsed = time.time() - run_start_time + total = len(questions) + answered = total - len(error_ids) + answered_elapsed_times = [ + elapsed_time + for elapsed_time in elapsed_times.values() + if elapsed_time is not None + ] + + by_tier = {} + by_wall_type = {} + review_items = [] + + for i, q in enumerate(questions): + qid = q.get("id", f"Q{i+1}") + tier = q.get("tier", "unknown") + wall_type = q.get("wall_type") or "null" + elapsed_time = elapsed_times.get(qid) + + by_tier[tier] = by_tier.get(tier, 0) + 1 + by_wall_type[wall_type] = by_wall_type.get(wall_type, 0) + 1 + + if elapsed_time is None: + response_speed_score = None + elif elapsed_time <= 5: + response_speed_score = 3 + elif elapsed_time <= 10: + response_speed_score = 2 + else: + response_speed_score = 1 + + review_items.append({ + "id": qid, + "tier": tier, + "wall_type": q.get("wall_type"), + "question_ko": q.get("question_ko", ""), + "question_en": q.get("question_en", ""), + "expected_answer": q.get("expected_answer", ""), + "actual_answer": actual_answers.get(qid, ""), + "elapsed_seconds": elapsed_time, + "request_error": qid in error_ids, + "auto_evaluation": { + "response_speed": { + "score": response_speed_score, + "criteria": "상=5초 이내, 중=5초 초과 10초 이내, 하=10초 초과", + }, + }, + "manual_evaluation": { + "fact_accuracy": {"score": None, "comment": ""}, + "security": {"score": None, "comment": ""}, + "context_fit": {"score": None, "comment": ""}, + "clarity": {"score": None, "comment": ""}, + }, + "manual_summary": { + "overall_score": None, + "comment": "", + }, + }) + + result_file = DATA_DIR / "manual_review_result.json" + with open(result_file, "w") as f: + json.dump({ + "source_questions": questions_filename, + "total": total, + "answered": answered, + "error": len(error_ids), + "error_ids": error_ids, + "elapsed_seconds": total_elapsed, + "average_response_seconds": ( + sum(answered_elapsed_times) / max(len(answered_elapsed_times), 1) + ), + "excluded_kpi": ["cost"], + "scoring_scale": { + "3": "상", + "2": "중", + "1": "하", + }, + "kpi_criteria": [ + { + "key": "fact_accuracy", + "name": "사실 정확성", + "priority": 1, + "high_3": "문서에 근거하여 사실을 정확하게 답변한다.", + "middle_2": "문서에 근거가 있으나 내용이 왜곡되거나 부정확하다.", + "low_1": "문서에 근거하지 않은 사실을 답변하거나 잘못된 정보를 제공한다.", + }, + { + "key": "security", + "name": "보안성", + "priority": 2, + "high_3": "민감/기밀 정보를 드러내지 않고 허용된 정보 범위 내에서 답변한다.", + "middle_2": "민감도는 낮지만 내부 문서명, 내부 정책 표현, 상담 로그 일부 등 불필요한 내부 정보를 드러낸다.", + "low_1": "개인정보, 기밀 문서, 보안과 직결된 내부 정보 등 노출되면 안 되는 정보를 드러낸다.", + }, + { + "key": "context_fit", + "name": "맥락 적합성", + "priority": 3, + "high_3": "사용자의 질문 의도와 대화 맥락에 맞는 정보를 답변한다.", + "middle_2": "질문과 일부 관련은 있으나 사용자의 의도나 맥락을 충분히 반영하지 못한다.", + "low_1": "사용자의 질문 해결에 필요한 정보가 아닌 다른 정보를 답변한다.", + }, + { + "key": "response_speed", + "name": "응답 속도", + "priority": 5, + "high_3": "5초 이내에 답변한다.", + "middle_2": "5초 초과, 10초 이내에 답변한다.", + "low_1": "10초를 초과하여 답변한다.", + }, + { + "key": "clarity", + "name": "답변 명확성", + "priority": 6, + "high_3": "표준 어투로 이해하기 쉽고 일관되며 명확한 답변을 제공한다.", + "middle_2": "일부 표현이 모호하거나 일관되지 않아 이해에 약간의 어려움이 있다.", + "low_1": "과도한 전문 용어, 모호한 표현, 불명확한 구조로 인해 이해하거나 활용하기 어렵다.", + }, + ], + "counts": { + "by_tier": by_tier, + "by_wall_type": by_wall_type, + }, + "items": review_items, + }, f, indent=2, ensure_ascii=False) + print(f"\n결과 저장: {result_file}") + + +if __name__ == "__main__": + main() diff --git a/data/manual_review_questions.json b/data/manual_review_questions.json new file mode 100644 index 0000000..eeacb99 --- /dev/null +++ b/data/manual_review_questions.json @@ -0,0 +1,252 @@ +[ + { + "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.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "cancel_order", + "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.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "delivery_options", + "wall_type": null + }, + { + "id": "Q016", + "question_ko": "마켓플레이스 상품도 14일 안에 반품할 수 있나요?", + "question_en": "Can I return a Marketplace item within 14 days?", + "expected_answer": "Marketplace items follow the individual seller's return policy, not Cholog's standard 14-day window. Return windows vary from 3 to 30 days depending on the seller. Always check the seller's policy on the product page before purchasing.", + "tier": "medium", + "source_layers": [ + "faq", + "policy" + ], + "primary_intent": "check_refund_policy", + "wall_type": "contradiction" + }, + { + "id": "Q017", + "question_ko": "VIP인데 냉장 상품 배송비도 무료인가요?", + "question_en": "As a VIP member, is cold-chain shipping also free?", + "expected_answer": "No. VIP members receive free Priority shipping on standard orders, but cold-chain delivery carries a flat 4,000 won fee for all members regardless of tier. The cold-chain fee applies because it uses a separate courier (CJ Logistics Fresh) with specialized packaging.", + "tier": "medium", + "source_layers": [ + "faq", + "policy" + ], + "primary_intent": "delivery_options", + "wall_type": "conditional" + }, + { + "id": "Q018", + "question_ko": "포인트 적립률이 몇 퍼센트인가요?", + "question_en": "What is the loyalty point earning rate?", + "expected_answer": "The current earning rates are: Standard tier 1%, Plus tier 3%, VIP tier 5%. These rates were updated in June 2023; the previous rates were higher (3%/5%/7%) but are no longer in effect.", + "tier": "medium", + "source_layers": [ + "faq", + "policy" + ], + "primary_intent": "loyalty_points", + "wall_type": "versioning" + }, + { + "id": "Q022", + "question_ko": "반품 금액이 크면 등급이 떨어질 수 있나요?", + "question_en": "Can returning items cause a tier downgrade?", + "expected_answer": "Yes. Returned order amounts are deducted from your annual spending total. If the deduction drops your total below the tier threshold (Plus: 200,000 won, VIP: 800,000 won), your tier is downgraded at the next monthly recalculation on the 1st of the following month.", + "tier": "medium", + "source_layers": [ + "faq", + "policy" + ], + "primary_intent": "membership_tiers", + "wall_type": "conditional" + }, + { + "id": "Q024", + "question_ko": "플러스 등급 기준이 연 15만원인가요, 20만원인가요?", + "question_en": "Is the Plus tier threshold 150,000 won or 200,000 won per year?", + "expected_answer": "The current Plus tier threshold is 200,000 won per year (as of January 2024). The threshold was previously 150,000 won in 2023. The current VIP threshold is 800,000 won (previously 600,000 won).", + "tier": "medium", + "source_layers": [ + "policy" + ], + "primary_intent": "membership_tiers", + "wall_type": "versioning" + }, + { + "id": "Q032", + "question_ko": "구독 중이면 스탠다드인데도 2만원 미만 주문에 배송비 무료인가요?", + "question_en": "If I have a subscription but I'm Standard tier, is shipping still free on orders under 20,000 won?", + "expected_answer": "Yes. Active subscribers get free shipping on all orders regardless of order amount or membership tier. The 20,000 won free shipping threshold applies only to non-subscriber Standard members.", + "tier": "medium", + "source_layers": [ + "faq", + "policy" + ], + "primary_intent": "subscription", + "wall_type": "conditional" + }, + { + "id": "Q034", + "question_ko": "걍 환불해주세요 ㅠㅠ", + "question_en": "I just want a refund please", + "expected_answer": "To process a refund, please go to My Orders, select the relevant order, and tap Request Return. Choose your reason, upload at least one photo, and select a pickup date. For change of mind, a 3,000 won handling fee is deducted. Kakao Pay refunds are typically instant after inspection.", + "tier": "hard", + "source_layers": [ + "faq" + ], + "primary_intent": "get_refund", + "wall_type": "cross_language" + }, + { + "id": "Q036", + "question_ko": "배송 지연됐는데 보상받은 사례가 있나요?", + "question_en": "Have other customers received compensation for delivery delays?", + "expected_answer": "Yes. Based on customer support records, delivery delays exceeding 3 business days (non-island) typically result in a 2,000 won coupon compensation. For significant delays or damaged items, replacements and larger coupons have been issued.", + "tier": "hard", + "source_layers": [ + "chatlog", + "policy" + ], + "primary_intent": "delivery_period", + "wall_type": "precedent" + }, + { + "id": "Q037", + "question_ko": "저번에 물어본 배송 건 어떻게 됐어요?", + "question_en": "What happened to the shipping issue I asked about last time?", + "expected_answer": "I don't have access to your previous conversation history. Please provide your order number and I can look up the current status of your shipment directly.", + "tier": "hard", + "source_layers": [ + "chatlog" + ], + "primary_intent": "track_order", + "wall_type": "memory" + }, + { + "id": "Q038", + "question_ko": "냉장 상품 오늘 금요일에 주문하면 언제 와요?", + "question_en": "If I order a cold-chain product today (Friday), when will it arrive?", + "expected_answer": "Cold-chain delivery is only available Monday through Thursday. An order placed on Friday will be dispatched the following Monday. Add 1-2 business days for delivery, so the earliest expected arrival would be Tuesday or Wednesday of next week.", + "tier": "hard", + "source_layers": [ + "faq", + "policy" + ], + "primary_intent": "delivery_period", + "wall_type": "conditional" + }, + { + "id": "Q045", + "question_ko": "VIP 30일 반품 가능하다고 들었는데요", + "question_en": "I heard VIP members can return items within 30 days — is that true?", + "expected_answer": "The standard return window for all members including VIP is 14 calendar days. However, in certain exceptional cases (documented absence during return window, defect discovered after extended use), VIP members may be granted an extended return window at CS agent discretion. This is not a publicized policy and is applied case-by-case.", + "tier": "hard", + "source_layers": [ + "faq", + "policy" + ], + "primary_intent": "check_refund_policy", + "wall_type": "contradiction" + }, + { + "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.", + "tier": "medium", + "source_layers": [ + "faq" + ], + "primary_intent": "get_refund", + "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.", + "tier": "easy", + "source_layers": [ + "faq" + ], + "primary_intent": "check_payment_methods", + "wall_type": null + }, + { + "id": "Q085", + "question_ko": "준비중 상태에서 취소는 즉시 처리되나요?", + "question_en": "Is cancellation immediate when the order is in Preparing status?", + "expected_answer": "Yes. Canceling an order while it is in Preparing status is processed instantly with no fee. Some agents have mistakenly advised that cancellation takes 1-2 business days — this is incorrect. You can cancel directly in the app and the status updates immediately.", + "tier": "medium", + "source_layers": [ + "chatlog", + "policy" + ], + "primary_intent": "cancel_order", + "wall_type": "noise" + }, + { + "id": "Q088", + "question_ko": "VIP 포인트가 7%라고 어디선가 봤는데 맞나요?", + "question_en": "I saw somewhere that VIP members earn 7% loyalty points — is that accurate?", + "expected_answer": "No. The current VIP earning rate is 5%. The previous rate was 7% under the old policy (Standard 3%, Plus 5%, VIP 7%), but this was updated in early 2024. Current rates are Standard 1%, Plus 3%, VIP 5%. Some older documents or chat logs may still reference the outdated 7% figure.", + "tier": "hard", + "source_layers": [ + "policy", + "chatlog" + ], + "primary_intent": "loyalty_points", + "wall_type": "noise" + }, + { + "id": "Q097", + "question_ko": "반품 기간이 10일이라고 들었는데 맞나요?", + "question_en": "I heard the return window is 10 days — is that right?", + "expected_answer": "No. The current return window is 14 calendar days (policy v3, effective April 2024). A 10-day window existed under policy v2 and a 7-day window under policy v1, but neither is in effect. If you encountered this information in an older document or a chat transcript, it is outdated.", + "tier": "hard", + "source_layers": [ + "policy" + ], + "primary_intent": "check_refund_policy", + "wall_type": "versioning" + }, + { + "id": "Q116", + "question_ko": "환불어케함? 반품하고싶은데", + "question_en": "How do I return something?", + "expected_answer": "Go to My Orders in the app or website, tap the order, select Request Return, choose a reason, and upload a photo. Courier pickup is free for defect returns; a 3,000 won fee applies for non-defect returns.", + "tier": "medium", + "source_layers": [ + "faq" + ], + "primary_intent": "get_refund", + "wall_type": "cross_language" + }, + { + "id": "Q150", + "question_ko": "불량품받았는데ㅠ 어케함 환불됨?", + "question_en": "I received a defective product what should I do?", + "expected_answer": "Request a return through My Orders and select Defective/Wrong Item as the reason. Upload photos of the defect. Courier pickup is free for defect returns and a full refund will be issued.", + "tier": "medium", + "source_layers": [ + "faq" + ], + "primary_intent": "wrong_item_received", + "wall_type": "cross_language" + } +] From 2d6ffbb2d30c62ce15e884443f4695f9fa01cbfe Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sat, 30 May 2026 17:04:22 +0900 Subject: [PATCH 48/50] =?UTF-8?q?docs:=20=ED=8F=89=EA=B0=80=20=EC=88=98?= =?UTF-8?q?=ED=96=89=20=EB=B0=8F=20=EC=A7=81=EC=A0=91=20=EA=B2=80=EC=88=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/manual_review_result.json | 858 +++++++++++++++++++++++++++++++++ 1 file changed, 858 insertions(+) create mode 100644 data/manual_review_result.json diff --git a/data/manual_review_result.json b/data/manual_review_result.json new file mode 100644 index 0000000..abc551a --- /dev/null +++ b/data/manual_review_result.json @@ -0,0 +1,858 @@ +{ + "source_questions": "manual_review_questions.json", + "total": 20, + "answered": 20, + "error": 0, + "error_ids": [], + "elapsed_seconds": 28.40176486968994, + "average_response_seconds": 1.4200799942016602, + "excluded_kpi": [ + "cost" + ], + "scoring_scale": { + "3": "상", + "2": "중", + "1": "하" + }, + "kpi_criteria": [ + { + "key": "fact_accuracy", + "name": "사실 정확성", + "priority": 1, + "high_3": "문서에 근거하여 사실을 정확하게 답변한다.", + "middle_2": "문서에 근거가 있으나 내용이 왜곡되거나 부정확하다.", + "low_1": "문서에 근거하지 않은 사실을 답변하거나 잘못된 정보를 제공한다." + }, + { + "key": "security", + "name": "보안성", + "priority": 2, + "high_3": "민감/기밀 정보를 드러내지 않고 허용된 정보 범위 내에서 답변한다.", + "middle_2": "민감도는 낮지만 내부 문서명, 내부 정책 표현, 상담 로그 일부 등 불필요한 내부 정보를 드러낸다.", + "low_1": "개인정보, 기밀 문서, 보안과 직결된 내부 정보 등 노출되면 안 되는 정보를 드러낸다." + }, + { + "key": "context_fit", + "name": "맥락 적합성", + "priority": 3, + "high_3": "사용자의 질문 의도와 대화 맥락에 맞는 정보를 답변한다.", + "middle_2": "질문과 일부 관련은 있으나 사용자의 의도나 맥락을 충분히 반영하지 못한다.", + "low_1": "사용자의 질문 해결에 필요한 정보가 아닌 다른 정보를 답변한다." + }, + { + "key": "response_speed", + "name": "응답 속도", + "priority": 5, + "high_3": "5초 이내에 답변한다.", + "middle_2": "5초 초과, 10초 이내에 답변한다.", + "low_1": "10초를 초과하여 답변한다." + }, + { + "key": "clarity", + "name": "답변 명확성", + "priority": 6, + "high_3": "표준 어투로 이해하기 쉽고 일관되며 명확한 답변을 제공한다.", + "middle_2": "일부 표현이 모호하거나 일관되지 않아 이해에 약간의 어려움이 있다.", + "low_1": "과도한 전문 용어, 모호한 표현, 불명확한 구조로 인해 이해하거나 활용하기 어렵다." + } + ], + "counts": { + "by_tier": { + "easy": 3, + "medium": 10, + "hard": 7 + }, + "by_wall_type": { + "null": 4, + "contradiction": 2, + "conditional": 4, + "versioning": 3, + "cross_language": 3, + "precedent": 1, + "memory": 1, + "noise": 2 + } + }, + "items": [ + { + "id": "Q001", + "tier": "easy", + "wall_type": null, + "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.", + "actual_answer": "주문 취소는 \"My Orders\"에서 해당 주문의 상태가 \"Preparing\"일 때 \"Cancel Order\"를 탭하시면 즉시 취소됩니다. 취소가 완료되면 결제하신 금액이 원래 결제수단으로 환불됩니다. 단, 주문 상태가 \"Shipped\"로 변경된 경우에는 취소가 불가능하며, 배송이 완료된 후에는 반품 절차를 진행하셔야 합니다.", + "elapsed_seconds": 2.1312150955200195, + "request_error": false, + "auto_evaluation": { + "response_speed": { + "score": 3, + "criteria": "상=5초 이내, 중=5초 초과 10초 이내, 하=10초 초과" + } + }, + "manual_evaluation": { + "fact_accuracy": { + "score": 3, + "comment": "" + }, + "security": { + "score": 3, + "comment": "" + }, + "context_fit": { + "score": 3, + "comment": "" + }, + "clarity": { + "score": 2, + "comment": "한국어로 물어봤으나 영문 섹션 안내" + } + }, + "manual_summary": { + "overall_score": 14, + "comment": "" + } + }, + { + "id": "Q007", + "tier": "easy", + "wall_type": null, + "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.", + "actual_answer": "냉장 배송은 월요일부터 목요일까지만 가능합니다. 금요일, 토요일, 일요일 및 공휴일에는 냉장 배송이 제공되지 않습니다.", + "elapsed_seconds": 0.8133330345153809, + "request_error": false, + "auto_evaluation": { + "response_speed": { + "score": 3, + "criteria": "상=5초 이내, 중=5초 초과 10초 이내, 하=10초 초과" + } + }, + "manual_evaluation": { + "fact_accuracy": { + "score": 3, + "comment": "" + }, + "security": { + "score": 3, + "comment": "" + }, + "context_fit": { + "score": 3, + "comment": "" + }, + "clarity": { + "score": 3, + "comment": "" + } + }, + "manual_summary": { + "overall_score": 15, + "comment": "" + } + }, + { + "id": "Q016", + "tier": "medium", + "wall_type": "contradiction", + "question_ko": "마켓플레이스 상품도 14일 안에 반품할 수 있나요?", + "question_en": "Can I return a Marketplace item within 14 days?", + "expected_answer": "Marketplace items follow the individual seller's return policy, not Cholog's standard 14-day window. Return windows vary from 3 to 30 days depending on the seller. Always check the seller's policy on the product page before purchasing.", + "actual_answer": "네, 마켓플레이스 상품도 14일 이내에 반품하실 수 있습니다. 다만, 마켓플레이스 상품은 판매자의 개별 반품 정책에 따르기 때문에, 판매자 페이지에서 구체적인 반품 기간과 조건을 확인하셔야 합니다.", + "elapsed_seconds": 0.8151259422302246, + "request_error": false, + "auto_evaluation": { + "response_speed": { + "score": 3, + "criteria": "상=5초 이내, 중=5초 초과 10초 이내, 하=10초 초과" + } + }, + "manual_evaluation": { + "fact_accuracy": { + "score": 2, + "comment": "처음에 잘못된 답변함" + }, + "security": { + "score": 3, + "comment": "" + }, + "context_fit": { + "score": 3, + "comment": "" + }, + "clarity": { + "score": 2, + "comment": "" + } + }, + "manual_summary": { + "overall_score": 13, + "comment": "" + } + }, + { + "id": "Q017", + "tier": "medium", + "wall_type": "conditional", + "question_ko": "VIP인데 냉장 상품 배송비도 무료인가요?", + "question_en": "As a VIP member, is cold-chain shipping also free?", + "expected_answer": "No. VIP members receive free Priority shipping on standard orders, but cold-chain delivery carries a flat 4,000 won fee for all members regardless of tier. The cold-chain fee applies because it uses a separate courier (CJ Logistics Fresh) with specialized packaging.", + "actual_answer": "VIP 고객님께서는 냉장 상품 배송비도 무료가 아닙니다. 냉장 상품 배송에는 4,000원의 냉장 배송비가 부과되며, 이는 회원 등급과 관계없이 적용됩니다.", + "elapsed_seconds": 0.934063196182251, + "request_error": false, + "auto_evaluation": { + "response_speed": { + "score": 3, + "criteria": "상=5초 이내, 중=5초 초과 10초 이내, 하=10초 초과" + } + }, + "manual_evaluation": { + "fact_accuracy": { + "score": 3, + "comment": "" + }, + "security": { + "score": 3, + "comment": "" + }, + "context_fit": { + "score": 3, + "comment": "" + }, + "clarity": { + "score": 2, + "comment": "`VIP 고객님께서는 냉장 상품 배송비도` 라는 표현이 다른 상품 배송비도 무료가 아니라는 표현 같아서 애매하다" + } + }, + "manual_summary": { + "overall_score": 14, + "comment": "" + } + }, + { + "id": "Q018", + "tier": "medium", + "wall_type": "versioning", + "question_ko": "포인트 적립률이 몇 퍼센트인가요?", + "question_en": "What is the loyalty point earning rate?", + "expected_answer": "The current earning rates are: Standard tier 1%, Plus tier 3%, VIP tier 5%. These rates were updated in June 2023; the previous rates were higher (3%/5%/7%) but are no longer in effect.", + "actual_answer": "포인트 적립률은 회원 등급에 따라 다릅니다. \n- Standard 등급: 1% \n- Plus 등급: 3% \n- VIP 등급: 5% \n\n즉, 주문 금액의 1%, 3%, 또는 5%에 해당하는 포인트가 적립됩니다.", + "elapsed_seconds": 1.0017859935760498, + "request_error": false, + "auto_evaluation": { + "response_speed": { + "score": 3, + "criteria": "상=5초 이내, 중=5초 초과 10초 이내, 하=10초 초과" + } + }, + "manual_evaluation": { + "fact_accuracy": { + "score": 3, + "comment": "" + }, + "security": { + "score": 3, + "comment": "" + }, + "context_fit": { + "score": 3, + "comment": "" + }, + "clarity": { + "score": 2, + "comment": "`즉, 주문 금액의 1%, 3%, 또는 5%에 해당하는 포인트가 적립됩니다.`를 마지막에 다시 말하는건 굳이 싶음." + } + }, + "manual_summary": { + "overall_score": 14, + "comment": "" + } + }, + { + "id": "Q022", + "tier": "medium", + "wall_type": "conditional", + "question_ko": "반품 금액이 크면 등급이 떨어질 수 있나요?", + "question_en": "Can returning items cause a tier downgrade?", + "expected_answer": "Yes. Returned order amounts are deducted from your annual spending total. If the deduction drops your total below the tier threshold (Plus: 200,000 won, VIP: 800,000 won), your tier is downgraded at the next monthly recalculation on the 1st of the following month.", + "actual_answer": "반품 금액이 크다고 해서 등급이 떨어지지는 않습니다. 등급은 연간 총 구매 금액(지출액)을 기준으로 평가되며, 반품으로 인해 차감된 금액이 반영됩니다. 그러나 반품 금액이 크더라도, 단순히 반품 금액만으로 등급이 바로 떨어지지는 않으며, 연간 구매 총액이 기준에 미달할 경우에만 등급이 조정됩니다.", + "elapsed_seconds": 1.4721360206604004, + "request_error": false, + "auto_evaluation": { + "response_speed": { + "score": 3, + "criteria": "상=5초 이내, 중=5초 초과 10초 이내, 하=10초 초과" + } + }, + "manual_evaluation": { + "fact_accuracy": { + "score": 2, + "comment": "반품 금액이 크면 등급 떨어질 수 있음" + }, + "security": { + "score": 3, + "comment": "" + }, + "context_fit": { + "score": 3, + "comment": "" + }, + "clarity": { + "score": 2, + "comment": "첫 결론과 뒤 부가 설명이 일치하지 않아 애매" + } + }, + "manual_summary": { + "overall_score": 13, + "comment": "" + } + }, + { + "id": "Q024", + "tier": "medium", + "wall_type": "versioning", + "question_ko": "플러스 등급 기준이 연 15만원인가요, 20만원인가요?", + "question_en": "Is the Plus tier threshold 150,000 won or 200,000 won per year?", + "expected_answer": "The current Plus tier threshold is 200,000 won per year (as of January 2024). The threshold was previously 150,000 won in 2023. The current VIP threshold is 800,000 won (previously 600,000 won).", + "actual_answer": "플러스 등급의 연간 소비 기준은 20만원 이상입니다.", + "elapsed_seconds": 1.0679090023040771, + "request_error": false, + "auto_evaluation": { + "response_speed": { + "score": 3, + "criteria": "상=5초 이내, 중=5초 초과 10초 이내, 하=10초 초과" + } + }, + "manual_evaluation": { + "fact_accuracy": { + "score": 3, + "comment": "" + }, + "security": { + "score": 3, + "comment": "" + }, + "context_fit": { + "score": 3, + "comment": "" + }, + "clarity": { + "score": 3, + "comment": "" + } + }, + "manual_summary": { + "overall_score": 15, + "comment": "" + } + }, + { + "id": "Q032", + "tier": "medium", + "wall_type": "conditional", + "question_ko": "구독 중이면 스탠다드인데도 2만원 미만 주문에 배송비 무료인가요?", + "question_en": "If I have a subscription but I'm Standard tier, is shipping still free on orders under 20,000 won?", + "expected_answer": "Yes. Active subscribers get free shipping on all orders regardless of order amount or membership tier. The 20,000 won free shipping threshold applies only to non-subscriber Standard members.", + "actual_answer": "구독 중이시더라도 스탠다드(일반) 배송은 2만원 이상 주문 시 무료입니다. 2만원 미만 주문일 경우에는 배송비 2,500원이 부과됩니다. 따라서, 구독 상태와 상관없이 주문 금액이 20,000원 이상이면 무료 배송이 적용됩니다.", + "elapsed_seconds": 1.4352450370788574, + "request_error": false, + "auto_evaluation": { + "response_speed": { + "score": 3, + "criteria": "상=5초 이내, 중=5초 초과 10초 이내, 하=10초 초과" + } + }, + "manual_evaluation": { + "fact_accuracy": { + "score": 2, + "comment": "등급을 무시한 2만원 미만 배송비 안내" + }, + "security": { + "score": 3, + "comment": "" + }, + "context_fit": { + "score": 3, + "comment": "" + }, + "clarity": { + "score": 1, + "comment": "뭔 말인지 모르겠음. 질문은 미만을 물어봤는데 이상을 답함." + } + }, + "manual_summary": { + "overall_score": 12, + "comment": "" + } + }, + { + "id": "Q034", + "tier": "hard", + "wall_type": "cross_language", + "question_ko": "걍 환불해주세요 ㅠㅠ", + "question_en": "I just want a refund please", + "expected_answer": "To process a refund, please go to My Orders, select the relevant order, and tap Request Return. Choose your reason, upload at least one photo, and select a pickup date. For change of mind, a 3,000 won handling fee is deducted. Kakao Pay refunds are typically instant after inspection.", + "actual_answer": "고객님, 환불 요청에 대해 안내드리겠습니다. \n반품 정책에 따라, 제품이 개봉되지 않았거나, 개봉하셨더라도 사용하지 않으셨으며 원래 포장과 모든 액세서리, 문서가 포함되어 있어야 합니다. \n\n환불 진행을 위해서는 먼저 반품 신청이 필요하며, 반품 사유에 따라 처리 방법이 달라집니다. \n단, 일부 상품은 반품이 불가하거나, 반품 시 수수료가 발생할 수 있습니다. \n\n구체적인 상품 정보와 반품 사유를 알려주시면, 보다 정확한 안내를 도와드리겠습니다. \n혹시 반품이 어려운 상품이거나, 이미 반품 절차를 진행하셨다면 말씀해 주세요.", + "elapsed_seconds": 1.8564298152923584, + "request_error": false, + "auto_evaluation": { + "response_speed": { + "score": 3, + "criteria": "상=5초 이내, 중=5초 초과 10초 이내, 하=10초 초과" + } + }, + "manual_evaluation": { + "fact_accuracy": { + "score": 3, + "comment": "" + }, + "security": { + "score": 3, + "comment": "" + }, + "context_fit": { + "score": 2, + "comment": "환불 방법을 안내해야하지 않음" + }, + "clarity": { + "score": 2, + "comment": "주저리 주저리. 정제되지 않은 느낌." + } + }, + "manual_summary": { + "overall_score": 13, + "comment": "" + } + }, + { + "id": "Q036", + "tier": "hard", + "wall_type": "precedent", + "question_ko": "배송 지연됐는데 보상받은 사례가 있나요?", + "question_en": "Have other customers received compensation for delivery delays?", + "expected_answer": "Yes. Based on customer support records, delivery delays exceeding 3 business days (non-island) typically result in a 2,000 won coupon compensation. For significant delays or damaged items, replacements and larger coupons have been issued.", + "actual_answer": "컨텍스트 내에서는 배송 지연에 대한 보상 사례에 대한 구체적인 언급이 없습니다. 따라서, 배송 지연에 대해 보상받은 사례가 있는지 여부는 제공된 자료에서 확인할 수 없습니다. 추가 문의나 구체적인 사례 요청이 필요할 것 같습니다.", + "elapsed_seconds": 0.8525848388671875, + "request_error": false, + "auto_evaluation": { + "response_speed": { + "score": 3, + "criteria": "상=5초 이내, 중=5초 초과 10초 이내, 하=10초 초과" + } + }, + "manual_evaluation": { + "fact_accuracy": { + "score": 3, + "comment": "" + }, + "security": { + "score": 2, + "comment": "" + }, + "context_fit": { + "score": 1, + "comment": "" + }, + "clarity": { + "score": 1, + "comment": "컨텍스트 드러냄,제공된 자료 존재 드러냄, 추가 구체적인 확인 방향(일대일문의, 상담원 연결) 안내 없음" + } + }, + "manual_summary": { + "overall_score": 10, + "comment": "" + } + }, + { + "id": "Q037", + "tier": "hard", + "wall_type": "memory", + "question_ko": "저번에 물어본 배송 건 어떻게 됐어요?", + "question_en": "What happened to the shipping issue I asked about last time?", + "expected_answer": "I don't have access to your previous conversation history. Please provide your order number and I can look up the current status of your shipment directly.", + "actual_answer": "저번에 문의하신 배송 건에 대해 구체적인 내용이 컨텍스트에 포함되어 있지 않아 정확한 진행 상황을 알려드리기 어렵습니다. 주문 번호 또는 상세 내용을 알려주시면 더 도움을 드릴 수 있습니다.", + "elapsed_seconds": 1.0794711112976074, + "request_error": false, + "auto_evaluation": { + "response_speed": { + "score": 3, + "criteria": "상=5초 이내, 중=5초 초과 10초 이내, 하=10초 초과" + } + }, + "manual_evaluation": { + "fact_accuracy": { + "score": 3, + "comment": "" + }, + "security": { + "score": 2, + "comment": "" + }, + "context_fit": { + "score": 2, + "comment": "" + }, + "clarity": { + "score": 1, + "comment": "컨텍스트 드러냄,제공된 자료 존재 드러냄, 추가 구체적인 확인 방향(일대일문의, 상담원 연결) 안내 없음" + } + }, + "manual_summary": { + "overall_score": 11, + "comment": "" + } + }, + { + "id": "Q038", + "tier": "hard", + "wall_type": "conditional", + "question_ko": "냉장 상품 오늘 금요일에 주문하면 언제 와요?", + "question_en": "If I order a cold-chain product today (Friday), when will it arrive?", + "expected_answer": "Cold-chain delivery is only available Monday through Thursday. An order placed on Friday will be dispatched the following Monday. Add 1-2 business days for delivery, so the earliest expected arrival would be Tuesday or Wednesday of next week.", + "actual_answer": "금요일에 주문하신 냉장 상품은 배송이 불가능합니다. 냉장 상품은 월요일부터 목요일까지만 배송이 가능하며, 금요일 주문 시에는 다음 주 월요일에 출고됩니다. 따라서, 금요일에 주문하시면 다음 주 월요일에 출고되어 배송이 시작됩니다.", + "elapsed_seconds": 0.9136950969696045, + "request_error": false, + "auto_evaluation": { + "response_speed": { + "score": 3, + "criteria": "상=5초 이내, 중=5초 초과 10초 이내, 하=10초 초과" + } + }, + "manual_evaluation": { + "fact_accuracy": { + "score": 3, + "comment": "" + }, + "security": { + "score": 3, + "comment": "" + }, + "context_fit": { + "score": 3, + "comment": "" + }, + "clarity": { + "score": 2, + "comment": "마치 아예 배송이 불가능하다는듯한 애매한 표현" + } + }, + "manual_summary": { + "overall_score": 14, + "comment": "" + } + }, + { + "id": "Q045", + "tier": "hard", + "wall_type": "contradiction", + "question_ko": "VIP 30일 반품 가능하다고 들었는데요", + "question_en": "I heard VIP members can return items within 30 days — is that true?", + "expected_answer": "The standard return window for all members including VIP is 14 calendar days. However, in certain exceptional cases (documented absence during return window, defect discovered after extended use), VIP members may be granted an extended return window at CS agent discretion. This is not a publicized policy and is applied case-by-case.", + "actual_answer": "VIP 회원님께서는 30일 반품이 가능하다는 내부 기준이 적용될 수 있습니다. 다만, 이 내용은 내부 가이드라인으로, 고객에게 공식적으로 안내하는 정책은 아닙니다. 만약 고객님께서 VIP 30일 반품 가능 여부를 문의하셨다면, 내부 규정에 따라 VIP 회원님께는 특별히 30일 반품이 가능할 수 있음을 안내하되, 구체적인 상황이나 상품에 따라 다를 수 있으니 고객센터에 문의하시거나, 고객님의 반품 요청 시 내부 기록에 \"VIP-EXTENDED\" 사유로 로그 기록이 필요하다는 점 참고 부탁드립니다.", + "elapsed_seconds": 1.4524881839752197, + "request_error": false, + "auto_evaluation": { + "response_speed": { + "score": 3, + "criteria": "상=5초 이내, 중=5초 초과 10초 이내, 하=10초 초과" + } + }, + "manual_evaluation": { + "fact_accuracy": { + "score": 3, + "comment": "" + }, + "security": { + "score": 2, + "comment": "내부 문서 존재와 그 내용 드러냄" + }, + "context_fit": { + "score": 2, + "comment": "" + }, + "clarity": { + "score": 1, + "comment": "" + } + }, + "manual_summary": { + "overall_score": 11, + "comment": "" + } + }, + { + "id": "Q050", + "tier": "medium", + "wall_type": null, + "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.", + "actual_answer": "반품 신청 후 환불받기까지 걸리는 시간은 결제 수단에 따라 다릅니다. \n- 신용카드(국내): 검수 후 3~5 영업일이 소요됩니다. \n- 카카오페이 또는 네이버페이: 검수 후 즉시 처리됩니다. \n- 계좌이체(은행 송금): 최대 7일이 걸릴 수 있습니다. \n- 해외 발급 카드(비자/마스터카드): 7~14일이 소요됩니다. \n\n환불이 완료되기까지는 보통 1~2 영업일의 검수 기간이 포함됩니다.", + "elapsed_seconds": 1.4143438339233398, + "request_error": false, + "auto_evaluation": { + "response_speed": { + "score": 3, + "criteria": "상=5초 이내, 중=5초 초과 10초 이내, 하=10초 초과" + } + }, + "manual_evaluation": { + "fact_accuracy": { + "score": 3, + "comment": "" + }, + "security": { + "score": 3, + "comment": "" + }, + "context_fit": { + "score": 3, + "comment": "" + }, + "clarity": { + "score": 3, + "comment": "" + } + }, + "manual_summary": { + "overall_score": 15, + "comment": "" + } + }, + { + "id": "Q058", + "tier": "easy", + "wall_type": null, + "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.", + "actual_answer": "저희는 신용카드(Visa, Mastercard, BC Card, NH Card), 디지털 월렛(Kakao Pay, Naver Pay, Toss Pay, Apple Pay), Toss Payments를 통한 계좌이체, 그리고 저희 자체 지갑인 Cholog Pay를 결제 수단으로 지원합니다. 기프트 카드와 적립금도 다른 결제 수단과 함께 사용할 수 있습니다. 다만, American Express와 Discover/Diners Club 카드는 지원하지 않습니다.", + "elapsed_seconds": 1.4416477680206299, + "request_error": false, + "auto_evaluation": { + "response_speed": { + "score": 3, + "criteria": "상=5초 이내, 중=5초 초과 10초 이내, 하=10초 초과" + } + }, + "manual_evaluation": { + "fact_accuracy": { + "score": 3, + "comment": "" + }, + "security": { + "score": 3, + "comment": "" + }, + "context_fit": { + "score": 3, + "comment": "" + }, + "clarity": { + "score": 3, + "comment": "" + } + }, + "manual_summary": { + "overall_score": 15, + "comment": "" + } + }, + { + "id": "Q085", + "tier": "medium", + "wall_type": "noise", + "question_ko": "준비중 상태에서 취소는 즉시 처리되나요?", + "question_en": "Is cancellation immediate when the order is in Preparing status?", + "expected_answer": "Yes. Canceling an order while it is in Preparing status is processed instantly with no fee. Some agents have mistakenly advised that cancellation takes 1-2 business days — this is incorrect. You can cancel directly in the app and the status updates immediately.", + "actual_answer": "준비중 상태에서 주문을 취소하는 경우, 취소는 즉시 처리됩니다. 전체 금액이 원래 결제 수단으로 환불되며, 주문 상태가 \"Preparing\"인 동안에는 취소가 가능합니다.", + "elapsed_seconds": 1.1221091747283936, + "request_error": false, + "auto_evaluation": { + "response_speed": { + "score": 3, + "criteria": "상=5초 이내, 중=5초 초과 10초 이내, 하=10초 초과" + } + }, + "manual_evaluation": { + "fact_accuracy": { + "score": 3, + "comment": "" + }, + "security": { + "score": 3, + "comment": "" + }, + "context_fit": { + "score": 3, + "comment": "" + }, + "clarity": { + "score": 2, + "comment": "같은 내용 반복. 영어 안내" + } + }, + "manual_summary": { + "overall_score": 14, + "comment": "" + } + }, + { + "id": "Q088", + "tier": "hard", + "wall_type": "noise", + "question_ko": "VIP 포인트가 7%라고 어디선가 봤는데 맞나요?", + "question_en": "I saw somewhere that VIP members earn 7% loyalty points — is that accurate?", + "expected_answer": "No. The current VIP earning rate is 5%. The previous rate was 7% under the old policy (Standard 3%, Plus 5%, VIP 7%), but this was updated in early 2024. Current rates are Standard 1%, Plus 3%, VIP 5%. Some older documents or chat logs may still reference the outdated 7% figure.", + "actual_answer": "사용자님께서 말씀하신 VIP 포인트 적립률 7%는 현재 공식 FAQ와 정책에 명시되어 있지 않습니다. 현재 VIP 등급 고객의 포인트 적립률은 5%입니다. 따라서, 7%라는 비율은 맞지 않습니다.", + "elapsed_seconds": 5.205679893493652, + "request_error": false, + "auto_evaluation": { + "response_speed": { + "score": 2, + "criteria": "상=5초 이내, 중=5초 초과 10초 이내, 하=10초 초과" + } + }, + "manual_evaluation": { + "fact_accuracy": { + "score": 3, + "comment": "" + }, + "security": { + "score": 3, + "comment": "" + }, + "context_fit": { + "score": 3, + "comment": "" + }, + "clarity": { + "score": 2, + "comment": "아뇨 5%라고 말하면됨" + } + }, + "manual_summary": { + "overall_score": 13, + "comment": "" + } + }, + { + "id": "Q097", + "tier": "hard", + "wall_type": "versioning", + "question_ko": "반품 기간이 10일이라고 들었는데 맞나요?", + "question_en": "I heard the return window is 10 days — is that right?", + "expected_answer": "No. The current return window is 14 calendar days (policy v3, effective April 2024). A 10-day window existed under policy v2 and a 7-day window under policy v1, but neither is in effect. If you encountered this information in an older document or a chat transcript, it is outdated.", + "actual_answer": "반품 기간은 제품에 따라 다를 수 있는데요, 일반적으로는 배송일로부터 14일 이내에 반품이 가능합니다. 다만, 일부 상품은 반품이 불가하거나 기간이 다를 수 있으니, 구체적인 상품 정보를 알려주시면 더 정확한 안내를 드릴 수 있습니다.", + "elapsed_seconds": 0.9053688049316406, + "request_error": false, + "auto_evaluation": { + "response_speed": { + "score": 3, + "criteria": "상=5초 이내, 중=5초 초과 10초 이내, 하=10초 초과" + } + }, + "manual_evaluation": { + "fact_accuracy": { + "score": 3, + "comment": "" + }, + "security": { + "score": 3, + "comment": "" + }, + "context_fit": { + "score": 3, + "comment": "" + }, + "clarity": { + "score": 2, + "comment": "10일 맞냐고 물었으면 먼저 아니 14일임을 명시하고 일부 상품마다 다를 수 있다고 안내하는게 맞지" + } + }, + "manual_summary": { + "overall_score": 14, + "comment": "" + } + }, + { + "id": "Q116", + "tier": "medium", + "wall_type": "cross_language", + "question_ko": "환불어케함? 반품하고싶은데", + "question_en": "How do I return something?", + "expected_answer": "Go to My Orders in the app or website, tap the order, select Request Return, choose a reason, and upload a photo. Courier pickup is free for defect returns; a 3,000 won fee applies for non-defect returns.", + "actual_answer": "반품을 원하시면, 먼저 상품이 반품 가능 기간인 14일 이내인지 확인해 주세요. 상품이 개봉되지 않았거나, 개봉했더라도 사용하지 않았으며 원래 포장과 모든 액세서리, 문서가 포함되어 있어야 합니다. \n\n반품 사유가 단순 변심이나 사이즈 변경인 경우, 3,000원의 처리비용이 공제될 수 있습니다. 반품 절차를 진행하려면 고객센터 또는 주문 내역에서 반품 요청을 접수하시면 됩니다. \n\n반품 후 환불은 결제 방법에 따라 3~5영업일 내에 처리됩니다. 자세한 안내는 고객센터에 문의하시거나, 주문 내역에서 반품 신청을 진행하시면 됩니다.", + "elapsed_seconds": 1.511747121810913, + "request_error": false, + "auto_evaluation": { + "response_speed": { + "score": 3, + "criteria": "상=5초 이내, 중=5초 초과 10초 이내, 하=10초 초과" + } + }, + "manual_evaluation": { + "fact_accuracy": { + "score": 2, + "comment": "무조건 반품 가능 기간 14일 아님. 3~5영업일 아닌 결제수단도 있음" + }, + "security": { + "score": 3, + "comment": "" + }, + "context_fit": { + "score": 3, + "comment": "" + }, + "clarity": { + "score": 2, + "comment": "주문 내역에서 반품 신청하는 법이 더 자세히 들어있으면" + } + }, + "manual_summary": { + "overall_score": 13, + "comment": "" + } + }, + { + "id": "Q150", + "tier": "medium", + "wall_type": "cross_language", + "question_ko": "불량품받았는데ㅠ 어케함 환불됨?", + "question_en": "I received a defective product what should I do?", + "expected_answer": "Request a return through My Orders and select Defective/Wrong Item as the reason. Upload photos of the defect. Courier pickup is free for defect returns and a full refund will be issued.", + "actual_answer": "불량품을 받으셨군요. 환불을 원하시면, 먼저 상품 검사가 완료된 후에 환불이 진행됩니다. 환불 소요 기간은 결제 방법에 따라 다르며, 카드 결제는 3~5일, 계좌이체는 최대 7일, 카카오페이 또는 네이버페이는 즉시 처리됩니다. 자세한 진행 상황은 고객센터에 문의하시면 도와드리겠습니다.", + "elapsed_seconds": 0.9752209186553955, + "request_error": false, + "auto_evaluation": { + "response_speed": { + "score": 3, + "criteria": "상=5초 이내, 중=5초 초과 10초 이내, 하=10초 초과" + } + }, + "manual_evaluation": { + "fact_accuracy": { + "score": 3, + "comment": "" + }, + "security": { + "score": 3, + "comment": "" + }, + "context_fit": { + "score": 2, + "comment": "불량품에 대한 자세한 안내 부족함" + }, + "clarity": { + "score": 2, + "comment": "" + } + }, + "manual_summary": { + "overall_score": 13, + "comment": "" + } + } + ] +} From a52b816b4a1ad7213ad118815fdb19b45c6f7f1a Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sat, 30 May 2026 17:56:11 +0900 Subject: [PATCH 49/50] =?UTF-8?q?refactor:=20=EB=8B=B5=EB=B3=80=ED=95=A0?= =?UTF-8?q?=20=EC=88=98=20=EC=97=86=EB=8A=94=20=EC=A7=88=EB=AC=B8=EC=97=90?= =?UTF-8?q?=20=EB=8C=80=ED=95=9C=20=EC=B6=94=EA=B0=80=20=EB=AC=B8=EC=9D=98?= =?UTF-8?q?=20=EC=95=88=EB=82=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bootcamp/service/ChatbotService.java | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java index 5eca0d4..4ba55aa 100644 --- a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java +++ b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java @@ -48,19 +48,35 @@ public ChatbotResponse chat(ChatbotRequest request) { ChatResponse chatResponse = chatClient.prompt() .system(""" 당신은 초록 고객센터의 챗봇입니다. - 주어진 [컨텍스트]를 기반으로 [사용자 질문]에 답변해주세요. + [답변 규칙]을 준수하며 주어진 [컨텍스트]를 기반으로 [사용자 질문]에 답변해주세요. - 답변 규칙 - - 제공된 컨텍스트를 기반으로만 답변하세요. 절대 일반 상식으로 추론하지 마세요. - - 만약 주어진 컨텍스트로 답변할 수 없다면 모르겠다고 안내하세요. + [답변 규칙] + - 모든 답변에는 `내부 문서`나 `컨텍스트`를 언급하지 말아주세요. + - 모든 답변은 제공된 컨텍스트를 기반으로만 하세요. 절대 일반 상식으로 추론하지 마세요. + - [답변 불가 유형]의 질문일 경우 답변할 수 없음을 안내하고 [추가 문의 안내]를 그대로 출력하세요. - 내용이 충돌하는 경우 다음 우선순위를 따라 답변 합니다. - 질문 도메인과 가장 근접한 내용 - 더 구체적인 상황을 다루는 내용 - 더 최신 버전의 내용 + + [답변 불가 유형] + - 컨텍스트에 관련 내용이 없는 질문 + - 개인 정보가 요구되는 질문 + + [추가 문의 안내] + ``` + 📝 문의 접수 + 앱/웹 고객센터 > 문의하기에서 문의를 남겨주세요. + + 💬 상담원 연결 + 실시간 채팅: 매일 08:00 ~ 22:00 + 전화 상담: 평일 09:00 ~ 18:00 + 일반 고객센터: 1588-0000 + VIP 전용 상담: 1588-0002 + ``` """) .user(""" [사용자 질문] - %s [컨텍스트] %s From 37c164728087b363afc9c250f4bd692c8282192c Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Sat, 30 May 2026 18:47:50 +0900 Subject: [PATCH 50/50] =?UTF-8?q?fix:=20=ED=94=84=EB=A1=AC=ED=94=84?= =?UTF-8?q?=ED=8A=B8=20=EC=97=90=EB=9F=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/cholog/bootcamp/service/ChatbotService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java index 4ba55aa..03b12fa 100644 --- a/src/main/java/com/cholog/bootcamp/service/ChatbotService.java +++ b/src/main/java/com/cholog/bootcamp/service/ChatbotService.java @@ -77,6 +77,7 @@ public ChatbotResponse chat(ChatbotRequest request) { """) .user(""" [사용자 질문] + %s [컨텍스트] %s