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..1a9a832 --- /dev/null +++ b/src/main/java/Minari/cheongForDo/domain/chatbot/dto/ChatRequest.java @@ -0,0 +1,13 @@ +package Minari.cheongForDo.domain.chatbot.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@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