この記事は NRI Organization Qiita Advent Calendar 2025 の 13日目の記事です。
表題の通り、Findy社が主催する開発組織のぷち改善ハッカソン」で開発してきました。
普段は受託開発の現場で業務システムを作っているのですが、
「業務に直結する“ぷち改善”を、AIを使って一日で作る」というコンセプトに惹かれて参加しました。
ハッカソンの1日で、
- Slackの
/onayamiコマンドから - 匿名のお悩みを受け取り
- peing風のカード画像に変換してチャンネルに投稿し
- さらに GPT で「💡要約 / 🔖タグ / 🔍keywords」を自動生成・保存し
-
/onayami-toukeiコマンドでワードクラウドにして可視化する
というところまで実装したので、
この記事ではその内容をまとめてみます。
- イベント: 開発組織のぷち改善ハッカソン! ~AI使ってちっちゃなカイゼンにとりくもう~(主催: ファインディ株式会社)
- 開催日: 2025/11/08(土)
🧠 解決したかった「ぷち課題」
今回のテーマは「開発組織のぷち改善」。
自分の現場を振り返ると、こんな悩みが思い当たりました。
- 「こんなこと聞いていいのかな…?」と質問しづらい空気
- 初歩的な質問をするときに、チャンネルで名指しになる心理的ハードル
- 他の人も同じことで困っているのに、ナレッジが散らばっていく
そこで、「質問のハードルを下げる匿名質問箱が、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つのスラッシュコマンドから以下の処理を一気に回しています。
- Slackイベント(スラッシュコマンド)受信
- 入力テキストのバリデーション
- HTMLテンプレートへの埋め込み
- Playwrightで描画 & スクリーンショット取得
- OpenAIで要約・タグ・キーワード生成
- Slackへの画像アップロード + コメント
- (あれば)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 ステップです。
-
gazou.htmlに質問文とメタ情報を流し込む - headless Chromium で指定サイズでレンダリング
-
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 がない場合
- Slack の
TARGET_CHANNEL_IDの履歴を取得 - メッセージ本文から
🔖 #タグ行をパースして集計
その上で、集計結果を 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
commandschat:writefiles:write
あると便利 / 機能によって必要な scope
- 統計機能や HTML フォワーダー系では
channels:historyも必要
ハッカソン中は、
「この機能を実現するために、その権限が本当に必要か?」
を都度見直し、scope を増やしすぎないように注意していました。
👀 ハッカソンを通じて得た学び
✅ 「ちっちゃなカイゼン」でも、ちゃんと価値は出る
今回のプロダクトは、壮大な新規サービスではなく、
- 匿名質問
- 心理的安全性
- ナレッジの見える化
といった “日々のモヤモヤ” に寄り添うツールでしたが、
メンターの方々からも 「自分のチームでも欲しい」 というコメントを頂けて、
「ぷち改善」でも十分に価値があると実感しました。
✅ AI は “自動分類・要約” と相性が良い
GPT は回答生成だけでなく、
- タグ付け
- サマリ生成
- 検索用キーワード抽出
のような 「後から効いてくるメタ情報」 の生成にも向いていると分かりました。
こういった箇所に組み込むと、業務との相性がかなり良さそうです。
✅ Playwright × Docker の知見は業務にも持ち帰れる
- HTMLテンプレ → 画像化
- 日本語フォント問題
- headlessブラウザの依存管理
このあたりの知見は、レポート生成や PDF / 画像出力系の業務にも直結するため、
現場にもそのままフィードバックできそうです。
🎁 まとめ
Findy の「開発組織のぷち改善ハッカソン」で、
- Slack × GPT × Playwright × WordCloud
という構成で、
開発組織の “お悩み” をちょっとだけ可視化するボット
を 1日で作った話をまとめました。
今後は、
- 実際の現場の Slack に導入してみる
- タグや悩みの傾向を定期レポート化する
- 他ツール(Jira や Confluence など)との連携
なども試してみたいと思っています。
どこかのチームで、
「匿名で質問しやすい環境を作りたい」
「悩みの傾向を可視化したい」
という方の参考になればうれしいです 🙌
質問や、「うちのチームにも欲しい」などあれば、
コメントや X などでぜひ教えてください!