OpenAI API를 이용하여
사용자가 웹에 질문을 입력하면 open ai가 답변을 생성하고
그 답을 사용자에게 보여주는 자동응답기를 만들어보겠다.
1. GPT-3 API 키 발급
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. 질문해보기!!

머찐 자바개발자가 되려면 ...
음 .. 그렇다고한다...
끝~~^*^
'DEV :: > Etc' 카테고리의 다른 글
| [Google Cloud Study Jam] 2023 클라우드 스터디잼 쿠버네티스 심화과정 (0) | 2023.08.16 |
|---|---|
| Kubernetes (쿠버네티스) 기초 강의 모음 (0) | 2023.08.04 |
| STS/SVN - Ignored Resources 설정으로 target 폴더 및 불필요한 파일 커밋 리스트에서 제외 하기 (0) | 2023.04.12 |
| 우분투 - java 설치 삭제, 버전 및 경로 확인, 환경 설정 방법 (0) | 2023.04.07 |
| VirtualBox 버추얼박스 가상머신 위 Ubuntu 우분투 설치 방법 및 kernel panic not syncing 에러 해결, 화면 사이즈 조절 방법 (0) | 2023.04.03 |
댓글