🧠

Hackathonから実運用へ、Slack要約AIの開発journey

2024/09/27に公開

こんにちは、JAPAN AIマーケティングチームEMの東と申します。
今回は8月にJAPAN AI事業部で開催した1日AIハッカソンで作成した、Slackのスレッド要約botについて紹介します。

ハッカソンでは「自分たちの業務効率を向上させるAIツールの開発」を目標に、エンジニア/プロダクトマネージャー/CSなど合わせて30名程度が参加し、個人またはチームでAIアプリ開発に取り組みました。(時間も限られていたので、私はチームではなく個人で参加しました。)

実装したアプリの概要

今回は、Slackのスレッドの内容を要約してくれるbotを実装しました。長いスレッドの途中でメンションされることがよくあり、そこで話されている内容を把握するのに時間がかかるという課題を解決したいと考えていたため、この機会に自分で作ってみることにしました。

しかし、単純なAI要約や自然言語による検索機能は、(1ユーザーあたり¥1,200/月と少しお高めですが)Slack公式のAIアドオンとしてすでに提供されています。
https://slack.com/intl/ja-jp/features/ai

そこで、今回はその機能の一部を実装してみる+Slack AIアドオンだけでは実現できない外部との連携を行うアイディアを実装してみました。

  • スレッド要約機能:
    • ユーザーがbotをメンションすると、スレッド内の会話を分析して簡潔な要約を作成
    • 決定事項、アクションアイテムも一緒に作成
  • インシデント分析
    • サービスのインシデント報告チャンネルの内容を分析して、過去の類似事例や対処法の検索
    • Confluenceのページと連携し、過去事例をもとにネクストアクションを提案
  • GitHub連携
    • Slackのスレッド内で行われた仕様に関する議論など、PRに紐づけたい内容を要約
    • スレッド内から要約をそのまま対象のPRにコメント

アプリに対してメンションするだけで要約してくれます。(実際には、複数のアカウントによる会話を想定しています)

使用技術とアーキテクチャ

技術スタックの概要

  • Slack Bot:TypeScript, Bolt for JavaScript
  • AIワークフロー:Dify
  • 連携先: Confluence, GitHub

今回は要約の肝となる部分のロジックをDifyを使って実装しました。

https://docs.dify.ai/

DifyはオープンソースのAIアプリ開発プラットフォームです。Backend as a ServiceとLLMOpsの理念を融合し、開発者が迅速にAIアプリケーションを構築できるようにします。

条件分岐や繰り返し、LLMを含む外部ツールとの連携を含む一連のワークフローをGUIベースで組むことができるため、プロンプトチューニングを含むあらかたのロジックをノーコードで素早く実装することができました。

処理のフロー

  • Slackのスレッド内でbotがメンションされると、イベントリスナー(Slack Bot)が起動
  • スレッドの内容を取得し、Difyに送信
  • Difyで設定したワークフローに基づいて要約を生成
  • 生成された要約を元のスレッドに返信

Difyワークフロー

このワークフローでは、単純な要約のフローに加えて、インシテント分析のために過去のデータを模したknowledgeを処理のフローに挟んだり(RAG連携みたいな感じ)、コンテクストに合わせてプロンプトを使い分けるようなロジックまで実現しています。

プロンプト設計

要約のベースとなるプロンプトは業務で使うことを意識して結論やアクションまで出してもらう点を意識しました。

const threadSummaryPrompt = (messages: string, additionalPrompt: string) => `
こちらはSlackのスレッド内で行われた会話です。以下の点に注意して要約を行ってください。

1. 会話全体をよく読んでください
2. 議論された主なトピックを特定し、重要な決定や結論があればメモする。重要な期限や日付があれば共に言及する
3. チームメンバーに割り当てられたアクションアイテムやタスクを強調する
4. 未解決の問題があれば記録する

${additionalPrompt
    ? `また、会話の前提および注意点として、以下の内容も考慮してください。
    ${additionalPrompt}`
    : ''
}
<message>
${messages}
</message>
`

これに加えて、インシデント分析やGitHub連携ではそれぞれのユースケースに合わせてコンテクストを補完するプロンプトを用意しました。

実装過程

今回のハッカソンでは実装時間は実質1日も無かったのですが、コード生成をはじめとして、いたるところでAIツールを利用してやりたいことを爆速で実装できました。

  • Slack Botをcursorで0から実装
  • 実装に用いるプロンプト案をAnthropic Workbenchのプロンプト作成機能で生成、デバッグ
  • 仕様のアイディアやSlackアプリに載せる説明文をChat GPTで生成
  • Slackアプリのアイコン画像作成

作成したアプリ

Summary(要約)と「さんま」をかけてSummabotという名前にしました。「足が早い秋刀魚 => 情報も鮮度が命」というChatGPTのセンスをそのまま利用しています。

運用と今後の改善

ハッカソンから1ヶ月以上経ってしまいましたが、インフラチームが準備してくれた社内のOpenStack環境上でホスティングできることになり、実際に社内の皆さんに(来週から)使ってもらえるようになりました。

実際の運用にあたって、Difyで実装していたロジックはTypeScriptに移植しました(DifyのDSLをcursorに読み込ませてほぼ一発)。やはり、ロジックが複雑になるとGUIベースのツールでは管理が難しくなります。また、機能についてもスレッド要約以外のインシデント分析やPRコメントについては精度が出なかったので一旦外し、代わりにチャンネル分析の機能をつけて初期リリースをしています。

今後のロードマップ

  • 要約機能の強化:
    • 目的に合わせた要約機能の提供
    • 外部データとの連携やデータセットの作成
  • ユーザビリティ改善:
    • 複数チャンネルにまたがる情報の連携
    • インタラクティブな要約オプションの追加

まとめ

今回のハッカソンは、業務改善アプリを作ることができただけでなく、我々が提供しているJAPAN AIというサービスのための新たなアイディアを試してみる良い時間にもなりました。
開発したSlack要約botについては、使えそうという評価をいただいたので、サービスとして提供できるレベルに育てていきたいと考えています。

ハッカソン全体のレポートは、Genieeの公式ブログでもご覧いただけます。他のチームが実装した面白いアイデアも紹介されていますので、ぜひそちらもご覧ください。
https://note.com/geniee_inc/n/na299c3e9aad4

GENIEE TechBlog

Discussion