分報ってご存知ですか?
みなさんは、だれかと連絡を取るほどじゃないけど、なんとなく
「なんかお腹すいたな〜」とか
「なんか暇だなぁ〜」みたいな、
反応があれば嬉しいけど、反応が何もなくても何の問題もない。みたいなコミュニケーションを取りたいと思ったことはないでしょうか?
エンジニアの世界では「日報」よりもさらに細かく、「分報」という、何か連絡したいわけじゃないけど、現在の状況を垂れ流す文化があり、Slackなどの連絡ツールに「〜times」みたいな名前で自分用のつぶやきスペースを作り、社内版Twitterみたいな運用をしている人々がいます。
分報のメリット・活用方法とは?書き方やslackでの運用事例を紹介
最近エンジニアの友人と一緒にハッカソンに出場することになったのですが、LINEとかじゃなくて、そういう分報を書き込める場所が欲しいよね、という話になり、気軽にDiscordにそういう場所を作ってみることにしました。
準備
-
Discordのアカウント作成
- やりとりをする場所はDiscordにしてみます
-
OpenAIのAPIキーの取得
- 分報だけでなく、Discordの中でChatGPTとの会話ができ、その会話に横槍をいれるみたいな形で第三者が割り込んでこれたら面白いよね。ということで、DiscordのBotアカウントを作って、それにメンションをしたらChatGPTに回答を考えてもらって返信をしてみるようにします
-
RailWayのアカウント作成と課金
- DiscordBotの裏側のプログラムを用意し、それをホスティングしておくツールはRailWayにしてみました。
実装
Discord編
Discordなんて初めて聞きました、という人は、まずはこちらを読んでみましょう
Discordサーバーを準備
適当に選んで次に進みましょう(チャンネルが自動で作られますが、あとで好みの形に編集できるので特に悩まなくても大丈夫です)
Discord Botを準備
Discord上でBotアカウントを動かすためには、Discord Developer Portalからアカウントを追加する必要があります
Botの名前を決め、チェックボタンを押して、Createボタンを押す
こんな感じでBotが作られたかと思います
サイドバーの「Bot」からリセットトークンを行い、トークンを控えておきます。
PUBLIC BOTの設定はかならずOFFにしましょう
Privileged Gateway Intentsの三つの設定はすべてONにしましょう
Discord Botをサーバーに追加
サイドバー「OAuth2」から「OAuth2 URL Generator」の「Bot」にチェックを入れ、BOT PERMISSIONSはチェックなしで、作られたURLをコピーします
ブラウザのURL欄にコピーしたURLを入力してアクセスすると以下のような画面が表示されるので追加するサーバーを選択し、認証を行いましょう。
サーバー編
ここからはRailWayというサービスを使います。
課金をしないと使えませんが、少額から始めることができ、よほど利用しない限りは月5ドルのHobbyプランで収まると思います。
サービス料についてはこちら
サーバーのソースコードの準備
GitHubにChatGPTにつないだDiscordBotを作る用のテンプレートを用意しています。
https://github.com/cog1t0/discordpy-railway/tree/main
画面右上の「Use ThisTemplate」から「Create a new repository」を選択します
RailWayの設定
RailWayのダッシュボードから「NewProject」 -> 「Deploy from GitHub repo」で先ほどコピーしたリポジトリを選択し、デプロイします。
環境変数を設定しましょう
DISCORD_BOT_TOKENはdiscordbotを作った時に控えていたトークンを入力します。
OPENAI_API_KEYは自分のopenAIのAPIキーを貼り付けます。やり方
完成!!
これで、discordにopenAIと繋がったBotを作ることができました!
軽く立ち上げまでの解説でしたが、プロンプトややり取りを作り込みたい場合は、以下のファイルを編集していきましょう。
import discord
from discord.ext import commands
from openai import OpenAI
from constant import TOKEN, OPENAI_API_KEY # OPENAI_API_KEYもconstant.pyからインポート
extensions = (
)
class MyBot(commands.Bot):
def __init__(self):
super().__init__(
command_prefix=commands.when_mentioned,
intents=discord.Intents.all(),
)
async def setup_hook(self):
for extension in extensions:
await self.load_extension(f'extensions.{extension}')
# メンションを受けた際の処理を追加
async def on_message(self, message):
messages = [
{"role": "system", "content": "あなたは技術的な質問に、端的にわかりやすく回答するAIアシスタントです."}
]
if message.author.bot: # ボット自体のメッセージは無視
return
if self.user.mentioned_in(message): # Botへのメンションが含まれている場合
content = message.content.replace(f'<@!{self.user.id}>', '') # メンションを削除
messages.append({"role": "user", "content": content.split('>')[1].lstrip()})
# OpenAIのAPIキーを設定
client = OpenAI(
# This is the default and can be omitted
api_key=OPENAI_API_KEY,
)
# OpenAI APIを呼び出して応答を生成
chat_completion = client.chat.completions.create(
messages=messages,
model="gpt-3.5-turbo",
)
await message.channel.send(chat_completion.choices[0].message.content) # 応答を送信
if __name__ == '__main__':
MyBot().run(TOKEN)
参考記事
以下を参考にさせていただきました🙏
ありがとうございます。