친구와 진행하기로 한 프로젝트에 대비하기 위해 GPT-3를 이용한 간단한 튜토리얼을 진행해 보려 한다.
GPT-3는 딥 러닝을 이용해 인간다운 텍스트를 만들어내는 자기회귀 언어 모델이다. OpenAI가 만든 GPT-n 시리즈의 3세대 언어 예측 모델이다. GPT-3의 전체 버전은 1,750억 개의 매개변수를 가지고 있어, 2020년 5월 도입된 이전 버전 GPT-2보다 2배 이상 크다. 2020년 7월 베타 테스트를 거쳤고, 2022년 12월 3.5 베타가 출시되어 세계적으로 큰 반향을 일으켰다. 사전 훈련된 언어의 자연어 처리(NLP) 시스템의 일환이다. GPT-3 출시 전 가장 큰 언어 모델은 2020년 2월에 선보인 마이크로소프트의 튜링 NLG로 GPT-3보다 용량이 10배 적었다.
엄청난 이슈가 되고 있는 GPT-3 나도 한 번 써보자!
먼저 OpenAI에서 제공하는 GPT-3 API를 프로젝트에서 쓸 수 있도록 key를 발급받아야 한다.
OpenAI에 회원가입을 해주고
우측상단 Personal 버튼을 클릭하고 View API keys 탭을 클릭하면
+Create new secret key를 클릭해서 키를 발급받아줬다.
위는 생성된 나의 키이다.
Spring Initalizr를 이용해서 위와 같이 프로젝트를 생성해 주었다.
이제 API만 호출하면 GPT-3를 이용할 수 있는데 자료도 많이 없고 잘 모르겠어서 GPT-3를 기반으로 만들어진 대화형 AI ChatGPT한테 물어보았다.
"Please explain in detail with code how to use GPT-3 in Spring Boot project"
Spring Boot 프로젝트에서 GPT-3를 사용하는 방법을 코드로 자세히 설명해주세요. 라고 물어보았고 ChatGPT는 금새 코드와 설명을 알려줬다.
dependencies {
implementation 'com.openai:openai:2.1.1'
}
import com.openai.api.Client;
import com.openai.api.Gpt3CompletionRequest;
import com.openai.api.Gpt3CompletionResponse;
import com.openai.api.Gpt3CompletionOption;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Gpt3Controller {
@PostMapping("/gpt3")
public String generateCompletion(@RequestBody String prompt) {
String apiKey = "your-api-key-here";
Client client = new Client(apiKey);
Gpt3CompletionRequest request = new Gpt3CompletionRequest.Builder()
.model("text-davinci-002")
.prompt(prompt)
.maxTokens(1024)
.temperature(0.5)
.build();
Gpt3CompletionResponse response = client.completions().complete(request);
for (Gpt3CompletionOption option : response.getOptions()) {
return option.getText();
}
return "Error: No completion generated";
}
}
완전 신기하다. 알려줬으니 한 번 써먹어보자.
시작부터 에러다ㅋ 불러올 수가 없는 모양인데 ChatGPT 이녀석이 나에게 거짓말을 쳤다. dependency 추가가 안 된다고 다시 알려달라고 해보았다.
번역하면,
사용 중인 코드가 잘못되었거나 사용 중인 OpenAI API 클라이언트 라이브러리에 문제가 있을 수 있습니다. 문제를 진단하는 데 도움이 되도록 시도해 볼 수 있는 몇 가지 사항은 다음과 같습니다.
코드 확인: 사용 중인 코드가 정확하고 제가 제공한 예와 일치하는지 확인하세요.
API 키 확인: OpenAI API 키를 올바르게 입력했고 필요한 권한이 있는지 확인하십시오.
라이브러리 버전 확인: OpenAI API 클라이언트 라이브러리의 올바른 버전을 사용하고 있고 사용 중인 Spring Boot 버전과 호환되는지 확인하십시오.
오류 확인: 문제에 대한 추가 정보를 제공할 수 있는 오류 메시지가 있는지 애플리케이션 로그를 확인하십시오.
여전히 문제가 있는 경우 OpenAI API 설명서를 확인하거나 지원 팀에 문의하여 추가 지원을 받는 것이 도움이 될 수 있습니다.
내 생각에는 3번인 것 같다. 자료를 한 번 찾아봐야겠다.
OpenAI에 올라와 있는 깃허브를 찾았다.
들어가서 보니 두 개의 유형이 있는데
openai-gpt3-java:api 는 GPT-3의 순수 API를 사용할 수 있는듯하고
openai-gpt3-java:client 는 라이브러리 형식으로 쉽고 빠르게 GPT-3를 이용할 수 있는 방법인듯하다.
그렇다면 client를 써보도록 하자.
dependencies {
implementation group: 'com.theokanning.openai-gpt3-java', name: 'client', version: '0.9.0'
}
mvnrepository에서 버전을 찾아 가져왔고 빌드도 성공했다.
README에 따르면 OpenAiService를 이용하는 것이 가장 빠르고 편리한 방법이라고 한다.
@RestController
@RequestMapping("/gpt3")
public class Gpt3Controller {
@PostMapping("/question")
public void sendQuestion() {
OpenAiService service = new OpenAiService("your_token");
CompletionRequest completionRequest = CompletionRequest.builder()
.prompt("Somebody once told me the world is gonna roll me")
.model("ada")
.echo(true)
.build();
service.createCompletion(completionRequest).getChoices().forEach(System.out::println);
}
}
깃허브에 있는 코드를 그대로 가져와 컨트롤러를 만들었다.
prompt는 GPT-3에게 전송되는 사용자의 질문이고
model은 사용할 모델,
echo는 완료와 함께 프롬프트를 되풀이하는지에 대한 여부이다.
포스트맨을 통해서 확인해 보자
status code 200으로 정상이라고 나오기는 하는데
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by retrofit2.Platform (file:/C:/Users/.gradle/caches/modules-2/files-2.1/com.squareup.retrofit2/retrofit/2.9.0/d8fdfbd5da952141a665a403348b74538efc05ff/retrofit-2.9.0.jar) to constructor java.lang.invoke.MethodHandles$Lookup(java.lang.Class,int)
WARNING: Please consider reporting this to the maintainers of retrofit2.Platform
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
서버에서 이런 메세지가 떴다. 200인 걸로 보아서는 에러는 아니지만 원인을 찾아봐야겠다.
메세지와 깃허브를 보니까 client api를 사용하려면 retrofit이라는 자바 클라이언트 라이브러리가 필요한 것 같다.
다음날이 되었더니 깃허브가 좀 수정되어 있었다.
클라이언트 모듈의 OpenAiService는 더 이상 사용되지 않고 서비스 Service 모듈에서 새 버전으로 전환하라는데 아직 Service 모듈은 보이지 않는다.. mvnrepository에도 없고 깃허브를 아무리 뒤져봐도 버전을 알 수가 없다.
허탈한 마음과 함께 클라이언트에 어떤 식으로 정보가 날라오는지 알아보기 위해 컨트롤러를 수정해서 결과를 확인해 봤다.
@PostMapping("/question")
public ResponseEntity<?> sendQuestion() {
OpenAiService service = new OpenAiService("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");
CompletionRequest completionRequest = CompletionRequest.builder()
.prompt("Somebody once told me the world is gonna roll me")
.model("ada")
.echo(true)
.build();
//service.createCompletion(completionRequest).getChoices().forEach(System.out::println);
return ResponseEntity.ok(service.createCompletion(completionRequest).getChoices());
}
위와 같이 결과를 ResponseEntity에 담아서 리턴하도록 했다. 포스트맨을 통해 확인해 보면
내가 날렸던 질문 뒤에 GPT-3가 보낸 답변이 붙어있는 것 같다.
뭔가 문맥상 내가 보낸 질문 뒤에 올 문장을 이어서 쓴 느낌이다.
echo를 false로 바꾸고 "Hi, How are you today?"로 질문을 바꿔 보았다.
뭔 소린지 모르겠다. 같은 질문을 다시 해보았다.
??
이것도 뭔가 작문을 한 것 같이 어색하다. 다시 보내보자.
ChatGPT와 다르게 대화형 언어 모델이 아니라 그런지 내가 잘 못 이용하고 있는 건지 라이브러리가 이상한 건지 모르겠다. 답변이 오긴 오는데 뭔가 이상하다..
그리고 서버에서는 계속 retrofit 관련 메세지가 뜬다. 이것도 이해가 안 가는게 사용을 안 했는데 왜 되는 건지도 모르겠다.
일단은 할 수 있는 건 여기까지인듯하다. 관련 레퍼런스가 더 나올 때까지 일단 기다려보고 나중에 시도해 봐야겠다.