Slack ChatGPT 연동하기 본문

Python

Slack ChatGPT 연동하기

최재강 2023. 1. 28. 16:44

ChatGPT는 출시된 후 프로그래머 사이에 적잖이 큰 충격을 주었다. 기대이상의 수준 높은 답변과 직접 코딩까지 해주는 등 업무에 이용할만한 수준까지 발전되었기 때문이다.

지금까지 ChatGPT를 사용하려면 직접 ChatGPT 웹사이트에 방문하여 질문을 남기는 방식이 일반적이였다. 하지만 슬랙에서 ChatGPT를 사용할 수 있다면 얼마나 편할까? 팀원들과 업무를 진행하면서 의문점이 생겼을 때 곧바로 ChatGPT를 통해 질문을 남기고, 답변을 받는다면 업무처리가 조금 더 원활해 질 수 있을 것 이다.

따라서 본 포스팅에서는 슬랙에서 ChatGPT를 사용할 수 있도록 안내한다. Python, OpenAI, 슬랙봇의 RTM 기능을 이용할 예정이다.

0. ChatGpt 슬랙에 온걸 환영합니다.

환영한다니까 Slack에 대한 TMI를 쏟는 ChatGPt..

1. 슬랙 봇 만들기

우선 슬랙에 메세지를 작성할 슬랙 봇을 만들어야 한다.
여러 블로그 포스팅에서 슬랙 봇 만들기 방법을 안내하고 있으나, 슬랙 봇의 RTM 기능을 이용하기 위해서는 Classic 버전의 Slack App을 만들어야 한다고 한다. 이 부분을 몰라서 일반적으로 안내하는 방법으로 만든 후 정상적으로 동작하지 않아 애를 많이 먹었다.

결국 필자는 현재 슬랙 웹사이트에서 해당 앱을 만들 수 있는 경로를 찾지 못했고 그대신 직접 접근할 수 있는 링크를 알게 되었다.

Classic Slack App을 만들기 위해 아래 링크에 방문한다. (로그인 과정 필요)

그 후 아래 화면에서 원하는 App Name과 슬랙 봇을 사용할 Workspace를 지정한다.

필자는 App Name을 ChatGPTBot으로 설정했다.

Create App을 누르면 다음과 같은 화면을 확인할 수 있다.

Bots 버튼을 눌러 생성한 ChatGPTBot 앱에 Bot을 추가해줄 것 이다.

우선 Add Legacy Bot User를 클릭해 Bot User를 만든다.

Display Name은 실제로 슬랙에서 슬랙봇이 표시되는 이름이다.

필자는 App Name과 동일하게 ChatGPTBot으로 설정, Default username은 소문자만 가능하기 때문에 chatgptbot으로 설정했다.

이름 설정을 끝냈다면 Add 버튼을 눌러 생성을 완료한다.

생성이 정상적으로 완료 됐다면 다음과 같이 생성한 Bot 정보가 표시된다.

확인했다면 좌측 탭의 OAuth & Permissions을 클릭한다.

OAuth & Permission 페이지에 접근했다면 페이지를 스크롤해 아래로 내려서 Scopes를 지정할 수 있는 곳으로 내려온다.

OAuth Scopes란 해당 슬랙봇이 슬랙 채널에서 어떠한 권한을 가질 수 있는지 지정하는 것이다. 슬랙봇이 슬랙 채널에 메세지를 직접 보낼 수 있는지, 채널의 이전 채팅을 볼 수 있는 지 등을 설정할 수 있다. 여기서 필요한 권한을 추가해줄 것이다.

아래와 같이 Add an OAuth Scopes 버튼을 클릭한다.

기존에 있던 bot Scope를 포함해 아래 사진과 같이 두가지의 권한을 더 추가한다.

channels:history 는 슬랙 봇이 속한 채널의 채팅 기록을 볼 수 있는 권한이다.

chat:write:bot은 슬랙 봇이 슬랙에 메세지를 작성해 보낼 수 있는 권한이다.

OAuth Scopes 추가를 완료했다면, 다시 페이지 위로 올라가 Install to Workspace 버튼을 클릭한다.

확인 후 허용버튼을 클릭한다.

그러면 다음과 같이 OAuth Token을 확인할 수 있다.
여기서 Bot User OAuth Token은 추후 코드에서 사용하게 되니, 따로 저장해둔다.

2. OpenAI 가입 및 API Key 발급

ChatGPT는 OpenAi 기반의 언어 모델이다. OpenAi는 프로그래밍적으로 ChatGPT를 사용할 수 있도록 API를 제공한다.

우선 아래 OpenAI 홈페이지에 들어가서, 로그인 혹은 회원가입을 진행한다.


그 다음 프로필을 눌러 API발급을 위해 View API keys 버튼을 클릭한다.

해당 페이지에서 Create new secret key 버튼을 클릭한다.

발급받은 API Key를 따로 저장해둔다.

3. Python Code 준비

이제 슬랙 봇과, OpenAI가 준비되었으므로 python code를 작성하여 슬랙 봇이 ChatGPT역할을 하도록 서버 구성을 할 것이다.

전체 코드에 대해 깃허브에 업로드 해두었다.

코드 사용을 위해 해당 깃허브를 clone한다.

git clone https://github.com/workdd/ChatGPT_with_Slack

그다음 필수적인 python 라이브러리 설치를 위해 아래의 명령어를 입력한다.

pip install -r requirements.txt

정상적으로 설치가 되었다면 코드 실행 준비가 완료된 것이다.

참고 사항

  • python 패키지 버전
    • python : 3.8.12
    • open ai : 0.26.4
    • slack : 0.0.2
    • slackClient : 2.9.4
  • Python으로 chatgpt를 이용하는 코드 관련해서 아래 블로거분의 코드를 참고했다.

코드 소개 및 발급받은 key 기입

총 두가지의 python 파일이 사용된다.

해당 코드를 사용하기 위해 YOUR_API_KEY변수에 앞서 저장해두었던 OpenAI API Key를 기입한다.

chatgpt.py는 openai의 api를 호출해 최신 chatgpt 언어 모델인 text-davinci-003 모델을 가져온다. 그외에 text-curie-001, text-babbage-001 모델 등 다른 모델을 사용할 수도 있다.

chatgpt.py

import openai

# 발급받은 OpenAI API Key 기입
YOUR_API_KEY = '<your-openai-api-key>'


def ChatGPT(prompt, API_KEY=YOUR_API_KEY):
    # api key 세팅
    openai.api_key = API_KEY

    # ChatGPT API 호출 및 최신 언어 모델인 text-davinci-003을 가져옴
    completion = openai.Completion.create(
        engine='text-davinci-003'  # 'text-curie-001'  # 'text-babbage-001' #'text-ada-001'
        , prompt=prompt
        , temperature=0.5
        , max_tokens=1024
        , top_p=1
        , frequency_penalty=0
        , presence_penalty=0)

    return completion['choices'][0]['text']


def main():
    # 지문 입력 란
    prompt = input("Insert a prompt: ")
    print(ChatGPT(prompt).strip())


if __name__ == '__main__':
    main()

실제로 구동할 코드인 main.py이다.
Slack RTM 클라이언트를 통해 슬랙 채널에서 @ChatGPTBot을 언급하면 정의해둔 chatgptbot 함수가 실행되는 방식이다.

해당 코드를 사용하기 위해서는 bot_token변수에 앞서 저장한 bot user token을 기입해야한다.

main.py

from slack import RTMClient
from chatgpt import ChatGPT

# 발급받은 슬랙 bot user token 기
bot_token = "<your-slack-bot-token>"

# 지속적으로 슬랙 메세지 트래킹
@RTMClient.run_on(event="message")
def chatgptbot(**payload):
    data = payload["data"]
    web_client = payload["web_client"]
    bot_id = data.get("bot_id", "")
    subtype = data.get("subtype", "")
    origin_text = data.get("text", "")
    tag_code = origin_text.split(" ")[0]

    # 메세지 정보 파악
    print(data)
    # Bot이 입력한 채팅이 아닐 경우 ChatGPT 동작
    if bot_id == "" and subtype == "" and ">" in tag_code:
        channel_id = data["channel"]
        # Extracting message send by the user on the slack
        text = data.get("text", "")
        text = text.split(">")[-1].strip()
        # 해당 메세지 입력 시간을 파악하여 답글을 달 수 있도록 지정
        message_ts = data["ts"]

        #받아온 텍스트를 ChatGPT에 전달하고 ChatGPT의 답변 저장
        response = ChatGPT(text)
        # 슬랙에 메세지 전달
        web_client.chat_postMessage(channel=channel_id, text=response, thread_ts=message_ts)


if __name__ == "__main__":
    try:
        # RTM 클라이언트 호출 및 시작
        rtm_client = RTMClient(token=bot_token)
        print("Starter Bot connected and running!")
        rtm_client.start()
    except Exception as err:
        print(err)

 

bot user token 기입이 끝났다면 다음 작업으로 넘어간다.

4. Slack에 생성한 슬랙 봇 추가

슬랙 앱에 들어가 좌측 탭에서 버튼을 클릭한다.

클릭 후 생성한 슬랙 봇 이름을 검색 후 클릭한다.

클릭하면 생성한 슬랙 봇과 1대1 메세지창이 나온다.

그러면 이제 슬랙 봇에게 질문할 준비가 완료된 것이다.

우선 앞서 작업한 코드를 이제 실행시킨다.

python main.py

실행한 창에서 “Starter Bot connected and running!” 이라는 문구를 확인했다면, 슬랙 봇이 메세지를 받을 준비가 완료된 것이다.

사용은 아래와 같이 “@슬랙봇이름 메세지”의 방법으로 슬랙봇을 언급하고 원하는 메세지를 입력하는 것이다.

슬랙에 온 것을 환영한다고 하니.. 슬랙에 대한 TMI를 늘어놓는 ChatGPTBot을 확인할 수 있다.

Slack에 ChatGPT를 들여오다

만약 1대1 대화가 아닌 특정 채널에서 ChatGPTBot을 활용하고 싶다면 ChatGPTBot을 해당 채널에 초대한 후 위와 같은 방식으로 활용하면 된다.

Python 코드로 Slack에 ChatGPT를 연동하면서 제가 미쳐 대응하지 못한 버그가 발생하거나 비효율적으로 동작할 수 있는 부분이 있을 수 있습니다. 
현재 예상이 가는 부분은 메세지를 순차적으로 처리하기 때문에 동시에 많은 메세지 요청이 서버가 견디지 못하거나 답변이 많이 느려지는 등의 이슈가 생길 수 있을 것 같습니다.
혹시 본 포스팅의 방법 및 코드로 진행해보시고 보완해야할 부분이 있다면, 댓글로 피드백 해주시거나 깃허브에 Issue 생성 및 Pull Request를 적극 환영합니다!
감사합니다.

 

참조

Comments