From 857ca1bf5a65410d4786de986843ba3ab83bcd17 Mon Sep 17 00:00:00 2001 From: whitenoise13 Date: Mon, 12 May 2025 11:23:33 +0900 Subject: [PATCH 1/2] =?UTF-8?q?Feat::=20=EC=B1=97=EB=B4=87=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80(model:=20gpt-3.5-turbo)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chatbot/controller/ChatbotController.java | 26 ++++++++ .../domain/chatbot/dto/ChatMessage.java | 15 +++++ .../domain/chatbot/dto/ChatRequest.java | 15 +++++ .../domain/chatbot/dto/ChatResponse.java | 25 ++++++++ .../domain/chatbot/dto/OpenAiChatRequest.java | 13 ++++ .../chatbot/service/ChatbotService.java | 62 +++++++++++++++++++ 6 files changed, 156 insertions(+) create mode 100644 src/main/java/Minari/cheongForDo/domain/chatbot/controller/ChatbotController.java create mode 100644 src/main/java/Minari/cheongForDo/domain/chatbot/dto/ChatMessage.java create mode 100644 src/main/java/Minari/cheongForDo/domain/chatbot/dto/ChatRequest.java create mode 100644 src/main/java/Minari/cheongForDo/domain/chatbot/dto/ChatResponse.java create mode 100644 src/main/java/Minari/cheongForDo/domain/chatbot/dto/OpenAiChatRequest.java create mode 100644 src/main/java/Minari/cheongForDo/domain/chatbot/service/ChatbotService.java diff --git a/src/main/java/Minari/cheongForDo/domain/chatbot/controller/ChatbotController.java b/src/main/java/Minari/cheongForDo/domain/chatbot/controller/ChatbotController.java new file mode 100644 index 0000000..e82d71a --- /dev/null +++ b/src/main/java/Minari/cheongForDo/domain/chatbot/controller/ChatbotController.java @@ -0,0 +1,26 @@ +package Minari.cheongForDo.domain.chatbot.controller; + + +import Minari.cheongForDo.domain.chatbot.dto.ChatRequest; +import Minari.cheongForDo.domain.chatbot.dto.ChatResponse; +import Minari.cheongForDo.domain.chatbot.service.ChatbotService; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/chat") +@Tag(name = "CHATBOT", description = "chatbot API") +@RequiredArgsConstructor +public class ChatbotController { + + private final ChatbotService chatbotService; + + @PostMapping + public ChatResponse chat(@RequestBody ChatRequest request) { + return chatbotService.askQuestion(request); + } +} diff --git a/src/main/java/Minari/cheongForDo/domain/chatbot/dto/ChatMessage.java b/src/main/java/Minari/cheongForDo/domain/chatbot/dto/ChatMessage.java new file mode 100644 index 0000000..dc45b6b --- /dev/null +++ b/src/main/java/Minari/cheongForDo/domain/chatbot/dto/ChatMessage.java @@ -0,0 +1,15 @@ +package Minari.cheongForDo.domain.chatbot.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class ChatMessage { + private String role; + private String content; +} diff --git a/src/main/java/Minari/cheongForDo/domain/chatbot/dto/ChatRequest.java b/src/main/java/Minari/cheongForDo/domain/chatbot/dto/ChatRequest.java new file mode 100644 index 0000000..20f8670 --- /dev/null +++ b/src/main/java/Minari/cheongForDo/domain/chatbot/dto/ChatRequest.java @@ -0,0 +1,15 @@ +package Minari.cheongForDo.domain.chatbot.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +@NoArgsConstructor +// 사용자 요청용 +public class ChatRequest { + private String question; +} diff --git a/src/main/java/Minari/cheongForDo/domain/chatbot/dto/ChatResponse.java b/src/main/java/Minari/cheongForDo/domain/chatbot/dto/ChatResponse.java new file mode 100644 index 0000000..61f66b8 --- /dev/null +++ b/src/main/java/Minari/cheongForDo/domain/chatbot/dto/ChatResponse.java @@ -0,0 +1,25 @@ +package Minari.cheongForDo.domain.chatbot.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class ChatResponse { + public List choices; + + @Getter + @Setter + public static class Choice { + public Message message; + + @Getter + @Setter + public static class Message { + public String role; + public String content; + } + } +} diff --git a/src/main/java/Minari/cheongForDo/domain/chatbot/dto/OpenAiChatRequest.java b/src/main/java/Minari/cheongForDo/domain/chatbot/dto/OpenAiChatRequest.java new file mode 100644 index 0000000..419f164 --- /dev/null +++ b/src/main/java/Minari/cheongForDo/domain/chatbot/dto/OpenAiChatRequest.java @@ -0,0 +1,13 @@ +package Minari.cheongForDo.domain.chatbot.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class OpenAiChatRequest { + private String model; // GPT 모델 + private List messages; // 메시지 목록 +} \ No newline at end of file diff --git a/src/main/java/Minari/cheongForDo/domain/chatbot/service/ChatbotService.java b/src/main/java/Minari/cheongForDo/domain/chatbot/service/ChatbotService.java new file mode 100644 index 0000000..4268e23 --- /dev/null +++ b/src/main/java/Minari/cheongForDo/domain/chatbot/service/ChatbotService.java @@ -0,0 +1,62 @@ +package Minari.cheongForDo.domain.chatbot.service; + +import Minari.cheongForDo.domain.chatbot.dto.ChatMessage; +import Minari.cheongForDo.domain.chatbot.dto.ChatRequest; +import Minari.cheongForDo.domain.chatbot.dto.ChatResponse; +import Minari.cheongForDo.domain.chatbot.dto.OpenAiChatRequest; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import org.springframework.http.*; + +import java.util.List; + +@Service +public class ChatbotService { + @Value("${spring.ai.openai.api-key}") + private String API_KEY; + private static final String API_URL = "https://api.openai.com/v1/chat/completions"; + + public ChatResponse askQuestion(ChatRequest userRequest) { + RestTemplate restTemplate = new RestTemplate(); + + // 사용자가 보낸 질문을 OpenAI API 요청 형식으로 변환 + ChatMessage systemMsg = new ChatMessage("system", + """ + 당신은 경제 전문가입니다. 다음 규칙을 반드시 따르세요: + + 1. 항상 부드럽고 공손한 존댓말을 사용해야 합니다. 반말은 절대 사용하지 마세요. + + 2. 이모티콘은 사용하지 마세요. + + 3. 이름을 묻는 질문에는 "아직 이름은 정해지지 않았습니다."라고만 답변하세요. + + 4. 경제에 관한 질문에 대해 특히 전문적인 답변을 하세요. + + 5. 가능하면 경제 관련 질문에만 대답하세요. + """ + ); + ChatMessage userMsg = new ChatMessage("user", userRequest.getQuestion()); + + OpenAiChatRequest openAiRequest = new OpenAiChatRequest(); + openAiRequest.setModel("gpt-3.5-turbo"); + openAiRequest.setMessages(List.of(systemMsg, userMsg)); + + // HTTP 요청 헤더 설정 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setBearerAuth(API_KEY); + + HttpEntity entity = new HttpEntity<>(openAiRequest, headers); + + // OpenAI API 호출 + ResponseEntity response = restTemplate.exchange( + API_URL, + HttpMethod.POST, + entity, + ChatResponse.class + ); + + return response.getBody(); // OpenAI 응답 반환 + } +} \ No newline at end of file From 71ca10009db56d791671cf58dec300c5c0780efe Mon Sep 17 00:00:00 2001 From: whitenoise13 Date: Mon, 12 May 2025 11:24:30 +0900 Subject: [PATCH 2/2] =?UTF-8?q?Feat::=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20import=EB=AC=B8=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/Minari/cheongForDo/domain/chatbot/dto/ChatRequest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/Minari/cheongForDo/domain/chatbot/dto/ChatRequest.java b/src/main/java/Minari/cheongForDo/domain/chatbot/dto/ChatRequest.java index 20f8670..1a9a832 100644 --- a/src/main/java/Minari/cheongForDo/domain/chatbot/dto/ChatRequest.java +++ b/src/main/java/Minari/cheongForDo/domain/chatbot/dto/ChatRequest.java @@ -4,8 +4,6 @@ import lombok.NoArgsConstructor; import lombok.Setter; -import java.util.List; - @Getter @Setter @NoArgsConstructor