diff --git a/backend/src/main/java/com/ai/lawyer/domain/chatbot/service/ChatBotService.java b/backend/src/main/java/com/ai/lawyer/domain/chatbot/service/ChatBotService.java index 4eed34d9..ef9c8ccc 100644 --- a/backend/src/main/java/com/ai/lawyer/domain/chatbot/service/ChatBotService.java +++ b/backend/src/main/java/com/ai/lawyer/domain/chatbot/service/ChatBotService.java @@ -37,6 +37,7 @@ public class ChatBotService { private final QdrantService qdrantService; private final HistoryService historyService; + private final KeywordService keywordService; private final ChatRepository chatRepository; private final HistoryRepository historyRepository; @@ -91,14 +92,6 @@ public Flux sendMessage(Long memberId, ChatRequest chatChatRequest .onErrorResume(throwable -> Flux.just(handleError(history))); // 에러 발생 시 에러 핸들링 -> 재전송 유도 } - // 키워드 추출 메서드 - public T keywordExtract(String content, String promptTemplate, Class classType) { - String prompt = promptTemplate + content; - return chatClient.prompt(new Prompt(new UserMessage(prompt))) - .call() - .entity(classType); - } - private ChatResponse ChatResponse(History history, String fullResponse, List cases, List laws) { return ChatResponse.builder() .roomId(history.getHistoryId()) @@ -161,7 +154,7 @@ private void handlerTasks(ChatRequest chatDto, History history, String fullRespo } private void extractAndUpdateKeywordRanks(String message) { - KeywordExtractionDto keywordResponse = keywordExtract(message, keywordExtraction, KeywordExtractionDto.class); + KeywordExtractionDto keywordResponse = keywordService.keywordExtract(message, keywordExtraction, KeywordExtractionDto.class); KeywordRank keywordRank = keywordRankRepository.findByKeyword(keywordResponse.getKeyword()); @@ -180,7 +173,7 @@ private void extractAndUpdateKeywordRanks(String message) { private void setHistoryTitle(ChatRequest chatDto, History history, String fullResponse) { String targetText = fullResponse.contains("해당 질문은 법률") ? chatDto.getMessage() : fullResponse; - TitleExtractionDto titleDto = keywordExtract(targetText, titleExtraction, TitleExtractionDto.class); + TitleExtractionDto titleDto = keywordService.keywordExtract(targetText, titleExtraction, TitleExtractionDto.class); history.setTitle(titleDto.getTitle()); historyRepository.save(history); } diff --git a/backend/src/main/java/com/ai/lawyer/domain/chatbot/service/KeywordService.java b/backend/src/main/java/com/ai/lawyer/domain/chatbot/service/KeywordService.java index af0e1d4b..e246dbfa 100644 --- a/backend/src/main/java/com/ai/lawyer/domain/chatbot/service/KeywordService.java +++ b/backend/src/main/java/com/ai/lawyer/domain/chatbot/service/KeywordService.java @@ -3,6 +3,9 @@ import com.ai.lawyer.domain.chatbot.entity.KeywordRank; import com.ai.lawyer.domain.chatbot.repository.KeywordRankRepository; import lombok.RequiredArgsConstructor; +import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.chat.messages.UserMessage; +import org.springframework.ai.chat.prompt.Prompt; import org.springframework.stereotype.Service; import java.util.List; @@ -11,10 +14,20 @@ @RequiredArgsConstructor public class KeywordService { + private final ChatClient chatClient; + private final KeywordRankRepository keywordRepository; public List getTop5KeywordRanks() { return keywordRepository.findTop5ByOrderByScoreDesc(); } + // 키워드 추출 메서드 + public T keywordExtract(String content, String promptTemplate, Class classType) { + String prompt = promptTemplate + content; + return chatClient.prompt(new Prompt(new UserMessage(prompt))) + .call() + .entity(classType); + } + } diff --git a/backend/src/main/resources/system-prompt.yml b/backend/src/main/resources/system-prompt.yml index 901ae80d..91139cfd 100644 --- a/backend/src/main/resources/system-prompt.yml +++ b/backend/src/main/resources/system-prompt.yml @@ -26,22 +26,34 @@ custom: title-extraction: "다음 문장의 핵심을 요약하여 간결한 제목을 만들어줘: " keyword-extraction: | - 1. 오직 가장 중요하고 대표적인 키워드 **하나**만 추출해야 합니다. - 2. 절대로 콤마(,)로 구분된 여러 키워드를 하나의 문자열로 합쳐서 만들면 안 됩니다. - 3. 응답은 반드시 아래 JSON 형식에 맞춰 'keywords' 리스트에 **단 하나의 문자열**만 포함해야 합니다. + 당신은 키워드 추출기입니다. 반드시 아래 지침을 절대적으로 따라야 합니다. + + 1. 오직 **가장 중요하고 대표적인 키워드 하나만** 추출해야 합니다. + 2. 여러 개의 키워드를 추출하거나, 콤마(,)나 공백으로 구분된 여러 단어를 하나의 문자열로 합치는 것은 금지입니다. + 3. 반드시 JSON 형식으로만 답변해야 하며, 'keyword' 리스트에는 문자열이 단 하나만 포함되어야 합니다. + 4. 예시 외의 설명, 추가 텍스트, 주석은 절대 출력하지 마세요. JSON만 출력하세요. --- - **예시 1:** - - 입력 문장: 아파트 층간소음 문제로 다투던 중 이웃을 폭행하여 상해를 입혔습니다. - - 올바른 JSON 응답: - { - "keywords": ["폭행"] - } - - 잘못된 JSON 응답: - { - "keywords": ["층간소음, 폭행, 상해"] - } + 올바른 예시: + 입력: "아파트 층간소음 문제로 다투던 중 이웃을 폭행하여 상해를 입혔습니다." + 출력: + [ + { + "id": 1, + "keyword": "폭행" + "socre": 1 + } + ] + + 잘못된 예시: + [ + { + "id": 1, + "keyword": "폭행, 상해, 층간소음, 이웃" + "socre": 1 + } + ] --- - 이제 아래 문장에서 위의 규칙을 엄격히 준수하여 핵심 키워드 **단 하나**를 추출해주세요: - """; \ No newline at end of file + 이제 아래 문장에서 위 규칙을 엄격히 준수하여 JSON만 출력하세요: + """ \ No newline at end of file