[AI] ChatGpt4 Discord Bot 만들기 (feat. python)

김민주·2024년 5월 8일
4
post-thumbnail

사전 준비사항

  • Discord 계정 & 서버
  • OpenAI API Key
  • 파이썬 개발 환경 IDE(vscode or PyCharm)

사실 위의 환경이 미리 준비되어 있지 않아도 됩니다. 단계별로 차근 차근 따라오시면서 필요한 환경을 만드셔도 됩니다.

참고로 저는 PyCharm으로 진행했고, 학생이시라면 학교 계정으로 1년 동안 PyCharm Pro를 사용하실 수 있으니 이참에 사용해보시면 좋을 것 같습니다.

Discord Bot 만들기

새 Discord Server 만들기

디스코드 봇을 만들거니까 가장 먼저 봇이 들어갈 장소인 서버가 필요하겠죠?

Discord 사이트로 이동하여 [ Open Discord ]를 클릭합니다. 참고로 Discord는 웹브라우저에서도 사용이 가능하며 앱 모바일이나 데스크톱 앱 다운로드 후 이용도 가능합니다.

디스코드에서 서버는 공간이나 장소의 의미입니다. 왼쪽 열에 보이는 목록이 서버 목록이고, 가장 아래에 있는 초록색 [+] 버튼을 클릭하면 서버를 추가할 수 있습니다.

서버 추가 과정은 아래 빨간색 박스를 클릭하며 아래 사진과 같이 진행하면 됩니다.

Application Bot 생성

Discord Developer Portal - Application에 접속해 New Application 버튼을 클릭합니다.

Application의 이름을 지어준 후 Create 버튼을 눌러 application을 생성합니다.

생성이 성공적으로 되면 아래와 같은 화면이 뜰 것입니다.
이제 드디어 Bot을 만들 수 있게 되었습니다! 왼쪽 열에서 Bot을 클릭해 주세요.
그 후 Build-A-Bot 섹션에 아무것도 안뜬다면 Add Bot 버튼을 눌러 bot을 만들어주세요. (이미 있을시 그냥 냅두셔도 됩니다.)

그 다음 Bot의 설정은 discord 서버 이용자로 제한할 것이기 때문에 private으로 했습니다.
Privileged Gateway Intents는 권한 설정 부분입니다. dicord와 채팅하기 위해서 MESSAGE CONTENT INTENT의 활성화는 반드시 필요합니다. 그리고 나머지 권한에 대해서는 잘 모르지만 discord api가 제공하는 모든 정보를 제공받기 위해서 저는 일단 다 허용했습니다..ㅎ

서버와 Bot 연결

OAuth2를 클릭해 이동합니다. OAuth2 URL Generator에서 bot을 체크하면 BOT PERMISSIONS이 뜹니다.

우리는 Bot과 대화를 할 것이기 때문에 TEXT PERMISSONS에서 Send Messages를 체크해줍니다.
그 다음 Generated Url을 복사해줍니다.

이제 다시 디스코드를 엽니다. 그리고 채팅창에 복사한 url을 붙여넣고, url을 클릭합니다.
클릭하면 위에서 만든 application이 discord에 접근하려한다는 팝업이 뜹니다. [승인] 버튼을 눌러 Bot과 서버를 연결해주세요.

이제 드디어 Discord bot이 서버와 연결되었습니다!🥳
bot 이름을 클릭하면 현재 bot이 온라인 상태인지 오프라인 상태인지 확인할 수 있습니다.

ChatGpt4를 Discord bot에 적용하기

이제 파이썬을 사용해 discord bot에 ChatGpt4 영혼을 불어넣어 주도록 하겠습니다.

파이썬 프로젝트 생성

PyCharm을 실행시켜 New Project를 클릭하면, 아래와 같은 팝업이 나옵니다. 프로젝트 파일이 생성될 위치를 지정해 주세요.
그리고 interpreter type에는 로컬, conda, 리모트 3가지가 있는데 저는 로컬인 Project venv로 선택했습니다.
이들 중 아무거나 선택해도 됩니다. 이를 나누어 놓은 이유는 프로젝트를 독립적으로 원하는 버전의 파이썬, 라이브러리 등을 사용하기 위해서이기 때문에, 현재 프로젝트에는 큰 영향이 없습니다!

discord openai package 설치

터미널에 아래 명령어를 입력해서 라이브러리를 설치해주세요.

pip install discord openai python-dotenv 

openai 라이브러리를 사용해 OpenAI API 사용을 할 것이고, discord 라이브러리를 사용해 Discord API를 사용할 것입니다.
load_dotenv 라이브러리를 사용해 API keys를 관리하기 때문에 key 노출에 대한 걱정은 안해도 됩니다!

.env 파일을 만들어서 discord token을 입력해주세요.

DISCORD_TOKEN = "디스코드 토큰"

Discord Bot TOKEN은 Bot에 할당되는 고유 식별자입니다. Bot이 동작하고 Discord API와 통신하는 데 필요합니다. Discord 개발자 포털 > Bot > Build-A-Bot > TOKEN에서 Reset Token 버튼을 눌러 토큰을 확인 해주세요.

bot.py 만들기

이제 bot.py 파일로 디스코드 봇을 만들어 봅시다!

# bot.py
import os
import discord
from dotenv import load_dotenv

# 환경 변수를 .env 파일에서 로딩
load_dotenv()

TOKEN = os.getenv('DISCORD_TOKEN')

intents = discord.Intents.all()
client = discord.Client(command_prefix='!', intents=intents)

@client.event
async def on_ready():
  print(f'We have logged in as {client.user.name}')

# start the bot
client.run(TOKEN)

ctrl+shift+R 이나 $ python bot.py 명령어를 통해 코드를 실행해주세요.
봇을 실행하는데 성공했다면 터미널에 아래 사진과 같이 뜨게 됩니다.

그리고 디스코드에 들어가 봇 상태를 확인해보면, 오프라인에서 온라인으로 바뀐 것을 확인할 수 있습니다.
너무 너무 신기하지 않나요~~?!😊

디스코드 bot과 대화

먼저 bot이 메세지를 받았을 때를 간략하게 만들어 봤습니다. bot이 보낸 메세지는 무시하게 하였고, 'Heelo'라고 시작하면 '바보'라고 대답하게 구현했습니다.

@client.event
async def on_message(message):
    if message.author == client.user:
        return  # bot 스스로가 보낸 메세지는 무시
    if message.content.startswith("Heelo"):
        await message.channel.send("바보")

discord 대화창에다 'Heelo'라고 보내면 '바보'라고 오는 것을 확인할 수 있습니다. 참고로 채널에 대한 제한을 걸지 않았기 때문에 어떤 채널에서든지 봇이 작동하는 것을 확인할 수 있습니다.

OpenAI Key 받아오기

OpenAI API 연결을 위해서 Key가 필요합니다.
OpenAI에 접속해서 로그인 후, API key를 생성해주세요.

참고로 Gpt4 모델은 유료니 OpenAI > Settings > billing에 돈이 채워져 있어야 합니다. ChatGPT4와 API는 별개라 따로 결제 수단 등록이 필요합니다..!

그 다음 .env 파일에 OPENAI_KEY 값에 복사한 Secret key값을 붙여 넣어주세요.

DISCORD_TOKEN = "복사한 디스코드 토큰 값"
OPENAI_KEY = "복사한 OpenAI Secret Key"

OpenAI와 디스코드 봇 연결하기

이제 아까 만들었던 discord bot에 gpt4를 연결할 차례입니다. chatgpt.py 파일을 만들어주세요.
.env에서 받아온 OPENAI_KEY값을 받아와 줍니다.

#chatgpt.py
import os

import openai
from dotenv import load_dotenv
from openai import OpenAI

# 환경 변수를 .env 파일에서 로딩
load_dotenv()

OPENAI_KEY = os.getenv('OPENAI_KEY')
# Set up the OpenAI API client
client = OpenAI(api_key=OPENAI_KEY)

on_message 이벤트는 봇이 초대된 디스코드 채널에서 메시지가 보내질 때마다 트리거됩니다.

OpenAI APIclient.chat.completions.create() 메서드를 사용하여 봇 메시지의 프롬프트를 생성합니다. 이 메서드는 메시지의 프롬프트를 사용하여 응답을 생성합니다.

그런 다음, 채팅봇의 응답 길이를 제한하기 위해 max_tokens를 추가하고, 채팅봇의 성격을 조정하기 위해 temperature 파라미터를 조정할 수 있습니다. 온도가 낮을수록 채팅봇이 더 자유롭게 행동합니다.

마지막으로, OpenAI API에서 생성한 응답 중 첫 번째 항목을 선택하여 반환합니다. 그리고 문맥을 연결하기 위해 기존 messages를 계속 append하는 방식을 택했습니다.

def send_to_chatGpt(messages, model="gpt-4"):
    response = client.chat.completions.create(
        model=model,
        messages=messages,
        max_tokens=500,
        temperature=0.5,
    )
    message = response.choices[0].message.content
    print(message)
    messages.append(response.choices[0].message)
    return message

디스코드와 대화

마지막으로 잘 작동하는지 확인해볼까요?

우왕~~ 디스코드에 gpt 봇을 만들기를 성공했습니다!🥳
이제 나도 AI 전문가?! ㅎㅎ

Github 코드

전체 코드와 추가적으로 특정 채널에만 챗봇 가능하게 하는건 github에 올려 놓도록 하겠습니다!

🌟 전체 코드 보러가기


다가가기 어려운 AI라 생각했는데 막상 해보니 누구나 api 적용 수 있을 것 같더라고요! 앞으로 꾸준히 AI 포스팅을 올리겠습니다~!!

많.관.부..!


참고자료

https://github.com/openai/openai-python
https://jman4190.medium.com/how-to-build-a-discord-gpt3-chat-bot-with-openai-and-python-14177cd926f0
https://medium.com/sopmac-labs/create-a-chatgpt-discord-bot-8b853c62b08d
https://www.youtube.com/watch?v=zdCliXlK4ro&t=704s
https://yunwoong.tistory.com/214

profile
즐거운 개발자 김민주입니다🙂

3개의 댓글

comment-user-thumbnail
2024년 5월 19일

좋은 글 감사합니다.
더 많은 글 기대하겠습니다.

답글 달기
comment-user-thumbnail
2025년 2월 25일

안녕하세요! 궁금한 게 있습니다. 문과라서 아무것도 모르는데, 찾아가며 cmd 통해서 봇을 만들고 있습니다. 오류가 자꾸 발생해서 찾아보니
openai.ChatCompletion이 OpenAI API 1.0.0 이상에서 지원이 되지 않는다고 나오더라구요. 그래서 1.68.0으로 설치 하려니 PyPI에는 1.64.0이 최신이라 작동이 안 된다-고 추정하고 있습니다. 이런 경우 기다리면 PyPI에 1.68.0 패키지?가 등록 되고, 그 때 봇을 제작하면 되나요? 아니면 임의로 1.68.0 버전을 제가 설치해야할까요?
신기해보여서 시작했는데 생각보다 어렵네요 😭 읽어주셔서 감사해용!

1개의 답글