Skip to content

Commit a28a876

Browse files
authored
Merge pull request #97 from git1uv/feature/#96
�Feat : 챗봇 개인화 프롬프트 수정
2 parents 443fdb0 + 0b225e3 commit a28a876

File tree

3 files changed

+20
-4
lines changed

3 files changed

+20
-4
lines changed

src/main/java/com/simter/domain/chatbot/controller/ChatbotController.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,12 @@ public ApiResponse<SelectChatbotResponseDto> createChatbotSession(
7575

7676
@Operation(summary = "챗봇과의 대화 API", description = "챗봇 채팅 API")
7777
@PostMapping("/chatting")
78-
public Mono<ApiResponse<ClaudeResponseDto>> chatting(
78+
public Mono<ApiResponse<ClaudeResponseDto>> chatting(HttpServletRequest request,
7979
@RequestBody ClaudeRequestDto requestDto,
8080
@RequestParam Long counselingLogId) {
81-
return claudeAPIService.chatWithClaude(requestDto, counselingLogId)
81+
JwtTokenDto token = jwtTokenProvider.resolveToken(request);
82+
String email = jwtTokenProvider.getEmail(token.getAccessToken());
83+
return claudeAPIService.chatWithClaude(requestDto, counselingLogId, email)
8284
.map(response -> ApiResponse.onSuccessCustom(SuccessStatus.CHATBOT_CHATTING, response));
8385
}
8486

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package com.simter.domain.chatbot.repository;
22

33
import com.simter.domain.chatbot.entity.Opinion;
4+
import java.util.List;
45
import org.springframework.data.jpa.repository.JpaRepository;
6+
import org.springframework.data.jpa.repository.Query;
7+
import org.springframework.data.repository.query.Param;
58

69
public interface OpinionRepository extends JpaRepository<Opinion, Long> {
7-
10+
@Query("SELECT o FROM Opinion o WHERE o.member.email = :email ORDER BY o.createdAt DESC")
11+
List<Opinion> findTop3ByMemberEmailOrderByCreatedAtDesc(@Param("email") String email);
812
}

src/main/java/com/simter/domain/chatbot/service/ClaudeAPIService.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@
1313
import com.simter.domain.chatbot.dto.CounselingResponseDto;
1414
import com.simter.domain.chatbot.entity.ChatbotMessage;
1515
import com.simter.domain.chatbot.entity.CounselingLog;
16+
import com.simter.domain.chatbot.entity.Opinion;
1617
import com.simter.domain.chatbot.entity.Solution;
1718
import com.simter.domain.chatbot.repository.ChatbotRepository;
1819
import com.simter.domain.chatbot.repository.CounselingLogRepository;
20+
import com.simter.domain.chatbot.repository.OpinionRepository;
1921
import com.simter.domain.chatbot.repository.SolutionRepository;
2022
import com.simter.domain.mail.converter.MailConverter;
2123
import com.simter.domain.mail.entity.Mail;
@@ -63,6 +65,7 @@ public class ClaudeAPIService {
6365
private final CounselingLogRepository counselingLogRepository;
6466
private final SolutionRepository solutionRepository;
6567
private final CalendarsRepository calendarsRepository;
68+
private final OpinionRepository opinionRepository;
6669

6770
// Claude API를 호출
6871
private Mono<String> callClaudeAPI(String systemPrompt, String conversationContext, int maxTokens) {
@@ -105,7 +108,7 @@ private Mono<String> callClaudeAPI(String systemPrompt, String conversationConte
105108
}
106109

107110
@Transactional
108-
public Mono<ClaudeResponseDto> chatWithClaude(ClaudeRequestDto request, Long counselingLogId) {
111+
public Mono<ClaudeResponseDto> chatWithClaude(ClaudeRequestDto request, Long counselingLogId, String email) {
109112
CounselingLog counselingLog = counselingLogRepository.findById(counselingLogId)
110113
.orElseThrow(() -> new ErrorHandler(ErrorStatus.CHATBOT_SESSION_NOT_FOUND));
111114
String chatbotType = counselingLog.getChatbotType();
@@ -125,6 +128,12 @@ public Mono<ClaudeResponseDto> chatWithClaude(ClaudeRequestDto request, Long cou
125128

126129
// 프롬프트 선택
127130
String chatbotPrompt = selectSystemPrompt(chatbotType);
131+
132+
String opinion = opinionRepository.findTop3ByMemberEmailOrderByCreatedAtDesc(email).stream()
133+
.map(Opinion::getContent)
134+
.collect(Collectors.joining(", "));
135+
136+
128137
String systemPrompt = "<systemPrompt>"
129138
+ "<redflag>"
130139
+ "사용자의 currentMessage가 위험한 내용이나 우울증과 관련된 신호를 포함하는지 판단할 때는, 단순히 부정적인 단어만으로 판단하지 말고 전체적인 문맥을 반드시 고려해야 해 위험 신호는 사용자가 극단적인 감정을 표현하는 경우가 많지만, 이 표현이 반드시 위험한 상태를 의미하는 것은 아니야. 예를 들어, '죽고싶어'나 '죽을 거 같아'와 같은 직접적인 표현은 위험 신호로 간주될 수 있지만, 이런 표현이 사용자의 기분이나 상황을 정확히 반영하지 않을 수 있어. 다음은 부정적인 단어가 포함되어 있지만, 전체적인 의미는 긍정적인 경우의 예시야:\n"
@@ -147,6 +156,7 @@ public Mono<ClaudeResponseDto> chatWithClaude(ClaudeRequestDto request, Long cou
147156
+ "</emotion>"
148157
+ "<message>"
149158
+ "You are a psychological counselor. Your role is to provide empathetic and supportive responses to users seeking advice or sharing their experiences.\n"
159+
+ "And please respond by reflecting the following user feedback." + opinion
150160
+ "Keep this summary between 300 and 350 characters."
151161
+ "</message>"
152162
+ "<example>"

0 commit comments

Comments
 (0)