From ddc622ca2ba826aebef11e02d9c31c3898bc321e Mon Sep 17 00:00:00 2001 From: yeoEun Date: Sat, 15 Feb 2025 02:25:32 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat=20#78=20:=20=EA=B7=BC=EA=B1=B0=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../giftidea/controller/GptController.java | 45 +++++++++++++++---- .../com/team4/giftidea/entity/Product.java | 7 +++ 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/team4/giftidea/controller/GptController.java b/src/main/java/com/team4/giftidea/controller/GptController.java index 079b9f9..7c3b241 100644 --- a/src/main/java/com/team4/giftidea/controller/GptController.java +++ b/src/main/java/com/team4/giftidea/controller/GptController.java @@ -72,13 +72,22 @@ public List processFileAndRecommend( List processedMessages = preprocessKakaoFile(file, targetName); // 2. GPT API 호출: 전처리된 메시지로 키워드 반환 - String categories = generatePrompt(processedMessages, relation, sex, theme); + String gptResponse = generatePrompt(processedMessages, relation, sex, theme); - // 3. 키워드 리스트 변환 및 상품 검색 - List keywords = Arrays.asList(categories.split(",")); + // 3. 키워드, 근거 리스트 변환 및 상품 검색 + String[] responseLines = gptResponse.split("\n"); + String categories = responseLines[0].replace("Categories: ", "").trim(); + String reasons = responseLines.length > 1 ? responseLines[1].trim() : ""; + + List keywords = Arrays.asList(categories.split(", ")); keywords.replaceAll(String::trim); + List reasonList = Arrays.asList(reasons.split("\n")); + List products = productService.searchByKeywords(keywords); + for (int i = 0; i < products.size() && i < reasonList.size(); i++) { + products.get(i).setReason(reasonList.get(i)); + } return products; } @@ -207,7 +216,6 @@ private String generatePrompt(List processedMessages, String relation, S private String generateText(String prompt) { GptRequestDTO request = new GptRequestDTO(gptConfig.getModel(), prompt); try { - // HTTP 요청 전에 request 객체 로깅 ObjectMapper mapper = new ObjectMapper(); @@ -217,21 +225,39 @@ private String generateText(String prompt) { if (response != null) { log.debug("GPT 응답 수신: {}", mapper.writeValueAsString(response)); - // 응답에 'choices'가 있고, 그 중 첫 번째 항목이 존재하는지 확인 if (response.getChoices() != null && !response.getChoices().isEmpty()) { String content = response.getChoices().get(0).getMessage().getContent(); - // 필요한 형태로 카테고리 추출 (예: "1. [무선이어폰, 스마트워치, 향수]" 형태) if (content.contains("1.")) { - String categories = content.split("1.")[1].split("\n")[0]; // 첫 번째 카테고리 라인 추출 + // 첫 번째 줄: 카테고리 리스트 추출 + String categories = content.split("1.")[1].split("\n")[0]; - // 괄호 안의 항목들을 추출하고, 쉼표로 구분하여 키워드 리스트 만들기 + // 카테고리 리스트 (괄호 안의 항목들) String[] categoryArray = categories.split("\\[|\\]")[1].split(","); + List keywords = new ArrayList<>(); for (String category : categoryArray) { keywords.add(category.trim()); } - return String.join(", ", keywords); // 최종적으로 카테고리들을 반환 + + // 두 번째 줄 이후: 카테고리별 설명(reason) 추출 + List reasons = new ArrayList<>(); + String[] lines = content.split("\n"); + + for (String line : lines) { + line = line.trim(); + if (line.startsWith("- ")) { // 설명 부분인지 확인 + int startIndex = line.indexOf(": ["); + if (startIndex != -1) { + String reason = line.substring(startIndex + 3, line.length() - 1).trim(); + reasons.add(reason); + } + } + } + + // 카테고리와 설명을 조합하여 반환 + return "Categories: " + String.join(", ", keywords) + "\n" + + "Reasons: " + String.join("\n", reasons); } else { log.warn("GPT 응답에서 카테고리 정보가 올바르지 않습니다."); } @@ -251,6 +277,7 @@ private String generateText(String prompt) { } } + private String extractKeywordsAndReasonsCoupleMan(String theme, String message) { String prompt = String.format(""" 다음 텍스트를 참고하여 남자 애인이 %s에 선물로 받으면 좋아할 카테고리 3개와 판단에 참고한 대화를 제공해주세요. diff --git a/src/main/java/com/team4/giftidea/entity/Product.java b/src/main/java/com/team4/giftidea/entity/Product.java index b6aa81d..9c5ce76 100644 --- a/src/main/java/com/team4/giftidea/entity/Product.java +++ b/src/main/java/com/team4/giftidea/entity/Product.java @@ -72,4 +72,11 @@ public class Product { */ @Column(nullable = false) private String keyword; + + /** + * 추천 근거 (GPT가 제공하는 추천 이유) + */ + @Column(length = 1000) // 추천 근거가 길어질 수 있으므로 적절한 길이 설정 + private String reason; + } \ No newline at end of file From 89f2a218fc71b9665e845f4b7113024211c82046 Mon Sep 17 00:00:00 2001 From: yeoEun Date: Sat, 15 Feb 2025 03:46:12 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat=20#78=20:=20=EC=83=81=ED=92=88=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=ED=98=95=EC=8B=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gradle/buildOutputCleanup/cache.properties | 2 +- .gradle/buildOutputCleanup/outputFiles.bin | Bin 19505 -> 19001 bytes .../giftidea/controller/GptController.java | 9 ++++----- .../com/team4/giftidea/entity/Product.java | 6 ------ 4 files changed, 5 insertions(+), 12 deletions(-) diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties index 8bfd2aa..b12c514 100644 --- a/.gradle/buildOutputCleanup/cache.properties +++ b/.gradle/buildOutputCleanup/cache.properties @@ -1,2 +1,2 @@ -#Fri Feb 07 20:37:40 KST 2025 +#Sat Feb 15 02:43:43 KST 2025 gradle.version=8.10 diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin index 1f7b7a32928e640828c392024bb279892e9365cf..ed5e392c7c13bab99779a179e55becdc656f3eff 100644 GIT binary patch delta 588 zcmdlugK_5+#tkMC^)l^hYfon_c_739243p_p`e5NPS!o|R9A?&M=DIbr(BvvV|Qg1 zRQxMUym#e``+Kt=?t+R3!^G!SykGliOWs6?xaV}3_>yC4?hEH~#XW&Yc!^GaD<-hJQQpvGy##P|GP>y^lC!wwZ+2@~IUW#6Ar2JJqG zxQ8Q5{B&gNljoi82chckL&PU1J^8MrI3xSyxl-bi`(f&TUHF=wyy=_;RDI&) zzf$6f7h$rJJTvCr{?xJpD*F*8E|uqdZ>KnS2-Nm+n7B^$?~^P?Ssy~xx5C8j4eSqf z)~23-s_&dEDjzpB0%U3;E<2>Y)2HMcdlvUUnrE@RiN`k-$-9lM>p6Z_$tzOqc+ ze3S6dZtQuws-C^$lRnb^Z1%Is5gWD}r31oMW{W>69PDjb zqW9s(1+-tyelPijXU-uv1$h(u{n9s2n&Y*%Y5xj~o3uORJ1>{e{+{d)Le{yDwh!A) zp2uGC)KH#z?2JF{uV;T2(DFRHi*qydb zd|T2O@|EVD*j+s8dg-%cR?_@lc2`Z&$hjkC9ucm(!QTC4=*fV%L7#;yv)KE)?$%W{ zZahl!uh~6fCsm#6>oP;QVlum*UEtV?hpEG9ez?WW*QYkEsVt)XT6X_Lv(e#(V=e9Z z#2!53UfqI7uQb{tV;>VR=4#4XHSLj4XIBJuZrD_(Z>9Nd7QYqfY{>ZPP1kK;4=vd- zD=A{R9bLDYJxnJrGt29{(4J`aX-m|m&h&q;e`OQ0|LAa>1^h&}n^qR8b5>@ki< zm%MVmrl~Y1;IfgGSo?>3EXJ3`u5}fLt z;U!$PmYsh~lH*kI9Dbqz3ZMWApa2S>01BW03ZMWApa2S>01BW03ZMWApa2S>01BW0 z3ZMWApa2S>01BW03ZMWApa2S>01BYMzbP=Z?K16O0B-+s@UJfjcmG4$>0e3PrEIvC t^;v%-w%wQYX502ypJm(Tjyub?&DQtTanf;rp>3Nx?kwxgw#l#m#ZTr1{aye7 diff --git a/src/main/java/com/team4/giftidea/controller/GptController.java b/src/main/java/com/team4/giftidea/controller/GptController.java index 3787962..4d16661 100644 --- a/src/main/java/com/team4/giftidea/controller/GptController.java +++ b/src/main/java/com/team4/giftidea/controller/GptController.java @@ -64,7 +64,7 @@ public GptController(RestTemplate restTemplate, GptConfig gptConfig, ProductServ @ApiResponse(responseCode = "500", description = "서버 내부 오류 발생") }) @PostMapping(value = "/process", consumes = "multipart/form-data", produces = "application/json") - public List processFileAndRecommend( + public List processFileAndRecommend( @RequestParam("file") @Parameter(description = "카카오톡 대화 파일 (.txt)", required = true) MultipartFile file, @RequestParam("targetName") @Parameter(description = "분석 대상 이름 (예: '여자친구')", required = true) String targetName, @RequestParam("relation") @Parameter(description = "대상과의 관계 (couple, friend, parent 등)", required = true) String relation, @@ -128,10 +128,9 @@ public List processFileAndRecommend( List reasonList = Arrays.asList(reasons.split("\n")); - List products = productService.searchByKeywords(keywords); - for (int i = 0; i < products.size() && i < reasonList.size(); i++) { - products.get(i).setReason(reasonList.get(i)); - } + List products_No_reason = productService.searchByKeywords(keywords); + List products = new ArrayList<>(products_No_reason); + products.add(reasonList); return products; } diff --git a/src/main/java/com/team4/giftidea/entity/Product.java b/src/main/java/com/team4/giftidea/entity/Product.java index 9c5ce76..656c83e 100644 --- a/src/main/java/com/team4/giftidea/entity/Product.java +++ b/src/main/java/com/team4/giftidea/entity/Product.java @@ -73,10 +73,4 @@ public class Product { @Column(nullable = false) private String keyword; - /** - * 추천 근거 (GPT가 제공하는 추천 이유) - */ - @Column(length = 1000) // 추천 근거가 길어질 수 있으므로 적절한 길이 설정 - private String reason; - } \ No newline at end of file