はじめに
- 本記事では、UiPath製品を利用してContext-Grounding (RAG) に対応したSlackボットを作成します。これによって普段お使いのSlackのユーザーインターフェイスを使用して、関連文書を参照して回答するチャットボットをUiPath Automation Cloud環境に構築することができます。
- チャットボットの実装で一般的に利用されるサーバーレスコンピューティング(AWS LambdaやAzure Functionsなど)やNode.js・Pythonなどによるコーディングは不要です。
全体像
- 今回作成するSlackボットの全体像はこちらです。
- 前段の緑色の部分を本記事にて説明します。主に こちらの公式Webガイド を元に執筆しております。
- 後段のContext-Groundingやインデックス化処理の詳細については別記事 【UiPath】 AI Trust LayerによるContext-Grounding機能のメリットと利用手順 をご参照ください。
必要なもの
-
UiPath Automation Cloud
- 現時点ではCommunity版でもOKです。
- Slackアカウント
- Slackアプリ作成の権限が必要となります。
実装手順
大まかには次の手順にて実装します。
- Slackの設定
- Integration Service(Slackコネクタ)の設定
- Integration Service(HTTP Webhookコネクタ)の設定
- Orchestratorの設定
- ワークフローの実装① ~ Slack連携
- ワークフローの実装② ~ Slack返信
- ワークフローの実装③ ~ Context-Grounding
それぞれ詳細な手順を説明します。
1. Slackの設定
まずSlackボット専用のSlackチャンネルとSlackアプリを作成します。
-
最初は試行錯誤して意図せずメッセージ投稿される可能性がありますので、通常業務の妨げにならないように既存チャンネルは使用せず新規作成することをお勧めします。
-
次にSlackアプリを作成します。Slack API にアクセスし [Create New App] をクリックし、 From scratch を選択します。
-
App Nameを指定します。本記事では
uipath-slackbot-app
というアプリ名にします。[Create App] をクリックして、Slackアプリ作成を完了します。
2. Integration Service(Slackコネクタ)の設定
Integration ServiceにてSlackコネクタを設定します。この設定はSlackチャンネルにメッセージを投稿・返信するために使用されます。
-
Automation Cloud にサインインし、Integration Serviceの管理画面に遷移します。
-
Integration ServiceにてOrchestratorフォルダーを選択します。(最終的にプロセスをデプロイするフォルダーを選択しますが、本記事ではSharedフォルダーを使用します)
3. Integration Service(HTTP Webhookコネクタ)の設定
次にIntegration ServiceにてHTTP Webhookコネクタを設定します。この設定はSlackの特定チャンネルにメッセージが投稿されたのをトリガーにワークフローを実行するために使用されます。
-
Integration ServiceにてSharedフォルダーを選択し、コネクションにて コネクションを追加 をクリックします。HTTP Webhook を選択します。
-
What application is this webhook for? には Slack と入力して接続をクリックします。
-
UiPath EU を選択してアプリケーションを追加します。追加された UiPath を右クリックし、View app details をクリックします。
4. Orchestratorの設定
ワークフローの実行環境を整えるためにOrchestratorの設定を行います。
-
まずサーバーレスロボットを実行するためのロボットアカウントを作成し、テナントロールを割り当てます。
-
Orchestrator管理画面に移動し、ロボットアカウントにロールを割り当てます。
-
次にマシン作成とフォルダーへの割り当てを行います。
5. ワークフローの実装① ~ Slack連携
Slackボットの処理を行うワークフローを実装します。まずはSlackへのメッセージ投稿をトリガーとしてワークフローが実行されるように連携の設定を行います。
-
Automation CloudにてHTTP Webhookの設定を行います。
-
ドロップダウンにて 次の値と等しい を選択し、
{Channel ID}
を指定します。{Channel ID} はSlackチャンネル作成時にメモしたIDです。このフィルターによって指定チャンネルへの投稿時にのみ、このワークフローが実行されるように制御します。 -
-
左辺: 式エディターを使用して
"body.event.user"
- ドロップダウン: 次の値と等しくない (上のフィルターとは異なることに注意!)
-
右辺:
{UiPathアプリ Member ID}
(先ほどメモした"UiPath"アプリのMember ID)
-
左辺: 式エディターを使用して
ここで作成した2つ目のフィルターの意味は、返信がループすることを防ぐためです。このワークフローはユーザーの投稿をトリガーとして実行されますが、以降の処理にて返信処理を実装すると、この返信処理をトリガーとしてこのワークフローが再帰的に実行され、無限ループに陥ってしまいます。これを防ぐために"UiPath"アプリの返信では以降の処理が実行されないようにフィルターします。
- 上記で設定したHTTP Webhookトリガーと連携するようSlackアプリの設定を行います。
-
Slack API にて
uipath-slackbot-app
の設定画面に遷移し、Event Subscriptions メニューをクリックします。
-
Enable Eventsのトグルをオンにし、Request URLに先ほどコピーしたURLをペーストします。しばらくして
Verified
と表示されることを確認します。
-
Subscribe to events on behalf of users を展開し、Add Workspace Event をクリックし、
message.channels
を選択します。
-
Install App メニューをクリックし、Slackアプリをワークスペースにインストールし、[Allow] をクリックしてアクセスを許可します。
-
6. ワークフローの実装② ~ Slack返信
-
Slackのメッセージ投稿に返信するようにワークフローを実装します。
-
Studio Webのワークフローにて、Create Webhook Triggerの続きで (+) をクリックし、JSONを逆シリアル化(Deserialize JSON) アクティビティを選択します。
-
JSON文字列として
{Create Webhook Trigger > Webhook Event Payload > Content}
を指定します。
-
返信を送信 アクティビティは次のように設定します。
-
チャンネル名/ID:
jsonオブジェクト("event")("channel").ToString
(式エディターを使用) -
メッセージのタイムスタンプ:
jsonオブジェクト("event")("ts").ToString
(式エディターを使用) -
メッセージ:
OK
-
送信元:
Bot
-
チャンネル名/ID:
-
-
ワークフローの続きを実装します。
-
Orchestratorの管理画面でプロセスのデプロイを行います。
-
Slackのユーザーインターフェースにて動作確認を行います。
7. ワークフローの実装③ ~ Context-Grounding
最後にワークフローを改修して、Slackへのメッセージ投稿の質問に対してインデックスを参照して回答するように実装します。Context-Groundingは個人用ワークスペースでは動作しないため、ここまでの手順通りSharedフォルダーにパッケージをパブリッシュしてサーバーレスロボットで実行します。
-
関連文書のインデックスは事前に作成します。詳細な手順は 【UiPath】AI Trust LayerによるContext-Grounding機能のメリットと利用手順 をご参照ください。
-
Studio Webにてワークフローを修正します。
-
既存ワークフローを開き、JSONを逆シリアル化アクティビティと返信を送信アクティビティの間に、UiPath GenAIアクティビティの コンテンツ生成(Content Generation) を追加します。
-
コンテンツ生成アクティビティでは次のように設定します。
-
モデル名:
gpt-4o-2024-05-13
-
プロンプト:
jsonオブジェクト("event")("text").ToString
(式エディターを使用) -
コンテキストグラウンディング:
Existing index
- インデックス: {作成済みインデックス名}
-
モデル名:
-
返信を送信アクティビティを修正し、次のように設定します。
-
-
Slackチャンネルにて関連文書にかかわる質問を投稿します。
更なるワークフローの改善
ここまで実装したワークフローでも一応動作しますが、いくつか改善すべき点がありますのでそれらについて説明します。
新規投稿イベントのみに応答
- HTTP Webhookイベントは新規投稿だけでなくメッセージの編集や削除にも実行されます。現時点でのワークフローではコンテンツ生成を呼び出す際のプロンプトで指定される
jsonオブジェクト("event")("text")
の値がメッセージの編集・削除ではNullになるためObject reference not set to an instance of an object.
というエラーでジョブ実行が失敗します。 - これを回避するためにコンテンツ生成の前に 条件分岐(If) アクティビティを配置し、条件 を式エディターにて
jsonオブジェクト("event")("text") IsNot Nothing
と指定し、このオブジェクトが存在した場合に「コンテンツ生成」や「返信を送信」などの後続処理を実行するように修正します。
出力形式の変更
-
現時点での回答文は大規模言語モデル
gpt-4o
が生成した文章をそのまま出力しています。そのためSlackの出力形式に合わない部分があります。たとえばSlackで太字にするためにはアスタリスクで文字を囲みます(例:*太字*
)が、現在の出力ではアスタリスク2つで囲まれている(例:**太字**
)ため太字にはなりません。この見栄えを良くするためには回答文を地道に文字列置換するより他にありません。 -
次の手順で、正規表現を使用してアスタリスク2つで囲まれた文字列をアスタリスク1つで囲まる文字列に変換します。
-
パッケージをパブリッシュして、プロセスを最新版にアップグレードします。
おわりに
今回はSlackへの投稿をトリガーとしてContext-Groundingを実行するSlackボットの実装について解説しました。このようにUiPath製品を組み合わせてフロントエンドの実装も可能になります。皆さまも是非お試しください!