28
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

13億パラメータの日本語特化GPT言語モデルを使ってSlackAIチャットボットを作ってみた2~SlackBot実装編~

Last updated at Posted at 2022-07-25

1.はじめに

当記事は「文章生成機能編」の続きです。
先にそちらを読んでいただけると幸いです。

当記事ではSlackBotの実装について記載します。

初心者なため、間違った部分や理解の足りていない部分もあるかと思います。
そういった部分がありましたらコメントまたはTwitterで指摘して頂けると幸いです。

2.SlackBot初期設定

SlackBotの登録や設定、作成に関しては以下の記事が非常にわかりやすいため、そちらを参考に行ってください。1
(タイトルの構成が似てしまいました…)

上記記事に無い点や補足、差異についてを以下に記述します。

2-1.イベントや権限の設定

スクリーンショット 2022-07-03 233014.png
Event SubscriptionsEnable EventsONにします。
そして、Subscribe to bot eventsに以下のイベントを追加します。

  • message.channels
    このイベントを追加することで、チャンネルにメッセージが投稿された際のイベント実行が可能になります。

今回の場合、追加するイベントは上記1つのみでokです。

スクリーンショット 2022-07-03 232900.png
OAuth & PermissionsScopesBot Token Scopesで以下の権限を設定します。

  • channels:history
    botがチャンネルのメッセージ履歴にアクセスできるようになる権限です。
    この権限を追加することで、botがメッセージを読み取れるようになります。
    こちらの権限はSubscribe to bot eventsmessage.channelsを追加すると自動で追加されます。

  • chat:write
    botがチャンネルにメッセージを書き込むことができるようになる権限です。

今回の場合、設定する権限は上記2つのみでokです。

2-2.チャンネルにアプリを追加

スクリーンショット 2022-07-03 233703.png
botをアプリとして追加するチャンネルを右クリックし、チャンネル詳細を表示するを選択します。

スクリーンショット 2022-07-03 233910.png
表示されたポップアップのインテグレーションタブに移動し、Appアプリを追加するを選択します。

スクリーンショット 2022-07-03 234008.png
遷移先のページにある追加ボタンでアプリを追加します。

以上で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

ChatBot.py
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でインストールしたライブラリに加え、正規表現を使用するためreimportします。
前回作成した文章生成機能であるRinnaJapaneseGPT1bimportします。

4-2.botのTokenやチャンネルIDを指定

ChatBot.py
SLACK_BOT_TOKEN = "Bot User OAuth Tokenを記述"
SLACK_APP_TOKEN = "Socket ModeのTokenを記述"

CHANNEL_ID = "botを動かすチャンネルIDを記述"

token = WebClient(SLACK_BOT_TOKEN)

SLACK_BOT_TOKENBot User OAuth Tokenを格納します。3
SLACK_APP_TOKENSocket ModeTokenを格納します。

CHANNEL_IDbotを動かすチャンネルIDを格納します。

WebClientSLACK_BOT_TOKENを指定し、tokenに格納します。

4-3.bot起動時の処理

ChatBot.py
token.chat_postMessage(text="ログインしました。このチャンネルで話しかけてください。", channel=CHANNEL_ID)

app = App(token=SLACK_BOT_TOKEN)

token.chat_postMessagebot起動時にメッセージを送信します。
text"ログインしました。このチャンネルで話しかけてください。"というメッセージを指定します。
channelに送信先のチャンネルを指定します。

app = App(token=SLACK_BOT_TOKEN)botを初期化(イニシャライズ)します。

4-4.メッセージが投稿された時の処理

ChatBot.py
@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起動

ChatBot.py
if __name__ == ""__main__"":
  SocketModeHandler(app, SLACK_APP_TOKEN).start()

botを起動します。

4-6.コード全文

ChatBot.py
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の実行結果です。

スクリーンショット 2022-07-03 232141.png
無事実行出来ていますね。
これでSlack上でAIチャットボットとの会話を楽しむことができます。

スクリーンショット 2022-07-03 232437.png
だいぶすごい(小並感

余談ですが、実行時にもし必要な権限が無かった場合はなんとエラーで必要な権限を教えてくれます。
以下は権限を何も設定していない状態で実行した時のエラーの最終行です。

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.参考記事

  1. 「Slack bot」等で検索すると上位に出てくる情報は古いものが多いため注意が必要です。

  2. slack_boltをインストールすればslack_sdkも自動的にインストールされるそうなので、slack_boltのインストールだけで良いかもしれません。

  3. 今回構成を簡単にするためにBot User OAuth TokenSocket ModeToken、チャンネルIDを直接コードに記述していますが、本来であれば機密性や脆弱性等の観点から直接記述しない方が良いです。
    TokenやチャンネルIDを直接コードに記述している関係で、今回Pythonの仮想環境は使用していません。

28
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?