From f236511717d62d3b60b821dc7ccc6f1f143d9ecf Mon Sep 17 00:00:00 2001 From: Jeyong Date: Sun, 4 May 2025 16:09:25 +0900 Subject: [PATCH] =?UTF-8?q?[fix]=20=EC=B1=84=ED=8C=85=20-=20LLM=20?= =?UTF-8?q?=EC=84=9C=EB=B2=84=20=EC=97=B0=EA=B2=B0=20=EB=B0=8F=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Chat/controller/ChatController.java | 8 ++----- .../domain/Chat/dto/request/Prompt.java | 2 +- .../weakness/domain/Chat/entity/Chat.java | 1 + .../domain/Chat/service/ChatService.java | 10 ++++----- .../domain/Chat/service/LLMClient.java | 21 +++++++++---------- .../domain/common/enums/ChatRole.java | 9 +++++++- 6 files changed, 26 insertions(+), 25 deletions(-) diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/controller/ChatController.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/controller/ChatController.java index 57fb5ac..5ee323a 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/controller/ChatController.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/controller/ChatController.java @@ -4,8 +4,6 @@ import MathCaptain.weakness.domain.Chat.dto.request.LLMRequest; import MathCaptain.weakness.domain.Chat.dto.response.ChatResponse; import MathCaptain.weakness.domain.Chat.service.ChatService; -import MathCaptain.weakness.domain.User.entity.Users; -import MathCaptain.weakness.global.annotation.LoginUser; import lombok.RequiredArgsConstructor; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.simp.SimpMessagingTemplate; @@ -41,9 +39,7 @@ public void handleChat(ChatRequest request) { template.convertAndSend("/sub/" + request.getUserId(), chatResponse); // 2) LLM 호출 & 응답 저장 + 브로드캐스트 (동기 방식) - List llmResponses = chatService.askAI(request); - llmResponses.forEach(aiResp -> - template.convertAndSend("/sub/" + request.getUserId(), aiResp) - ); + ChatResponse llmResponse = chatService.askAI(request); + template.convertAndSend("/sub/" + request.getUserId(), llmResponse); } } diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/dto/request/Prompt.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/dto/request/Prompt.java index 21f963d..843727e 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/dto/request/Prompt.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/dto/request/Prompt.java @@ -18,7 +18,7 @@ public class Prompt { private List history; private Prompt(Long userId, String message, List history) { - this.template = "다음 내용을 참고하여 답변해줘"; + this.template = "질문의 내용에 답변을 할 때 사용자의 활동기록과 문서에서 검색된 내용이 필요하면 참고해서 답변해줘"; this.inputs = Map.of( "user_id", userId.toString(), "user_question", message diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/entity/Chat.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/entity/Chat.java index 8cd864a..b1f80fc 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/entity/Chat.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/entity/Chat.java @@ -29,6 +29,7 @@ public class Chat { @Enumerated(EnumType.STRING) private ChatRole role; + @Column(columnDefinition = "LONGTEXT") private String message; @CreatedDate diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/service/ChatService.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/service/ChatService.java index cf35a82..0ff1521 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/service/ChatService.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/service/ChatService.java @@ -15,7 +15,7 @@ @Slf4j @Service @RequiredArgsConstructor -@Transactional(readOnly = true) +@Transactional public class ChatService { private final ChatRepository chatRepository; @@ -28,15 +28,13 @@ public ChatResponse saveUserMessage(ChatRequest request) { return ChatResponse.of(saved); } - public List askAI(ChatRequest request) { + public ChatResponse askAI(ChatRequest request) { List history = chatRepository.findAllByUserIdOrderBySendTimeAsc(request.getUserId()).stream() .map(ChatResponse::of) .toList(); - List aiChats = llm.call(history, request); - return aiChats.stream() - .map(this::storeAndTransform) - .toList(); + Chat aiChats = llm.call(history, request); + return storeAndTransform(aiChats); } @Transactional diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/service/LLMClient.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/service/LLMClient.java index 9dd29d2..1d4316b 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/service/LLMClient.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/service/LLMClient.java @@ -8,6 +8,7 @@ import groovy.util.logging.Slf4j; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.client.HttpClientErrorException; @@ -31,33 +32,31 @@ public class LLMClient { @Value("${llm.server.url}") private String baseUrl; - public List call(List history, ChatRequest request) { + public Chat call(List history, ChatRequest request) { try { LLMRequest llmRequest = LLMRequest.of(request, history); - ResponseEntity response = restTemplate.postForEntity( + ResponseEntity response = restTemplate.postForEntity( // TODO : 엔드포인트 수정 - baseUrl + "/v1/chat", + baseUrl + "/mcp/query", llmRequest, // 응답을 ChatResponse[] (배열)로 역직렬화 (수정 필요) - ChatResponse[].class + ChatResponse.class ); - ChatResponse[] body = response.getBody(); + ChatResponse body = response.getBody(); if (body == null) { - return Collections.emptyList(); + throw new HttpServerErrorException(HttpStatus.NOT_ACCEPTABLE, "LLM이 응답하지 않습니다"); } - return Arrays.stream(body) - .map(Chat::of) - .collect(Collectors.toList()); + return Chat.of(body); } catch (ResourceAccessException timeoutEx) { log.error("LLM 서버 응답 지연", timeoutEx); - return List.of(); + throw new ResourceAccessException("LLM 서버 응답 지연"); } catch (HttpClientErrorException | HttpServerErrorException httpEx) { // 4XX/5XX 응답 log.error("LLM 호출 실패: {}", httpEx.getStatusCode(), httpEx); - return List.of(); + throw new HttpClientErrorException(HttpStatus.NOT_ACCEPTABLE, "LLM 호출 실패"); } } } \ No newline at end of file diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/common/enums/ChatRole.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/common/enums/ChatRole.java index e1f9cac..d47ed9e 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/common/enums/ChatRole.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/common/enums/ChatRole.java @@ -1,6 +1,13 @@ package MathCaptain.weakness.domain.common.enums; +import com.fasterxml.jackson.annotation.JsonCreator; + public enum ChatRole { USER, - ASSISTANT + ASSISTANT; + + @JsonCreator + public static ChatRole fromValue(String value) { + return ChatRole.valueOf(value.toUpperCase()); + } }