졸업 프로젝트로 진행중인 "Neverland" 앱을 위해 spring boot 프로젝트 개발 환경 세팅과 Open AI의 GPT API를 사용하기 위한 Java 라이브러리 세팅 및 테스트를 하는 과정을 기록해보려 한다. 우선 우리 팀이 프로젝트에 사용할 서버 관련 스택은 다음과 같다.
CI/CD 관련한 스택의 경우, 변경될 가능성이 있다.
Java, Spring Boot, AWS EC2, RDS, ALB, MySQL, Redis, Docker, Github Actions, Chat GPT java client library
참고로 AWS EC2, RDS, MySQL, Docker 설정 등은 추후 다른 글에서 다룰 예정이다.
📌 Spring Project Setting
Neverland(가제) 서비스를 위한 spring 프로젝트를 생성하고 초기화해보자!
물론 Spring Initializer 사이트에 접속해 새로운 spring 프로젝트를 생성할 수도 있지만, IntelliJ를 통해서도 간단히 Spring Initializer를 사용할 수 있다. IntelliJ에서 New Project를 클릭하면, 다음과 같은 화면이 뜰 것이다.
Generators를 Spring Initializer로 선택하면, 오른쪽에 Spring Initializer 사이트에 들어가 생성하는 것과 동일한 방법으로 프로젝트를 생성할 수 있는 부분이 보일 것이다.
Name에는 프로젝트의 이름인 neverland(가제)를 작성하고, Location을 원하는 path로 설정해준다. 추후 터미널을 통해 로컬 git repository를 생성할 예정이라 Create Git repository 옵션은 체크하지 않고 그대로 둔다. Language는 Java, Type은 Gradle-Groovy로 설정하고, Group명과 Artifact명을 작성해준다. Group명은 팀명인 lesso를 활용해 com.lesso로 지정해줬고, Artifact는 프로젝트명으로 설정했다. JDK는 corretto-17, Java는 Java 17로 설정해줬고, 이는 다음 화면에서 나올 Spring Boot 버전과 잘 맞춰주는 것이 중요하다. 마지막으로 배포를 위한 Packaging은 Jar로 설정했다. Spring boot를 사용하고, JSP를 사용한다는 등의 특별한 이유가 없다면 Jar로 packaging하는 것이 좋다.
Next를 눌러 다음 화면으로 넘어가면, Spring Boot 버전과 Dependency를 추가할 수 있는 부분이 나온다. Spring Boot 버전은 SNAP-SHOT을 제외하고 가장 높은 버전인 3.1.5로 선택하고, Dependency로는 Lombok, Spring Web, Spring Security, MySQL Driver, Spring Data JPA를 추가해줬다. 참고로, 추후 소셜 로그인을 구현할 때 dependency에 Redis를 추가할 예정이다. 우선, 이와 같이 선택해주고 나중에 추가로 다른 dependency가 필요하면 그 때 추가해줘도 괜찮다.
드디어! Create을 누르면 위와 같이 프로젝트가 시작되며 선택한 dependency 다운로드가 시작된다.
다운로드 및 프로젝트 세팅이 다 되기를 기다리면, 드디어 빌드에 성공했다는 메시지가 뜬다. BUILD SUCCESSFUL!
이제 프로젝트 세팅은 모두 성공적으로 마쳤고, 본격적으로 서비스 개발을 시작하기 전에 Spring에서 Chat GPT API를 prompt engineering 방식으로 사용할 수 있도록 세팅 및 테스트를 먼저 해볼 것이다.
📌 Spring에서 Chat GPT java client library 사용하기
Spring 환경에서 Chat GPT java client 라이브러리를 활용해 프롬프트 엔지니어링을 구현할 수 있도록 세팅해보자!
우선 우리 팀은 피드 목록을 보여주는 부분에서 미리 입력받은 유저의 관심사와 과거 클릭 데이터 등을 활용해 피드를 추천해주는 기능을 구현하려 한다. 현재 계획으로는 LLM(GPT)으로 데이터 태깅을 하고, CF 추천 알고리즘을 활용해 피드를 추천해주도록 할 것이다.
Open AI 공식 문서는 https://platform.openai.com/docs/introduction로 들어가면 확인할 수 있다. Capabilities, Prompt engineering 방법, 활용할 수 있는 library 등에 대해 자세히 기록되어 있으니, 궁금한 점이 있을 때 참고하면 좋을 것 같다.
Spring 환경에서 GPT API를 프롬프트 엔지니어링 방식으로 사용하려면 크게 두 가지 방법이 있다. Open AI 공식 문서에서 기술해놓은 대로 API를 그래도 사용하는 방법이 있고, Java client 라이브러리를 사용하는 방법이 있는데, 난 라이브러리를 활용해서 더욱 쉽게 프롬프트 엔지니어링을 구현하는 방법을 택했다.
GitHub - TheoKanning/openai-java: OpenAI Api Client in Java
OpenAI Api Client in Java. Contribute to TheoKanning/openai-java development by creating an account on GitHub.
github.com
이 라이브러리는 4k개 이상의 star를 받고 많은 사람들이 사용하는 GPT Java client 라이브러리고, Open AI 공식 문서에도 Library 부분에 기재될 정도여서 해당 라이브러리를 활용해 프롬프트 엔지니어링 방식으로 GPT를 활용해보려 한다.
프로젝트에 라이브러리 세팅하기
가장 먼저, 사용하려는 라이브러리를 build.gradle에 implementation으로 추가해 import 해준다. 그리고 gradle 설정 파일에 변경 사항이 생기면 Load Gradle Changes 버튼을 눌러 바로 반영하는 것 잊지 말자.
build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'com.theokanning.openai-gpt3-java:service:0.18.2'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
}
라이브러리의 버전은 현재 기준으로 가장 최신 버전인 0.18.2으로 선택하고, Artifact의 경우 service로 한다.
Github에서 Read.me를 읽어보면 해당 라이브러리는 아래와 같이 총 3가지의 Artifacts를 포함하고 있다.
api : request/response POJOs for the GPT APIs.
client : a basic retrofit client for the GPT endpoints, includes the api module
service : A basic service class that creates and calls the client. This is the easiest way to get started.
Please switch to using the new 'service' library if you need to use OpenAiService. The old 'client' OpenAiService is deprecated as of 0.10.0.
그리고 위와 같은 설명이 써있는데, OpenAiService를 사용하려면 최근 버전부터는 'service' artifact를 사용하라고 돼있기 때문에 service로 선택해줬다.
Open AI API Key 발급 및 프로젝트 설정
다음으로는 Open AI API를 사용하기 위해 반드시 필요한 API Key를 발급 받아야 한다. API Key 발급은 Open AI 계정을 만들고 API Keys 탭에 들어가면 생성할 수 있다. 다음 링크로 들어가면 확인할 수 있다. https://platform.openai.com/account/api-keys
API Keys 탭을 누르면 아래와 같은 화면을 볼 수 있다. 계정을 새로 만들면 phone number 인증이 안된 상태일 것이기 때문에 Start verification 버튼을 눌러 번호 인증을 받는다.
인증을 받은 후, Create new secret key를 클릭하면 위와 같은 창이 뜬다. 새로 만들 Key의 name을 입력해주고 Create secret key 버튼을 클릭하면 성공적으로 key가 생성되고, secret key value를 화면에 보여준다.
위 설명에도 써있듯이, 다른 secret key들과 마찬가지로 Open AI API secret key도 처음 생성했을 때만 key value값을 알려주고, 다시 확인할 수 없다. 잊지말고 꼭 안전한 곳에 기록해두자!
성공적으로 생성 완료한 후 API Keys 목록에서 방금 만든 key를 확인할 수 있다. 혹시 몰라 가려뒀지만, 실제로 KEY값에 value 전체가 써있지 않고 일부만 써있으니 꼭! 다른 곳에 key 값을 옮겨두자.
그리고 Open AI API를 사용하기 위해선 공식 레퍼런스에서 제공하는 것과 같이 현재 자신 계정의 API Key를 함께 요청 시 보내줘야 한다. 이제 방금 발급 받은 API Key를 사용하도록 프로젝트에 설정해주자.
아래와 같이 공식 문서에 방법이 자세히 작성되어 있다. https://platform.openai.com/docs/api-reference/authentication
GptConfig.java
@Configuration
public class GptConfig {
@Value("${open.api.token}")
private String token;
@Bean
public OpenAiService openAiService() {
return new OpenAiService(token, Duration.ofSeconds(60));
}
}
Gpt 관련 설정을 위해 GptConfig 파일을 위와 같이 작성해줬다. 우선 @Value 어노테이션으로 application.properties 파일에 따로 저장해둔 open.api.token(Open API token secret key)값을 안전하게 가져오고, OpenAiService 모듈에 전달해 생성했다.
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);
OpenAiService 모듈을 가져와 사용하는 방법으로 테스트해보기 위해 깃헙에 공개되어 있는 위 테스트 코드 형식을 가져와 GptTestController를 만들었다. 구조는 아래와 같다.
GptTestController.java
@RestController
@RequestMapping("/api/gpt3")
public class GptTestController {
private final OpenAiService openAiService;
public GptTestController(OpenAiService openAiService) {
this.openAiService = openAiService;
}
@PostMapping("/request")
public ResponseEntity<List<CompletionChoice>> sendRequest() {
CompletionRequest completionRequest = CompletionRequest.builder()
.prompt("This is test prompt!")
.model("ada")
.echo(false)
.build();
// service.createCompletion(completionRequest).getChoices().forEach(System.out::println);
return ResponseEntity.ok(openAiService.createCompletion(completionRequest).getChoices());
}
}
prompt값에 넣어준 내용은 gpt에게 전달하는 메시지 값이고, echo를 통해 완료 후 프롬프트 반복 여부를 설정할 수 있다.
이번 글은 Spring 프로젝트 생성 및 개발 환경 세팅과, Spring 환경에서 Open AI GPT 프롬프트 엔지니어링을 실행해볼 수 있는 환경 구축 방법에 관해 정리했다. 이제 프로젝트와 GPT에 프롬프트를 활용해 request를 보낼 준비를 모두 끝냈으니, 다음 글에서는 클라우드 환경, 즉 AWS EC2, RDS(MySQL) 등을 세팅하고 Spring 프로젝트와 연결하는 것을 다뤄볼 예정이다.