50
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Slackでリアクション未反応者を自動検出し、リマインドするBotを簡単に AI に実装させてみようとした話

50
Last updated at Posted at 2025-12-03

こんにちは:sunny:
any 株式会社のエンジニア @se_yoshida です:santa_tone1:
この記事は、any Product Team Advent Calendar2025 4日目の記事になります。


Slack で「この投稿を確認した人はスタンプで反応してください!」という運用をすることがあります。
ただ、この運用は

  • スタンプ押し忘れが発生する
  • 誰が押していないのか毎回手動で確認する必要がある

と、地味に手間がかかります。

「このあたりの管理を簡素化できないかな?」と思い、既存のサービスをいろいろ探してみたのですが、意外と「これだ!」というものが見つかりませんでした。
そこで今回、リアクション未反応者を検出し、リマインドしてくれるSlack Botを実装することにしました。

「AIを使えば一瞬でできるだろう」 と軽く考えていたら、意外とハマってしまい、結果的に時間がかかりました。
AIでこんなに簡単に作れました!ということを伝えられればと思っていたのですが、時間がかかった事でそれが伝えられなくなり、でも、AIの良さを少しでも組み込みたかったので、リマインドメッセージをAIに都度生成させるという仕組みを組み込んでみました ^_^

この過程で、「AIに任せてよい部分」と「人間がやるべき部分」 が明確になったため、そのあたりも含めて体験をまとめていきます。


今回やりたいこと

  • ChatGPT に実装方針を策定してもらう
  • その実装方針を Devin に伝え実装してもらう
  • できる限り自分で実装しない

:low_brightness: 最初にAIに「必要な工程と技術」を丸ごと聞いた

まず、AI(今回はGPT5.1)に以下のように聞いてみました。

  • どんな技術を使う?
  • 必要なSlack APIの権限は?
  • どんな手順で実装する?
  • TODOリストとして落とし込んで
    スクリーンショット 0007-11-27 11.19.19.png

さすが AI!諸々一瞬で提示してくれました。
「これは、めちゃくちゃ簡単に作れるのでは!?」と、この時点では気軽に考えていました。
スクリーンショット 0007-11-27 11.22.02.png


:hammer: AIの言う通りに進めてみる

AIが作ってくれたTODOリスト通りに作業を進めていったのですが、ここから問題が続発します。

Botの権限(スコープ)設定でつまづく

AIからは以下のような権限を設定するよう指示がありました。

  • conversations:read
    • チャンネルメンバー一覧などを取得するため

しかし、権限一覧内にそのスコープが存在しない。
AIに「ないよ」と伝えると
スクリーンショット 0007-11-27 11.28.18.png

「良いところに気づきました!」
AI あるある発動。
とはいえ、最終的には正しいスコープを教えてくれたので先へ進むことができました。

Slackアプリをワークスペースにインストールできない

次に遭遇したのがこちらのエラー。

未回答リマインダー にはインストールするボットユーザーがありません
このアプリはこのワークスペースにボットをインストールする許可を要求していますが、現在、ボットを使用するための設定がされていません。この問題を解決するためには開発者にお問い合わせください。

これもAIに相談。
同じ回答をひたすらループして返されるだけで解決せず。
AI との対話だけで解決したかったのですが時間がかかりすぎるので、公式ドキュメントやフォーラムを漁り、アプリ名を指定していなかっただけという基本的な問題でした。

「前途多難?!(おおげさ)」と思った瞬間です。

AIに書いてもらったコードと、インフラ設定が衝突

ここは完全に自分の指示の出し方が悪かったと反省したポイントです。

AI(今回は Devin)に実装を依頼する際、初回にAIに仕様を聞いたときと同様の指示をしました。その結果、AIが生成したコードの中にLambdaとAPI Gatewayの連携設定まで込みで書かれていました。
スクリーンショット 0007-11-27 12.05.40.png

一方で私はというと、AIのTODOリスト通りにAWSコンソール側でLambdaとAPI Gatewayを手動で設定。
その結果、AIが生成した設定と手動で作成した設定が衝突していました。
ということで、手動で作成したAWSの設定をすべて削除しました。
AIに作業を任せるときは、どこまでAIに任せるかを明確に伝えるとともに、自分がどこをやるかを理解しながらやらないといけないことを痛感しました。(本来当たり前ですが)

待機ステップ + Webhook構成が使えない

LambdaとAPI Gatewayの連携が無事に終わり、TODOに従ってSlack側でワークフローの作成に入りました。
当初の想定では、

  • 待機ステップで所定時間待つ
  • 待機後に Webhook(HTTP リクエスト)で Lambda を叩く

という構成を取る予定でした。
しかしWebhookリクエストを追加しようとしたところWebhookの項目が存在しないことに気付きました。
AIに「ここにあるはず」と言われた場所を探してみたものの、やはり見つからず。
参照情報が古そうだなと、公式ドキュメントを確認したところWebhookリクエストはすでに非推奨となっていました。
また、リマインド機能のために使う予定だった Slack の待機ステップを探してみたところ、こちらも項目がありませんでした。
ワークフロー構成を含めてAIの想定していた構成が現行仕様とは一致していないことがわかり、Slack → Lambda の連携をすべて見直すことにしました:cry:

当初やりたかった構成(AIの指示のもと)
  1. ワークフローでフォーム入力
    • 周知内容
    • リマインド時刻
    • 「手動実行」で起動する設計
  2. Webhookリクエストで Lambdaを呼ぶ
    • その前に「待機ステップ」を利用
      • 入力された「待機時間」だけワークフローが内部で待機
      • Slack側でリマインドタイミングを制御できる想定
    • 待機後、LambdaへHTTP POST
    • ボディに「周知内容」「リマインド時刻」「チャンネルID」「投稿URL」などを渡す
  3. Lambda → Slack API
    • Lambdaが受け取ったデータを解析
    • Slack APIを叩いて、該当チャンネルに「未リアクションユーザーへのメンション」を投稿

「フォーム → 待機ステップ → Webhook → Lambda → Slack」 という、流れを想定していました。

最終的に採用した構成(自分である程度設計)
  1. ワークフローでフォーム入力
    • 周知内容
    • リマインド時刻
    • 最大リマインド回数
      2.ワークフローがチャンネルに投稿を行う
    • 対象チャンネルへメッセージを投稿
    • その際にBotをスレッドでメンションして呼び出す
  2. Botメンションイベントを Slack Events APIで受信
    • LambdaへHTTP POST
    • ボディに「周知内容」「リマインド時刻」などを渡す
  3. Lambdaが受け取り、EventBridge Schedulerを作成
    • Lambda側で、ワークフローから送られた情報を解析
    • 指定時間後に自動的に Lambdaを再実行するスケジュールを登録
  4. 指定時間後に Scheduler → Lambda → Slack APIへ通知
    • Slack APIを叩いて、該当チャンネルに「未リアクションユーザーへのメンション」を投稿

「フォーム → Events API → Lambda → EventBridge Scheduler → Lambda → Slack」 という構成になりました。


:bulb: コード生成自体はAIが最高に便利だった

設計が固まったあとのコード生成は本当にスムーズでした。

  • リアクション取得コード
  • Slack APIとの通信処理
  • 未反応者の抽出
  • リマインド処理
  • スケジューラーの設定例

これらは AI がサクッと生成してくれるので、楽でした。 UIが絡まないあたりは結構任せられるっぽいなと感じました。


:robot: BotのアイコンもAIに作ってもらった

せっかくなので、Botのアイコン画像もAI画像生成に任せました。
絵心がない自分でも、それっぽいロゴがすぐ手に入り、AIに丸投げできるのは最高です。
プロダクトへの愛着も上がります。


:speech_balloon: リマインドメッセージをAIに生成させた

ここまでなんだかんだ時間がかかってしまい、簡単にAIに実装できたとは言えず、せっかくなのでもうちょっとAIに頼りたいと思い、リマインドメッセージをその都度AIに生成してもらうようにしました。(定型文の作成を依頼せず Gemini API 経由でメッセージを生成)

  • 毎回メッセージの文面が変わる
  • 連続で無視する人には、だんだん厳しい口調になる
  • 逆に、初回は優しくリマインド
  • テンションや文体もランダムで変化
  • たまに冗談を交える

こういう遊びが簡単に入れられるのはAIと動的コンテンツの相性の良さですね。実装もテストも楽しい:musical_note:


:tada: 完成したBot

  • チャンネルのメッセージを取得
  • スタンプ未反応者を抽出
  • AIでリマインドメッセージ生成
    • 毎回文面が異なる
  • BotのアイコンもAI作成
  • 指定された時間にリマインド
    • 初回リマインドから1時間に1回の最大3回

ゆくゆくはリマインド回数の指定や、期日で指定して逆算でリマインドできるなど、もう少し自由度をアップしたいです!

スクリーンショット 0007-11-27 23.50.28.png


:pushpin: まとめ: AIは【道具として最強】、でも【導くのは人間】

「まとめ: AIは【道具として最強】、でも【導くのは人間】」
お気付きかもしれませんが、この記事作成も AI に直してもらいつつ書いています。
強い表現は直しつつ書いているのですが、なんか大きなこと言ってて面白かったのでここだけ残してみました。

  • 正しい API の選定
  • 正しい設定手順の判断
  • 現時点での最新仕様の把握
  • UI系作業

このあたりは完全にAIを信頼するのはまだ怖いですね。
ざっくり理解してからドキュメントを参照するための補助くらいに考えておいた方が良さそうです。
とはいえ、仕様や前提を整理する段階でサポートしてもらえるのはかなり助かりました。複数の選択肢を出してもらったり、概念を噛み砕いて説明してもらったり、考えるための材料を揃えるという意味で頼りになりますね。

今後はもっとAIを使いこなして、よりスムーズに開発できるようになりたいと思います!

50
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
50
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?