현의 개발 블로그

스프링부트에서 Open AI API 호출하기(2) 본문

대외활동/한이음

스프링부트에서 Open AI API 호출하기(2)

hyun2371 2023. 7. 26. 21:52

Open AI API를 호출하기 위해 이전 글에서 설정 및 request DTO까지 생성 완료하였다.

 

스프링부트에서 Open AI API 호출하기(1)

스프링부트에서 Open AI를 활용해 응답을 받아오는 API를 구현할 것이다. build.gradle 설정 아래 라이브러리를 import 해준다. GitHub - TheoKanning/openai-java: OpenAI Api Client in Java OpenAI Api Client in Java. Contribute

hyun-keepdeving.tistory.com

 

Controller 작성하기

 

라이브러리로 OpenAiService가 잘 구현되어 있으니 사용하자.

DEFAULT_TIMEOUT이 10으로 되어 있어 긴 답변을 요청할 때 socket timeout에러가 났다.

이를 해결하기 위해 파라미터로 Duration 값을 직접 설정해 주었다.

@PostMapping("/question")
public String sendQuestion(@Valid @RequestBody QuestionRequestDto requestDto) {
  OpenAiService service = new OpenAiService(apiKey, Duration.ofSeconds(60));
  ...}

 

 

 

ChatMessage를 생성하고  role과 content에 각각 "user"와 클라이언트 입력값을 넣는다.

 

model을 gpt-3.5-turbo를 사용하였다.

gpt-4.0를 써보고 싶었는데 한 번 이상 결제한 내역이 있어야 쓸 수 있다고 한다.

List<ChatMessage> messages = new ArrayList<>();
ChatMessage chatMessage = new ChatMessage("user", requestDto.getQuestion());
messages.add(chatMessage);

ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest
          .builder()
          .model("gpt-3.5-turbo")
          .messages(messages)
          .temperature(1.0)
          .n(1)
          .stream(Boolean.FALSE)
          .maxTokens(500)
          .presencePenalty(0.0)
          .frequencyPenalty(0.0)
          .build();

 

 

Builder 패턴으로 요청 DTO를 생성하였다. 파라미터를 더 자세히 살펴보자

  • temperature
    • 0~2 사이로 설정 가능하다. 0에 가까울수록 정형화되고, 2에 가까울수록 무작위 값이 나온다.

  • n
    • 입력 메시지를 몇 개 생성할 건지 설정한다.
  • stream
    • true로 설정하면 chatGPT처럼 한 글자씩 값을 내려준다.
  • maxTokens
    • 응답받는 최대 토큰 수이다. 기본값은 max로 설정되어 잇다.
  • presencePenalty
    • 값이 클수록 새로운 토픽에 대해 말할 가능성을 낮춰준다.
  • frequencyPenalty
    • 값이 클수록 동일한 구나 단어를 자주 반복하지 않도록  해준다. 

 

 

아래와 같이 작성하면 ChatMessage 타입으로 반환할 수 있다.

ChatMessage responseMessage = service.createChatCompletion(chatCompletionRequest).getChoices().get(0).getContent();

return responseMessage;

 

 

나는 content만 받고 싶어서 getContent()를 추가했다. 그러면 String 형태로 반환받을 수 있다.

 

Comments