GPT-3(ChatGPT)が動くDiscord botをノーコードで作ってみたよ
こんにちは。さいP( @_saiP )です。
連日話題沸騰中の GPT-3 (ChatGPTで使用されている自然言語処理モデル) を Slack で動かしているツイートを Twitter で見かけまして、「弊社で社内チャットとして使用している Discord でも同じことが出来ないかな~」と思い試してみました。
今回はノーコードのオートメーションツール Make (旧 Integromat )を使用します。Zapier や IFTTT のようなツールです。
【本文中ではMakeを使用していますが、Pipedreamのほうが良さそうでした】
やりたいこと
- Discord の特定のチャンネルに投稿された全ての新着メッセージを取得する
- GPT-3 の API にプロンプトを送信する
- GPT-3 の API レスポンスを Discord の元のチャンネルに bot として投稿する
- GPT-3 自身のメッセージにはレスポンスしない(無限ループって怖くね?)
準備するもの
- Make のアカウント(無料でOK)
- OpenAI のアカウント(API クレジットが残っているもの)
- Discord のアカウント(対象のサーバーの管理者権限があるもの)
まずはおもむろにMakeでシナリオを作成する
まっさらな世界
Makeに登録すると↑のような画面が出てくるので、でっかい+アイコンをクリックして Discord を選びます。
ここでは Watch Channel Message を選ぶ
すると、以下のような画面になるので Connection から「Add」を選び、Discord のアカウントと連携します。
Discord からメッセージを取得するには OAuth 2.0認証 が必要になります(ここで2時間費やしました)。
「Show Advanced Setting」のチェックボックスを入れてください。入力欄が縦に長くなります。
「Bot Token」と「Client ID」、「Client Secret」が必要になるので、Discord からゲットしてきましょう。
Discord で Application を作成する。
https://discord.com/developers にアクセスし、右上の「New Application」ボタンからアプリを作成します。
左側メニューから「OAuth2」を選び、
- CLIENT ID を Make の 「Client ID」欄にコピペ
- CLIENT SECRETは「Reset Secret」ボタンからコピーして Make の 「Client Secret」にコピペ
しましょう。
そして、 Redirects セクションに以下の 2 つの URL を追加します。
https://www.integromat.com/oauth/cb/discord
https://www.make.com/oauth/cb/discord
こんな感じ
次に、左側メニューの「Bot」→「Add Bot」を選択し、Botを作成します。
少し下にスクロールするとある Privileged Gateway Intents セクションの権限のうち 「MESSAGE CONTENT INTENT」を ON にしておきましょう。Botがメッセージを取得するのに必要です。
ナイスなスクリーンネームとアイコンを設定したら、「Reset Taken」ボタンをクリックするとBot Takenが表示されます。
- Bot Taken を Make の「Bot Token」欄にコピペ
しましょう。
Make の 3 つの欄が埋まったら Bot Permissions はそのままで Save しましょう。
無事に Discord と連携できたら、Bot を常駐させたいチャンネルと Limit (一回の実行で取得する新着メッセージの上限数)を設定します
なお、Watch Channel Messages はそのチャンネルの最初まで遡って取得してきてくれるので、Bot は新しく作成したチャンネルに導入するのをおすすめします。
OpenAI GPT-3 と接続する
メッセージが取得できたら、GPT-3 に Prompt として渡します。
Connection に必要な API Key と Organization ID はそれぞれ https://beta.openai.com/account/api-keys と https://beta.openai.com/account/org-settings で生成・確認することができます。
Model は text-davinci-003 (GPT-3) を選択、Promptには Discord の Content アイテムを指定しましょう。
画像のように、前後に返答の口調や前提条件、文脈などを入れておくと多様な回答が期待できます。
Bot のメッセージには動作しないように、画像のようなFilterを設定しておきます。
(Condition には Bot の Username を指定しておきました)
レスポンスを Discord に投稿する
GPT-3の回答は choices[].text
で取得できるので、 Discord の Message 欄に入力します。
このとき <@{{author.id}}>
とすると、発言者にメンションすることができます。
無料プランでは15分に1回しか実行できません。
月額9ドルの有料プランだと1分おきに実行できるようですが、リアルタイム感はあまりありません・・・。
もっといい方法があれば教えてください。
Pipedreamを使用したら改善されました!
Discussion
こんにちは!こちらの連携に挑戦して見ているのですが、makeでdiscordのテキスト情報を受け取ることができません・・・!
「Discord からメッセージを取得するには OAuth 2.0認証 が必要になります(ここで2時間費やしました)。」
さいPさんの文章中にも書かれている、こちらが原因かとは思うのですがどのように解決したでしょうか?もしよろしければぜひ教えていただきたいです(泣)