Skip to content

Commit d1eb489

Browse files
authored
Merge pull request #32 from TeamAiary/feat/#31-prompt-engineering
feat : 프롬프트와 모델 변경
2 parents 14a2365 + 1819ebb commit d1eb489

2 files changed

Lines changed: 24 additions & 13 deletions

File tree

src/main/java/com/aiary/be/report/application/ReportClient.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.aiary.be.global.annotation.Client;
55

66
import com.aiary.be.report.application.dto.AiResponse;
7+
import com.aiary.be.report.domain.ReportType;
78
import lombok.extern.slf4j.Slf4j;
89
import org.springframework.beans.factory.annotation.Value;
910
import org.springframework.web.reactive.function.client.WebClient;
@@ -25,11 +26,11 @@ public ReportClient(WebClient.Builder webClientBuilder) {
2526
this.webClient = webClientBuilder.baseUrl("https://api.openai.com/v1").build();
2627
}
2728

28-
public Mono<AiResponse> analyze(Long userId, List<DiaryInfo> diaryInfos) {
29-
String prompt = buildPrompt(diaryInfos);
29+
public Mono<AiResponse> analyze(Long userId, List<DiaryInfo> diaryInfos, ReportType reportType) {
30+
String prompt = buildPrompt(diaryInfos, reportType);
3031

3132
Map<String, Object> requestBody = new HashMap<>();
32-
requestBody.put("model", "gpt-3.5-turbo");
33+
requestBody.put("model", "gpt-4o-mini");
3334
requestBody.put("messages", List.of(Map.of("role", "user", "content", prompt)));
3435

3536
return webClient.post()
@@ -49,8 +50,20 @@ public Mono<AiResponse> analyze(Long userId, List<DiaryInfo> diaryInfos) {
4950
});
5051
}
5152

52-
private String buildPrompt(List<DiaryInfo> diaryInfos) {
53-
StringBuilder prompt = new StringBuilder("아래의 사용자의 일기를 읽고 우울감과 같은 심리 지표를 분석하고, 간단한 조언을 포함한 리포트를 작성해줘.\n");
53+
private String buildPrompt(List<DiaryInfo> diaryInfos, ReportType reportType) {
54+
String startStr = reportType.equals(ReportType.WEEKLY) ?
55+
"아래는 사용자가 이번 주에 작성한 일기야.\n" : "아래는 사용자가 이번 달에 작성한 일기야.\n";
56+
57+
StringBuilder prompt = new StringBuilder(startStr);
58+
prompt.append("아래의 일기들을 읽고, 사용자에게 공감과 위로가 담긴 따뜻한 리포트를 작성해 줘.\n");
59+
prompt.append("리포트에는 다음 내용을 포함해:\n");
60+
prompt.append("1. 일기를 읽고 느낀 전반적인 감정과 분위기 요약\n");
61+
prompt.append("2. 사용자에게 공감과 위로의 말\n");
62+
prompt.append("3. 오늘 하루를 되돌아볼 수 있는 질문 또는 생각할 거리\n");
63+
prompt.append("4. 앞으로의 마음가짐이나 행동에 도움이 될 수 있는 따뜻한 조언\n");
64+
prompt.append("너무 차갑거나 기계적으로 분석하지 말고, 진심 어린 친구처럼 부드럽고 따뜻하게 작성해 줘.\n");
65+
prompt.append("일기는 오직 Plain text로만 작성하고, 마크다운 문법을 사용하지 않아야 해\n");
66+
prompt.append("그리고, 1, 2, 3, 4 이런식의 첨자를 사용하지 말고 평서문으로 작성해줘\n");
5467

5568
for (int i = 0; i < diaryInfos.size(); i++) {
5669
prompt.append("\n일기 ")
@@ -62,8 +75,6 @@ private String buildPrompt(List<DiaryInfo> diaryInfos) {
6275
.append("\n");
6376
}
6477

65-
prompt.append("\n\n분석의 형식은 두 줄로, 첫 줄에는 리포트의 제목을, 두 번째 줄에는 리포트의 내용을 적어줘");
66-
6778
log.info(prompt.toString());
6879
return prompt.toString();
6980
}

src/main/java/com/aiary/be/report/application/ReportFacade.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,10 @@ public void createReport(ReportType reportType) {
4848

4949
// 유저-주간 다이어리 쌍
5050
Map<Long, List<DiaryInfo>> userIdDiary = users.stream()
51-
.collect(Collectors.toMap(
52-
User::getId,
53-
user -> diaryService.readDiaryInfos(user.getId(), searchRange)
54-
));
51+
.map(user -> Map.entry(user.getId(), diaryService.readDiaryInfos(user.getId(), searchRange)))
52+
.filter(entry -> !entry.getValue().isEmpty())
53+
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
54+
5555
// 유저-주간 감정 쌍
5656
Map<Long, Emotion> userIdEmotion = userIdDiary.keySet().stream()
5757
.collect(Collectors.toMap(
@@ -70,15 +70,15 @@ public void createReport(ReportType reportType) {
7070

7171
// 핵심 : 외부 api 호출을 non-blocking으로 하고, 이후에 응답을 모아서 한 번에 bulk로 저장
7272
Flux.fromIterable(userIdDiary.entrySet())
73-
.flatMap(entry -> reportClient.analyze(entry.getKey(), entry.getValue()))
73+
.flatMap(entry -> reportClient.analyze(entry.getKey(), entry.getValue(), reportType))
7474
.collectList()
7575
.publishOn(Schedulers.boundedElastic())
7676
.flatMap((apiResponses) -> {
7777
List<Report> reports = new ArrayList<>();
7878
for (AiResponse apiResponse : apiResponses) {
7979
reports.add(new Report(
8080
userIdMap.get(apiResponse.userId()),
81-
start + " - " + end,
81+
start + "부터 " + end + "까지의 리포트입니다.",
8282
apiResponse.content(),
8383
reportType,
8484
start,

0 commit comments

Comments
 (0)