5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Findy「開発組織のぷち改善ハッカソン」で Slack匿名お悩みBot を作った話 〜AI × Slack × Playwright で心理的安全性をちょっとだけ上げる〜

Last updated at Posted at 2025-12-12

この記事は NRI Organization Qiita Advent Calendar 2025 の 13日目の記事です。

表題の通り、Findy社が主催する開発組織のぷち改善ハッカソン」で開発してきました。
普段は受託開発の現場で業務システムを作っているのですが、
業務に直結する“ぷち改善”を、AIを使って一日で作る」というコンセプトに惹かれて参加しました。

ハッカソンの1日で、

  • Slackの /onayami コマンドから
  • 匿名のお悩みを受け取り
  • peing風のカード画像に変換してチャンネルに投稿し
  • さらに GPT で「💡要約 / 🔖タグ / 🔍keywords」を自動生成・保存し
  • /onayami-toukei コマンドでワードクラウドにして可視化する

というところまで実装したので、
この記事ではその内容をまとめてみます。

🧠 解決したかった「ぷち課題」

今回のテーマは「開発組織のぷち改善」。
自分の現場を振り返ると、こんな悩みが思い当たりました。

  • 「こんなこと聞いていいのかな…?」と質問しづらい空気
  • 初歩的な質問をするときに、チャンネルで名指しになる心理的ハードル
  • 他の人も同じことで困っているのに、ナレッジが散らばっていく

そこで、「質問のハードルを下げる匿名質問箱が、Slack だけで完結したらいいのでは?」と考えて作ったのが

Slack お悩み投稿くん(匿名お悩み質問ボット)

です。

単に匿名で投げるだけではなく、

  • GPTで 要約 / タグ / keywords を自動生成
  • 質問をカード画像化してタイムラインでも目に留まりやすく
  • タグを集計して ワードクラウドで可視化

することで、

「開発組織の悩みの傾向がなんとなく見えるようになる」

ところまでを 1day ハッカソンのゴールに置きました。

🛠️ 作ったものの概要

GitHub: (ハッカソン用リポジトリ / Private)
FindyHackathon2025/PythonBotSample

機能一覧

  • /onayami <本文>

    • 投稿されたお悩みを HTML テンプレートに流し込み
    • Playwright でスクリーンショット → 画像化
    • peing風カードとして Slack の別チャンネルに投稿
    • 同時に GPT で要約・タグ・keywords を生成
      • カードのバッジ表示
      • Slackコメントへの追記
      • (任意)PostgreSQL に保存
  • /onayami-toukei

    • 過去のお悩みから AIタグを集計
    • matplotlib + wordcloud + japanize-matplotlib で日本語ワードクラウド画像を生成
    • Slack に投稿
  • /onayami-help

    • 使い方のヘルプを表示

ざっくりアーキテクチャ

  • 言語: Python
  • Slack: Bolt + Socket Mode
  • 画像生成: Playwright (Chromium)
  • AI: OpenAI API (GPT, tags/summary/keywords 用)
  • DB(任意): PostgreSQL
  • 可視化: matplotlib + wordcloud + 日本語フォント(Noto)
  • デプロイ前提: Docker(Playwright入りカスタムイメージ)

🏗️ 技術構成とディレクトリ

リポジトリの構成はざっくりこんな感じです。

PythonBotSample/
├── Dockerfile                  # Playwright + 日本語フォント入り
├── requirements.txt            # Slack SDK / Playwright / psycopg / openai / matplotlib / wordcloud ...
├── src/
│   ├── __init__.py
│   ├── bots/
│   │   └── slack_anonymous_question_box.py   # ボット本体
│   └── services/
│       └── ai_tag_generator.py               # GPT 連携ヘルパー
├── docs/
│   ├── README_QUESTION_BOX.md                # 詳細仕様
│   └── README_HTML_FORWARDER.md
├── assets/
│   └── templates/
│       └── gazou.html                        # peing風カードの HTML テンプレ
├── .dockerignore
├── .gitignore
└── README.md

ボット本体の流れ(slack_anonymous_question_box.py

ボット本体では、1つのスラッシュコマンドから以下の処理を一気に回しています。

  1. Slackイベント(スラッシュコマンド)受信
  2. 入力テキストのバリデーション
  3. HTMLテンプレートへの埋め込み
  4. Playwrightで描画 & スクリーンショット取得
  5. OpenAIで要約・タグ・キーワード生成
  6. Slackへの画像アップロード + コメント
  7. (あれば)DBへ保存

⚙️ セットアップ手順(ローカル)

ハッカソン中は、まずローカルで動くところまで一気に持っていきました。

リポジトリ取得 & 仮想環境セットアップ

git clone https://github.com/FindyHackathon2025/PythonBotSample.git
cd PythonBotSample

python3 -m venv .venv
source .venv/bin/activate

pip install -r requirements.txt
playwright install chromium

🎨 カード画像生成のしくみ

なぜ Playwright を選んだか

HTML → 画像化の方法はいろいろ候補がありましたが、以下の理由から Playwright を採用しました。

  • ブラウザとほぼ同じレンダリング結果がほしい
  • CSS で細かくデザイン調整できる
  • 将来的に UI をリッチにしたい

処理の流れ

カード画像生成の処理フローはシンプルで、次の 3 ステップです。

  1. gazou.html に質問文とメタ情報を流し込む
  2. headless Chromium で指定サイズでレンダリング
  3. page.screenshot() で PNG 出力

ハマりポイント: フォント & 日本語

ハッカソン時間内にわりとハマったのが、日本語フォント問題 でした。

発生した問題

  • コンテナ内で日本語が「□」になる
  • ワードクラウドでも日本語が化ける

対処したこと

  • Dockerfile に Noto Sans CJK 系フォント をインストール
  • matplotlib のデフォルトフォントを Noto 系に変更

この対応により、Slack 上でも 日本語が正しく表示されたカード画像・ワードクラウド を生成できました。


🤖 GPT でつける「要約 / タグ / keywords」

質問文そのものをカードに載せるだけでなく、GPT に以下のメタ情報を生成させています。

  • 💡 要約: 1〜2行で悩みの本質をまとめる
  • 🔖 タグ: #オンボーディング #レビュー #チームコミュニケーション のような分類
  • 🔍 keywords: 後で検索しやすい単語群

これによって、

  • カードを見るだけで「何の話か」が一目でわかる
  • 組織内の “悩みの傾向” を後から分析しやすい

というメリットが生まれます。

プロンプト設計で意識したこと

  • タグの粒度が細かくなりすぎないようにする
  • 英単語が混ざりがちなところを、日本語寄りに抑える

このあたりを調整することで、「後から見返したときに意味のあるタグ/keywords」になるよう意識しました。


📊 /onayami-toukei とワードクラウド

「せっかくタグをつけているなら、可視化もしたいよね」ということで /onayami-toukei を用意しました。

動作イメージ

PostgreSQL がある場合

  • anonymous_questions テーブルから ai_tags を集計

DB がない場合

  1. Slack の TARGET_CHANNEL_ID の履歴を取得
  2. メッセージ本文から 🔖 #タグ 行をパースして集計

その上で、集計結果を wordcloud に流し込み、生成された画像を Slack にアップロードします。

これにより、たとえば:

  • 「最近はオンボーディング関連の悩みが多いな」
  • 「レビュー / フィードバック系のタグが増えてきたな」

といった気付きが、ミーティングで共有できる1枚絵として扱えるようになります。


🧪 ハッカソン当日の進め方

1日の流れは、ざっくり次のようなタイムラインでした。

10:00〜

  • チーム自己紹介 & 役割分担
  • テーマ決め(「匿名お悩み × AIタグ × 可視化」で即決)

午前

  • Slack Bot のスケルトン作成
  • /onayami コマンドのイベント受け取り〜スタブ実装

昼〜午後前半

  • Playwright でカード画像の最低限の見た目を作る
  • OpenAI 連携で、要約 / タグ / keywords を返すところまで接続

午後後半

  • ワードクラウド機能 /onayami-toukei 実装
  • Docker 対応 & Playwright の依存解消

夕方

  • デモ用シナリオ準備
  • 発表スライド作成 & リハーサル

✅ やって良かったこと

1. 「MVP の線引き」を最初に決めた

  • 最低限 「カード画像 + GPTタグ」 が動けば OK、という基準を先に固定
  • 余った時間で統計・ワードクラウドを追加する方針にした

結果として、**「動かない高機能」より「動くシンプル版」**を優先できたのが大きかったです。

2. DBなし運用も考えた設計にした

  • 本番環境に DB が置けないケースも想定
  • Slack履歴からタグを集計できるようにしておいた

これにより、「とりあえず Slack さえあれば試せる」構成になりました。

🧩 困ったところ & 解決

1. Playwright の依存とフォント問題

困った点

  • playwright install --with-deps が必要
  • Docker イメージに日本語フォントが無い
  • ローカルと Docker で見た目がズレる

対処

  • Playwright公式イメージベースの Dockerfile に寄せる
  • fonts-noto-cjk 系のフォントをインストール
  • 開発中はローカル + Docker 両方でスクショ確認

2. Slack の権限まわり

最低限必要な scope

  • commands
  • chat:write
  • files:write

あると便利 / 機能によって必要な scope

  • 統計機能や HTML フォワーダー系では channels:history も必要

ハッカソン中は、

「この機能を実現するために、その権限が本当に必要か?」

を都度見直し、scope を増やしすぎないように注意していました。

👀 ハッカソンを通じて得た学び

✅ 「ちっちゃなカイゼン」でも、ちゃんと価値は出る

今回のプロダクトは、壮大な新規サービスではなく、

  • 匿名質問
  • 心理的安全性
  • ナレッジの見える化

といった “日々のモヤモヤ” に寄り添うツールでしたが、
メンターの方々からも 「自分のチームでも欲しい」 というコメントを頂けて、
「ぷち改善」でも十分に価値があると実感しました。

✅ AI は “自動分類・要約” と相性が良い

GPT は回答生成だけでなく、

  • タグ付け
  • サマリ生成
  • 検索用キーワード抽出

のような 「後から効いてくるメタ情報」 の生成にも向いていると分かりました。
こういった箇所に組み込むと、業務との相性がかなり良さそうです。

✅ Playwright × Docker の知見は業務にも持ち帰れる

  • HTMLテンプレ → 画像化
  • 日本語フォント問題
  • headlessブラウザの依存管理

このあたりの知見は、レポート生成や PDF / 画像出力系の業務にも直結するため、
現場にもそのままフィードバックできそうです。


🎁 まとめ

Findy の「開発組織のぷち改善ハッカソン」で、

  • Slack × GPT × Playwright × WordCloud

という構成で、

開発組織の “お悩み” をちょっとだけ可視化するボット

を 1日で作った話をまとめました。

今後は、

  • 実際の現場の Slack に導入してみる
  • タグや悩みの傾向を定期レポート化する
  • 他ツール(Jira や Confluence など)との連携

なども試してみたいと思っています。

どこかのチームで、

「匿名で質問しやすい環境を作りたい」
「悩みの傾向を可視化したい」

という方の参考になればうれしいです 🙌

質問や、「うちのチームにも欲しい」などあれば、
コメントや X などでぜひ教えてください!

5
0
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
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?