1.はじめに
当記事は「文章生成機能編」の続きです。
先にそちらを読んでいただけると幸いです。
当記事ではSlackBotの実装について記載します。
初心者なため、間違った部分や理解の足りていない部分もあるかと思います。
そういった部分がありましたらコメントまたはTwitterで指摘して頂けると幸いです。
2.SlackBot初期設定
SlackBotの登録や設定、作成に関しては以下の記事が非常にわかりやすいため、そちらを参考に行ってください。1
(タイトルの構成が似てしまいました…)
- 初心者がPythonでSlackbotを作ってみた!1 〜Slack初期設定編〜
- 初心者がPythonでSlackbotを作ってみた!2 〜Slackbot起動編〜
- 初心者がPythonでSlackbotを作ってみた!3 〜Slackbot機能編〜
上記記事に無い点や補足、差異についてを以下に記述します。
2-1.イベントや権限の設定
Event Subscriptions
のEnable Events
をON
にします。
そして、Subscribe to bot events
に以下のイベントを追加します。
-
message.channels
このイベントを追加することで、チャンネルにメッセージが投稿された際のイベント実行が可能になります。
今回の場合、追加するイベントは上記1つのみでokです。
OAuth & Permissions
のScopes
のBot Token Scopes
で以下の権限を設定します。
-
channels:history
bot
がチャンネルのメッセージ履歴にアクセスできるようになる権限です。
この権限を追加することで、bot
がメッセージを読み取れるようになります。
こちらの権限はSubscribe to bot events
にmessage.channels
を追加すると自動で追加されます。 -
chat:write
bot
がチャンネルにメッセージを書き込むことができるようになる権限です。
今回の場合、設定する権限は上記2つのみでokです。
2-2.チャンネルにアプリを追加
bot
をアプリとして追加するチャンネルを右クリックし、チャンネル詳細を表示する
を選択します。
表示されたポップアップのインテグレーション
タブに移動し、App
のアプリを追加する
を選択します。
以上でbot
の初期設定が完了しました。
3.ライブラリインストール
pip install slack_bolt slack_sdk
必要なライブラリをインストールします。
3-1.slack_bolt
イベント実行によるメッセージの送受信を行うためにslack_bolt
をインストールします。
3-2.slack_sdk
メッセージの送信を行うためにslack_sdk
をインストールします2。
4.コード解説
4-1.import
from slack_sdk import WebClient
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
import re
import RinnaJapaneseGPT1b as rinna
必要なライブラリをimport
します。
3でインストールしたライブラリに加え、正規表現を使用するためre
もimport
します。
前回作成した文章生成機能であるRinnaJapaneseGPT1b
もimport
します。
4-2.botのTokenやチャンネルIDを指定
SLACK_BOT_TOKEN = "Bot User OAuth Tokenを記述"
SLACK_APP_TOKEN = "Socket ModeのTokenを記述"
CHANNEL_ID = "botを動かすチャンネルIDを記述"
token = WebClient(SLACK_BOT_TOKEN)
SLACK_BOT_TOKEN
にBot User OAuth Token
を格納します。3
SLACK_APP_TOKEN
にSocket Mode
のToken
を格納します。
CHANNEL_ID
にbot
を動かすチャンネルIDを格納します。
WebClient
にSLACK_BOT_TOKEN
を指定し、token
に格納します。
4-3.bot起動時の処理
token.chat_postMessage(text="ログインしました。このチャンネルで話しかけてください。", channel=CHANNEL_ID)
app = App(token=SLACK_BOT_TOKEN)
token.chat_postMessage
でbot
起動時にメッセージを送信します。
text
に"ログインしました。このチャンネルで話しかけてください。"
というメッセージを指定します。
channel
に送信先のチャンネルを指定します。
app = App(token=SLACK_BOT_TOKEN)
でbot
を初期化(イニシャライズ)します。
4-4.メッセージが投稿された時の処理
@app.message(re.compile("(.*)"))
def reply(message, context, say):
user = message["user"]
token.chat_postMessage(text="文章生成中…", channel=CHANNEL_ID)
greeting = context['matches'][0]
response = rinna.generate_text(greeting)
text = f'<@{user}>{response}'
say(text=text, channel=CHANNEL_ID)
正規表現を使い、@app.message(re.compile("(.*)"))
でメッセージが投稿された際に処理をイベント実行します。
メンションする為にmessage["user"]
でメッセージを投稿したユーザーを判定し、user
に格納します。
文章生成開始を明示する為にtoken.chat_postMessage
で"文章生成中…"
というメッセージを指定チャンネルに送信します。
正規表現のマッチ結果がcontext.matches
に設定されるため、context['matches'][0]
でマッチ結果である投稿されたメッセージをgreeting
に格納します。
rinna.nlp(greeting)
で投稿されたメッセージをrinna
に与え、生成された文章をresponse
に格納します。
メンション付きメッセージをf'<@{user}>{response}'
で設定し、text
に格納します。
say
でメンション付きメッセージを指定チャンネルに返します。
4-5.bot起動
if __name__ == ""__main__"":
SocketModeHandler(app, SLACK_APP_TOKEN).start()
bot
を起動します。
4-6.コード全文
from slack_sdk import WebClient
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
import re
import RinnaJapaneseGPT1b as rinna
SLACK_BOT_TOKEN = "Bot User OAuth Tokenを記述"
SLACK_APP_TOKEN = "Socket Mode のTokenを記述"
CHANNEL_ID = "botを動かすチャンネルIDを記述"
token = WebClient(SLACK_BOT_TOKEN)
token.chat_postMessage(text="ログインしました。このチャンネルで話しかけてください。", channel=CHANNEL_ID)
app = App(token=SLACK_BOT_TOKEN)
@app.message(re.compile("(.*)"))
def reply(message, context, say):
user = message["user"]
token.chat_postMessage(text="文章生成中…", channel=CHANNEL_ID)
greeting = context['matches'][0]
response = rinna.generate_text(greeting)
text = f'<@{user}>{response}'
say(text=text, channel=CHANNEL_ID)
if __name__ == "__main__":
SocketModeHandler(app, SLACK_APP_TOKEN).start()
上記コピペでそのまま使用できます。
5.実行
それではいよいよbot
の実行をしていきます。
以下の画像がSlack上でのbot
の実行結果です。
無事実行出来ていますね。
これでSlack上でAIチャットボットとの会話を楽しむことができます。
余談ですが、実行時にもし必要な権限が無かった場合はなんとエラーで必要な権限を教えてくれます。
以下は権限を何も設定していない状態で実行した時のエラーの最終行です。
The server responded with: {'ok': False, 'error': 'missing_scope', 'needed': 'chat:write:bot', 'provided': 'incoming-webhook'}
全てを教えてくれているわけではありませんが、権限にchat:write
が必要と教えてくれています。優しいですね。
6.おわりに
SlackBotとrinna/japanese-gpt-1bを使うことで簡単にAIチャットボットを作成することができました。
今回は行っていませんが、seed値を固定したりFine Tuningしたりなど、様々な楽しみ方が出来ると思うのでぜひ調べてみてください。
私も開発し、学んでいて非常に楽しく、自然言語処理(機械学習)の取っ掛かりとしても良かったと感じました。
BLOOMも最近リリースされたので、こちらも試してみたいと思います。
当記事を通じて自然言語処理に少しでも興味を持っていただけたなら幸いです。
7.参考記事
- Slack API
- Bolt 入門ガイド
- 初心者がPythonでSlackbotを作ってみた!1 〜Slack初期設定編〜
- 初心者がPythonでSlackbotを作ってみた!2 〜Slackbot起動編〜
- 初心者がPythonでSlackbotを作ってみた!3 〜Slackbot機能編〜
- 【最新版slackアプリ開発】久しぶりにslackアプリを作った時にslackbotライブラリでは使えなかったのでBoltに移行した
- Python で Slack API や Webhook を扱うなら公式 SDK(slack-sdk/slack-bolt)を使おう
- Slack ソケットモードの最も簡単な始め方