From fffb4bf2db2d588e168af493beaa05f8c05a7e20 Mon Sep 17 00:00:00 2001 From: Jeyong Date: Sun, 4 May 2025 15:25:39 +0900 Subject: [PATCH] =?UTF-8?q?[fix]=20=EC=B1=84=ED=8C=85=20-=20LLM=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Chat/controller/ChatController.java | 14 ++++++-- .../domain/Chat/dto/request/LLMRequest.java | 24 +++++++------- .../domain/Chat/dto/request/Prompt.java | 32 +++++++++++++++++++ .../domain/Chat/service/ChatService.java | 19 ++++++++--- .../domain/Chat/service/LLMClient.java | 2 +- 5 files changed, 71 insertions(+), 20 deletions(-) create mode 100644 MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/dto/request/Prompt.java 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 1cf0370..57fb5ac 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 @@ -1,6 +1,7 @@ package MathCaptain.weakness.domain.Chat.controller; import MathCaptain.weakness.domain.Chat.dto.request.ChatRequest; +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; @@ -8,9 +9,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.simp.SimpMessagingTemplate; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + import java.util.List; @RestController @@ -26,6 +26,14 @@ public List getHistory(@PathVariable Long userId) { return chatService.getHistory(userId); } + @PostMapping("/chat/test/{userId}") + public LLMRequest test( + @PathVariable Long userId, + @RequestBody ChatRequest request + ) { + return chatService.test(userId, request); + } + @MessageMapping("/chat.send") // 클라이언트 → /app/chat.send public void handleChat(ChatRequest request) { // 1) 유저 메시지 저장 + 클라이언트에게 에코 diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/dto/request/LLMRequest.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/dto/request/LLMRequest.java index fae5251..d15a0dd 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/dto/request/LLMRequest.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/dto/request/LLMRequest.java @@ -1,29 +1,31 @@ package MathCaptain.weakness.domain.Chat.dto.request; -import MathCaptain.weakness.domain.Chat.entity.Chat; -import MathCaptain.weakness.domain.User.entity.Users; +import MathCaptain.weakness.domain.Chat.dto.response.ChatResponse; import lombok.Getter; import lombok.NoArgsConstructor; +import java.util.HashMap; import java.util.List; +import java.util.Map; @Getter @NoArgsConstructor public class LLMRequest { - private Long userId; + private Prompt prompt; - private String message; + private Map resources; - private List history; + private List tools; - private LLMRequest(Long userId, String message, List history) { - this.userId = userId; - this.message = message; - this.history = history; + private LLMRequest(Prompt prompt) { + this.prompt = prompt; + this.resources = new HashMap<>(); + this.tools = List.of(); } - public static LLMRequest of(ChatRequest request, List history) { - return new LLMRequest(request.getUserId(), request.getMessage(), history); + public static LLMRequest of(ChatRequest request, List history) { + Prompt prompt = Prompt.of(request, history); + return new LLMRequest(prompt); } } 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 new file mode 100644 index 0000000..21f963d --- /dev/null +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/dto/request/Prompt.java @@ -0,0 +1,32 @@ +package MathCaptain.weakness.domain.Chat.dto.request; + +import MathCaptain.weakness.domain.Chat.dto.response.ChatResponse; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Map; + +@Getter +@NoArgsConstructor +public class Prompt { + + private String template; + + private Map inputs; + + private List history; + + private Prompt(Long userId, String message, List history) { + this.template = "다음 내용을 참고하여 답변해줘"; + this.inputs = Map.of( + "user_id", userId.toString(), + "user_question", message + ); + this.history = history; + } + + public static Prompt of(ChatRequest request, List history) { + return new Prompt(request.getUserId(), request.getMessage(), history); + } +} 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 7d69958..cf35a82 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 @@ -1,11 +1,10 @@ package MathCaptain.weakness.domain.Chat.service; import MathCaptain.weakness.domain.Chat.dto.request.ChatRequest; +import MathCaptain.weakness.domain.Chat.dto.request.LLMRequest; import MathCaptain.weakness.domain.Chat.dto.response.ChatResponse; import MathCaptain.weakness.domain.Chat.entity.Chat; import MathCaptain.weakness.domain.Chat.repository.ChatRepository; -import MathCaptain.weakness.domain.User.entity.Users; -import MathCaptain.weakness.domain.common.enums.ChatRole; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -24,15 +23,16 @@ public class ChatService { @Transactional public ChatResponse saveUserMessage(ChatRequest request) { - log.info("userid {}", request.getUserId()); - log.info("message {}", request.getMessage()); Chat message = Chat.of(request); Chat saved = chatRepository.save(message); return ChatResponse.of(saved); } public List askAI(ChatRequest request) { - List history = chatRepository.findAllByUserIdOrderBySendTimeAsc(request.getUserId()); + List history = chatRepository.findAllByUserIdOrderBySendTimeAsc(request.getUserId()).stream() + .map(ChatResponse::of) + .toList(); + List aiChats = llm.call(history, request); return aiChats.stream() .map(this::storeAndTransform) @@ -47,6 +47,15 @@ public List getHistory(Long userId) { .toList(); } + @Transactional + public LLMRequest test(Long userId, ChatRequest request) { + List history = chatRepository.findAllByUserIdOrderBySendTimeAsc(userId).stream() + .map(ChatResponse::of) + .toList(); + + return LLMRequest.of(request, history); + } + private ChatResponse storeAndTransform(Chat message) { Chat saved = chatRepository.save(message); return ChatResponse.of(saved); 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 62d3510..9dd29d2 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 @@ -31,7 +31,7 @@ public class LLMClient { @Value("${llm.server.url}") private String baseUrl; - public List call(List history, ChatRequest request) { + public List call(List history, ChatRequest request) { try { LLMRequest llmRequest = LLMRequest.of(request, history);