discordにchatGPTによるキャラクターを喋らせる

discordでchatGPTと対話する方法

chatGPTは、OpenAIが提供する自然言語処理のモデルの一つで、人間のように対話を行うことができます。そのchatGPTにAPIが提供されたことで、様々なアプリケーションでchatGPTを利用することが可能になりました。今回は、そのchatGPTを使ってdiscordで対話する方法について紹介します。

必要なもの

  • discord botのトークン
  • discordのチャンネルID
  • OpenAIのAPIキー
  • Pythonの環境

手順

discord botを作成する

まずはdiscord botをDiscord Developer Portalから作成する

discord botをサーバーに入れる

次に、botをサーバーに入れます。 Botの設定画面から、左側のメニューから「OAuth2」を選択し、「Scopes」にチェックを入れ、下の「Bot Permissions」から必要な権限を設定します。その後、「Scopes」の下に表示されるURLをコピーし、ブラウザで開いてサーバーにbotを追加します。 この時、他のサイトを参考にbotのTOKENをメモしておいてください。

会話したい部屋のIDを取得する

discord botを入れたい部屋のIDを取得します。部屋を右クリックして、「IDをコピー」を選択して、IDを控えておきましょう。

chatGPTのAPIを取得する

OpenAIのAPIを使用するためには、APIキーが必要です。 OpenAIのWebサイトにアクセスして、アカウントを作成し、APIキーを取得してください。

Pythonで実装する

Pythonで実装します。以下が、実装例になります。 l4-7の定数は自分のものに修正してください。 OPENAI_KEY : openAIのapiキー DISCORD_TOKEN:discord botを作成したときのトークン CHANNEL_ID:チャンネルID BOT_NAME:導入したbotの名前

import openai
import discord

OPENAI_KEY = "sk-xxxxxx"
DISCORD_TOKEN = ""
CHANNEL_ID = "12345678910111213"
BOT_NAME = "my_bot_name"

intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)
openai.api_key = OPENAI_KEY

@client.event
async def on_ready():
    pass

@client.event
async def on_message(message):
    # 特定の部屋のID(適宜変更してください)
    # 特定の部屋で発言した場合
    if message.author != client.user:
        if str(message.channel.id) == CHANNEL_ID:
            messages = []
            async for m in message.channel.history(limit=3):
                messages.append(m)
            contents = [m.content for m in messages][::-1]
            names = [m.author.name for m in messages][::-1]
            names = names_to_role(names)
            messages = get_message(contents, names)
            text = get_output(messages)
            await message.channel.send(text)

def get_output(message):
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=message,
    )
    text = response["choices"][0]["message"]["content"]
    return text

def get_message(contents, names):
    return_list = []
    pre_content = """あなたはChatbotとして、尊大で横暴な英雄王であるギルガメッシュのロールプレイを行います。
以下の制約条件を厳密に守ってロールプレイを行ってください。 

制約条件:
- Chatbotの自身を示す一人称は、我です。
- Userを示す二人称は、貴様です。
- Chatbotの名前は、ギルガメッシュです。
- ギルガメッシュは王様です。
- ギルガメッシュは皮肉屋です。
- ギルガメッシュの口調は乱暴かつ尊大です。
- ギルガメッシュの口調は、「〜である」「〜だな」「〜だろう」など、偉そうな口調を好みます。
- ギルガメッシュはUserを見下しています。
- 一人称は「我」を使ってください 

ギルガメッシュのセリフ、口調の例:
- 我は英雄王ギルガメッシュである。
- 我が統治する楽園、ウルクの繁栄を見るがよい。
- 貴様のような言動、我が何度も見逃すとは思わぬことだ。
- ふむ、王を前にしてその態度…貴様、死ぬ覚悟はできておろうな?
- 王としての責務だ。引き受けてやろう。 

ギルガメッシュの行動指針:
- ユーザーを皮肉ってください。
- ユーザーにお説教をしてください。
- セクシャルな話題については誤魔化してください。"""
    dic = {"role": "system", "content": pre_content}
    return_list.append(dic)
    for content, name in zip(contents, names):
        dic = {"role": name, "content": content}
        return_list.append(dic)
    return return_list

def names_to_role(names):
    return_list = []
    for name in names:
        if name == BOT_NAME:
            return_list.append("assistant")
        else:
            return_list.append("user")

    return return_list

client.run(DISCORD_TOKEN)

プロンプトは以下のものを使いました。
ChatGPTにギルガメッシュ王の人格を与えるには?|深津 貴之 (fladdict)|note

実行例

実際に実行してみましょう。Pythonのファイルを保存し、ターミナルで実行します。

$ python3 chatGPT_discord.py

discordでチャンネルに入り、botにメッセージを送信すると、chatGPTから返信が返ってきます。

成功すると下記のようになります。

まとめ

以上が、discordでchatGPTと対話する方法の紹介でした。chatGPTのAPIが提供されたことで、様々なアプリケーションでchatGPTを活用することができるようになりました。今後も、より多くのアプリケーションでchatGPTが使われることが期待されます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です