제멋대로맛 초코볼
thumbnail
Spring

Spring Boot openai starter로 ChatGPT 쉽게 사용하기

2024.03.12.

글을 쓰게 된 동기

스프링으로 ChatGPT API를 사용해서 기능을 사용해야 하는 경우가 생겼습니다..! 그래서 RestTemplate과 WebClient 중 비동기를 사용할 수 있고 Non-Blocking을 지원하는 WebClient로 구현하려고 시도했습니다. 하지만 어떠한 이유 때문인지 WebClient Header에 Api 키를 넣었음에도 불구하고 계속 응답을 BadRequest로 받았습니다.

그러던 와중에 Spring에서 제공해주는 spring.ai.openai 의존성이 있다는 것을 알게 되었고, 하루 꼬박 걸렸던.. 제 오류는 금방 해결할 수 있어서 다른 분들도 쉽게 할 수 있으면 좋겠다라고 생각해서 이렇게 블로그 글을 남깁니다!

Spring AI로 ChatGPT 환경설정

Dependancy 설정하기

pom.xml

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-bom</artifactId>
            <version>0.8.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Gradle

dependencies {
  implementation platform("org.springframework.ai:spring-ai-bom:0.8.0")
  implementation 'org.springframework.ai:spring-ai-openai'
}

스프링 공식 홈페이지에서는 Gradle에서는 특정한 버전을 써주지 않아도 문제 없다고 하는데 제가 시도했을 때는 위와 같이 버전을 지정해주니 잘 동작했습니다!
제 환경만 그럴 수도 있으니 한 번 빼고 동작해보시는 것도 추천합니다. (버전은 최신 버전 추천!)

Spring Boot AI ChatGPT Chat 실행해보기

Chat Properties 설정하기

spring:
  ai:
    openai:
      base-url: base-url # 기본 값 : api.openai.com
      api-key: api-key 입력 # 필수 
      chat:
        options:
          model: gpt-4 # 모델 입력 # 필수
          # 아래는 세부 GPT 모델 설정 값
          temperature: 
          frequencyPenalty: 
          presencePenalty: 
          maxTokens: 
          topP: 

위에 사용하지 않은 Properties들이 존재하니 아래 링크를 참조하면 좋을 것 같습니다.

스프링 AI Propreties

Spring Boot AI 사용하기

아래는 공식문서에서 사용하는 예제입니다. 아주 간단하게 사용할 수 있게 지원해주는 것 같습니다.

@RestController
public class ChatController {

    private final OpenAiChatClient chatClient;

    @Autowired
    public ChatController(OpenAiChatClient chatClient) {
        this.chatClient = chatClient;
    }

    @GetMapping("/ai/generate")
    public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        return Map.of("generation", chatClient.call(message));
    }

    // Stream 형식으로 보내주기
    @GetMapping("/ai/generateStream")
	public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        Prompt prompt = new Prompt(new UserMessage(message));
        return chatClient.stream(prompt);
    }
}

위의 방법 말고도 아래와 같이 ChatClient를 직접 만들어 사용하는 것도 가능합니다.

var openAiApi = new OpenAiApi(System.getenv("OPENAI_API_KEY"));

// Properties에 적었던 설정 값들을 직접 명시하여 생성
var chatClient = new OpenAiChatClient(openAiApi)
    .withDefaultOptions(OpenAiChatOptions.builder()
            .withModel("gpt-35-turbo")
            .withTemperature(0.4)
            .withMaxTokens(200)
        .build());

ChatResponse response = chatClient.call(
    new Prompt("Generate the names of 5 famous pirates."));

// Stream 응답으로 보내기
Flux<ChatResponse> response = chatClient.stream(
    new Prompt("Generate the names of 5 famous pirates."));

소감

이렇게 Spring Boot에서 제공해주는 AI 의존성에 대해서 알아보았습니다.
생각보다 저는 삽질을 많이 했는데 모든 정보를 공식문서부터 찾아보는 습관이 아직은 되어 있지 않은 것 같아서 이번에 반성을 하게 되었습니다.
앞으로는 공식문서 위주로 찾아본 뒤에 추가적인 정보들을 다른 채널을 통해서 찾아보는 방식으로 변경할 것 같습니다.

참고

스프링 AI Docs

© Ambosing, Powered By Gatsby.