Slack botとしてChatGPTをお招きしてスレッドに返信してもらう

こんにちは、品川です。

何番煎じかわからないですが、ChatGPTを研究室のSlackに入れたいと思って少し色々といじっていました。とりあえず目的のものはできたので備忘録がてらbot作成についてまとめておきます。

仕様

メイン:

  • botはGASとSlack API、ChatGPT (gpt-3.5-turbo) APIで実装 (GPT-4 API欲しい・・・)
  • botは他のユーザからメンションされた時だけ応答
  • 応答はスレッドに投稿
  • スレッドが存在しない場合はスレッドを新規作成して応答を投稿
  • スレッドが存在する場合は、スレッドの対話履歴を抽出
  • ChatGPT APIは対話履歴を入力として応答文を生成する(スレッドが存在しない場合はユーザの入力のみ)

動作例は下のような感じです。簡単な計算を行ってから会話をまとめてもらう操作を依頼して、履歴が次の発話に継承されているのを確認しました。

動作例:簡単な計算を行ってから会話をまとめてもらう操作を依頼
動作例:簡単な計算を行ってから会話をまとめてもらう操作を依頼

細かい点:

Slack botとGASの準備

基本は下記のサイトに従って進めればOK。
【忘備録】SlackチャンネルにChatGPTを組み込んでみた!【Google Apps Script】 | 情報学部生の気ままなブログ
※ただし、上の記事にあるSlackAppは結局使わないで実装しました(SlackAppでスレッドに送信する方法が調べてもよく分からずハマったため・・・)

OAuth Scopeは以下のBot Token Scopesが必要です。

  • channels:history (スレッドの読み込みに必要)
  • chat:write (応答に必要)
  • users:read (ユーザIDをユーザ名に変換するのに必要)

※更新したらbotの再インストールの警告が出ます。再インストール(Install Appにある「Reinstall to Workspace」)をしてようやく権限が更新されるので注意。

GASでの実装

gist.github.com

これでGASのコードを置き替えて再デプロイすれば動きます。

動かない場合:

  • GAS側の設定
    • 設定の「スクリプトプロパティ」としてopenApiKey, slackBotId, slackBotTokenがきちんと設定されているか
    • デプロイの方法が間違ってないか
  • Slack API側の設定
    • OAuth & PermissionのScopeが反映されているか
    • Event Subscriptionはonになっているか
  • Slack側の設定
    • 「チャンネル名」→「インテグレーション」→「アプリを追加する」でbotを動かしたいチャンネルに登録しているか

感想

有志の方々が先行して記事をまとめてくださってたのでだいぶ助かりました。GASはあまり使い慣れてなかったので良い勉強になりました。とはいうものの、SlackのAPIの仕様で思ったより苦戦しました。 私はまだ諸般の事情でGPT-4に課金して無かったのでgpt-3.5-turboで聞いてみたりしたのですが、SlackのAPIのスレッド周りの仕様についてのWeb上の記事が比較的少ないせいか、結構トンチキな提案をされて逆に振り回されてしまった感じです。結局公式のリファレンスを読むのが一番早かったというオチでした。

参考

GASの利用準備+実装

実装