목차
1. OpenAI 설정 > Key 발급
2. SpringBoot 설정
3. 코드 작성
1. OpenAI 설정 > Key 발급
Chat AI를 사용하기 위해서 해당 사이트에서 Secret Key를 발급받아야 한다.
https://platform.openai.com/account/api-keys
로그인 후 Usage를 클릭하면 현재 Free trial을 사용 중이며 무료로 $5.00 까지의 요청을 사용할 수 있다고 한다. 그리고 API Keys에서 Create new secret key를 클릭해서 API 활용을 위한 Key를 발급받는다.
이때 발급받은 Key값은 다시 보여주지 않기 때문에 따로 기록해두어야 한다!!!
2. SpringBoot 설정
나는 Spring Boot 2.7.12 버전에 자바 11 버전을 사용중이며, OpenAI api를 사용하기 위해서 build.gradle에 다음과 같은 의존성을 추가해주어야 한다.
dependencies {
// GPT
implementation 'com.theokanning.openai-gpt3-java:service:0.12.0'
}
또한 방금 발급받은 Key를 application.yml에 등록해주어야 한다. 나는 yml 파일을 .gitignore에 추가하지 않았기 때문에 실질적인 Key값은 인텔리제이에 환경변수로 설정해주었고 ${GPT_SECRET}로 값을 주입받았다.
chatgpt:
key: ${GPT_SECRET}
인텔리제이로 환경변수를 등록하려면 Edit Configuration > Environment variables에 GPT_SECRET=어쩌고저쩌고; 요런식으로 작성해주면 된다.
3. 코드 작성
블로그 작성을 위해 간단히 Controller와 Service만 작성해봤는데, 반환타입은 원하는대로 수정해서 작성하면 된다.
GPT한테 List 형태로 답변을 달라고 하면 형식에 맞춰서 답을 주니까 우리가 원하는 형식에 맞게 커스텀해서 prompt를 작성하면 되고, 요구사항이 자세할수록 GPT도 더 정확한 답변을 줄 수 있으니까 참고 바란다!
EmotionAnalyzeController.java
package com.hanium.memotion.controller;
import com.hanium.memotion.service.EmotionAnalyzeService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
public class EmotionAnalyzeController {
private final EmotionAnalyzeService emotionAnalyzeService;
@GetMapping("/gpt-sentiment")
public String createGptComment(@RequestBody String content) {
return emotionAnalyzeService.createGptComment(content);
}
}
EmotionAnalyzeService.java
package com.hanium.memotion.service;
import com.theokanning.openai.completion.chat.ChatCompletionRequest;
import com.theokanning.openai.completion.chat.ChatMessage;
import com.theokanning.openai.service.OpenAiService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.time.Duration;
import java.util.List;
@Service
@RequiredArgsConstructor
public class EmotionAnalyzeService {
private OpenAiService openAiService;
@Value("${chatgpt.key}")
private String apiKey;
private static final String MODEL = "gpt-3.5-turbo";
// ChatGPT 감정분석
public String createGptComment(String content) {
this.openAiService = new OpenAiService(apiKey, Duration.ofSeconds(60));
String prompt = "내가 오늘 다이어리에 작성한 내용은 " + content + "야. 다이어리 내용 바탕으로 감정분석 해줘.";
ChatCompletionRequest requester = ChatCompletionRequest.builder()
.model(MODEL)
.maxTokens(2048)
.messages(List.of(
new ChatMessage("user", prompt)
)).build();
return openAiService.createChatCompletion(requester).getChoices().get(0).getMessage().getContent();
}
}
처음엔 Duration을 설정하지 않았더니, timeout이 발생했다..
그러니 간단히 답을 얻을 수 있는 요청이 아니라면 다음과 같이 Duration 설정을 넣어주는 것이 좋다.
this.openAiService = new OpenAiService(apiKey, Duration.ofSeconds(60));
실제로 요청을 보내면 다음과 같은 결과가 나온다.
'Framework > Spring' 카테고리의 다른 글
[SpringBoot] Swagger 3.0 + 전역적 Bearer 토큰 적용 (0) | 2023.10.31 |
---|---|
[SpringBoot] Naver CLOVA Sentiment를 활용한 감정분석 (0) | 2023.08.30 |
[SpringBoot] JPA ConverterNotFoundException 에러 (0) | 2023.05.16 |
[SpringBoot] JPA NoViableAltException: unexpected token: value 에러 (0) | 2023.04.02 |
[SpringBoot] IntelliJ 2022.3 Gradle로 실행돼서 너무 느린 경우 (0) | 2023.03.30 |