본문 바로가기
DEV ::/Etc

[Spring/Java] OpenAI gpt-3.5-turbo API 호출로 자동응답기 프로그램 만들기

by bbombi 2023. 6. 15.

 

OpenAI API를 이용하여

사용자가 웹에 질문을 입력하면 open ai가 답변을 생성하고

그 답을 사용자에게 보여주는 자동응답기를 만들어보겠다.

 

 

 

1. GPT-3 API 키 발급

https://openai.com/

 

OpenAI

Creating safe AGI that benefits all of humanity

openai.com

 

위 페이지 접속하여 가입 or 로그인을 한 후

오른쪽 상단 마이페이지로 들어가 USER 탭의 API Keys에 접근한다.

 

 

Create new secret key를 클릭한다.

 

 

키 생성하기 버튼을 누르면

 

 

위와 같이 새로운 키가 발급되는데, 

보안상의 이유로 키 넘버를 다시 확인할수없으니 바로 복붙해서 안전한곳에 보관해두어야 한다.

근데 까먹으면 그냥 다시 발급받으면 되니까 걱정 노

 

 

 

2. 프로젝트 의존성 및 발급받은 키 설정

 

먼저 pom.xml 에 웹 개발에 필요한 의존성이 필요하다.

 

<dependencies>
    <!-- 다른 의존성 -->

    <!-- 웹 애플리케이션 개발을 위한 Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
</dependencies>

 

 

그 다음은 1번에서 발급받았던 GPT-3 API 키 설정을 해줘야한다.

키를 프로젝트의 환경변수나 설정파일에 저장해야하는데, 이런 민감한 정보를 application.properties 같은 설정 파일에

직접 입력해 저장하는 것 보다는 환경 변수를 통해 값을 관리하는 것을 권장한다.

코드와 설정을 분리하여 보안을 강화 할 수 있기 때문이다.

 

Window:

// set OPENAI_API_KEY=발급받은키
set OPENAI_API_KEY=your-api-key

 

터미널에서 위 명령을 입력해서 환경 변수를 설정한다.

set 명령 이후 잘 설정 되었다면 별도의 메시지가 출력되지 않아서 잘 입력되었나 궁금했다.

 

echo %OPENAI_API_KEY%

 

위 명령어로 키가 설정되었는지 확인 완료했다. ㅎㅎ

 

 

application.properties:

OPENAI_API_KEY=당신의키값

혹시 application.properties 에서 처리하려면 해당 파일에 위 설정을 넣어주면된다.

사실 나도 이렇게 했다. ㅎㅋ

 

 

 

 

3. 코드 작성

 

먼저 api를 호출하기 위한 서비스 클래스 OpenAIService를 작성했다.

 

@Service
public class OpenAIService {

	@Value("${OPENAI_API_KEY}") // application.properties에서 값을 가져옴
	private String apiKey;

	public String generateText(String question) throws IOException {

		// GPT API URL
		final String apiUrl = "https://api.openai.com/v1/chat/completions";

		// HTTP 헤더 설정
		HttpHeaders headers = new HttpHeaders();
		headers.setContentType(MediaType.APPLICATION_JSON); // 요청 본문의 컨텐츠 타입을 JSON으로 설정
		headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
		headers.setBearerAuth(apiKey);

		// HTTP Body 설정
		String body = "{ \"messages\": [{ \"role\": \"system\", \"content\": \"You are a helpful assistant.\" }, { \"role\": \"user\", \"content\": \""
				+ question + "\" }], \"model\": \"gpt-3.5-turbo\" }";

		// HTTP 요청 생성
		HttpEntity<String> entity = new HttpEntity<>(body, headers);
		RestTemplate restTemplate = new RestTemplate();

		// HTTP 요청 보내기
		ResponseEntity<String> response = restTemplate.exchange(apiUrl, HttpMethod.POST, entity, String.class);

		// 응답 처리
		if (response.getStatusCode() == HttpStatus.OK) {

			// 응답의 본문에서 생성된 텍스트를 추출
			ObjectMapper mapper = new ObjectMapper();
			JsonNode root = mapper.readTree(response.getBody());
			String answer = root.path("choices").get(0).path("message").path("content").asText();

			return answer; // 생성된 텍스트 반환

		} else {

			// 오류 처리
			throw new RuntimeException("요청 실패: " + response.getStatusCode());

		} // if-else

	} // generateText

} // end class

 

 

다음은 컨트롤러 ChatPageController 클래스이다.

 

@Controller
public class ChatPageController {

	@Autowired
	private OpenAIService openAIService;

	@GetMapping("/")
	public String homePage() {
		return "askPage";
	} // homePage

	@PostMapping("/ask")
	@ResponseBody
	public String ask(@RequestParam("question") String question) throws IOException {

		// OpenAIService를 사용하여 질문에 대한 응답을 생성
		String answer = openAIService.generateText(question);

		// 생성된 응답을 반환 (HTTP 응답 본문으로 사용됨)
		return answer;
	} // ask

} // end class

 

 

그리고 간단하게 ask.jsp 작성.

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>openAI3.5</title>
</head>

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
 $(document).ready(function () {
     $('#questionForm').submit(function (event) {
         event.preventDefault(); // 기본 제출 동작 방지

         var question = $('#question').val();
         
         $.ajax({
             type: 'POST',
             url: '/ask',
             data: {question: question},
             success: function (data) {
                 $('#answer').text(data);
             },
             error: function () {
                 $('#answer').text('Error occurred while retrieving the answer.');
             }
         });
     });
 });
</script>

<body>
	<h1>♡무엇이든 질문하세요~!~!♡</h1>
    <form id="questionForm">
        <input type="text" id="question" style="height: 100px; width: 500px" placeholder="여기에 입력하세요" required>
        <button type="submit">질문등록</button>
    </form>

    <h2>답변:</h2>
    <div>
    	<textarea rows="20" cols="100" id="answer"></textarea>
    </div>
</body>
</html>

 

 

 

 

4. 질문해보기!!

 

머찐 자바개발자가 되려면 ...

음 .. 그렇다고한다...

 

 

 

끝~~^*^

 

 

댓글