Skip to content
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
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -91,14 +92,6 @@ public Flux<ChatResponse> sendMessage(Long memberId, ChatRequest chatChatRequest
.onErrorResume(throwable -> Flux.just(handleError(history))); // 에러 발생 시 에러 핸들링 -> 재전송 유도
}

// 키워드 추출 메서드
public <T> T keywordExtract(String content, String promptTemplate, Class<T> classType) {
String prompt = promptTemplate + content;
return chatClient.prompt(new Prompt(new UserMessage(prompt)))
.call()
.entity(classType);
}

private ChatResponse ChatResponse(History history, String fullResponse, List<Document> cases, List<Document> laws) {
return ChatResponse.builder()
.roomId(history.getHistoryId())
Expand Down Expand Up @@ -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());

Expand All @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -11,10 +14,20 @@
@RequiredArgsConstructor
public class KeywordService {

private final ChatClient chatClient;

private final KeywordRankRepository keywordRepository;

public List<KeywordRank> getTop5KeywordRanks() {
return keywordRepository.findTop5ByOrderByScoreDesc();
}

// 키워드 추출 메서드
public <T> T keywordExtract(String content, String promptTemplate, Class<T> classType) {
String prompt = promptTemplate + content;
return chatClient.prompt(new Prompt(new UserMessage(prompt)))
.call()
.entity(classType);
}

}
42 changes: 27 additions & 15 deletions backend/src/main/resources/system-prompt.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
]
---

이제 아래 문장에서 위의 규칙을 엄격히 준수하여 핵심 키워드 **단 하나**를 추출해주세요:
""";
이제 아래 문장에서 규칙을 엄격히 준수하여 JSON만 출력하세요:
"""