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
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
@@ -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<Choice> choices;

@Getter
@Setter
public static class Choice {
public Message message;

@Getter
@Setter
public static class Message {
public String role;
public String content;
}
}
}
Original file line number Diff line number Diff line change
@@ -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<ChatMessage> messages; // 메시지 목록
}
Original file line number Diff line number Diff line change
@@ -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<OpenAiChatRequest> entity = new HttpEntity<>(openAiRequest, headers);

// OpenAI API 호출
ResponseEntity<ChatResponse> response = restTemplate.exchange(
API_URL,
HttpMethod.POST,
entity,
ChatResponse.class
);

return response.getBody(); // OpenAI 응답 반환
}
}
Loading