From 2735626df0e669cb67e4ce305c69211f8e8c6352 Mon Sep 17 00:00:00 2001 From: kjyyjk Date: Fri, 8 May 2026 20:34:32 +0900 Subject: [PATCH 01/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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/45] =?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