概要
本記事では、Slack BoltとChatGPT、LangChainを用いて社内FAQボットを開発する過程を、Partに分けて解説します。
Part1では独自データを回答するところまでを解説しました。
今回のPart2では、Slack Bolt for Pythonを使ってSlack Botの実装について解説します。
Slackアプリ作成
まず、アプリ作成前に普段の業務の邪魔にならないようにテスト用のワークスペースを作っておきましょう。アプリ作成ではソケットモードとHTTP方式の選択肢があります。デバッグするにはソケットモードが楽ですが、最終的にAWS Lambdaで動かすときにHTTP方式にする必要があるので、今回はHTTP方式で作り、デバッグ方法などを解説していきます。
Slackアプリの作り方はBolt入門ガイドに丁寧に書かれています。
一応、私がやった手順も記載しておきます。
slack api > Your APPsから「Create New App」ボタンをクリックします。
マニフェストから作成もできますが、今回はゼロからUIに従って構築するので「From scratch」をクリックします。
「App Name」の入力と ワークスペース を選択し、「Create App」ボタンをクリックします。
アプリの Basic Information ページが表示されます。
ページを下にスクロールすると Signing Secret があり、これはあとで利用します。
まず、 App Display Name を設定します。以前は設定しなくてもよかったのですが、仕様が変わったようで、設定しないとワークスペースへ追加するときにエラーとなります。
左サイドバーの「App Home」をクリックし、「Your App’s Presence in Slack」セクションの「App Display Name」の「Edit」ボタンをクリックします。
「Display Name」と「Default username」を入力し、「Add」ボタンをクリックします。Default usernameはSlackでメンションするときの名前になります。
次にスコープ追加とトークン取得をします。
左サイドバーの「OAuth & Permissions」をクリックし、「Bot Token Scopes」セクションまで下にスクロールします。「Add an OAuth Scope」ボタンをクリックします。
chat:write を追加します。これでアプリがメッセージを投稿できるようになります。
OAuth & Permissions ページの一番上までスクロールし、「Install to Workspace」をクリックします。
OAuth & Permissions ページが表示され、Bot User OAuth Token が確認できます。このトークンはこのあと利用します。
Bolt for PythonでBot実装
Part1で作成したPythonプロジェクトに追加実装しますので、同一ディレクトリに「slack_app.py」というファイルを作成します。slack_bolt パッケージをインストールします。(仮想環境などの説明は省略していますが、必要に応じて作成してください。)
pip install slack_bolt
Slackアプリ作成の OAuth & Permissions ページのBot User OAuth Token と Basic Information ページのSigning Secret が必要になります。
取得したキーは環境変数などに保存して、お使いになることをお勧めします。
以下のサンプルではSlackアプリにメンションしたメッセージへ応答します。
import os
from slack_bolt import App
# ボットトークンと署名シークレットを使ってアプリを初期化します
# SLACK_BOT_TOKENはBot User OAuth Tokenを環境変数に登録したものを参照しています
# SLACK_SIGNING_SECRETはSigning Secretを環境変数に登録したものを参照しています
app = App(token=os.environ.get('SLACK_BOT_TOKEN'),
signing_secret=os.environ.get('SLACK_SIGNING_SECRET'),
process_before_response=True)
# chatbotにメンションが付けられたときのハンドラ
@app.event("app_mention")
def handle_mention(event, say):
say("How can I help you today?")
#アプリを起動します(デフォルトポートは3000です)
if __name__ == "__main__":
app.start()
実行すると、開発用Webサーバーで起動します。
Bolt app is running! (development server)
HTTP方式の場合は上記コードを実行するだけではやり取りできないので、デバッグ用にngrokというローカルで実行しているWebサーバーを外部に公開できるツールを使います。私の環境はWindowsなので、ngrok公式サイトからZipファイルをダウンロード > 解凍 > exe実行と、これだけで動きます。(ちなみアカウント登録せずに使うと、2時間で外部公開のURLが無効になります。)
起動するとコマンドプロンプトのような画面が表示されます。
以下、デバッグのアプリに合わせてポート3000でコマンドを実行します。
ngrok http 3000
実行すると以下の画面が表示されます。 このあと Forwarding のアドレス(ここでは、https://b326-49-98-243-121.ngrok-free.app)を使います。
ngrok (Ctrl+C to quit)
Try our new Traffic Inspector Dev Preview: https://ngrok.com/r/ti
Session Status online
Account XXXXXX
Version 3.7.0
Region Japan (jp)
Latency 20ms
Web Interface http://127.0.0.1:4040
Forwarding https://b326-49-98-243-121.ngrok-free.app -> http://localhost:3000
Connections ttl opn rt1 rt5 p50 p90
0 0 0.00 0.00 0.00 0.00
HTTP方式を利用する場合、イベントスクリプトを有効にする必要があります。アプリ管理ページでアプリをクリックします。次に、左サイドバーの「Event Subscriptions」をクリックし、「Enable Events」というラベルのスイッチをオンに切り替えます。
「Request URL」に先ほど起動したngrokのForwardingのアドレスと末尾に /slack/events を入力します。正常に疎通できると確認済みになります。※ngrokは起動のたびにアドレスが変わるので、その都度アドレスの差し替えが必要になります。
デバッグ側でもSlackからのイベントを正常に受信できています。
127.0.0.1 - - [01/Apr/2024 10:23:23] "POST /slack/events HTTP/1.1" 200 -
設定画面を少し下にスクロールして、「Subscribe to bot events」の「Add Bot User Evnet」ボタンをクリックし、app_mentions:read を追加します。これで、Slackアプリにメンションされたメッセージが受信できるようになります。
右下隅にある「Save Changes」ボタンを押してください。画面上部に「これらの変更を有効にするには、アプリを再インストールしてください」という英語のメッセージが出てくるので、リンクをクリックして、ワークスペースに再インストールします。
これですべての準備が整ったので、Slackからメッセージを送ってみましょう。
まずは作成したSlackアプリをチャンネルに追加します。
そして、Slackアプリにメンションをつけてメッセージを送信します。
ここまででSlack Boltを使った自作Botができました。
ただ、これだと独自データの回答ができていないので、次回はSlackから独自データを回答するように改造していきます。その過程でDockerを使ってLambda環境でデバッグもしていきます。
参考文献