ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Springboot에서 ChatGpt연동하기
    개발/Spring(boot) 2025. 2. 9. 22:49

    Springboot에서 외부 Api(ChatGpt)를 연동한 프로젝트를 만드는 방법에 대해 작성해보고자 한다.

     

    1. 프로젝트 초기 환경 세팅

    2. OpenAI Docs를 보고 FeignClient를 활용해 Api 호출을 하여 사용하는 방법

    3. SpringAI를 사용해 연동하는 방법

    순서로 작성하겠다.


    0. OpenAi Api key 발급

    Chat GPT API 호출은 유료이다.

    먼저 외부 Api를 연동하기 위해서는 Api key 발급이 필요하다.

    https://platform.openai.com/api-keys 위 url에 들어가서 로그인(회원가입)을 한 뒤에 Create Api Key 버튼을 클릭한다.

    발급된 Api key는 다시 볼 수 없는 것 같아서 어딘가에 저장해 놓는 것을 추천한다. 


    1. 프로젝트 초기 환경 세팅

    그럼 Springboot 프로젝트를 하나 만들어보자.

    IDE는 Intellij IDEA, JDK는 zulu-17, 스프링 버전은 3.4.2를 언어는 Kotlin을 사용했다.

     

    새 프로젝트를 하나 생성해보자

    이후 스프링 앱을 실행하면 실패한다

    OpenAI API key가 없다고 하니 사용하기 전 까지 dependency에서 openai를 주석처리해주자.

     

    그리고 나서 간단하게 테스트를 위한 컨트롤러를 작성해보자.

    잘 나오므로 이제 FeignClient를 활용해 OpenAI의 Api를 호출해보자.


    2. OpenAI Docs를 보고 Api 호출을 하여 사용하는 방법

    OpenAi Docs에서 어떻게 api를 호출하는지에 대한 간략한 설명이 나와있다.

    https://platform.openai.com/docs/api-reference/introduction

    앞서 발급받은 Api Key를 Header에 잘 넣어주고 이 내용을 참고하면 충분히 호출할 수 있어 보인다.

     

    스프링부트 초기환경 세팅을 할 때 FeignClient를 추가했었다.

    그리고 FeignClient를 사용하기 위해

    main에 @EnableFeignClients를 붙여줘야 한다.

    @SpringBootApplication
    @EnableFeignClients
    class OpenaiTestApplication
    
    fun main(args: Array<String>) {
    	runApplication<OpenaiTestApplication>(*args)
    }

    발급받았던 Api Key를 환경변수에 넣어주자.

    그럼 controller에서 아래와 같이 사용할 수 있다.

    그리고 Docs에 어떤 형식으로 api를 보내야 하는지 잘 살펴보자

    Content-Type의 경우 아마 Default가 application/json일 것이므로 따로 지정해주지 않아도 되고

    Header에는 Authorization으로 Api Key를 보내야 하고

    Body에는 Map<Map<String>> 형태로 값을 보내면 될 것 같아 보인다.

     

    그럼 FeignClient를 작성해보자.

    @FeignClient(name = "openAI", url = "https://api.openai.com/v1")
    interface OpenAIClient {
    
        @PostMapping("/chat/completions")
        fun callApi(
            @RequestHeader("Authorization") authorization: String,
            @RequestBody body: Map<String, Any>
        ): String
    }

    생각한대로 형식만 맞춰주면 된다.

    이에 따라 다시 Controller 영역도 수정해보자(간단한 테스트를 위한 코드이므로 Controller에서 FeignClient를 호출)

    @RestController
    @RequestMapping("/test")
    class OpenAIController(
        @Autowired
        private val openAIClient: OpenAIClient,
    
        @Value("\${ai.api.key}")
        private val apiKey: String
    ) {
        @GetMapping("/feign-client")
        fun callByFeignClient(@RequestParam question: String): ResponseEntity<String>{
            return ResponseEntity.ok(
                openAIClient.callApi(
                    "Bearer $apiKey",
                    mapOf(
                        "model" to "gpt-4o-mini",
                        "messages" to arrayOf(
                            mapOf(
                                "role" to "system",
                                "content" to "과격한 10년차 시니어 개발자",
                            ),
                            mapOf(
                                "role" to "user",
                                "content" to question
                            )
                        )
                    )
                )
            )
        }
    }

    형식을 잘 맞춰준 것 같으니 이제 실행해보자. 

    안녕하세요 라는 질문을 해보겠다.

    많은 정보가 함께 오지만 content 안에만 보면 될 것 같다.

    복잡한 질문 역시 응답이 잘 온다(돈이 많이 들겠지만..)


    여기까지가 FeignClient를 활용해 ChatGpt를 연동하는 방법이었다.

    디렉토리 구조는 아래와 같고 코드는 바로 위에 작성한 코드를 참고하면 될 것 같다.


    3. SpringAI를 사용해 연동하는 방법

    이번에는 SpringAI 라이브러리를 활용해 Chat GPT api를 호출해보겠다.

    먼저 dependency에 있던 open-ai 주석을 제거하고 앞서 발급받았던 api-key를 application.properties에 지정해줘야 한다.

    spring.application.name=openai_test
    ai.api.key=...
    
    #TODO
    spring.ai.openai.api-key=...

    그리고 ChatClient를 Bean으로 선언하는게 필요해 보이는데, 이를 Config 파일로 만들어두겠다.

    @Component
    class OpenAIConfig {
        @Bean
        fun chatClient(builder: ChatClient.Builder): ChatClient {
            return builder
                .defaultSystem("You are a friendly chat bot that answers question in the text")
                .build()
        }
    }

    앞으로 ChatClient를 가지고 통신을 하면 되는 것 같으며 내용은 OpenAi Docs를 참고했다.

     

    그리고 마지막으로 Controller에 ChatClient를 추가하고 형식에 맞게 통신하는 코드를 추가한다.

    class OpenAIController(
        @Autowired
        private val openAIClient: OpenAIClient,
    
        @Autowired
        private val myClient: ChatClient,
    
        @Value("\${ai.api.key}")
        private val apiKey: String
    ) {
        ...
        @GetMapping("/lib")
        fun callByLib(@RequestParam question: String): ResponseEntity<String>{
            return ResponseEntity.ok(
                myClient.prompt()
                    .user(question)
                    .call()
                    .content()
            )
        }
    }

    "Deepseek랑 너랑 비교하면 어때" 라는 질문을 넣어봤다.

    결과가 잘 나오는 것을 확인할 수 있다.


    Chat GPT를 Springboot에서 연동하여 사용해봤다.

    기존에 FeignClient를 사용해서는 연동해봤지만 SpringAI 라이브러리를 사용해보고 싶어서 복습해볼겸 둘 다 사용해서 연동해봤다.

    확실히 FeignClient 방식보다는 라이브러리 방식을 활용하는것이 훨씬 편한 것 같고 만약 모델이나 회사를 변경해야 한다면(gpt4-mini -> gpt4 또는 OpenAI -> Azure) 라이브러리 방식이 수정사항이 적어 보인다.

    앞으로 AI 모델을 Api 방식으로 연동해 사용할 일이 있다면 SpringAI를 사용할 것 같다.

     

    작업한 코드는 아래 깃에서 확인할 수 있습니다.

    https://github.com/SungHoonKim-Ski/openai_test

     

    출처

    https://platform.openai.com/docs/api-reference/introduction

    https://docs.spring.io/spring-ai/reference/api/chatclient.html#_using_an_autoconfigured_chatclient_builder

    반응형

    댓글

Designed by Tistory.