1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Slackで質問に自動回答!ChatGPTとLangChainで社内FAQボットを作ってみた Part2

Last updated at Posted at 2024-04-02

概要

本記事では、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」ボタンをクリックします。
image.png

マニフェストから作成もできますが、今回はゼロからUIに従って構築するので「From scratch」をクリックします。
image.png

App Name」の入力と ワークスペース を選択し、「Create App」ボタンをクリックします。
image.png

アプリの Basic Information ページが表示されます。
image.png

ページを下にスクロールすると Signing Secret があり、これはあとで利用します。
image.png

まず、 App Display Name を設定します。以前は設定しなくてもよかったのですが、仕様が変わったようで、設定しないとワークスペースへ追加するときにエラーとなります。
左サイドバーの「App Home」をクリックし、「Your App’s Presence in Slack」セクションの「App Display Name」の「Edit」ボタンをクリックします。
image.png

Display Name」と「Default username」を入力し、「Add」ボタンをクリックします。Default usernameはSlackでメンションするときの名前になります。
image.png

次にスコープ追加とトークン取得をします。
左サイドバーの「OAuth & Permissions」をクリックし、「Bot Token Scopes」セクションまで下にスクロールします。「Add an OAuth Scope」ボタンをクリックします。
chat:write を追加します。これでアプリがメッセージを投稿できるようになります。
image.png

OAuth & Permissions ページの一番上までスクロールし、「Install to Workspace」をクリックします。
image.png

許可する」ボタンをクリックします。
image.png

OAuth & Permissions ページが表示され、Bot User OAuth Token が確認できます。このトークンはこのあと利用します。
image.png

Bolt for PythonでBot実装

Part1で作成したPythonプロジェクトに追加実装しますので、同一ディレクトリに「slack_app.py」というファイルを作成します。slack_bolt パッケージをインストールします。(仮想環境などの説明は省略していますが、必要に応じて作成してください。)

pip install slack_bolt

Slackアプリ作成の OAuth & Permissions ページのBot User OAuth TokenBasic 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」というラベルのスイッチをオンに切り替えます。
image.png

Request URL」に先ほど起動したngrokのForwardingのアドレスと末尾に /slack/events を入力します。正常に疎通できると確認済みになります。※ngrokは起動のたびにアドレスが変わるので、その都度アドレスの差し替えが必要になります。
image.png

デバッグ側でも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アプリにメンションされたメッセージが受信できるようになります。
image.png

右下隅にある「Save Changes」ボタンを押してください。画面上部に「これらの変更を有効にするには、アプリを再インストールしてください」という英語のメッセージが出てくるので、リンクをクリックして、ワークスペースに再インストールします。
image.png

これですべての準備が整ったので、Slackからメッセージを送ってみましょう。
まずは作成したSlackアプリをチャンネルに追加します。
そして、Slackアプリにメンションをつけてメッセージを送信します。
image.png

ソースで記述した固定のメッセージが返ってきました。
image.png

ここまででSlack Boltを使った自作Botができました。
ただ、これだと独自データの回答ができていないので、次回はSlackから独自データを回答するように改造していきます。その過程でDockerを使ってLambda環境でデバッグもしていきます。

参考文献

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?