こんにちは、品川です。
何番煎じかわからないですが、ChatGPTを研究室のSlackに入れたいと思って少し色々といじっていました。とりあえず目的のものはできたので備忘録がてらbot作成についてまとめておきます。
仕様
メイン:
- botはGASとSlack API、ChatGPT (gpt-3.5-turbo) APIで実装 (GPT-4 API欲しい・・・)
- botは他のユーザからメンションされた時だけ応答
- 応答はスレッドに投稿
- スレッドが存在しない場合はスレッドを新規作成して応答を投稿
- スレッドが存在する場合は、スレッドの対話履歴を抽出
- ChatGPT APIは対話履歴を入力として応答文を生成する(スレッドが存在しない場合はユーザの入力のみ)
動作例は下のような感じです。簡単な計算を行ってから会話をまとめてもらう操作を依頼して、履歴が次の発話に継承されているのを確認しました。
細かい点:
- Challenge-response認証
- GASのリクエスト再送回避
- bot自身のメッセージにbotが応答しないようにする
- 生成文が長い場合は時間がかかるので、ユーザに返答可能を示すために先に送信するメッセージ(filler message)を設定
- スレッドから抽出する履歴はbotのfiller messageを除いた履歴とする
- テキスト中のメンション表現「<@\w+>」をすべて対応する「at:ユーザ名」に置換 (意図せぬbotからの誤爆回避のため)
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での実装
これで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の利用準備+実装
- 【忘備録】SlackチャンネルにChatGPTを組み込んでみた!【Google Apps Script】 | 情報学部生の気ままなブログ
- ChatGPT APIを使って何にでも応答するSlackボットをGASで作る方法【改】(スレッドの文脈考慮機能付き) - Qiita
実装