Spring Boot로 ChatGPT API 사용하기


OpenAI의 ChatGPT는 현재 전세계에서 가장 핫한 키워드 중 하나다. ChatGPT를 접하고 API를 제공할 텐데 한번 만들어 볼까 생각이 들어 시작했다. 마침 Spring Boot 3.0이 릴리즈 된 후 제대로 써보지 않았어서 Spring Boot 3.0 기반으로 만들기로 했다.




Spring Boot 3.0


Spring Boot 3.0 버전이 릴리즈 되면서 여러 변경 점이 있지만 그 중 가장 주목했던 부분은 reactive programming에 대한 지원이 개선되었다는 점이다. 따라서 이전 버전에서는 dependency를 추가해야만 사용이 가능했던 Spring Web Flux가 기본으로 탑재되어 별도의 dependency 추가 없이 사용이 가능해졌다.

그리고 SpirngBoot 3.0은 Java 17부터 지원하기 때문에 Java 16에 도입됐던 record도 사용이 가능하다.





OpenAI Doc


ChatGPT API를 사용하기 위해서는 OpenAI에서 제공해주는 문서를 찾아봤다.

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

API 문서에서 필요한 내용은 API에 보낼 RequestResponse의 형태이다.

Request Body

curl https://api.openai.com/v1/completions \ 
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \ 
-d '{ 
    "model": "text-davinci-003", 
    "prompt": "Say this is a test", 
    "max_tokens": 7, 
    "temperature": 0 
  }'

OpenAI가 제공해주는 Request Body 샘플이다.

Response

{
    "id": "cmpl-uqkvlQyYK7bGYrRHQ0eXlWi7",
    "object": "text_completion",
    "created": 1589478378,
    "model": "text-davinci-003",
    "choices": [
        {
            "text": "\n\nThis is indeed a test",
            "index": 0,
            "logprobs": null,
            "finish_reason": "length"
        }
    ],
    "usage": {
        "prompt_tokens": 5,
        "completion_tokens": 7,
        "total_tokens": 12
    }
}

OpenAI가 제공해주는 Response 샘플이다.




API Key


개발하기 앞서 Request를 보낼 때 Header에 필요한 API Key를 생성해야 한다.

API Key는 https://platform.openai.com/account/api-keys 에서 생성하면 된다.



코딩


준비는 끝났으니 이제 코딩만 하면된다.


Controller

컨트롤러는 간단하다.

화면에서 chatgpt에게 물어볼 prompt만 받아서

Service에 넘겨주고 받은 response만 다시 내려주면 된다.



Data class (Request & response)

Spring Boot 3.0으로 만드는 만큼 익숙한 lombok이 아닌 record 클래스로 만들었다.


Request
  • 요청을 보낼 때 필요한 데이터 model, promot, temperature, max_tokens를 포함한 record 클래스다.
  • create() method를 통해 사용자가 입력한 prompt 값을 받아서 reqeust에 필요한 데이터를 생성해준다.

Response
  • getText() method를 통해 OpenAI에 받아온 Response에서 ChatGPT의 응답 값인 text를 추출해준다.



SERVICE

Service 단에는 두 개의 method가 있다.

1. chat()

Controller로 부터 받은 사용자 입력 값으로 Request Record를 만들고 API로 부터 받은 응답으로 Response Record를 만드는 기능을 한다.

2. sendRequest()

OpenAI API에 요청을 보내는 기능을 한다.


  • ObjectMapper

    ObjectMapper를 사용해서 Request Record를 String으로 바꾸고 받아온 Response를 내가 만든 Response record 클래스 형태로 간편하게 변환할 수 있다.

  • HttpClient, HttpRequset, HttpResponse

    java.net.http에서 제공하는 Http객체들을 사용하면 Http 통신을 편리하게 할 수 있다.




테스트


작성한 코드가 잘 돌아가는지 테스트 해보자.

먼저 아름다운 화면을 하나 만들어 주고 ChatGPT에게 말을 걸어보자.


로그

responseBody {
    "id":"cmpl-6udbCmqY9XsrFX1nJOrhFcqLXzopK",
    "object":"text_completion",
    "created":1678956606,"model":"text-davinci-003",
    "choices":[{
        "text":"\n\nNo, I'm not.",
        "index":0,"logprobs":null,
        "finish_reason":"stop"
    }],
    "usage":{
        "prompt_tokens":4,"completion_tokens":8,"total_tokens":12
    }
}


응답을 제대로 받아오는 걸 볼 수 있다.






Spring Boot로 OpenAI ChatGPT3 API 연결을 간단하게 구현해 보았다.





근데 다 만들고 보니 ChatGPT4가 출시되었다.




jeewoo jung 아바타