티스토리 뷰

첫 번째 글을 통해 슬랙 앱을 설치했고 두 번째 글에서 로컬 PC에서 ChatGPT를 서비스하는 방법을 살펴봤습니다. 이번 글에서는 앞서 소개한 소스코드를 클라우드에 올려두고 슬랙에 연동해서 사용해 볼 겁니다. 슬랙 앱이 없다면 첫 번째 글을 참고하시고, 두 번째 글은 슬랙 앱에 권한 설정 부분과 토큰을 얻는 설명이 있기 때문에 부분적으로 참고하셔야 할 겁니다. 만약 권한 같은 문제를 이미 통달하셨다면 이번 글만 보셔도 상관은 없습니다. 자, 그럼 클라우드로 출발합니다.


 

우리는 Google Cloud 를 통해 서버리스 환경에서 ChatGPT와 슬랙앱을 운영해 볼 겁니다. 대략적인 아키텍처는 아래와 같습니다. 보이는 것처럼 아주 심플합니다. Cloud Run은 fully-managed serverless container platform으로 아주 강력한 서버리스 도구입니다. 슬랙에 있는 사람들이 멘션 걸어서 ChatGPT 애플리케이션이 동작될 때만 클라우드 비용이 청구될 겁니다. 그게 서버리스의 강력한 장점이죠. 

Cloud Run을 통해 배포합니다

 

여기서는 Google Cloud 계정은 모두 있다고 가정합니다. 만약 가입되어 있지 않다면 가입하고 이용하시길 추천드립니다. 최초 가입 시 3개월 간 사용 가능한 $300 크레딧이 들어오기 때문에 여러 가지 테스트를 해보실 수 있을 겁니다. 

 

# GitHub 소스코드 fork

Google Cloud에 Cloud Build를 통해 소스코드가 배포될 것이기 때문에 GitHub에 소스코드가 있어야 합니다. 이 부분은 권한이 필요하기 때문에 제가 제공해 드리는 Repository를 그대로 이용할 수는 없고 Fork를 해서 개인 Repository로 가져가셔야 합니다.

Fork 하도록 합니다

 

아래 두 개 Repository를 모두 Fork 합니다.

 

Fork가 끝났으면 Google Cloud Console로 이동합니다. 그리고 상단 중앙에 Search를 통해 Cloud Run을 검색합니다.

Cloud Run을 선택합니다

 

# Cloud Run으로 Hello-ChatGPT 서비스 생성 

다음으로 CREATE SERVICE를 선택합니다. 새로운 Cloud Run 서비스를 만들겠다는 겁니다. 먼저 Hello-ChatGPT를 생성하도록 하겠습니다. 뒤쪽에 환경변수 때문에 꼭 Hello-ChatGPT를 먼저 배포해 주세요.

CREATE SERVICE 선택

 

아래 화살표가 선택이 필요한 부분입니다. 먼저 Continuously deploy new revisions from a source repository를 선택하고 우측에 Manage connected repositories를 이어서 선택합니다. GitHub에 있는 소스코드를 가져다 사용하겠다는 의미이며 지금 현재 GitHub에 연동이 되어 있지 않은 상태기 때문에 연동을 하고 Repository를 선택하기 위한 과정이라고 보시면 됩니다.

차례대로 클릭합니다

 

그럼 브라우저에 새창이 뜨고 GitHub으로 이동될 텐데요, (필요시 GitHub에 로그인을 하고) 아래와 같은 화면이 보이면 Select repositories를 선택합니다. 어떤 레포를 Google Cloud Build에 노출시킬지 결정하는 부분입니다. 당연히 All repositories를 선택하셔도 상관없습니다만, 아무래도 무엇이든 간에 권한에 대한건 "모든 권한"을 선택하는 건 추천되는 방법이 아니니까요.

Only select repositories를 선택하고 Save합니다

 

이제 Google Cloud Console로 돌아와서 Repository를 선택하고 NEXT로 넘어갑니다. 만약 Repository가 보이지 않는다면 우측에 탭을 닫고 다시 SET UP WITH CLOUD BUILD를 열어서 확인해 보세요.

Repository를 선택합니다

 

다음 화면에서는 아무것도 손대실 게 없습니다. 소스코드에 이미 Dockerfile도 있고 브랜치도 main을 바라볼 거니까요. 그대로 SAVE 버튼을 눌러줍니다.

SAVE 하도록 합니다

 

다음으로 서비스 이름이나 리전을 선택해도 됩니다. 하지만 크게 중요하지 않은 부분이라 각자 선택에 맡기겠습니다. 스크롤을 내려 Autoscaling 부분으로 이동합니다. 첫 번째로 Maximum nuber of instances를 1~2 정도로 설정해 줍니다. 기본 값인 30을 딱히 수정하지 않으셔도 상관없습니다만 굳이 그만큼의 인스턴스로 오토스케일 될 필요도 없을뿐더러 이건 비용과 연결될 수 있는 부분이니 적당히 낮게 설정해 주시면 되겠습니다. 2개의 인스턴스로 300명 이상의 사용자가 얼마든지 사용을 하든 Cloud Run이 충분히 감당할 겁니다. 오히려 ChatGPT API 통신에 Rate Limit에 걸리게 될 겁니다( 이건 우리가 어떻게 할 수 있는 부분이 아닙니다 ). 두 번째로 AuthenticationAllow unauthenticated invocations으로 선택해 줍니다. 슬랙 앱에서 호출할 때 권한 없이 호출하기 위한 용도입니다. 설정을 끝냈으면 CRETE 해줍니다. 

Maximum number of instances를 0이 아닌 적당히 낮은 값으로 설정

 

스크롤을 내려서 Container, Networking, Security에서 Container port를 8000번으로 수정해 줍니다. 이건 소스코드에 이미 그렇게 설정되어 있는 부분이라 맞춰주는 겁니다. 여기서 잠깐. 오른쪽에 비용이 나오는데요. 한 달에 180,000초를 무료로 이용할 수 있습니다. 슬랙 메시지 하나당 5초 정도의 응답을 갖는다고 할 때, 약 36,000 개의 메시지가 무료로 처리될 수 있다는 겁니다. ( 비용은 다른 것도 고려는 해야 하지만 편의상 넘어갑니다 )

포트를 8000번으로 설정합니다

 

모든 설정이 끝났습니다. 스크롤을 제일 밑으로 내려서 CREATE 버튼을 눌러 서비스를 배포합니다. 자동으로 Cloud Build를 통해 GitHub에 소스코드를 가져와서 Cloud Run이 실행될 겁니다.

CREATE 버튼을 누르면 Cloud Run 서비스가 생성됩니다

 

Cloud Run 서비스 생성이 끝났으면 목록에서 서비스를 선택해서 들어갑니다. 그리고 상단에 보이는 URL을 복사해서 다음으로 생성할 Hello-Slack-Bot 쪽에 환경변수로 사용하도록 합니다.

URL을 복사해둡니다

 

# Cloud Run으로 Hello-Slack-Bot 서비스 생성 

위에서 진행한 Hello-ChatGPT와 모두 동일하게 진행하고 마지막에 Environment variables만 따로 설정해 주도록 합니다. 아래와 같이 slack_token, channel, openai_token, chat_server, number_of_messages_to_keep을 설정해 주시면 됩니다. 위에 세 개 환경변수는 각자 알고 있는 값을 넣어주시면 되고, chat_server는 위에서 생성한 Hello-ChatGPT Cloud Run URL을 입력해 주시면 됩니다. 단, URL 뒤쪽에 /chat을 꼭 넣어주세요. https://chat-blabla-xxxxxxx.a.run.app/chat과 같은 형태로 넣게 될 겁니다. 그리고 number_of_messages_to_keep는 꼭 0으로 넣어주세요. 이 환경변수는 대화내역을 N개 저장하고 있겠다는 설정인데요. 대화내역을 저장하는 경우 ChatGPT와 대화할 때 상호작용이 되는 것처럼 보일 겁니다. 이전 대화내용을 기억하고 있으니까요. 아주 훌륭한 옵션이죠. 다만, 이 설정을 위해서는 Redis가 필요합니다. Google Cloud에서 Memorystore(Redis)를 올려서 사용하는 것도 좋지만 비용 문제로 다루지 않겠습니다. 만약 이미 Redis가 있다면 앞에 Hello-ChatGPT에 환경변수로 REDIS_HOST를 넣어서 사용해 주시면 됩니다. 

환경변수를 등록합니다

 

환경변수 설정까지 끝났으면 CREATE 버튼을 통해 서비스를 배포합니다. 그리고 방금 생성한 Hello-Slack-Bot Cloud Run에 URL을 복사합니다. 그리고 Slack App에 Event Subscriptions 쪽으로 이동해서 Request URL 주소를 수정해 줍니다. 여기도 꼭 chat을 붙여야 합니다. 혹시 Event Subscriptions 화면이 뭔지 모르시겠다면 이전 글을 참고해 주세요.

Cloud Run 에서 생성한 URL로 교체합니다

 

🎉 축하드립니다. 모든 설정이 끝났습니다! 방금 우리는 서버리스 환경에 ChatGPT API 서버와 슬랙 앱을 배포했습니다. 이제 슬랙에 접속해서 대화를 시도해 보세요!

마음껏 대화를 즐겨봅니다

 

# 마무리

지금까지 Cloud Run을 통해 ChatGPT API 서버와 슬랙 앱 배포를 살펴봤습니다. 서버리스라서 비용 부담도 안될 겁니다. 사실상 OpenAI API 사용요금만 청구될 텐데요. 이 API 사용료가 굉장히 저렴합니다. 경험상 약 200개의 메시지를 처리하는데 $0.3 정도 사용했습니다. 심지어 이때는 대화내역을 저장하는 옵션을 켜서 사용했기 때문에 비용이 약 10배 가까이 나온 수치입니다. 우리가 방금 설정한 대로 대화내역을 저장하지 않는다면 $0.03 정도면 충분할 겁니다. 당연히 메시지 길이에 따라 차이는 있겠지만요("음식점 추천 500개 해줘" 같은 건 답변이 길어질 테니 당연히 비용이 많이 나올 겁니다. 그래봤자 얼마나 차이 나겠냐마는). 월 $20 하는 Plus 유료 플랜을 이용하시겠습니까? 아니면 API를 이용하시겠습니까? 당연히 비용 외적인 문제도 있지만 

아무튼, ChatGPT가 연일 화제의 중심에 있는 만큼, 또한 많은 회사들이 업무용 메신저로 Slack을 이용하는 만큼 ChatGPT <->Slack이 조금 더 대중화되었으면 하는 마음에 글을 적게 됐습니다. 아무쪼록 누군가에게는 도움이 되셨기를 바랍니다. 감사합니다 :)

약 200개의 메시지를 처리했을 때 OpenAI API 비용입니다

 


# 개발자 부록

소스코드 관련해서 누군가 유사한 애플리케이션을 만든다면 고려해야 할 것들입니다.

1) 슬랙 앱은 3초 안에 Response를 보내야 합니다. 그런데 ChatGPT API 반응은 그렇게 빠르지 않습니다. 고로, 슬랙 앱에 요청이 들어오면 일단 적당히 ok 메시지를 Response로 보내고 나서 backgroun task로 ChatGPT 메시지를 처리해야 합니다. 그리고 처리가 끝나면 그 내용을 슬랙에 전송하시면 됩니다.

2) 슬랙에 메시지 보낼 때 thread_ts를 활용하시면 스레드에 댓글이 달리게 됩니다. 이미 스레드에서 대화를 나누고 있다면 thread_ts를, 최초 스레드를 만들어야 하는 상황이면 ts를 이용하시면 됩니다. 아래처럼요.

client.chat_postMessage(
    channel=channel, text=response.text, thread_ts=event.get("ts") if event.get("ts") else event.get("thread_ts")
)

3) ChatGPT가 대화 내역을 기억하고 있게 하려면 주고받는 메시지를 어딘가에 저장하고 있다가 전체를 다시 ChatGPT한테 전달하면 됩니다. 예를 들어 사용자가 "안녕?"이라는 걸 보냈고 응답이 "그래 안녕"이라고 왔습니다. 다시 사용자가 "너는 누구니?"를 보낸다고 치면, [{"user": "안녕"}, {"assistant": "그래 안녕"}, {"user": "너는 누구니?"}] 처럼 메시지를 이어 붙여서 통째로 보내야 합니다. 그렇기 때문에 대화 내용을 저장하고 있으면 비용이 커집니다.

4) token이라는 단위로 비용이 청구되는데 https://platform.openai.com/tokenizer 사이트를 통해 몇 토큰이 사용되는지 확인하실 수 있습니다. 영어에 비해 한글이 표기하는데 토큰 비용이 많이 듭니다. "hello james"는 공백 포함해서 3 token이지만, "안녕 철수"는 12 token을 사용하게 됩니다.

5) 개발자 분들은 소스코드를 보시고 어떤 영감을 얻으시는 등 혹시 도움이 되셨다면 Repository에 Star(⭐️) 부탁드립니다 :)

 

 

댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday