OpenAI 와 open API
OpenAI에서 chatGPT와 관련한 open API를 배포하였기 때문에 이제 누구나 손쉽고 편리하게 ChatGPT API를 이용해서 애플리케이션을 제작할 수 있게 되었다.
ChatGPT API와 Whisper API 연동 방법
API 사용법에 관련하여 공식 문서로 제공이 되어 있어 이를 공부해 구현해볼 수 있었다. 내가 지금껏 썼던 OPEN API는 보통 라이브러리 형식이라 다운로드하여 import해서 쓰는 형식이 많았는데, OpenAI에서 제공해주는 API는 HTTP 통신 형태로 CURL 명령어를 보며 이해해야 하는 과정이 있었다.
CURL 명령어
curl(client url) 명령어는 프로토콜들을 이용해 URL 로 데이터를 전송하여 서버에 데이터를 보내거나 가져올때 사용하기 위한 명령줄 도구 및 라이브러리이다.
간단히 가장 많이 쓰는 POST와 GET 요청을 알아보자!
POST 요청
# JSON 형식 데이터 $ curl -d '{"key1":"value1", "key2":"value2"}' \ -H "Content-Type: application/json" \ -X POST http://localhost:8000/data
-d 옵션으로 body 데이터를 기재하고 -H 옵션으로 전송할 헤더 지정 (디폴트 : application/x-www-form-urlencoded)한다.
GET 요청
$ curl -X GET www.example.com
body가 없으므로 그냥 GET url
코드 구현
ChatGPT Request
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
@AllArgsConstructor @NoArgsConstructor @Setter
public class chatGPTRequest {
public String model;
public List<Message> messages;
public double temperature;
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
@AllArgsConstructor @NoArgsConstructor
public static class Message {
public String role;
public String content;
}
}
ChatGPT Response
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
@Getter
public class chatGPTResponse {
public String id;
public String object;
public long created;
public String model;
public chatGPTResponse.Usage usage;
public List<chatGPTResponse.Choice> choices;
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
@Getter
public static class Usage {
public int promptTokens;
public int completionTokens;
public int totalTokens;
}
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
@Getter
public static class Choice {
public chatGPTResponse.Choice.Message message;
public String finishReason;
public int index;
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
@Getter @Setter
public static class Message {
public String role;
public String content;
}
}
}
위의 두 양식에서 볼 수 있듯이 Request와 Response에서 보내고 가져와야 할 데이터 양식을 동일하게 맞춰준다. nested json 형식으로, 쉽게 말해 dto 속 dto를 넣어주면 된다.
이후 Header에 들어가야 하는 Bearer $OPENAI_API_KEY는 아래 Service 코드에서 @Value에 넘겨주었으며 이는 서버단 환경변수 안에 존재한다. webClient + objectMapper는 JSON을 파싱할 때 많이 사용하는 조합이다.
@Service
public class chatGPTService {
private final Logger log = LoggerFactory.getLogger(this.getClass());
private final WebClient webClient;
private final ObjectMapper objectMapper;
private final String openaiApiKey;
public chatGPTService(WebClient.Builder webClientBuilder, ObjectMapper objectMapper,
@Value("${hackaton.openai-api-key}") String openaiApiKey) {
this.webClient = webClientBuilder.baseUrl("https://api.openai.com").build();
this.objectMapper = objectMapper;
this.openaiApiKey = openaiApiKey;
}
public String completeChat(String prompt) {
List<chatGPTRequest.Message> messages = new ArrayList<>();
messages.add(new chatGPTRequest.Message("user", prompt));
chatGPTRequest request = new chatGPTRequest(
"gpt-3.5-turbo-0301",
0.9,
messages
);
try {
chatGPTResponse response = webClient.post()
.uri("/v1/chat/completions")
.header("Authorization", "Bearer " + openaiApiKey)
.bodyValue(request)
.retrieve()
.bodyToMono(chatGPTResponse.class)
.blockOptional()
.orElseThrow(() -> new IllegalStateException("Error occurred while completing chat"));
return response.getChoices().get(0).getMessage().getContent();
} catch (WebClientResponseException e) {
log.error("Error occurred while completing chat - " + e.getResponseBodyAsString(), e);
throw new IllegalStateException("Error occurred while completing chat", e);
}
}
}
'BackEnd > JAVA\SPRING' 카테고리의 다른 글
[SPRING] DAO의 분리와 확장 (5) | 2023.09.03 |
---|---|
[OPEN SOURCE] FOSSLIGHT 오픈소스 기여 (0) | 2023.08.21 |
[Spring] Spring으로 JWT 구현하기2 - Spring Security 라이브러리 (0) | 2023.02.11 |
[SPRING] Swagger, 프론트와의 소통을 편하게 하는 자동 툴 (2) | 2023.02.11 |
[SPRING] Spring으로 JWT 구현하기1 - jwt-java 라이브러리 (2) | 2023.02.09 |