RAG型社内チャットボットでSlackデータ取得

背景や目的


私の会社では、社内コミュニケーションにSlackを使用しており、日々のやり取りを色々なSlackチャンネルでしています。 

その中には、ナレッジとして再利用できる情報が含まれていることも多く、
これらを社内向けのRAG(Retrieval-Augmented Generation)型チャットボットの元情報として活用したいと思っていました。
それにはSlackのAPIを利用してチャンネルに蓄積された会話データを抽出する必要があり、今回その実装を行った次第です。

この記事では、Slackデータ取得に絞って紹介したいと思います。

実現したい事


毎朝4時の定期実行でSlackの特定チャンネルからスレッド会話を取得し、ベクター化してベクトルデータベースに保存したいです。

手順概要


本記事では上図の赤枠部を説明します。その手順は以下のとおりです。

1.SlackAPPの作成
2.対象チャンネルIDの取得とアプリ追加
3.処理コードの作成

順番に紹介してゆきます。

1)SlackAPPの作成


SlackのAPIを使ってデータを取得するには、認証のためにAPIキーのようなOAuthTokenが必要になります。
このTokenは、SlackAppを作成しインストールした後にのみ取得できるものです。

なので、まずSlack Appを作成します。

・SlackAPIのAPP作成画面:https://api.slack.com/apps にアクセスし、新しいアプリを作成します。

・「Create New App」をクリックし、表示されたモーダル画面で「From scratch」を選択します。

・アプリ名と使用するワークスペースを指定し、「Create App」を押して作成します。

設定項目
App NameVarunBot ※お好きな名前で設定
Workspace東京システムハウス株式会社 ※お手元の環境に応じて設定

・APP作成後は以下の画面が表示されます。左メニューの「OAuth & Permissions」を押しOAuth設定画面に遷移します。

・OAuthトークンを作るために、まずアプリに必要なスコープ(権限)を設定する必要があります。スコープとは、アプリに許可する操作やアクセス範囲をSlackに伝えるための設定です。

・同じページを下へスクロールし、スコープを追加していきます。

・Bot Token Scopesの下部にある「Add an Oauth Scope」を押し、下表の値のスコープを追加します。

設定項目
Bot Token Scopeschannels:read ※パブリックチャンネルの情報取得用
channels:history ※パブリックチャンネルのメッセージ履歴アクセス
groups:history ※プライベートチャンネルのメッセージ履歴アクセス
im:history ※ダイレクトメッセージの履歴アクセス
mpim:history ※複数人DM(グループDM)の履歴アクセス

・パブリックチャンネルの情報と、チャンネル内のメッセージ履歴を取得したいので、channels:read と channels:history をまずセットしました。
さらに、プライベートチャンネルの履歴も取得したいので、groups:history を追加。
そして、SlackのDMの情報を使うかもしれないのでim:historyとmpim:historyも追加しました。

・スコープを設定したら、画面上部にある「OAuth Tokens」セクションに戻ります。
「Install to ***(ワークスペース)」をクリックしてアプリをインストールします。

・上記の手順のあと、アプリのインストール確認画面が表示されるので、そこで「Allow」(許可する)をクリックします。
※自分がワークスペースの管理者であれば表示されます。管理者でない場合は、管理者による承認を待つ必要があります。

・OAuth設定画面に戻ります。そこで、OAuthToken =「Bot User OAuth Token」(xoxb-…)が発行されているのを確認できるので、これを控えておきます。

これで、Slack APPの作成は完了です。

2)対象チャンネルIDの取得とアプリ追加


データ抽出コードで使用するチャンネルIDを取得し、作成したアプリを対象チャンネルに参加させます。

・Slackチャンネルが存在するSlackワークスペースにアクセスし、対象のチャンネル名をクリックします。実際の画面は以下のようになっているはずです。

・チャンネル画面の上部にあるチャンネル名のタグをクリックすると、チャンネルの詳細情報がモーダル画面で表示されます。

・下部で「Channel ID」がいるのを確認できるので、これを控えておきます。

・モーダル画面のタブで「Integrations」押し「Add an App」押します。

・表示された画面で先ほど作成したAppを検索して「Add」を押し追加します。

この手順を、データを抽出したいすべてのチャンネルに対して同様に行います。
最初に少し手間はかかりますが、一度追加と記録すればその後はスムーズです。

3)処理コードの作成


Slack APIを呼び出してデータを取得するコードを作成します。
・Slackチャンネル内にある、スレッド形式の会話データを取得するのが目的です。
・具体的には、以下の2点を実現します:
 - 各チャンネル内のメッセージ一覧を取得し、スレッド(会話の起点となるメッセージ)を抽出
  → 使用APIメソッド:conversations.history
 - 上記で取得した各スレッドに紐づくリプライ(返信)を取得
  → 使用APIメソッド:conversations.replies

 ※(参考)利用可能なAPIメソッド一覧はこちら

・AWS LambdaでPythonを使いたく、Slackが公式に提供しているPython用ライブラリslack_sdk を使用します。

・Lambda上で動かす前にGoogle Colab上で実験します。
 まずslack_sdkをインストールします。

Google Colab (slack_sdk Install)
# ライブラリのインストール(初回のみ必要)
!pip install slack_sdk

・セルを実行すると、以下のようにインストールされます。

・処理用コードのポイントは以下の通りです。
 - OAuth Token情報
  →先ほど作成したOAuth TokenをWebClientにセット(コード中のxoxb-***
 - 対象のチャンネルID
  →先ほど確認したchannel ID」をchannel_idにセット
 - 取得したい日付の指定
  →指定したい日付時刻をUnix timeにまず変換
  →それをconversations_history(oldest=”*” )でセット
 - 取得したい件数
  →同様にconversations_history(limit=*)でその数を指定
  →Slack推奨は200件だそう (処理速度の問題を考慮したものと想像します)
  →oldestとlimitはSlackAPIのレート制限にも注意して設定してください。
 実際のコードは以下の通りです。

Google Colab (Slack データ抽出)
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError

# OAuth トークンを設定
slack_client = WebClient(token="xoxb-***")#先ほど作成した「Bot User OAuth Token」の情報

def run():
    channel_id = "対象チャンネルID" #控えておいたSlackの「channel ID」

    try:
        response = slack_client.conversations_history(channel=channel_id, limit=1,oldest="1742340080.000000" )
        messages = response.get("messages", [])

        for message in messages:
            if "thread_ts" in message:
                thread_ts = message["thread_ts"]
                replies = slack_client.conversations_replies(channel=channel_id, ts=thread_ts)
                
                print("スレッド:", message["text"])
                for reply in replies["messages"][1:]:  # 最初の1件は親メッセージ
                    print(" ┗ リプライ:", reply["text"])

    except SlackApiError as e:
        print(f"Slack API error: {e.response['error']}")

# 関数を実行
run()

・セルを実行してみます。

成功!対象チャンネル内のスレッドの質問(Q)と、それに対するリプライ(A1・A2)が出力されました。

・Lambda関数で実装する場合の追加の考慮点は以下の通りです:
 - slack_sdkをLambda関数にレイヤーとして追加
 - 抽出したデータをベクター化し、ベクトルデータベースへ登録する処理を追加

Slackデータ取得とは別の話題になるので、これらの処理はここでは割愛させて頂きます。

データのチェック


念のため、抽出データがあっているかみてみます。

・Slackの対象チャンネルでは、下図のような内容です。

・一方、colabで出力した内容は以下の通りです。

・双方内容が同じ!成功です。

・最終的には以下のようなチャットボットの裏側で説明したようなデータが使われる事になります。
(構築全体の説明は、また別途記事にする予定です。)

まとめ


Slack APIにアクセスすることで、conversations.history と conversations.replies の2つのAPIメソッドを使い、メッセージとそのリプライ(スレッド会話)を取得することができました。

なお詳しくは触れていませんが、500件を超えるデータを一度に取得しようとした際にレート制限エラーが発生したため、oldestとlimit パラメータを調整しながら対応しました。各APIメソッドにはそれぞれ制限があるため、利用時には注意が必要です。

Slack内まだ細かい情報(リアクションやイベント情報など)を取得するには、他にも活用できそうなAPIメソッドがあるため、時間のあるときにそういった追加データの取得にもチャレンジしてみたいと思います。

ಮುಂದಿನ ಲೇಖನಕ್ಕಾಗಿ ನಿರೀಕ್ಷಿಸಿ.
(次回の記事にご期待ください)

ご連絡フォーム


フィードバックを是非お願いします。
本記事の方法での問題点や、よりよい方法のアイデアを頂けると大変助かります。

この記事に関して

その他のご連絡

DevAIsをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む