注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

リスナーを使用して AI 搭載の Slack ボットを作成する

Foundry のイベントリスナーを使用すると、Foundry の外部にあるチャットワークスペースとやり取りできる AI 搭載のボットを作成できます。このガイドでは Slack を使用した例を紹介しますが、同様の方法で Microsoft Teams(Microsoft Bot Framework 経由)などのほかのプラットフォームにも接続できます。

概要

このチュートリアルでは、Slack ユーザーがテニスについて詳しく知るための AI アシスタント「Tennis Bot」を作成します。

この Slack ボットの例は、次のコンポーネントで構成されます。

ステップ1:Slack リスナーをセットアップする

最初のステップでは、Slack アプリを作成して Slack ワークスペースにインストールし、リスナーを使用してチャットイベントの取り込みを開始します。Slack リスナーのセットアップガイドに沿って、Slack リスナーを作成します。

ユーザーは Tennis Bot にダイレクトメッセージで質問するため、Slack アプリに関連するスコープ、イベント、設定を追加する必要があります。Slack アプリの設定の詳細については、Slack の公式ドキュメント ↗を参照してください。

アプリに im:history と chat:write のスコープを追加します。

Slack アプリの OAuth スコープの設定。

さらに、アプリで message.im イベントを購読します。

Slack Events API の設定。

ユーザーがボットにダイレクトメッセージを送信できるようにする必要もあります。この設定は、Slack アプリの設定の機能 > アプリホームにあります。

Slack でボットへのダイレクトメッセージを有効にする

リスナーを設定したら、リスナーのセットアップウィザードのテストタブで、リスナーが正しく設定されていることを確認できます。

Data Connection の Slack リスナーのテストパネルに表示されたイベント。

ステップ2:Slack ソースをセットアップする

次に、チャットプラットフォームに書き戻すための資格情報を指定して、新しい Slack ソースを作成する必要があります。

Slack アプリをワークスペースにインストールした後、インストール済みアプリの設定で、ソースの設定に使用する Bearer トークンを確認できます。

ソースの認証に使用する Slack アプリの Bearer トークン。

接続設定に移動して、ソースのエクスポートとコードリポジトリへのインポートを有効にする必要があります。

ソースのエクスポートを有効にする。

ソースのコードリポジトリへのインポートを有効にする。

さらに、コードからソースを参照できるように、ソースのAPI名を設定する必要があります。API名の設定は、接続設定 > コードインポート設定にあります。

ステップ3:AIP Chatbot をセットアップする

このステップでは、AIP Chatbot(旧称 Agent Studio)で新しいチャットボットを作成します。チャットボットの指示と検索コンテキストを設定する必要があります。

チャットボットの指示を指定する

テニス情報ボットとして応答する方法をチャットボットに教えるには、タスクに特化した指示をチャットボットに入力します。プロンプトの例を以下に示します。

You are an assistant for answering questions about tennis.

If a query is not related to tennis, you should respond politely and explain that your purpose is only for answering questions about tennis, and suggestion some possible topics the user may like to ask about related to tennis.

Keep your responses concise and friendly.

検索コンテキストを指定する

チャットボットにテニスに関する情報源を与えるには、テニスのルールを記載した PDF をドキュメントコンテキストとしてチャットボットに指定します。これにより、チャットボットはこのコンテキストを使用してユーザーのクエリに回答できるようになります。

テニスのルールを記載したドキュメントをチャットボットに指定する。

チャットボットがレスポンスに XML 引用を含めないように、引用を無効にしてください。これにより、チャットボットが Slack のレスポンスにドキュメントへのリンクを含めなくなります。

チャットボットの引用を無効にする。

さらに、チャットボットをテストして、適切に応答することを確認できます。アドホックなテストには Chatbot Studio を使用し、評価スイート全体でテストするには AIP Evals を使用します。

AIP Chatbot にテニスに関する質問をして、セットアップをテストする。

チャットボットの性能に満足できたら、イベント処理ワークフローでチャットボットを使用できるように、チャットボットを関数として公開します。

ステップ4:ソースとチャットボット関数をコードリポジトリにインポートする

チャットボットをセットアップしたら、チャットボットが Slack とやり取りできるようにする必要があります。まず、TypeScript 関数を記述するための新しいコードリポジトリを作成します。作成後、作成したソースと公開済みのチャットボット関数の両方をリポジトリにインポートします。

チャットボット関数とソースの両方がコードリポジトリにインポートされている。

ステップ5:リスナーのイベントペイロード処理をセットアップする

メッセージに応答するには、ボットが受信したリスナーのイベントペイロードを処理できる必要があります。リスナーのイベントペイロード処理を有効にする TypeScript 関数を作成します。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 import { OntologyEditFunction } from "@foundry/functions-api"; import { Queries } from "@foundry/ontology-api"; import { ExternalSystems } from "@foundry/functions-api"; import { TennisBotSlackSource } from "@foundry/external-systems/sources"; export class MyFunctions { @ExternalSystems({ sources: [TennisBotSlackSource] }) @OntologyEditFunction() public async processTennisBotEvent(decodedEventPayload: string): Promise<void> { const message = (JSON.parse(decodedEventPayload) as any).event; // ボット以外のメッセージのみを処理します(ボットとして送信したメッセージは再処理しません) if (message == null || message.bot_id != null) { return; } const messageText = message.text; const channel = message.channel; if (messageText == null || channel == null) { return; } // メッセージをエージェントに渡します const agentResponse = await Queries.tennisAgentDocumentContextExample({ userInput: messageText }); // エージェントのレスポンスを Slack に送り返します const postMessageUrl = `${TennisBotSlackSource.getHttpsConnection().url}/api/chat.postMessage`; const response = await TennisBotSlackSource.fetch(postMessageUrl, { method: "POST", headers: { ["Authorization"]: `Bearer ${TennisBotSlackSource.getSecret("SLACK_BEARER_TOKEN_AUTH")}`, ["Content-Type"]: "application/json" }, body: JSON.stringify({ channel: channel, text: agentResponse.markdownResponse, }) }) } }

TypeScript 関数でのソースの使用について詳しくは、関連ドキュメントを参照してください。

コミットしてバージョンにタグを付け、この関数を公開します。

ステップ6:関数ベースのアクションをセットアップする

Ontology Manager に移動し、イベント処理関数を使用して関数ベースのアクションを作成します。このアクションは、受信した Slack メッセージイベントごとにトリガーされます。

関数ベースのアクションを作成するためのウォークスルーウィザード。

ステップ7:関数ベースのアクションを実行する自動化をセットアップする

次に、新しいリスナーイベントごとに関数ベースのアクションを実行する新規の自動化を作成します。新規の自動化には「ストリーム」条件を設定します(ストリームに新しい行が追加されると実行されます)。この自動化の入力には、作成した Slack リスナーの出力ストリームを指定します。

作成した自動化の概要。

ステップ8:ボットをテストする

これで、Tennis Bot をテストする準備ができました。Slack でボットにダイレクトメッセージを送信し、レスポンスを待ちます。ボットはテニスに関する情報で応答するはずです。

ユーザーと作成した Slack ボットの会話。

任意の拡張機能と改善

これで、AI を活用した基本的なチャットボットを作成できました。ここから、ボットに機能を追加していくことができます。拡張機能と改善の例には、次のようなものがあります。

  • イベントを最初に受信したときに、最初の確認メッセージ(「処理中です!」など)を送信し、LLM のレスポンスが利用可能になったら、そのメッセージの内容を LLM のレスポンスに更新します。これにより、ユーザーが最初のレスポンスを受け取るまでの時間を短縮できます。
  • チャットボットの会話セッションにユーザーの会話履歴を保持します。これにより、過去のメッセージをコンテキストとして使用した会話が可能になります。チャットボット関数の sessionRid パラメーターを使用して、会話のコンテキストを有効にできます。
    • たとえば、チャットボット関数の出力からセッション RID(スレッドの最初のメッセージで作成されます)をオントロジーのオブジェクトタイプに保存できます。その後、新しいメッセージについて、このオブジェクトタイプで関連するセッション RID を検索し、チャットボット関数の入力に使用できます。
  • 処理の遅延を低減するには、イベント処理の実装を、アクションを呼び出す自動化から、外部 UDF を呼び出すストリーミングパイプラインに移行できます。ストリーミングパイプラインを使用したイベント処理の詳細については、イベント処理のオプションに関するドキュメントを参照してください。

Slack® のすべてのスクリーンショットは参考用にのみ掲載されており、Slack Technologies, LLC の所有物です。