Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: 추천 목표 반환 개수 3개, descriptions 추가 #247

Merged
merged 2 commits into from
Dec 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/main/java/com/groom/orbit/ai/app/AiService.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.groom.orbit.ai.app;

import com.groom.orbit.goal.app.dto.request.CreateGoalRequestDto;
import com.groom.orbit.goal.app.dto.response.RecommendGoalListResponseDto;
import com.groom.orbit.goal.app.dto.response.RecommendQuestListResponseDto;
import com.groom.orbit.member.app.dto.response.GetFeedbackResponseDto;
import com.groom.orbit.resume.app.dto.GetResumeResponseDto;
Expand All @@ -9,7 +9,7 @@ public interface AiService {

GetFeedbackResponseDto getMemberFeedback(String interestJobs, GetResumeResponseDto dto);

CreateGoalRequestDto recommendGoal(Long memberId);
RecommendGoalListResponseDto recommendGoal(Long memberId);

RecommendQuestListResponseDto recommendQuest(Long memberId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import com.groom.orbit.ai.app.AiService;
import com.groom.orbit.ai.app.VectorService;
import com.groom.orbit.ai.dao.vector.Vector;
import com.groom.orbit.goal.app.dto.request.CreateGoalRequestDto;
import com.groom.orbit.goal.app.dto.response.RecommendGoalListResponseDto;
import com.groom.orbit.goal.app.dto.response.RecommendQuestListResponseDto;
import com.groom.orbit.member.app.dto.response.GetFeedbackResponseDto;
import com.groom.orbit.resume.app.dto.GetResumeResponseDto;
Expand Down Expand Up @@ -66,8 +66,9 @@ public GetFeedbackResponseDto getMemberFeedback(String interestJobs, GetResumeRe
}

@Override
public CreateGoalRequestDto recommendGoal(Long memberId) {
BeanOutputConverter<CreateGoalRequestDto> converter = getConverter(CreateGoalRequestDto.class);
public RecommendGoalListResponseDto recommendGoal(Long memberId) {
BeanOutputConverter<RecommendGoalListResponseDto> converter =
getConverter(RecommendGoalListResponseDto.class);
String format = converter.getFormat();
List<Vector> similarVectors = vectorService.findSimilarVector(memberId);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package com.groom.orbit.goal.app.command;

import java.util.List;
import java.util.stream.IntStream;

import org.springframework.stereotype.Service;

import com.groom.orbit.ai.app.AiService;
import com.groom.orbit.goal.app.dto.request.CreateGoalRequestDto;
import com.groom.orbit.goal.app.dto.response.GetRecommendGoalListResponseDto;
import com.groom.orbit.goal.app.dto.response.GetRecommendGoalResponseDto;
import com.groom.orbit.goal.app.dto.response.RecommendGoalListResponseDto;
import com.groom.orbit.goal.app.dto.response.RecommendGoalResponseDto;
import com.groom.orbit.goal.dao.entity.Goal;

import lombok.RequiredArgsConstructor;
Expand All @@ -16,10 +21,26 @@ public class GoalRecommendService {
private final GoalCommandService goalCommandService;
private final AiService aiService;

public GetRecommendGoalResponseDto createRecommendGoal(Long memberId) {
CreateGoalRequestDto dto = aiService.recommendGoal(memberId);
Goal goal = goalCommandService.upsert(dto.title(), dto.category());
public GetRecommendGoalListResponseDto createRecommendGoal(Long memberId) {
RecommendGoalListResponseDto dtos = aiService.recommendGoal(memberId);
dtos.items().forEach(dto -> goalCommandService.upsert(dto.title(), dto.category()));
List<Goal> newGoals =
dtos.items().stream()
.map(dto -> goalCommandService.upsert(dto.title(), dto.category()))
.toList();

return new GetRecommendGoalListResponseDto(convertToDto(newGoals, dtos));
}

return new GetRecommendGoalResponseDto(goal.getGoalId(), dto.title(), dto.category());
private static List<GetRecommendGoalResponseDto> convertToDto(
List<Goal> newGoals, RecommendGoalListResponseDto dtos) {
return IntStream.range(0, newGoals.size())
.mapToObj(
i -> {
RecommendGoalResponseDto dto = dtos.items().get(i);
return new GetRecommendGoalResponseDto(
newGoals.get(i).getGoalId(), dto.title(), dto.category(), dto.descriptions());
})
.toList();
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.groom.orbit.goal.app.dto.response;

import java.util.List;

public record GetRecommendGoalListResponseDto(List<GetRecommendGoalResponseDto> items) {}
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
package com.groom.orbit.goal.app.dto.response;

public record GetRecommendGoalResponseDto(Long goalId, String title, String category) {}
import java.util.List;

public record GetRecommendGoalResponseDto(
Long goalId, String title, String category, List<String> descriptions) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.groom.orbit.goal.app.dto.response;

import java.util.List;

public record RecommendGoalListResponseDto(List<RecommendGoalResponseDto> items) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.groom.orbit.goal.app.dto.response;

import java.util.List;

public record RecommendGoalResponseDto(String title, String category, List<String> descriptions) {}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import com.groom.orbit.common.annotation.AuthMember;
import com.groom.orbit.common.dto.ResponseDto;
import com.groom.orbit.goal.app.command.GoalRecommendService;
import com.groom.orbit.goal.app.dto.response.GetRecommendGoalResponseDto;
import com.groom.orbit.goal.app.dto.response.GetRecommendGoalListResponseDto;

import lombok.RequiredArgsConstructor;

Expand All @@ -19,7 +19,8 @@ public class GoalRecommendController {
private final GoalRecommendService goalRecommendService;

@PostMapping("/recommend")
public ResponseDto<GetRecommendGoalResponseDto> creatRecommendGoal(@AuthMember Long memberId) {
public ResponseDto<GetRecommendGoalListResponseDto> creatRecommendGoal(
@AuthMember Long memberId) {
return ResponseDto.ok(goalRecommendService.createRecommendGoal(memberId));
}
}
1 change: 1 addition & 0 deletions src/main/resources/templates/ai-feedback-prompt.txt
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
- 가독성을 고려해주세요
- 내용에 따라 문단을 나누어 작성해주세요
- 문장이 길어지면 개행을 해주세요
- 문장은 존댓말을 써서 답변해주세요

# 응답 포맷
{format}
43 changes: 39 additions & 4 deletions src/main/resources/templates/goal-recommend-prompt.txt
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
# 상황
저의 관심 직무는 {job}입니다.

{myGoal}는 제가 여태까지 작성했던 목표입니다.
{goalList}에 포함된 목표 중 제가 아직 수행하지 않은 목표를 선택하려고 합니다.
{goalList}에 포함된 목표 중 저의 목표와 관련성이 가장 높은 목표를 하나 선택해주세요.
{goalList}에 포함된 목표 중 저의 목표와 관련성이 가장 높은 목표 *세 개*를 선택해주세요.
{goalList}에서 선택한 목표가 {job}과 관련이 있는지 판단해주세요.
만약 {job}과 관련이 없다면, {job}과 {myGoal}을 기준으로 새로운 목표를 만들어주세요.
새로운 목표는 {myGoal}과 같으면 안됩니다.

목표의 카테고리(goalCategory)는 다음과 같습니다.
# 조건
## 조건1
각 목표의 카테고리(goalCategory)는 다음과 같습니다.
- 자격·어학·수상
- 경험·활동·교육
- 경력
Expand All @@ -16,8 +19,40 @@
제시해주시는 목표는 goalCategory 중 하나의 카테고리에 포함되어야 합니다.
제시해주시는 목표와 goalCategory는 연관성이 있어야 합니다.

## 조건
- 새로운 목표의 종결 어미는 "~하기"여야 합니다.
## 조건2
새로운 목표의 종결 어미는 "~하기"여야 합니다.

## 조건3
- 해당 목표를 왜 추천했는지에 대한 설명(descriptions)을 같이 작성해주세요.
- descriptions에 나오는 내용은 "~요" 어미로 끝나야 해요.
- descriptions의 개수는 2 ~ 3개를 반드시 포함해요.
- descriptions의 내용이 해당 목표를 추천한 이유가 맞는지 다시 한 번 생각하고 답변해주세요.

## 예시 데이터
1)
- input
- "myGoal": ["SpringMVC 공부하기", "DDD 개념 이해하기", "클린 아키텍처 구현해보기"]
- output
- "title": "EDA에 대해 공부해보기", "goalCategory": "경험·활동·교육", "descriptions": ["다양한 IT 기업에 지원할 수 있어요", "분산 아키텍처에 대한 이해도를 높일 수 있어요"]
- "title": "SpringCloud 공부해보기", "goalCategory": "경험·활동·교육", "descriptions": ["scale out 가능한 아키텍처에 대해 공부해볼 수 있어요", "분산 아키텍처를 직접 만들어보며 이해도를 높일 수 있어요"]
- "title": "AWS를 이용해 EDA를 적용하기", "goalCategory": "경력", "descriptions": ["로컬 환경에서 벗어나 배포 환경을 분산 아키텍처로 구성해볼 수 있어요", "IT 기업에 지원할 때 우대 받을 수 있어요"]

2)
- input
- "myGoal": ["미적분학 A+받기", "선형대수학 A+받기", "과탑하기"]
- output
- "title": "해석학 공부해보기", "goalCategory": "경험·활동·교육", "descriptions": ["다양한 수학 분야를 경험해볼 수 있어요", "앞서 배운 내용을 응용해 대학 수학에 대한 이해도를 높일 수 있어요"]
- "title": "수학 경시대회 나가서 수상해보기", "goalCategory": "자격·어학·수상", "descriptions": ["관련 직무에 지원할 때 우대를 받을 수 있어요", "공부한 실력을 검증해볼 수 있어요"]
- "title": "수학과 취업 시장 조사하기", "goalCategory": "경력", "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": ["일본 현지인들과 함께 생활해보는 경험을 할 수 있어요", "일본어 어학 관련 기업에 지원할 때 우대 받을 수 있어요"]

# 응답 포맷
{format}
2 changes: 1 addition & 1 deletion src/main/resources/templates/quest-recommend-prompt.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

- {myQuest}는 제가 여태까지 작성했던 목표입니다.
- {questList}에 포함된 퀘스트 중 제가 아직 수행하지 않은 퀘스트를 선택하려고 합니다.
- {questList}에 포함된 퀘스트 중 저의 직무, 목표와 관련성이 가장 높은 퀘스트를 세 개 선택해주세요.
- {questList}에 포함된 퀘스트 중 저의 직무, 목표와 관련성이 가장 높은 퀘스트를 *세 개* 선택해주세요.
- {questList}에서 선택한 퀘스트가 {job}, {goal}과 관련이 있는지 판단해주세요.
- 만약 선택된 퀘스트가 {job} 또는 {goal} 과 관련이 없다면, {job}과 {goal}, {myQuest}을 기준으로 새로운 퀘스트를 만들어주세요.
- 새로운 퀘스트는 {myQuest}에 해당되면 안됩니다. 해당되지 않는다는 것은 비슷한 내용도 포함됩니다.
Expand Down
Loading