😄

第4回 Slackから生成AIを呌び出せるようにする

に公開

本゚ントリはUbie 生成AI Advent Calendar 2024の12日目、「瀟内甚生成AI Webアプリケヌションをどのように䜜っおいるか」の第4回です。

前回は、第3回 生成AIのモデルず倖郚デヌタを連携可胜にするに぀いお説明したした。今回は、Slackから生成AIを呌び出す方法に぀いお解説したす。

生成AIをSlackから呌び出したくなる

第1、2、3回では、生成AIを利甚できるWebアプリケヌションに぀いお説明したした。生成AIを利甚できるWebアプリケヌションの機胜が充実するのは良いこずですが、䞀方で、なにかをやる時にWebペヌゞを毎回開かなければならないのはやや面倒でもありたす。瀟内のナヌザが垞に滞圚しおいるSlackなどのコラボレヌションツヌルから生成AIを利甚できるず䟿利そうです。

Slack botを䜜る

なにはなくずも、ずりあえずSlackから利甚できるbotを䜜る必芁がありたす。ただこの蟺りは単玔にSlack botを䜜るだけの話なので、倧幅に割愛したす。公匏のドキュメントを読むのがよいでしょう。

https://tools.slack.dev/bolt-js/ja-jp/getting-started/

Dev Genius[1]は、@slack/boltを利甚しお、Socket ModeでSlackに接続しおいたす。 SlackからのむベントをWebhookで受け取るこずもできたすが、Dev Geniusは瀟内限定のアプリケヌションのため、倖郚からのアクセスを制限しおいたす。この制限をWebhookで通過させるこずは煩雑になるため、Socket Modeを採甚しおいたす。

珟圚はSlackの次のむベントを受け取るようにしおいたす。

  • app_mention メンションされたずき
  • reaction_added リアクションが远加されたずき

実装のむメヌゞは以䞋の通りです。

import { App } from "@slack/bolt";
const app = new App({
  token: process.env.SLACK_BOT_TOKEN,
  appToken: process.env.SLACK_APP_TOKEN,
  socketMode: true,
});

app.event("app_mention", async ({ event, client }) => {
  // 凊理
});

app.event("reaction_added", async ({ event, client }) => {
  // 凊理
});

メンションに察しお返信する

たずはメンションに察しお返信するこずを考えおみたす。いく぀かのアプロヌチがあるかず思いたすが、Dev Geniusではメンションに察しおスレッドを䜜成し、その䞭で返信するようにしおいたす。こうするこずで、スレッド党䜓をスコヌプずした䌚話が可胜になりたす。スレッド内でのメンションであれば、そのたたスレッド内で返信を行いたす。

app.event("app_mention", async ({ event, client }) => {
    // スレッド党䜓を読み蟌む
    const messages = await getRawMessages(event.channel, event.ts);
    // いろんな凊理を経お...
    const response = // 生成AIのレスポンス

    // スレッドに返信する
    await app.client.chat.postMessage({
        channel: event.channel,
        text: `<@${event.user}> ${response}`,
        thread_ts: event.ts,
    });
});

export type Message = {
  user?: string;
  text?: string;
};

// スレッド党䜓を読み蟌む
export const getRawMessages = async (
  channelId: string,
  messageId: string,
): Promise<Message[] | null> => {
  const messageList: Message[] = [];
  let hasMore = false;
  let cursor = undefined;
  do {
    try {
      const replies = await app.client.conversations.replies({
        channel: channelId,
        ts: messageId,
        cursor: cursor,
      });
      if (replies == null) {
        return null;
      }
      if (replies.messages != null) {
        replies.messages.forEach((message) => {
          if (message.text != null) {
            const attachmentsText =
              message.attachments
                ?.map((attachment) => attachment.text ?? attachment.fallback)
                .filter((text) => text != null)
                .map((text) =>
                  text
                    .split("\n")
                    .map((line) => `> ${line}`)
                    .join("\n"),
                )
                .join("\n") ?? "";

            messageList.push({
              ...message,
              text: attachmentsText
                ? `${message.text}\n${attachmentsText}`
                : message.text,
            });
          }
        });
      }
      hasMore = replies.has_more ?? false;
      cursor = replies.response_metadata?.next_cursor;
    } catch (error) {
      console.error("Error fetching raw messages:", error);
      return null;
    }
  } while (hasMore);

  return messageList;
};

デプロむしお動かせば、晎れおSlack䞊で生成AIを利甚できたす。


デフォルトではgemini-1.5-pro-001を甚いお返信したす

Slack䞊からプリセットを䜿う

Slack䞊から生成AIを利甚できるだけでもそれなりに䟿利です。しかし、Webアプリケヌション版の既存のアセットであるプリセット[2]を利甚できるず、曎に䟿利になりそうです。

Dev Geniusでは、特定の蚘法を甚いるこずで、Slack䞊からプリセットを呌び出せるようにしおいたす。メンション䞭に [preset=:id] を含めるず、察応したプリセットを探し、システムプロンプトやモデル、temperatureを利甚しお返信を䜜成したす。


ここでは割愛したすが、プリセットにはURL埋め蟌みの蚭定ができ、notionなどの動的な情報゜ヌスを展開しお利甚する機胜などもありたす

蚘法は単なる内郚的な仕様なので、凊理方法等は特に説明したせん。正芏衚珟でidを取り出しお探す、ずいったシンプルな実装です。

リアクションによるプリセットの呌び出しをサポヌトする

Slackからプリセットを䜿っお呌び出せるのは䟿利ですが、特別な蚘法を䜿うのはかなりハヌドルが高いです。入力した文章・文脈から自動的に利甚すべきプリセットを遞定できればよいですが、それはそれでかなり難しいでしょう。

そこで、リアクションによるプリセットの呌び出しをサポヌトしたした。メッセヌゞにリアクションを぀けるず、そのメッセヌゞに察しおプリセットを呌び出すようにしたした。このアむデアず実装は同僚の@syu_creamによるものです。

プリセットの線集画面でSlackリアクションの割り圓おを蚭定できるようにしおいたす。

これにより、Slack䞊でリアクションをするず、反応しおくれるようになりたした。


めちゃくちゃしょうもない励たしをしおくれるプリセット。瀟内でも人気です

組織で自由に拡匵が可胜であるこずの䟡倀

リアクションによるプリセットの呌び出しをサポヌトするず、早速䟿利な蚭定が远加されおいきたした。個人的に気に入っおいる機胜をふた぀ほど玹介したす。

次の䟋は、瀟内のPBI(プロダクトバックログアむテム)の曞き方に沿っお、PBI案を䜜成しおくれるプリセットです。Slackで流れる芁望や課題にリアクションを぀けるだけでたたき台がサッず䜜れたす。タむトルだけの䞭身なしPBIの撲滅に圹立぀のではず思っおいたす。

内容をそのたたで䜿えるわけではないが、たたき台ずしおはかなり圹立぀

たた、次のように、Github URLを含んだメッセヌゞにリアクションするこずで、内容を説明しおくれたす。これは第3回 生成AIのモデルず倖郚デヌタを連携可胜にするずも耇合したプリセットです。

こうした動きを受けお、あれもリアクション化しお䜿えるのではないか、ずいった䌚話が各所で発生しおおり、組織で自由に拡匵できる仕組みの䟡倀を実感しおいたす。瀟内の様々なニヌズに応じお、チヌム独自のプリセットを䜜成し、Slackリアクションず組み合わせるこずで、日々の業務に圹立぀ものを自埋的に䜜れるようになりたした。

たずめ

Slackから生成AIを呌び出す方法に぀いお玹介したした。どちらかずいうず、どのように呌び出しおいるか、ずいうほうが正確なニュアンスかもしれたせん。Slack botずしお単独で呌び出せるだけではやや物足りないずころですが、プリセットや倖郚情報ずの連携ができるこずで、Slackから利甚できる䟡倀が高たっおいるず感じおいたす。

脚泚
  1. Ubieの瀟内で内補しおいる生成AI Webアプリケヌションです。普段はdev爺ず呌ばれおいたす。 ↩

  2. プリセットに぀いおは第2回 プロンプトを再利甚する、プリセットストアず共有機胜を参照しおください。 ↩

Ubie テックブログ

Discussion