ChatGPT Slackボット on Google App Script
ChatGPTとSlack上でやりとりができるBotを開発してみました。
以下のようにボットにメンションするとスレッドでChatGPTボットが返信してくれます。
Slack上でChatGPT使いたいなと思って、トライしてみました。
スレッド内ではChatGPTと会話を継続させることができますし、いつもの慣れ親しんだUIでChatGPTが使えるのは嬉しいです。
ソースコードや導入方法は公開してあるので、参考にしてください。
https://github.com/nishiyama-k0130/gas-chatgpt-slackbot
今回の開発ポイントはなんといってもGoogle App Scriptで作ったというところです。
当初はAWS API Gateway + AWS Lambdaで開発してみようと考えたのですが、エンジニアでなくても構築できるという点を実現したみたくて、GASに手を出してみました。
構築方法はGitに公開していますので、今回は苦労ポイントを書きたいと思います。
構成
まず構成は以下のようになっています。
大体の流れは以下のとおりです。
- SlackからのメンションイベントをdoPost()で受信して、Script Propertiesにイベント内容を登録する
- Triggerをスケジュール起動させてprocessEvent()を実行
- Script Propertiesに入っているEventを読み込んで処理(ChatGPT問い合わせ、Slack返信など)をする
- Script Propertiesから処理したEventを削除する
苦労ポイント
Slackの制限
今回始めてGASに手を出してみて、まずWebアプリが開発できることにビックリしました。これならばSlackからのイベントwebhookを受信することができます。
開発当初はdoPost()内で、ChatGPT呼んでSlackに返信してという一連の流れで開発を進めていたのですが、めんどくさいことが発覚しました。
Slackには、メンションイベントには3秒以内に200のステータスコードを返さないといけないというルールがありました。
以下はドキュメントの翻訳です。
アプリは、3 秒以内に HTTP 2xx でイベント リクエストに応答する必要があります。 そうでない場合は、イベント配信の試行が失敗したと見なされます。 失敗すると、3 回再試行し、指数関数的に後退します。 いくつかのベスト プラクティスは次のとおりです。
自動無効化を防ぐために、60 分あたり少なくとも 5% のイベントの応答成功率を維持します。
できるだけ早く HTTP 200 OK でイベントに応答してください。
同じプロセス内で実際にイベントを処理して反応することは避けてください。
インバウンド イベントを受信後に処理するためのキューを実装します。
ChatGPTのAPIも呼んでいるので、とてもじゃないけど3秒以内に返信はできません。
そこでScript PropertiesというGASの機能を使ってJobQueueとすることにしました。これは言ってしまえばグローバル変数です。
ここにwebhookのイベントの内容を保存しておいて、slackには返事をします。
GASの制限
このイベントの処理はスケジューラーであるTriggerというGASの機能を使って、順次処理をしていきます。
1分間隔での起動が最小設定でしたので、これを6本仕込んで1分の中でも秒数がばらけるように調整しています。
トリガーをたくさん仕込めば仕込むほど、レスポンスのスピードがあがるので、1分に6本と言わず、10本でも20本でもと当初は思ったのですが、調べたらトリガーの合計実行時間には制限があることがわかりました。
トリガーの合計実行時間は一般ユーザーは90 分(日)、Google Workspaceアカウントは6時間(日)となっています。そこも加味して、1分にトリガー6本をデフォルトとしています。
一般ユーザーの方は、トリガーの本数を半分の3本に減らすか、稼働時間を制限(9時から18時までなど)したほうがいいと思います。トリガーを一気に作成したり、削除したりする関数はスクリプトの中にありますので、それを起動するトリガースケジューラーを作成すれば、稼働時間の調整も可能です。
利用ログ
また、利用ログも取得しています。誰がどれくらい使ったのかがわかるようになっています。
ぜひ皆さんのSlackにも導入して、充実したChatGPTライフをお楽しみください。