【画像で導く】SlackとChatGPTの導入・連携方法を解説

今回はSlackを、ChatGPTやClaudeと連携する方法をご紹介します。

Slackのチャット画面を通じて、質問や文章の要約、タスクの自動化などできることはさまざま。さらに便利に使えることは間違いないので、ぜひ最後までご覧くださいっ!

お時間のない方向けに、まとめを作っております。
2,3分で概要を理解できるようにしてますので、目次からクリック!

目次

SlackとChatGPTを連携させる方法

SlackとChatGPTを連携させる方法は主に2つあります。

  1. Slack GPTを使って導入する
  2. APIを使ってSlackとChatGPTを連携させる

1.の方法だと比較的簡単に連携できるため、今すぐ使いたい方にもおすすめです。
2の方法はプログラムを書く方法です。1.に比べると専門知識が必要ですが、連携させることができれば細かい設定やモデルの変更なども可能です。
どちらの方法も便利に使えますので、ご自身のニーズに合わせて選んでいただければと思います。

Slack GPTを使ってSlackとChatGPTを連携する

Slack GPTは、Slack上にさまざまなAIを導入するための仕組みです。
次のようなAIサービスが利用可能です。

利用できるAIサービス概要ステータス
Claude app for SlackClaude(AIチャットボット)を導入できるベータ版として公開されており、無料で利用可能
ChatGPT app for SlackChatGPTを導入できる利用申し込みのウェイトリストを受付中
Einstein GPT app for SlackEinstein(Slack上でのネイティブAIサービス)を導入できる現在開発中
Workflow Builder with Slack GPTWorkflow機能にAIを導入できる今夏に登場予定

Slack GPTの機能

これらを組み込むことで、具体的には次のような機能が使えるようになります。

  1. メッセージ・スレッドの一括要約
  2. ライティング補助
  3. ワークフローへの組み込み
  4. Slack上でAIチャットとの会話

順番にどのようなものか見ていきましょう。

メッセージ・スレッドの一括要約

この機能では、溜まってしまったメッセージを要約してくれます。
確認時間の短縮ができて、スムーズな連携が可能です。Einstain GPTというSlack用に作られたAIが機能しはじめると、実現できますが、現状はまだ使えていません。

引用:https://slack.com/intl/ja-jp/blog/news/introducing-slack-gpt
ライティング補助

自身が作成するメッセージやCanvasに保存しているメモに対して、省略化・詳細化やトーンの変更という処理も今後できる予定です。

引用:https://indianexpress.com/article/technology/artificial-intelligence/slack-gpt-announced-with-conversation-summarisation-8591586/

現状は、まだ実装できていないみたいです。

ワークフローへの組み込み

Slackにはすでにワークフロー機能がありまして、定期的にある業務は自動化できます。現在は、Salesforce、Google Sheets、Trello、Jiraなどとの情報の送受信が簡単になっています。

今後は、この自動化に加えて、ChatGPTが得意とするパーソナライズを実現可能に。

例えば、以下の画面は「AIを活用したリード対応」の事例。

ChatGPTがワークフローに入ることで、お客様に合わせたメールの下書きをしてくれるんだとか。
弊社環境で確認してみましたが、このワークフロービルダーへのAI実装はまだできていなさそうです。

早く使えるようになってほしいです!

Slack上でAIチャットボットとの会話

Slackには外部アプリを導入する機能があります。その機能を使い、ChatGPTやClaudeをSlackのチャット画面に導入しましょう。

Slack GPTの導入方法

いくつかSlackGPTの機能を紹介しましたが、現状利用可能な「Claude」の導入方法について紹介します。

そもそも「Claude」とは、元OpenAIのメンバーが創業者であるAnthropic社によって開発されたチャットAIです。
ChatGPTと比較すると、物語への理解度や、ジョークの質が高いといわれています。
人間味が強く、コミュニケーションアプリであるSlackとの相性は良いかもしれません。

なお、Claude 2について詳しく知りたい方は、下記の記事を合わせてご確認ください。
Claude 2の日本での使い方解説!ChatGPT超えの最強LLMをご紹介

Slackの左メニューで「その他」→「App」

「その他」ボタンをクリックしたのち、「App」をクリック。

「Claude」を検索し、「追加」

検索欄に「Claude」と入力して、「追加」する。

チャンネル内で@Claudeと話しかける

チャンネル内にClaudeが現れるので、プロンプトを入力すると応答してくれる。

SlackとChatGPTをAPIで連携する

ChatGPTのAPIを使い、Slackアプリを作成する方法について説明します。
連携すると、以下のようなことが利用可能に。

  1. チャンネルの内容を要約
  2. 疑問などを質問 など

弊社では、実際にチャンネル内の会話を要約するために、ChatGPT APIを活用したSlackアプリを作りました。

それをもとに、連携方法を確認していきましょう。

API連携して作った要約アプリについて

まずは、作ったSlackアプリの概要は以下のとおりです。

  • (弊社環境では)times チャンネルに、対象チャンネルの要約がリストされる
  • 対象になるチャンネルは25時間以内に会話があったパブリック/プライベートチャンネル

実際に、以下のように、timesチャンネルへ複数チャンネルの要約が表示されています。

画像に alt 属性が指定されていません。ファイル名: 24e80e0918e96e8449368a1741933744.png

それでは、実際のコードを見ながら実行手順を確認していきましょう!

Slackアプリの実行手順

Slackアプリの実行には、定期実行と都度実行の2パターンがあり、今回は、都度実行するための手順を紹介します。

実行する前準備として、以下3つの変数に格納している値を書き換えます。

  • openai.api_key
  • TOKEN
  • CHANNEL_ID

後述するプログラムでは以下のように記述しています。

#以下の3つはご自身の環境で取得し書き換える必要があります。
openai.api_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
# APIトークンとチャンネルIDを設定する
TOKEN = "xoxb-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
CHANNEL_ID = "XXXXXXXXX"

こちらは、みなさんの環境独自のデータですので、それぞれ取得していきましょう。

OpenAI APIキーを取得する

openai.api_key は、OpenAI API キーを格納する変数です。
まずはOpenAI の Web サイトにアクセスします。
適宜、Sign In して、自身のアカウントアイコン→View API Keysをクリック

「Create new secret key」をクリックする

赤枠内にあるシークレットキーをコピー

OpenAI APIキーの取得手順は以上です。

Slack APIキーを取得する

tokenは、Slack APIキーを格納している変数です。
まずは、Slack API の Web サイトにアクセス。
ログインし「Create an app」をクリック。

「From an app manifest 」をクリック

アプリを追加したいワークスペースを選ぶ

以下のjsonを貼り付けて「Next」をクリック

{"display_information":{"name":"Summary","description":"Public channelのサマリーを作る","background_color":"#d45f00"},"features":{"bot_user":{"display_name":"Summary","always_online":false}},"oauth_config":{"scopes":{"bot":["channels:history","channels:join","channels:read","chat:write","users:read"]}},"settings":{"org_deploy_enabled":true,"socket_mode_enabled":false,"token_rotation_enabled":false}}

「Install to Workspace」をクリック

「許可する」をクリックし、画面遷移するまで待つ

左側の「OAuth & Permissions 」をクリックすると、「xoxb-」から始まるAPI キーが取得できる。

Slack APIキーの取得手順は以上です。

チャンネルIDを取得する

CHANNEL IDは、アプリを追加したいチャンネルIDを格納している変数です。
チャンネル名をクリックすると、下に表示されます

これで準備完了です。
プログラムの該当部分を書き換えてプログラムを保存してください。
今回は、summariser.pyというファイル名にしました。

#!/usr/bin/env python3
# https://github.com/masuidrive/slack-summarizer
# by [masuidrive](https://twitter.com/masuidrive) @ [Bloom&Co., Inc.](https://www.bloom-and-co.com/) 2023- [APACHE LICENSE, 2.0](https://www.apache.org/licenses/LICENSE-2.0)
import os
import re
import time
import pytz
from slack_sdk.errors import SlackApiError
from slack_sdk import WebClient
from datetime import datetime, timedelta
import openai
from openai.error import InvalidRequestError
#以下の3つはご自身の環境で取得し書き換える必要があります。
openai.api_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
# APIトークンとチャンネルIDを設定する
TOKEN = "xoxb-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
CHANNEL_ID = "XXXXXXXXX"
# OpenAIのAPIを使って要約を行う
def summarize(text):
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        temperature=0.5,
        messages=[
            {"role": "system", "content": "チャットログのフォーマットは発言者: 本文\\nになっている。\\nは改行を表しています。これを踏まえて指示に従います"},
            {"role": "user", "content": f"下記のチャットログを箇条書きで要約してください。1行ずつの説明ではありません。全体として短く。\n\n{text}"}
        ]
    )
    return response["choices"][0]["message"]['content']
# 取得する期間を計算する
HOURS_BACK = 25
JST = pytz.timezone('Asia/Tokyo')
now = datetime.now(JST)
yesterday = now - timedelta(hours=HOURS_BACK)
start_time = datetime(yesterday.year, yesterday.month, yesterday.day,
                      yesterday.hour, yesterday.minute, yesterday.second)
end_time = datetime(now.year, now.month, now.day,
                    now.hour, now.minute, now.second)
# Slack APIクライアントを初期化する
client = WebClient(token=TOKEN)
# ユーザーIDからユーザー名に変換するために、ユーザー情報を取得する
try:
    users_info = client.users_list()
    users = users_info['members']
except SlackApiError as e:
    print("Error : {}".format(e))
    exit(1)
# チャンネルIDからチャンネル名に変換するために、チャンネル情報を取得する
try:
    channels_info = client.conversations_list(
        types="public_channel,private_channel",
        exclude_archived=False,
        limit=200
    )
    channels = [channel for channel in channels_info['channels']
                if not channel["is_archived"] and channel["is_channel"]]
    channels = sorted(channels, key=lambda x: int(re.findall(
        r'\d+', x["name"])[0]) if re.findall(r'\d+', x["name"]) else float('inf'))
except SlackApiError as e:
    print("Error : {}".format(e))
    exit(1)
# 指定したチャンネルの履歴を取得する
def load_messages(channel_id, ts):
    result = None
    result = client.conversations_replies(ts=ts,
                                          channel=channel_id,
                                          oldest=start_time.timestamp(),
                                          latest=end_time.timestamp()
                                          )
    # messages = result["messages"]
    messages = list(filter(lambda m: "subtype" not in m, result["messages"]))
    if len(messages) < 1:
        return None
    messages_text = []
    while result["has_more"]:
        result = client.conversations_replies(ts=ts,
                                              channel=channel_id,
                                              oldest=start_time.timestamp(),
                                              latest=end_time.timestamp(),
                                              cursor=result["response_metadata"]["next_cursor"]
                                              )
        messages.extend(result["messages"])
    for message in messages[::-1]:
        if "bot_id" in message:
            continue
        if message["text"].strip() == '':
            continue
        # ユーザーIDからユーザー名に変換する
        user_id = message['user']
        sender_name = None
        for user in users:
            if user['id'] == user_id:
                sender_name = user['name']
                break
        if sender_name is None:
            sender_name = user_id
        # テキスト取り出し
        text = message["text"].replace("\n", "\\n")
        # メッセージ中に含まれるユーザーIDやチャンネルIDを名前やチャンネル名に展開する
        matches = re.findall(r"<@[A-Z0-9]+>", text)
        for match in matches:
            user_id = match[2:-1]
            user_name = None
            for user in users:
                if user['id'] == user_id:
                    user_name = user['name']
                    break
            if user_name is None:
                user_name = user_id
            text = text.replace(match, f"@{user_name} ")
        matches = re.findall(r"<#[A-Z0-9]+>", text)
        for match in matches:
            channel_id = match[2:-1]
            channel_name = None
            for channel in channels:
                if channel['id'] == channel_id:
                    channel_name = channel['name']
                    break
            if channel_name is None:
                channel_name = channel_id
            text = text.replace(match, f"#{channel_name} ")
        messages_text.append(f"{sender_name}: {text}")
    if len(messages_text) == 0:
        return None
    else:
        return messages_text
result_text = []
for channel in channels:
    try:
        threads = client.conversations_history(channel=channel["id"],
                                               oldest=start_time.timestamp(),
                                               latest=end_time.timestamp())
    except SlackApiError as e:
        if e.response['error'] == 'not_in_channel':
            response = client.conversations_join(
                channel=channel["id"]
            )
            if not response["ok"]:
                raise SlackApiError("conversations_join() failed")
            time.sleep(5)  # チャンネルにjoinした後、少し待つ
            threads = client.conversations_history(
                channel=channel["id"],
                oldest=start_time.timestamp(),
                latest=end_time.timestamp()
            )
        else:
            print("Error : {}".format(e))
            continue
    messages_in_channel = []
    if not threads["messages"]:
        continue
    result_text.append(f"----\n<#{channel['id']}>\n")
    for thread in threads["messages"]:
        if thread:
            messages = load_messages(channel["id"], thread["ts"])
            if messages:
                messages_in_channel.extend(messages[::-1])
    try:
        result_text.append(summarize(messages_in_channel))
    except InvalidRequestError as e:
        result_text.append('4096tokenを超えたため生成に失敗しました')
title = (f"{yesterday.strftime('%Y-%m-%d')}の要約")
text = title+"\n\n"+"\n\n".join(result_text)
response = client.chat_postMessage(
    channel=CHANNEL_ID,
    text=text
)
print("Message posted: ", response["ts"])
アプリを追加する

「アプリを追加する」 から「timesチャンネル」にSummaryアプリを召喚。

これで準備は完了です。

ちなみに、アプリ開発の際、参考にした記事はこちらです。

note(ノート)
ChatGPTで1日分のSlackを要約してくれるスクリプトを作りました|masuidrive Slackって読むの大変ですよね。っていうかもうみんな追いかけるの無理でメンションしか読んでないですよね? でも、全体感は把握しておきたい。そんな人のために昨日発表さ...

この記事のプログラムは、パブリックチャンネルのみ対象のして動作するものでしたので、プライベートチャンネルも対象になるよう修正しております。

それでは使ってみましょう!

なお、ChatGPTとExcelを連携させる方法について詳しく知りたい方は、下記の記事を合わせてご確認ください。
【非エンジニア必見】ChatGPTを使ったExcel自動化ツール!業務が倍速で終わる仕事術

SlackとChatGPTを実際に連携して使ってみた

「SlackGPT」、「SlackとChatGPTのAPI連携」の順番で確認していきます。

SlackGPT

以下のタスクを実行しました。

  1. メールの返信を考えてもらう
  2. プログラムを考えてもらう
  3. 社員の交流会を企画してもらう

プロンプトもあるので、ぜひご自身でお試しください。

1.メールの返信を考えてもらう

次のようなプロンプトを使って、メールの返信文を考えてもらいました。
書いてほしい内容が書かれていたので、問題ないと思います!

#instruction:
あなたは優秀なビジネスマンです。
最高な返信を考えてください。
#input:
{返信したい文章}
#ouput:

2.プログラムの考案

今回は、フィボナッチ数列を返すプログラムを次のプロンプトで作ってもらいました。

#役割:
あなたは優秀なエンジニアです
#制約条件:
フィボナッチ数列を作成するプログラミングを書いてください
数列の長さを指定できるようにしてください
#出力:

実行してみたところ、問題なく動いてました!
業務で使うようなプログラムも今度書いてもらおう!

3.社員の交流会を企画してもらう

次のようなプロンプトで、社員の交流会を企画してもらいました。
大枠を考えるときにすごく便利そう。

#役割:
あなたは優秀なイベントプランナーです
#制約条件:
社員の交流会を企画してください
#指示:
・開催地は東京都に絞る
・下記「出力」の条件に合わせる
・参加人数は20名
・予算は50万円以内とし、想定費用の詳細を算出してください
#出力:
{開催地}
{内容詳細}
{想定費用}
{開催日時}

ちなみに想定費用の算出根拠について質問してみました。
各項目毎にしっかりソースがあって納得できる気がします!

SlackとChatGPTのAPI連携

次は、先程準備した要約用のSlackアプリを実行しましょう。

要約アプリの実行

先程、Slackアプリの導入手順で作ったsummarize.pyを実行します。

python3 summarize.py 

すると、Slack上で、各チャンネルの内容が要約されます!

ほかにもSlack APIを使い別のアプリ開発することで、さまざまなことに応用可能です。

専門家AIを作り質問に答えてもらう

エンジニアマーケターコンサルタントの役職を持つSlackアプリを3つ導入し、質問に答えてもらっています。
それぞれの専門性にまつわる質問のときだけ反応するようにしています。
例えば、「PCを買いたいけどおすすめある?」と聞くと、
エンジニアAIが回答してくれるという感じです。

まとめ

SlackとChatGPTを連携させる方法は主に2つあります。

  1. Slack GPTを使って導入する
  2. APIを使ってSlackとChatGPTを連携させる

1.は、すぐに導入して活用したい方向け。
2.は、プログラミングが必要なため、やや技術者向けです。

SlackGPT

概要

Slack上で大規模言語モデル(ChatGPTやClaude)の機能を使えるようにする仕組みです。
AIを組み込むことで、次の4つの機能が使えます。

  1. メッセージとスレッドの要約
    • 溜まったメッセージを要約してくれる。
  2. ライティング補助
    • 自分が書くメッセージを要約したり詳細にしたりトーンを変えたりできる。
  3. ワークフローとの連携
    • Slackのワークフロー機能で業務フローを管理。
      Google Sheetsなど他のツールと情報を送受信できる。
  4. Slack上でAIチャットボットとの会話
    • 質問や要約などがSlackのチャットで実行できる

ただし、現状はすべてが利用できるわけではなく、4.Slack上で会話できるAIチャットボットのみが利用可能です。

導入方法

こちらの導入方法は次のステップで!

  1. Slackの左メニューで「その他」→「App」
  2. 「Claude」を検索し、「追加」
  3. チャンネル内で@claudeを話しかける

実際にClaudeを使ってみた

  1. メールの返信を考えてもらう
  2. プログラムを考えてもらう
  3. 社員の交流会を企画してもらう

SlackとChatGPT API連携

概要

Slack とChatGPT APIを使うことで、Slack上で動くアプリを開発できます。

導入(開発)手順

以下の方法で、ChatGPTが連携しているSlackアプリを導入できます。

  1. OpenAI APIキーを取得する
  2. Slack APIキーを取得する
  3. チャンネルIDを取得する
  4. アプリをSlackに追加する
  5. Pythonプログラムを実行する。

ただし、本記事で紹介したプログラムは、チャンネルの要約に特化したものです。
その他のユースケースに対しては、プログラムを書いていただく必要があります。

弊社でのSlackアプリ活用実績

これまでいくつか開発したアプリについてご紹介します。

  1. チャンネルの要約アプリ
  2. 専門分野にしか回答しない専門家AIアプリ
サービス紹介資料

生成系AIの業務活用なら!

・生成系AIを活用したPoC開発

・生成系AIのコンサルティング

・システム間API連携

弊社では法人向け生成AI研修・勉強会を行なっています

いかがだったでしょうか?

弊社では、法人様向けに生成AI研修を行なっております。
また、研修に加えて本事業の支援も行わせていただいております。

詳しくはこちらをご覧ください!
セミナー実績 | WEEL

研修をさせていただいた企業様からは、以下のような好評をいただいております。

生成AIについて包括的に理解ができ、多くの業務で生成AIが活用されるようになった。
生成AIの事例を知ることで、社内で生成AIを活用するためのアイデアがたくさん出てくるようになった。
全社で生成AIに関する認識を共有できたので、生成AIに関するプロジェクトの理解が得られるようになった。

研修の内容としては、以下のようなものになっています。

1. 生成AIの概要
2. 生成AIの歴史
3. 生成AIのリスク・対応策
4. 生成AIの活用事例
5. 生成AIの未来予測
6. 〇〇業界特有の生成AI活用法(様々な業界に対応)
7. プロンプトエンジニアリング実践(ChatGPTや画像生成AIへの入力文)
8. AI開発実践(Pythonプログラミング)
9. 生成AIの社内導入手順

※企業様のニーズに合わせて内容はカスタマイズしています。

「社員に生成AIに関する知識を身に付けてもらいたい」
「今後、生成AIを活用して事業展開をしていきたい」

と考えている方は、まずはご相談から承っておりますので、ぜひご連絡ください。

➡︎生成AIセミナー・社内勉強会について相談をしてみる

生成AIを社内で活用していきたい方へ
メルマガ登録

「生成AIを社内で活用したい」「生成AIの事業をやっていきたい」という方に向けて、通勤時間に読めるメルマガを配信しています。

最新のAI情報を日本最速で受け取りたい方は、以下からご登録ください。

また、弊社紹介資料もご用意しておりますので、併せてご確認ください。

投稿者

  • Leon Kobayashi

    必ずフォローすべきAIエバンジェリスト(自称) => 元東証一部上場ITコンサル (拙者、早口オタク過ぎて性に合わず退社)<-イマココ 【好きなもの】リコリコ・しゃぶ葉 宜しくおねがいします。

  • URLをコピーしました!
  • URLをコピーしました!
目次