🐡

DiscordにChatGPTのボットを追加してみました

2023/04/01に公開

タイトルの話題について友人と話し合ったことがきっかけで、取り組むことにしました!
Discordボットや、ChatGPTのAPIの使い方を学べたので、とても良い経験になりました。

以下がそのボットのコードです。
https://github.com/tanakenDX/PolyglotPal

このボットは、日本語の入力をDeepLのAPIを使って英語に変換し、その後ChatGPTのAPIに渡します。出力時も同様に行われます。

以下の記事を参考にさせていただき、コスト面と精度を考慮してこのような実装にしました。
https://zenn.dev/offers/articles/20230306-chatgpt_and_deepl

実装

  1. コード
    構造は以下のようになっています。メイン処理をbot.pyに書き、各APIの処理はモジュール化して呼び出しています。
PolyglotPal/
├── bot.py
├── api_keys.json
└── utils/
    ├── __init__.py
    ├── deepl.py
    └── chatgpt.py

以下がbot.pyの実装内容です。

bot.py
import discord
from discord.ext import commands
import json
# 作成したDeepL,ChatGPT APIのコール関数
from utils import translate_japanese_to_english, translate_english_to_japanese, interact_with_chatgpt

with open("api_keys.json", "r") as f:
    api_keys = json.load(f)
#  各APIキーの取得
polyglotpal_bot_key = api_keys["polyglotpal"]
deepl_api_key = api_keys["deepl"]
chatgpt_api_key = api_keys["chatgpt"]

# Intentsオブジェクトの作成 ※'2. discord botの設定'で説明します。
intents = discord.Intents.all()
client = discord.Client(intents=intents)

def ask(user_input):
    #DeepLでuser_inputを日本語 → 英語に変換
    translated_input = translate_japanese_to_english(user_input, deepl_api_key)
    # ChatGPTに質問、レスポンスを取得
    chatgpt_response = interact_with_chatgpt(translated_input, chatgpt_api_key)
    # DeepLでChatGPTのレスポンスを英語 → 日本語に変換
    translated_response = translate_english_to_japanese(chatgpt_response, deepl_api_key)
    return translated_response
@client.event
async def on_message(message):
    if message.content.startswith("!ask"):
        await message.channel.send("何でも聞いて")
        wait_message = await client.wait_for("message")
        res = ask(wait_message.content)
        await message.channel.send(res)
client.run(polyglotpal_bot_key)
  1. discord botの設定
    基本的には以下の記事を見ながら設定しました。
    https://www.freecodecamp.org/japanese/news/create-a-discord-bot-with-python/

しかし、上記の設定だけだとサーバー内でやり取りが行われたメッセージのcontentsプロパティを取得できず、結構困りました。。。
その後、友人が調べてくれて下記の設定を有効にする必要がある事がわかりました。

実装の中でもIntentsオブジェクトをdiscord.Clientに渡す必要があります。

後はbotをローカルなどで起動すればdiscord上で利用できました。

終わりに

本当は各APIの利用方法やChatGPT APIの詳細についても触れたかったのですが、、力尽きました。。笑

もしこのbotをご自身の環境でも利用してみたい方は気軽にコメントをしてください、ご意見等もお待ちしております!
読んでいただきありがとうございました!

補足 ChatGPTについて

実は今回、ChatGPTに要件を伝えて、何回かやり取りをしながら作ってもらいました。
出来上がったものは不具合が多く、かなりデバッグを行いましたが、基本的なAPIのコールは出来ていましたし、ディレクトリの構成はChatGPTが考えたものをそのまま利用しています。笑

Discussion