GPT 사용하기
아래의 내용은 모두 23.12월 기준이다. 현재의 Open AI API와 정책과 다를 수 있다
openai-java 써드파티 라이브러리 사용하기

open ai에서 api를 java 라이브러리를 통해 공식적으로 지원하지는 않고 있다. (23.11 기준)
그러나 open ai에서 알려준 써드파티 라이브러리가 존재한다.
GitHub - TheoKanning/openai-java: OpenAI Api Client in Java
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
public List<ChatCompletionChoice> getResponse(String userInputText) {
ChatMessage message = new ChatMessage("user", userInputText);
ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
.messages(List.of(message))
.model(MODEL)
.temperature(TEMPERATURE)
.build();
return OPEN_AI_SERVICE.createChatCompletion(chatCompletionRequest)
.getChoices();
}
/**
* Must be either 'system', 'user', 'assistant' or 'function'.<br>
* You may use {@link ChatMessageRole} enum.
*/
@NonNull
String role;
@JsonInclude() // content should always exist in the call, even if it is null
String content;
//name is optional, The name of the author of this message. May contain a-z, A-Z, 0-9, and underscores, with a maximum length of 64 characters.
String name;
@JsonProperty("function_call")
ChatFunctionCall functionCall;
public ChatMessage(String role, String content) {
this.role = role;
this.content = content;
}
public ChatMessage(String role, String content, String name) {
this.role = role;
this.content = content;
this.name = name;
}
}
role과 content를 작성하고 api를 통해 요청을 보내면 생성형 ai의 응답을 받아 볼 수 있다.
role에는 system, user, assistant, function이 있다. 말 그대로 chat gpt의 역할을 설정하는 항목이다.
프로젝트 내에서는 system과 user 만을 사용할 것이다.
모델 설정
open ai API에서 제공하는 모델은 다음과 같다.
model | description |
GPT-4 / GPT-4 Turbo | GPT-3.5를 개선한 모델로, 자연어 및 코드를 이해하고 생성할 수 있는 모델들입니다. |
GPT-3.5 | GPT-3를 개선한 모델로, 자연어 및 코드를 이해하고 생성할 수 있습니다. |
DALL·E | 자연어 프롬프트를 통해 이미지를 생성하고 편집할 수 있는 모델입니다. |
TTS | 텍스트를 자연스러운 음성 오디오로 변환할 수 있는 모델들의 집합입니다. |
Whisper | 오디오를 텍스트로 변환할 수 있는 모델입니다. |
Embeddings | 텍스트를 숫자 형태로 변환할 수 있는 모델들의 집합입니다. |
Moderation | 민감하거나 안전하지 않을 수 있는 텍스트를 감지할 수 있게 fine-tuned 된 모델 |
GPT base | instruction에 따른 답변 생성 불가, 자연어 및 코드를 이해하고 생성할 수 있습니다. |
GPT-3 | 자연어를 이해하고 생성할 수 있는 모델들입니다. |
Deprecated | 폐기된 모델들의 전체 목록과 권장되는 대체 모델들입니다. |
사용할 모델은 gpt 3.5 turbo이다
3.5 turbo를 사용하는 이유는 다음과 같았다.
- token 당 가격 : 가장 합리적인 가격
- 무난한 성능 : davinci 나 bbabge 모델은 파인튜닝을 거치지 않고 사용하기에는 무리가 있다.
- 속도 : gpt4 기반 모델보다 훨씬 빠른 속도를 보여준다
- 파인 튜닝 : 의도하지 않거나 어색한 표현이 생성되긴 하지만 추후 fine-tuning을 통해 성능을 향상시킬 수 있을거라 기대된다
프로토 타입
프로젝트의 가장 핵심 기능은 AI를 통해 사용자와 상호작용하며 이야기를 이어나가는 것이다. 한번도 구현해보지 않았던 개념이기에 먼저 간단한 프로토타입을 통해 구조를 생각해보기로 하였다.

초기 프로젝트에서는 AI를 통해 선택지를 주고 사용자가 선택하여 이야기를 이어나가는 방식을 사용하였다. 선택지를 통해 사용자의 입력을 3가지로 제한하였다.
사용자 입력을 제한한 이유는 생성형 AI의 특성 때문이다. AI의 응답 결과를 예측 할 수 없어 사용자 입력을 최대한 제한하여 일관성 있는 답을 생성하려 하였다.
간단한 테스트
모델 정보
model - gpt-3.5-turbo
temperature - 0.7
다른 수치는 기본으로 설정하였다.

한 평범한 날, 주인공은 마을 한복판에서 이상한 동전을 주웠다. 주인공은 선택해야 했다. 이 동전을 마을의 동전 수집가에게 팔러 가거나, 이 동전에 어떤 비밀이 있는지 알아보기 위해 마을 밖으로 모험을 떠나야 할까?
chat-gpt3.5-turbo >> 이 동전을 마을의 동전 수집가에게 팔러가기
주인공은 마을의 동전 수집가에게 동전을 팔러 가서, 그의 수집품들을 보며 놀라움을 금치 못했다. 이 중에서 (1)가장 오래된 동전이 어디서 왔는지 물어볼까? 아니면 (2)동전 수집가와 함께 다른 보물을 찾아볼까?
chat-gpt3.5-turbo >> 다른 보물을 찾아보기
주인공은 동전 수집가와 함께 다른 보물을 찾기로 결정했다. 그들은 (1)신비로운 동굴에서 보물을 찾으러 갈까? 아니면 (2)해저에서 잠긴 보물을 찾기 위해 해양 탐사를 시작할까?
chat-gpt3.5-turbo >> 해저에서 잠긴 보물을 찾기 위해 해양 탐사하기
주인공과 동전 수집가는 해양 탐사를 시작했고, (1)깊은 바다 속에서 오래된 배의 유적을 발견하게 되었는데, 그곳에 보물이 있는지 알아볼까요? 아니면 (2)물고기 떼에게 습격당하게 되어, 그들과의 대치를 해결하러 가볼까요?
chat-gpt3.5-turbo >> 물고기 뗴 공격하기
주인공과 동전 수집가는 물고기 떼에게 습격당하게 되어, (1)무력하게 저항할까요? 아니면 (2)물고기와 대화를 시도해 볼까요?
chat-gpt3.5-turbo >> 대화 시도해보기
주인공과 동전 수집가는 물고기와 대화를 시도해 보았는데, 물고기들은 주인공에게 자신들이 보물을 숨기고 있는 곳을 알려주겠다고 말했다. 주인공은 (1)물고기의 제안을 받아들일까요? 아니면 (2)물고기들의 진심을 의심하고 다른 방법을 찾을까요?
chat-gpt3.5-turbo >> 다른 방법 찾아보기
주인공과 동전 수집가는 물고기들의 진심을 의심하고 다른 방법을 찾기로 결정했다. 그들은 (1)섬의 다른 동물들과 이야기를 나누어 도움을 청해볼까? 아니면 (2)섬 주변의 자연 환경을 조사하여 보물의 흔적을 찾아볼까?
chat-gpt3.5-turbo >> 보물 흔적 찾기
주인공과 동전 수집가는 섬 주변의 자연 환경을 조사하던 중, (1)수상한 동굴에서 보물의 흔적을 발견할까요? 아니면 (2)비밀스러운 섬 숲 속에서 보물의 힌트를 찾아볼까요?
chat-gpt3.5-turbo >> quit
Process finished with exit code 0
생각해봐야 할 점
open-ai api의 과금 모델
- token 단위로 요금이 부과되기에 성능과 가격 사이에서 고민해보아야 한다.
- gpt-4-turbo의 속도가 3.5 turbo에 비해 느려 gpt-3.5-trubo 모델을 기반으로 프로젝트를 진행하고 있다.
모델 | 토큰 | 데이터학습 | 입력(1K) | 출력(1K) | |
GPT-4-Turbo | gpt-4-1106-preview | 128,000 | 23년 4월 | $0.01 | $0.03 |
gpt-4-1106-vision-preview | 128,000 | 23년 4월 | $0.01 | $0.03 | |
GPT-4 | gpt-4 | 8,192 | 21년 9월 | $0.03 | $0.06 |
gpt-4-32K | 32,768 | 21년 9월 | $0.06 | $0.12 | |
GPT-3.5 Turbo | gpt-3.5-turbo-1106 | 16,385 | 21년 9월 | $0.0010 | $0.0020 |
gpt-3.5-turbo-instruct | 4,096 | 21년 9월 | $0.0015 | $0.0020 |
api 응답 프롬프트
- open ai api 요청 시 이전 요청 내용을 기억하고 있지 않다문맥을 유지하기 위해 응답 내용을 계속 수집하고 있어야 한다
- 즉, 요청 할때마다 이전 내용을 같이 보내줘야 챗봇처럼 사용 가능하다
응답 속도
- token이 많아질수록 응답 속도 또한 길어진다.
- 응답 속도가 늘어나면 runtimeError에 걸릴 수 있다.
- (openai-java 라이브러리는 10초 동안 응답을 받지 못하면 runtimeError를 발생시킨다.)
일정한 답변 생성
- 자연어 쿼리인 만큼 최대한 잘 정제해서 일관된 답변 형식으로 받아와야 한다.
- fine tuning이 필요하다
- 일관된 어투 eg) ~해요 체 등으로 답을 받아와야 함
언어
- gpt 는 영어 설정일 때 성능이 훨씬 좋다.
- 사용자 입력을 영어로 번역해서 질의하고 응답을 다시 한국어로 번역하는 것이 좋을까?
- 영어 → 한국어 / 한국어 → 영어 과정에서 문체나 어투 등이 일관적으로 변환이 될까?
정리
- 불필요한 토큰을 최소화 하면서 이전 대화 내용을 포함하여 gpt-turbo-3.5에 요청해야 한다
- 이야기를 계속 생성할수록 요청 시 같이 보내는 이전 대화 내용이 길어짐으로 token 또한 증가, 비용이 계속해서 올라간다.
- 일관된 답변을 얻기 위해 여러가지 시도를 해봐야 한다.