見出し画像

社内AIハッカソンで知見マッチングbotを作ってみたお話

はじめに

こんにちは! hanachanm です。
くふうAIスタジオのサーバーサイドエンジニアとして、トクバイ の開発を行っています。

先日くふうカンパニーのグループ合同で行われた「AIハッカソン」に参加してきました。
今回は、私たちのチームが作成した「知見マッチングbot」について紹介したいと思います。

知見マッチングbotとは

「〇〇の知見を持っている人が知りたい!」そんなとき、社内で運用されているNotion記事や過去のSlack投稿を元に、適切な専門家や知識を持つ人物を教えてくれるbotです。
今回はSlack botとして作成しました。困っている内容をbotにメンションして送ることで、候補となる人物の情報と間を取り持つためのメッセージを提供します。

サーバーサイドエンジニア4人が集まったチームだったのですが、業務を進めていてぶち当たる
「知見を借りたいけど、誰に聞くんがええんやろ?」
「この技術他のサービスでも使ってるって聞いたんやけど、誰が詳しいんかわからんなぁ。。」
という点を解消したいという思いで作成を決めました。

こういった知見を探してくるbotは他のチームでもテーマとして取り上げられていましたが、私たちは「人を探す」という点に着目し、社内のコラボレーションの活性化をサブテーマにしました。

技術的な構成

今回は以下のような構成で作成しました。
※ Slack、Notionの会話ログのデータは膨大な量になってしまうため、特定のチャンネル・特定の記事に絞ることで負荷を軽減させ、まずは動くところを目指した内容となっています。
※ 会話ログを都度OpenAI APIリクエストに含む場合、トークン数が増えるので利用料金には要注意です

構成

Slack

リクエストを受け付け、結果をユーザーに通知するためのプラットフォーム

アプリケーション

データの収集、プロンプト生成、及び結果の返送を行う中心的な処理

  • データ収集: Slackの過去の会話やユーザー情報、Notionの記事を取得

  • プロンプト生成: 収集したデータとリクエストされた内容を合わせ、OpenAIに投げるプロンプトを作成

  • OpenAI API: リクエストに対して、候補となる人物の特定と返信内容の提案

  • 結果処理: 返信内容のうち、ユーザー名に当たる部分をSlackのユーザー情報とあわせてユーザーに通知

  • Glitchを利用して構成

具体的な実装の紹介

より具体的にどういったことを行っているのか、一部の実装とあわせて紹介したいと思います。

Slackの設定

まずはSlack上でbotを動かすために、Slack APIを設定しました。
具体的には、botユーザーを作成し、必要なスコープや権限を設定します。これにより以下のことが可能になります。

  • Slackのチャンネル内でメンションを受け取る

  • メッセージを送信する

  • 特定のチャンネルの過去の会話を取得する

  • ユーザー一覧の情報を取得する

Slackから過去の会話を取ってくる処理

次に、SlackのAPIを利用して、特定のチャンネルと期間のメッセージを取得します。
このデータが、ユーザーの質問に対応する際の参考情報になります。

サンプルコード

const { App } = require("@slack/bolt");
const app = new App({
  signingSecret: process.env.SLACK_SIGNING_SECRET,
  token: process.env.SLACK_BOT_TOKEN,
});

// チャンネルの過去の会話を取得する非同期関数
const fetchConversationsHistory = async (channelId, oldest) {
  try {
    // 過去の会話を取得するため、conversations.history APIを叩きます
    const result = await app.client.conversations.history({
      token: process.env.SLACK_BOT_TOKEN,
      channel: channelId,
      oldest: oldest
    });

    // 過去の会話からユーザーIDとメッセージ内容を抜き出します
    const formattedMessages = result.messages.map(({ user, text }) => ({
      user_id: user,
      message: text
    }));

    return formattedMessages;
  } catch (error) {
    console.error(error);
  }
}

プロンプトの生成

SlackやNotionから収集したデータを元に、OpenAIに投げるプロンプトを生成します。これには、ユーザーからの質問やどういった返信をして欲しいかの命令も含みます。
※会話ログを都度OpenAI APIリクエストに含む場合、トークン数が増えるので利用料金には要注意です

プロンプト例

    「過去の会話データ」
    これらの情報をもとに次のテキストに対して回答をしてください。名前部分はID+「さん」をつけて返してください。メッセージ送信者に対して回答をしてあげてください。
    あなたの名前は「知見マッチングねこ」です。
    最初は時間に合った挨拶をしてください。
    具体的な議論や会話情報を基に適切な専門家や知識を持つ人物を紹介し、対象者が見つかる場合はその人物の情報と、質問者と候補者の間を取り持つメッセージ例を2行程度で提供します。
    提案は明確な根拠に基づき、具体的な会話内容から適切な候補者を選定します。
    適切な人物が見つからない場合は1行でその旨を伝えます。
    候補者は実データに沿った人の中から選択してください。架空の人物を紹介しないでください。
    ```

返信内容を整頓

OpenAIから返ってきた回答を整理します。
会話ログとしてユーザーIDを利用しているので、Slackでユーザーに通知する前にユーザーIDをユーザー名に変換する処理を挟みます。

このようにして、以下のようなやりとりができるようになりました。

会話

人と人をマッチングさせるという観点で、詳しい人が誰かわかったとして、声かけるという点でもハードルがあるよねという話になりました。
そこで、こんなふうに話しかけてみては?という内容もbotに提案させるように組み込んでいます。

今後の展望

限られた情報の中からいい感じに知見マッチングをしてくれることはあるものの、botを運用していくためにはまだまだ課題があると考えています。
特に、社内にある大量の情報全てを読み込むことはできておらず、SlackやNotionから収集したデータを都度リクエストに含んでしまっている点は改善が必要です。

今回は時間の関係上行えませんでしたが、以下のような点も改善できると考えています。

  • 収集したデータについては埋め込み処理(AIが処理しやすい数値ベクトル表現への変換)を行い、より回答の精度が上げられないかの検証

  • botの回答内容が不安定(良い時悪い時がある)なので、安定するようなプロンプトへの調整

  • GitHubとの連携

  • 回答が安定してきたら、botから直接、有識者の候補にメンションを飛ばして橋渡しを行う

また、社内Slackには雑談をしているチャンネルもあることから、
「犬好きな人だれかいる?」や「モニター買いたいんだけど詳しそうな人いる?」
といった趣味のテーマでもbotは候補者を見つけてくれ、社内コミュニケーションの活性化につながる可能性を感じました。

まとめ

AIハッカソンに参加したことで、AI技術がもたらす可能性を改めて感じることができました。
何といってもチームメンバーでああだこうだ言いながら開発を進めている時間はとても楽しかったです。
業務改善といった視点でも、AI技術を取り入れていろいろ作ってみたいな!と思うきっかけとなりました。

くふうAIスタジオでは、採用活動を行っています。

当社は「AX で 暮らしに ひらめきを」をビジョンに、2023年7月に設立されました。
(AX=AI eXperience(UI/UX における AI/AX)とAI Transformation(DX におけるAX)の意味を持つ当社が唱えた造語)
くふうカンパニーグループのサービスの企画開発運用を主な事業とし、非エンジニアさえも当たり前にAIを使いこなせるよう、積極的なAI利活用を推進しています。
(サービスの一例:累計DL数1,000万以上の家計簿アプリ「Zaim」、月間利用者数1,600万人のチラシアプリ「トクバイ」等)
AXを活用した未来を一緒に作っていく仲間を募集中です。
ご興味がございましたら、以下からカジュアル面談のお申込みやご応募等お気軽にお問合せください。


この記事が気に入ったらサポートをしてみませんか?