TIL/개인공부

[Slack] ChatGPT Slack 챗봇 만들기 (2편)

재융 2023. 1. 29. 17:50
반응형

앞선 페이지에서 ChatGPT에 대한 기본적인 설정을 하였다. 이번 포스팅에서는 FastAPI를 사용하기 위한 환경을 구축해본다.

자세히는 설명하기가 너무 길어질것같고. 최대한 요약해서 설명을 해보려고한다.

 

필자는 AWS EC2환경에서 Docker 로 FastAPI를 띄우는 컨테이너를 만들었다.

먼저 app이라는 디렉토리를 생성한다.

mkdir app

그리고 해당 디렉토리 아래에 다음과같은 파일들을 옮겨놓는다.

먼저, 앞 포스팅에서 작업했던 chatgpt.py파일을 옮겨놓는다.

그다음 fastapi에서 사용하기 위한 main.py를 아래와같이 작성한다.

from fastapi import FastAPI, Request
from chatgpt import ChatGPT
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
from pydantic import BaseModel
import requests
import json

app = FastAPI()
# slack bot token 넣기
slack_token = "xoxb-로 시작"

try:
    client = WebClient(token=slack_token)
except Exception as e:
    print(e)

@app.get("/")
def read_root():
    return {"Hello": "World"}


class SlackMessage(BaseModel):
    message: str

@app.post("/chatgpt/")
async def send_to_chatgpt(request: Request):
    channel_id = ""
    user_name = ""
    message = ""
    try:
        request_body = await request.body()
        for data in request_body.decode('utf-8').split("&"):
            data_info = data.split("=")
            if data_info[0] == "channel_id":
                channel_id = data_info[1]

            if data_info[0] == "user_name":
                user_name = data_info[1]

            if data_info[0] == "text":
                message = data_info[1]
        message = message.strip()

        response_gpt = ChatGPT(message)

        question_response = client.chat_postMessage(channel = channel_id, text = f"*{user_name} => Question.* " + message)
        answer_response = client.chat_postMessage(channel = channel_id, text = "*ChatGPT Answer.*" + response_gpt)
        return {"ChatGPT" : "Finished answer"}
    except Exception as e:
        print(e)

그렇다면 이제 파일구조는 다음과같이 될것이다.

  • app
    • chatgpt.py
    • main.py

그다음으로는 FastAPI를 Docker로 띄우는 작업이다. 아래는 Dockerfile에 대한 내용이다.

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.8

COPY ./requirements.txt /app/requirements.txt

RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt

COPY ./app /app

requirements.txt에는 아래와같은 내용이 적혀있다.

openai
slack_sdk

위에서 작성한 Dockerfile을 아래와같은 명령어로 build해준다.

docker build --tag chatgpt_fastapi .

 

그 다음 아래와같은 명령어로 build한 이미지에 대해서 run을 진행한다. 컨테이너의 80포트는 고정이고, 앞의 외부포트만 내가 원하는 포트번호로 바꿔주면된다.

docker run -itd -p 20611:80 --name chatgpt_fastapi -v /home/ubuntu/chatgpt/app:/app  --rm chatgpt_fastapi:latest

이제 정상적으로 fastapi container가 띄워졌는지 체크해본다.

내가 띄운 주소의 /docs 경로로 접근이 되는지도 확인해본다. 해당 경로는 FastAPI의 문서페이지이다. 아래와같은 페이지가 나오면된다.

다음 포스팅에서는 내가 띄워놓은 FastAPI가 어떻게 Slack에서 사용되는지에 대해서 설명하겠다.

반응형