From 7122109a655095ced89a262a3dacd92b85b34329 Mon Sep 17 00:00:00 2001 From: koosco Date: Fri, 6 Dec 2024 11:03:11 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20quest=20prompt=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/templates/quest-recommend-prompt.txt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/resources/templates/quest-recommend-prompt.txt b/src/main/resources/templates/quest-recommend-prompt.txt index f0a740d..b583f8c 100644 --- a/src/main/resources/templates/quest-recommend-prompt.txt +++ b/src/main/resources/templates/quest-recommend-prompt.txt @@ -2,7 +2,7 @@ 저의 관심 직무는 {job}입니다. 저의 목표는 {goal}입니다. - {myQuest}는 제가 여태까지 작성했던 목표입니다. -- {questList}에 포함된 퀘스트 중 제가 아직 수행하지 않은 퀘스트를 선택하려고 합니다. +- {questList}에 포함된 퀘스트 중 제가 아직 수행하지 않은 퀘스트을(를) 선택하려고 합니다. - {questList}에 포함된 퀘스트 중 저의 직무, 목표와 관련성이 가장 높은 퀘스트를 *세 개* 선택해주세요. - {questList}에서 선택한 퀘스트가 {job}, {goal}과 관련이 있는지 판단해주세요. - 만약 선택된 퀘스트가 {job} 또는 {goal} 과 관련이 없다면, {job}과 {goal}, {myQuest}을 기준으로 새로운 퀘스트를 만들어주세요. @@ -41,7 +41,12 @@ # 조건 - 답변하기 전에 한 번 더 검토를 하고 {questList}에서 선택한 퀘스트가 {job}, {goal}과 관련이 있는지 판단해주세요. +- 선택한 퀘스트가 관련이 없다면 {job}과 {goal}과 관련있는 새로운 퀘스트명을 3개 만들어주세요 # 응답 포맷 -{format} \ No newline at end of file +다음 응답 포맷을 기준으로 데이터를 만들어야 합니다. +``` +{format} +``` +답변하는 데이터가 코드 블럭의 데이터면 절대 안됩니다! 코드 블럭의 데이터는 단순히 답변 포맷의 예시일뿐입니다. \ No newline at end of file From d96fbfdc970b7425f31e56ffd3c9c4d687364ab4 Mon Sep 17 00:00:00 2001 From: koosco Date: Fri, 6 Dec 2024 11:03:22 +0900 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20goal=20prompt=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../templates/goal-recommend-prompt.txt | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/main/resources/templates/goal-recommend-prompt.txt b/src/main/resources/templates/goal-recommend-prompt.txt index ee7d0e8..721a3d8 100644 --- a/src/main/resources/templates/goal-recommend-prompt.txt +++ b/src/main/resources/templates/goal-recommend-prompt.txt @@ -10,14 +10,15 @@ # 조건 ## 조건1 -각 목표의 카테고리(goalCategory)는 다음과 같습니다. -- 자격·어학·수상 -- 경험·활동·교육 -- 경력 -- 기타 +각 목표의 카테고리(category)는 다음과 같습니다. +- CERTIFICATION +- EXPERIENCE +- CAREER +- ETC -제시해주시는 목표는 goalCategory 중 하나의 카테고리에 포함되어야 합니다. -제시해주시는 목표와 goalCategory는 연관성이 있어야 합니다. +제시해주시는 목표는 반드시 category 중 하나의 카테고리에 포함되어야 합니다. +제시해주시는 목표와 category 연관성이 있어야 합니다. +category null이 아닌지 다시 한 번 확인해주세요. ## 조건2 새로운 목표의 종결 어미는 "~하기"여야 합니다. @@ -33,26 +34,26 @@ - input - "myGoal": ["SpringMVC 공부하기", "DDD 개념 이해하기", "클린 아키텍처 구현해보기"] - output - - "title": "EDA에 대해 공부해보기", "goalCategory": "경험·활동·교육", "descriptions": ["다양한 IT 기업에 지원할 수 있어요", "분산 아키텍처에 대한 이해도를 높일 수 있어요"] - - "title": "SpringCloud 공부해보기", "goalCategory": "경험·활동·교육", "descriptions": ["scale out 가능한 아키텍처에 대해 공부해볼 수 있어요", "분산 아키텍처를 직접 만들어보며 이해도를 높일 수 있어요"] - - "title": "AWS를 이용해 EDA를 적용하기", "goalCategory": "경력", "descriptions": ["로컬 환경에서 벗어나 배포 환경을 분산 아키텍처로 구성해볼 수 있어요", "IT 기업에 지원할 때 우대 받을 수 있어요"] + - "title": "EDA에 대해 공부해보기", "category": "EXPERIENCE", "descriptions": ["다양한 IT 기업에 지원할 수 있어요", "분산 아키텍처에 대한 이해도를 높일 수 있어요"] + - "title": "SpringCloud 공부해보기", "category": "EXPERIENCE", "descriptions": ["scale out 가능한 아키텍처에 대해 공부해볼 수 있어요", "분산 아키텍처를 직접 만들어보며 이해도를 높일 수 있어요"] + - "title": "AWS를 이용해 EDA를 적용하기", "category": "CAREER", "descriptions": ["로컬 환경에서 벗어나 배포 환경을 분산 아키텍처로 구성해볼 수 있어요", "IT 기업에 지원할 때 우대 받을 수 있어요"] 2) - input - "myGoal": ["미적분학 A+받기", "선형대수학 A+받기", "과탑하기"] - output - - "title": "해석학 공부해보기", "goalCategory": "경험·활동·교육", "descriptions": ["다양한 수학 분야를 경험해볼 수 있어요", "앞서 배운 내용을 응용해 대학 수학에 대한 이해도를 높일 수 있어요"] - - "title": "수학 경시대회 나가서 수상해보기", "goalCategory": "자격·어학·수상", "descriptions": ["관련 직무에 지원할 때 우대를 받을 수 있어요", "공부한 실력을 검증해볼 수 있어요"] - - "title": "수학과 취업 시장 조사하기", "goalCategory": "경력", "descriptions": ["졸업 후 취업 시장에 대한 식견을 넓힐 수 있어요", "기업들이 원하는 역량을 준비할 수 있어요", "수학의 다양한 응용분야에 대해 알 수 있어요"] + - "title": "해석학 공부해보기", "category": "EXPERIENCE", "descriptions": ["다양한 수학 분야를 경험해볼 수 있어요", "앞서 배운 내용을 응용해 대학 수학에 대한 이해도를 높일 수 있어요"] + - "title": "수학 경시대회 나가서 수상해보기", "category": "CERTIFICATION", "descriptions": ["관련 직무에 지원할 때 우대를 받을 수 있어요", "공부한 실력을 검증해볼 수 있어요"] + - "title": "수학과 취업 시장 조사하기", "category": "CAREER", "descriptions": ["졸업 후 취업 시장에 대한 식견을 넓힐 수 있어요", "기업들이 원하는 역량을 준비할 수 있어요", "수학의 다양한 응용분야에 대해 알 수 있어요"] 3) - input - "myGoal": ["JLPT 5급 합격하기", "JLPT 4급 합격하기", "매일 일본어 단어 정리하기"] - output - - "title": "JLPT 3급 합격하기", "goalCategory": "자격·어학·수상", "descriptions": ["일본 사람과 일상적인 대화를 주고 받을 수 있어요", "일상생활에서 사용하는 한자를 읽고 듣는 능력을 기를 수 있어요", "JLPT 2급을 준비할 수 있는 기초 능력을 기를 수 있어요"] - - "title": "교내 일본어 동아리 가입하기", "goalCategory": "경험·활동·교육", "descriptions": ["관심사가 비슷한 사람들과 함께 공부하며 배운 내용을 적용해볼 수 있어요", "일본어 어학 관련 기업에 지원할 때 우대 받을 수 있어요"] - - "title": "일본어 어학연수 알아보기", "goalCategory": "경험·활동·교육", "descriptions": ["일본 현지인들과 함께 생활해보는 경험을 할 수 있어요", "일본 대학에서 일본어를 배우는 경험을 할 수 있어요"] - - "title": "일본 워킹홀리데이 조사하기", "goalCategory": "경험·활동·교육", "descriptions": ["일본 현지인들과 함께 생활해보는 경험을 할 수 있어요", "일본어 어학 관련 기업에 지원할 때 우대 받을 수 있어요"] + - "title": "JLPT 3급 합격하기", "category": "자격·어학·수상", "descriptions": ["일본 사람과 일상적인 대화를 주고 받을 수 있어요", "일상생활에서 사용하는 한자를 읽고 듣는 능력을 기를 수 있어요", "JLPT 2급을 준비할 수 있는 기초 능력을 기를 수 있어요"] + - "title": "교내 일본어 동아리 가입하기", "category": "EXPERIENCE", "descriptions": ["관심사가 비슷한 사람들과 함께 공부하며 배운 내용을 적용해볼 수 있어요", "일본어 어학 관련 기업에 지원할 때 우대 받을 수 있어요"] + - "title": "일본어 어학연수 알아보기", "category": "EXPERIENCE", "descriptions": ["일본 현지인들과 함께 생활해보는 경험을 할 수 있어요", "일본 대학에서 일본어를 배우는 경험을 할 수 있어요"] + - "title": "일본 워킹홀리데이 조사하기", "category": "EXPERIENCE", "descriptions": ["일본 현지인들과 함께 생활해보는 경험을 할 수 있어요", "일본어 어학 관련 기업에 지원할 때 우대 받을 수 있어요"] # 응답 포맷 {format} \ No newline at end of file From 088dae0e78b834e36521d7d58319ccef4f8f937b Mon Sep 17 00:00:00 2001 From: koosco Date: Fri, 6 Dec 2024 11:04:21 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EB=AA=A9=ED=91=9C=20=EC=A1=B0=ED=9A=8C=20api=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit jackson config 추가에 따른 설정 충돌 해결 --- build.gradle | 2 ++ src/main/java/com/groom/orbit/ai/app/openai/OpenAiService.java | 1 - .../com/groom/orbit/goal/app/command/GoalCommandService.java | 2 ++ .../com/groom/orbit/goal/app/command/GoalRecommendService.java | 1 - 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index e633ab7..3c4e7fc 100644 --- a/build.gradle +++ b/build.gradle @@ -117,6 +117,8 @@ dependencies { implementation 'com.google.firebase:firebase-admin:9.2.0' //Jackson Data binding + implementation 'com.fasterxml.jackson.core:jackson-databind:2.16.1' + implementation 'com.fasterxml.jackson.core:jackson-annotations:2.16.1' implementation 'com.fasterxml.jackson.core:jackson-core:2.16.1' } diff --git a/src/main/java/com/groom/orbit/ai/app/openai/OpenAiService.java b/src/main/java/com/groom/orbit/ai/app/openai/OpenAiService.java index 659261d..5b22a24 100644 --- a/src/main/java/com/groom/orbit/ai/app/openai/OpenAiService.java +++ b/src/main/java/com/groom/orbit/ai/app/openai/OpenAiService.java @@ -119,7 +119,6 @@ public RecommendQuestListResponseDto recommendQuest(Long memberId) { othersVector.stream().flatMap(vector -> vector.goals().stream()).toList()), "format", format)); - log.info("response is {}", response); return converter.convert(response); } diff --git a/src/main/java/com/groom/orbit/goal/app/command/GoalCommandService.java b/src/main/java/com/groom/orbit/goal/app/command/GoalCommandService.java index 8d3f5a6..30957af 100644 --- a/src/main/java/com/groom/orbit/goal/app/command/GoalCommandService.java +++ b/src/main/java/com/groom/orbit/goal/app/command/GoalCommandService.java @@ -3,6 +3,7 @@ import java.util.Optional; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.groom.orbit.goal.dao.GoalRepository; @@ -18,6 +19,7 @@ public class GoalCommandService { private final GoalRepository goalRepository; + @Transactional(propagation = Propagation.REQUIRES_NEW) public Goal createGoal(String title, String category) { Goal goal = Goal.create(title, category); diff --git a/src/main/java/com/groom/orbit/goal/app/command/GoalRecommendService.java b/src/main/java/com/groom/orbit/goal/app/command/GoalRecommendService.java index 34f9688..dae7f3a 100644 --- a/src/main/java/com/groom/orbit/goal/app/command/GoalRecommendService.java +++ b/src/main/java/com/groom/orbit/goal/app/command/GoalRecommendService.java @@ -23,7 +23,6 @@ public class GoalRecommendService { public GetRecommendGoalListResponseDto createRecommendGoal(Long memberId) { RecommendGoalListResponseDto dtos = aiService.recommendGoal(memberId); - dtos.items().forEach(dto -> goalCommandService.upsert(dto.title(), dto.category())); List newGoals = dtos.items().stream() .map(dto -> goalCommandService.upsert(dto.title(), dto.category()))