주뇽's 저장소
[Spring] [GPT] Spring Boot에서 OpenAI API를 이용하여 GPT 연동하기 본문
728x90
반응형
1. OPENAI GPT API 및 요청 및 응답 데이터 확인
준비물 : OpenAI API를 이용하기 위해서는 OpenAI에 신용카드를 등록해야 한다. 이후 자신의 API Key를 확인.
API 레펀러스 페이지에서 초록색 API Keys 문구를 클릭하여 자신의 새로운 API Key를 생성하고 확인한다.
1-1 GPT 요청 형식 확인하기
curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": "현재 한국의 온도는 어떤가요?"
}
],
"temperature": 1,
"max_tokens": 256,
"top_p": 1,
"frequency_penalty": 0,
"presence_penalty": 0
}'
Authorization : 부분에 자신의 OpenAI API Key를 넣어서 요청을 보내주면 된다.
요청 구조를 보면
- 엔드포인트 : //api.openai.com/v1/chat/completions.
- 자신의 api Key
- model
- messages
해당 엔드포인트에 자신의 api key와 모델, 메시지를 함께 전송해주면 된다.
1-2 GPT 응답 데이터 확인하기
{
"id": "chatcmpl-8tUbLbfne4rO96nVrfjguN0yzp0F8",
"object": "chat.completion",
"created": 1708236363,
"model": "gpt-3.5-turbo-0125",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "죄송합니다, 현재 저는 실시간 정보를 제공할 수 없습니다. 하지만 한국의 온도 정보는 기상청 홈페이지나 기상앱을 통해 확인하실 수 있습니다.더 필요한 정보가 있으시면 도와드리겠습니다."
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 25,
"completion_tokens": 82,
"total_tokens": 107
},
"system_fingerprint": "fp_69829325d0"
}
위 처럼 현재 한국 온도에 대한 GPT의 답변을 받을 수 있다. 위와 같이 엔드포인트를 이용하여 Spring Boot에서 GPT를 연동하여 이용할 수 있다.
응답 구조를 확인해보면
- choices -> contnet 안에 답변을 확인할 수 있다.
2. Spring Boot GPT 연동(여기부터 따라해도 상관없음)
2-1 테스트를 위한 스프링 부트 프로젝트 생성
- Spring Web
- Lombok
- Spring boot DevTools
application.properties에 openai 정보 설정
openai.model=gpt-3.5-turbo
openai.api.key=자신의 OpenAI API Key
openai.api.url= https://api.openai.com/v1/chat/completions
2-2 테스트를 위한 RestTemplate 등록
RestTemplate를 빈으로 등록
- RestTemplate은 스프링 프레임워크가 제공하는 클래스로, RESTful 서비스를 소비하기 위한 동기식 HTTP 클라이언트이다. RestTemplate을 사용하면 HTTP 요청을 보내고, 응답을 받아, 자바 객체로 변환하는 과정을 간편하게 처리할 수 있다.
- RestTemplate은 다양한 HTTP 메소드(GET, POST, DELETE 등)를 지원하며, HttpEntity를 통해 요청 본문과 헤더를 설정할 수 있고, ResponseEntity를 통해 응답 본문과 상태 코드 등을 받을 수 있다.
package com.example.openaitest.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class OpenAiConfig {
@Value("${openai.api.key}")
private String openAiKey;
@Bean
public RestTemplate template(){
RestTemplate restTemplate = new RestTemplate();
restTemplate.getInterceptors().add((request, body, execution) -> {
request.getHeaders().add("Authorization", "Bearer " + openAiKey);
return execution.execute(request, body);
});
return restTemplate;
}
}
"Bearer " + openAiKey
// Bearer 이 부분을 꼭 띄어쓰기 해야함
2-3 테스트를 위한 요청 응답 DTO 작성
// Message
package com.example.openaitest.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Message {
private String role;
private String content;
}
// ChatGPTRequest
package com.example.openaitest.dto;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class ChatGPTRequest {
private String model;
private List<Message> messages;
public ChatGPTRequest(String model, String prompt) {
this.model = model;
this.messages = new ArrayList<>();
this.messages.add(new Message("user", prompt));
}
}
// ChatGPTResponse
package com.example.openaitest.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ChatGPTResponse {
private List<Choice> choices;
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Choice {
private int index;
private Message message;
}
}
2-4 테스트를 위한 Controller 작성
package com.example.openaitest.controller;
import com.example.openaitest.dto.ChatGPTRequest;
import com.example.openaitest.dto.ChatGPTResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/bot")
public class CustomBotController {
@Value("${openai.model}")
private String model;
@Value("${openai.api.url}")
private String apiURL;
@Autowired
private RestTemplate template;
@GetMapping("/chat")
public String chat(@RequestParam(name = "prompt")String prompt){
ChatGPTRequest request = new ChatGPTRequest(model, prompt);
ChatGPTResponse chatGPTResponse = template.postForObject(apiURL, request, ChatGPTResponse.class);
return chatGPTResponse.getChoices().get(0).getMessage().getContent();
}
}
- ChatGPTResponse chatGPTResponse = template.postForObject(apiURL, request, ChatGPTResponse.class);: RestTemplate의 postForObject 메소드를 사용하여, apiURL 주소로 request 객체를 JSON 형태로 전송하고, ChatGPTResponse 클래스의 인스턴스로 응답을 받는다. apiURL은 OpenAI의 ChatGPT API 엔드포인트 주소를 나타낸다. 이 메소드는 요청을 보내고, 응답을 받아 ChatGPTResponse 타입의 객체로 변환한다.
3. 요청 결과 확인
http://localhost:8080/bot/chat?prompt=한국은 어떤 나라인가요?
위와 같이 /bot/chat 으로 GET 요청을 보낸 결과 Spring Boot에 GPT를 잘 연동한 모습을 확인할 수 있다!!
출처 : https://www.youtube.com/watch?v=HlDkuFy8xRM
'웹개발 > SpringBoot' 카테고리의 다른 글
[Spring Boot] 실시간 채팅 기능을 위한 WebSocket, SockJS, STOMP (2) | 2024.02.29 |
---|---|
[Spring Security] 스프링 시큐리티 커스터마이징 Spring Security Filter Chain (0) | 2024.01.23 |
[Troubleshooting] Spring Boot 양방향 관계를 가지고 있는 엔티티로 인한Jackson 무한 루프 문제 (4) | 2024.01.04 |