brunch

You can make anything
by writing

C.S.Lewis

by 에디의 기술블로그 May 12. 2023

OpenAI ChatGPT API 연동

스프링부트 환경에서 OpenAI ChatGPT, DALL·E 사용

작년 이후로 ChatGPT 가 엄청난 관심을 끌고 있다. 게다가 최근 구글의 바드라는 대화형 인공지능 챗봇이 오픈한 상황이고, 엄청난 경쟁이 예상되는 흥미로운 상황이다. 암튼, 이번 글에서는 OpenAI 에서 제공하는 Open API 를 간단하게 사용해서 ChatGPT라 불리는 인공지능 챗봇을 연동해본다. 또한, DALL.E 모델을 사용해서 이미지를 생성해보겠다시간 관계상 빠르게 작성하는 허접한 글이므로, 개발자분들은 이 글을 간단하게 참고만 하길 바란다. 또한, ChatGPT를 포함한 최근 기술은 매우 빠르게 변하고 있다. 대학에서 ChatGPT 관련 논문을 쓰지 못한다는 우스개 소리를 들었다. 기술이 너무 빠르게 발전하고 있어서, 논문을 쓰는 사이에 새로운 기술이 발표되기 때문이란다. 믿거나 말거나 소문이지만, 어쨋든 필자가 작성하는 이 글 역시 시간이 지나면 의미가 없는 글이 될 가능성이 매우 높다. 이 글을 작성하는 시점은 2023년 5월이므로, 2023년 하반기 이후에 이 글을 보는 분들은 읽지 말기를 바란다.


OpenAI, ChatGPT 시작해보기


OpenAI라는 회사와 ChatGPT 에 대해서 필자가 자세히 설명할 필요는 없을 것 같다. 자세한 내용은 공식 사이트를 읽어보길 바란다. 

https://openai.com/

이 글에서는 ChatGPT 3.5 모델을 사용해서 ChatGPT 를 사용해보겠다. 또한, DALL·E 모델을 사용해서 이미지 생성하는 API 를 사용해보겠다. 


주의! 카드 등록 시 $5 결제된다

필자는 2월말에 호기심에 ChatGPT를 사용하기 위해서 API키를 생성했었다. 당시에 무료로 18달러 내에서 사용 가능한 토큰을 제공했다. 하지만 시간이 지난 후 사용하려고 보니 나에게 발급되었던 무료 토큰은 이미 만료가 된 상황이었다.


부득이하게 필자는 유료로 테스트를 해야하는 상황이고, 비싸지 않기 때문에 몇백원 정도만 사용할 계획다. API 사용을 위해 카드를 등록해야 하는데, 카드를 등록하는 순간 필자의 카드에서 5$가 바로 결제되었다. 정확히 10일후 결제취소가 되어서 돈을 돌려 받았지만, 기분이 유쾌하진 않았다. 암튼, OpenAI 의 API 를 사용하기 위해서 카드를 등록하는 순간 일부 금액이 결제가 될 수 있으니 주의하길 바란다. 물론 돌려받게 될 것이다. 참고로 이 정책 또한 추후에 변경될 수 있다. 항상 영어를 잘 읽어보길 바란다. 


카드 등록

방금 설명했듯이 카드를 등록하면 5달라가 결제되고, 10일 정도 지나면 결제가 취소되어서 환불된다. 


카드를 등록한 후 반드시 사용 제한을 걸어두자. 용돈이 부족한 필자는 소심하게 10$로 셋팅해놨다.


Model(https://platform.openai.com/docs/models)

OpenAI 에서 제공하는 모델은 아래와 같다. 


과금 정책(https://openai.com/pricing)

ChatGPT 중 gpt-3.5-turbo 모델은 1토큰 당 0.002$ 를 과금한다. 

이미지를 생성하는 DALL.E 모델은 토큰 기반이 아니라 호출 횟수에 따라서 과금되는데, 이미지 사이즈에 따라서 가격이 다르다.


반복해서 말하지만, 정책은 바뀔수 있다. 


필자의 글을 맹신하지 않기를 바란다.



이 글에서 사용한 클라이언트 기술

이 글에서는 자바, 스프링부트, FeignClient 기반으로 OpenAI API를 호출한다. 클라이언트 기술은 전혀 중요하지 않다. 필자가 익숙한 언어로 빠르게 테스트를 하기 위해서 사용했을 뿐이다. 스프링부트, FeignClient 등 클라이언트 기술은 핵심 주제와는 거리가 있으므로 자세히 다루진 않겠다. OpenAI API 요청 및 응답스펙, 응답 결과 및 응답속도 에 대해서 유심히 살펴보길 바란다. 혹시라도 (허접한) 필자의 샘플 코드를 참고하고 싶다면, 그대로 사용하지 말고 리팩토링해서 사용하길 바란다.

https://github.com/sieunkr/openai-sample


ChatGPT


ChatGPT 는 OpenAI 에서 제공하는 대화형 인공지능 서비스이다. Chat3.5, Chat4 모델이 있는데 이번 글에서는 Chat3.5 모델로 테스트해보겠다.


API키

ChatGPT 를 사용하기 위해서 가장 먼저, API키를 설정해야 한다. API키는 openai 사이트에서 생성할 수 있다.

API키는 클라이언트에서 ChatGPT API를 호출할 때 사용할 것이다. API키는 절대로 github 에 공개가 되지 않도록 주의하자. 필자는 아래와 같이 openai.properties라는 이름으로 별도의 프로퍼티 파일에 API키를 설정하였다. 

application.properties 에서 아래와 같이 프로퍼티 파일을 불러오도록 했다. 

해당 파일을 github 에 올라가지 않도록 gitignore 파일에 설정하였다.


스프링부트 기반으로 ChatGPT 연동 준비

필자는 샘플 코드에서는, 만만한 FeignClient 를 사용하였다. FeignClient 기술은 전혀 중요하지 않다. RestTemplate 또는 WebClient 를 사용해도 전혀 문제 없다. 아래와 같이 FeignClient 인터페이스를 정의한다.

이때 API header 에 API키를 전달해야 한다. header key는 "Authorization" 이고 value는 "Bearer API키"이다. API 요청스펙은 아래와 같다. 

Response 스펙은 아래와 같다. 

요청 및 응답 스펙에 대한 상세한 내용은 필자의 글에서 상세히 설명하진 않겠다. 참고로 total_tokens 값을 유심히 살펴보자. total_tokens는 모델에서 생성된 전체 텍스트의 토큰 수로 입력텍스트와 출력텍스트의 토큰 수의 합이다. 이 값으로 과금이 될 것이다. 자세한 스펙은 레퍼런스 문서를 읽어보길 바란다. 

https://platform.openai.com/docs/api-reference/chat/create


참고로 API 스펙이 최근에 변경되었다. 지난 달에는 ChatMessage, ChatChoice 이었는데 현재 스펙에서는 Message, Choice 등으로 변경되었다. 시간이 지나면 나중에 또 바뀔수도 있다. 


ChatGPT 3.5 모델로 질문하기

gpt-3.5-turbo 모델로 질문을 해보자. content 필드에 질문을 포함해서 호출하면 된다. 

"40 대 개발자의 미래에 대해서 조언해줘" 라는 질문을 해보자. 첫번째 호출은 FeighClient 의 Read Timeout 으로 인해서 응답을 제대로 받지 못했다. 참고로 FeighClient 에서의 디폴트 readTimeout 은 60초로 설정되어있는 상황이다.


두번째 호출은 성공했지만 응답 시간은 30초나 걸렸다. 응답 속도가 너무 느리다.

답변은 아래와 같이 넘어왔다. 식상한 답변이지만 도움이 될것 같다.


 

과금 확인

총 사용 토큰은 응답 받은 Usage 객체의 total_tokens 에서 확인할 수 있는데 467 토큰을 사용했다. 

토큰 사용에 대한 정보는 openai 사이트에서도 확인할 수 있다.

참고로, 영어로 번역해서 질문하면 좀 더 작은 토큰을 사용할 것이다.


총평

질문을 심플하게 던지면 응답시간이 빠르지만, 일반적으로 응답시간이 매우 오래걸려서 실서비스에 사용하는 것이 쉽지는 않을 것이다. 응답 결과 품질에 대한 개인적인 의견은 이글에서는 생략하겠다.


DALL·E 2


이번에는 이미지 생성하는 API 를 호출해보자. 이미지 생성은 DALL.E 모델을 사용한다. 위에서 설명한 ChatGPT 와 유사하다. Request, Response 스펙만 챙겨서 보도록 하자. 


스프링부트 기반으로 이미지생성(DALL.E) 연동 준비

FeignCLient 의 인터페이스를 정의하였다. 아주 심플하다. 

Request 스펙은 아래와 같다. 

Response 스펙은 아래와 같다. 


상세한 스펙은 레퍼런스 가이드를 읽어보길 바란다. 

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


DALL.E 이미지 생성

한글로 이미지 생성 요청을 해보자. "한국의 시골 강아지" 라는 이미지를 생성 요청하였다. 아래와 같은 이미지가 생성되었다. 

쌩뚱맞다. "한국의 시골 강아지" 사진을 요청했는데...


영어로 번역해서 다시 호출해보자. 코드는 아래와 같다. 

아래와 같은 시고르자브종(시골잡종) 이미지가 생성되었다. 이미지의 url 을 응답한다. 그런데, 개인적인 생각이지만 이미지 퀄러티가 높지는 않다.


과금 확인

DALL.E API 는 토큰 기반으로 과금되지 않고 호출 회수에 따라서 과금된다. 이미지 사이즈에 따라서 가격이 다르다. 


총평

한글로 이미지 생성을 하면 정확도가 매우 떨어지는 것을 확인할 수 있다. 실서비스에서 사용하고자 한다면 반드시 영어로 번역해서 사용하길 바란다. 또한, 생성된 이미지의 퀄러티가 그리 높지는 않다. 



마무리하면서


한두시간 정도 두개의 모델을 테스트하면서 나온 가격은 0.08$ 이다. 현재 환율로 105원 정도이다. (지극히 개인적인 생각이지만) 솔직히 저렴하다고 생각되진 않는다. 또한 ChatGPT 질문에 대한 응답속도가 너무 느리다고 생각된다. 실서비스에서 사용하기 쉽지 않을 것이다. 응답 결과에 대해서는 필자가 논하지는 않겠다. 개인적인 생각이지만, 흥미롭기는 하지만 가끔 거짓말도 하고 최신 데이터를 반영하지 않은 상황이라서 필자에게 큰 도움이 되진 않는다. 이미지 생성의 경우에도 퀄러티가 높지 않아서 필자에게 별 도움이 되진 않겠다. 사실 기술 발전이 워낙 빠르게 진행되고 있는 상황이라서 응답 속도 및 품질은 빠르게 개선될것이라 예상된다.


필자가 생업으로 바빠서 글을 작성할 시간이 없지만, ChatGPT에 대해서 틈틈히 검토를 하면서 좋은 정보는 공유하겠다. 끝!

매거진의 이전글 Spring WebSocket Ping/Pong
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari