【UiPath】Context-Grounding対応のSlackボットを作成する

# はじめに
- 本記事では、**UiPath製品を利用してContext-Grounding (RAG) に対応したSlackボットを作成**します。これによって普段お使いのSlackのユーザーインターフェイスを使用して、関連文書を参照して回答するチャットボットをUiPath Automation Cloud環境に構築することができます。
- チャットボットの実装で一般的に利用されるサーバーレスコンピューティング(AWS LambdaやAzure Functionsなど)やNode.js・Pythonなどによるコーディングは不要です。

【完成形】
![Slack_ContextGrounding.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/9eb9ec0f-06c6-0fbe-d012-ce8c96dd7c13.png)

# 全体像
- 今回作成するSlackボットの全体像はこちらです。

![AITL_SlackBot_Architecture.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/4fcb35df-21aa-66a7-c12e-e4415d607ed4.png)

- 前段の緑色の部分を本記事にて説明します。主に [こちらの公式Webガイド](https://docs.uipath.com/ja/activities/other/latest/integration-service/trigger-an-automation-using-the-http-webhook-connector-when-a-message-is-posted-to-a-slack-channel) を元に執筆しております。
- 後段のContext-Groundingやインデックス化処理の詳細については別記事 [【UiPath】 AI Trust LayerによるContext-Grounding機能のメリットと利用手順](https://qiita.com/hidecha/items/6aba3e50e9c3797fc92b) をご参照ください。

# 必要なもの
- UiPath Automation Cloud
    - 現時点ではCommunity版でもOKです。

    :::note warn
    ただし今後UiPath GenAIアクティビティのContext-Grounding機能がプレビューから一般利用可能(GA)になるタイミングで [AIユニット](https://docs.uipath.com/ja/overview/other/latest/overview/service-licensing#ai-units) ライセンスが必要となる可能性があります。
    またサーバーレスロボットの利用には [ロボットユニット](https://docs.uipath.com/ja/overview/other/latest/overview/service-licensing#robot-units) ライセンスが必要となります。Community版でも検証用途で少量のライセンスが付与されていますが、本番利用にあたってはライセンスのご購入をご検討ください。
:::

- Slackアカウント
    - Slackアプリ作成の権限が必要となります。

# 実装手順

大まかには次の手順にて実装します。

1. [Slackの設定](#1-slackの設定)
2. [Integration Service(Slackコネクタ)の設定](#2-integration-serviceslackコネクタの設定)
3. [Integration Service(HTTP Webhookコネクタ)の設定](#3-integration-servicehttp-webhookコネクタの設定)
4. [Orchestratorの設定](#4-orchestratorの設定)
5. [ワークフローの実装① ～ Slack連携](#5-ワークフローの実装--slack連携)
6. [ワークフローの実装② ～ Slack返信](#6-ワークフローの実装--slack返信)
7. [ワークフローの実装③ ～ Context-Grounding](#7-ワークフローの実装--context-grounding)

それぞれ詳細な手順を説明します。

## 1. Slackの設定
まずSlackボット専用のSlackチャンネルとSlackアプリを作成します。
- 最初は試行錯誤して意図せずメッセージ投稿される可能性がありますので、通常業務の妨げにならないように既存チャンネルは使用せず新規作成することをお勧めします。
- 本記事では `uipath-slackbot` というチャンネル名にします。
    ![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/775ee828-13be-ae11-8a69-dcdb290de5a7.png)

- チャンネルを右クリックして詳細を表示し、一番下の **Channel ID** をメモします。
    ![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/c40eef14-9bcf-9921-34a3-11dbf44c1ec7.png)

- 次にSlackアプリを作成します。[Slack API](https://api.slack.com) にアクセスし **[Create New App]** をクリックし、 **From scratch** を選択します。
    ![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/c2836ed9-14e6-ac96-1ca0-7f9b08fe4f66.png)

- App Nameを指定します。本記事では `uipath-slackbot-app` というアプリ名にします。**[Create App]** をクリックして、Slackアプリ作成を完了します。
    ![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/fbe6664f-44c6-cc04-332b-008987bae3d2.png)

## 2. Integration Service(Slackコネクタ)の設定
Integration ServiceにてSlackコネクタを設定します。この設定はSlackチャンネルにメッセージを投稿・返信するために使用されます。
- [Automation Cloud](https://cloud.uipath.com) にサインインし、Integration Serviceの管理画面に遷移します。
    ![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/f84bb6e3-bb07-80d6-e957-3e4ca0c43bf0.png)

- Integration ServiceにてOrchestratorフォルダーを選択します。(最終的にプロセスをデプロイするフォルダーを選択しますが、本記事ではSharedフォルダーを使用します)
- コネクションにて **コネクションを追加** をクリックします。
    ![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/7720a73d-bdc7-a9b4-47f1-6969e51aeeb2.png)

- **Slack** を選択し、**接続** をクリックします。
    ![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/e9d5f296-6e67-a423-23cc-617f6f1b714d.png)

    ![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/d32c5cb1-85fa-9004-62f4-05a8785f9d00.png)

- **UiPath EU** という名前のSlackアプリにワークスペースへのアクセス許可を与えます。
    ![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/2585f503-8643-f216-cdc7-86bbb5745685.png)

- コネクションが作成されたことを確認します。(任意でコネクション名を変更することもできます)
    ![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/285f1e53-b260-6b7d-ac1a-d59cdf1dac58.png)

## 3. Integration Service(HTTP Webhookコネクタ)の設定
次にIntegration ServiceにてHTTP Webhookコネクタを設定します。この設定はSlackの特定チャンネルにメッセージが投稿されたのをトリガーにワークフローを実行するために使用されます。
- Integration ServiceにてSharedフォルダーを選択し、コネクションにて **コネクションを追加** をクリックします。**HTTP Webhook** を選択します。
    ![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/e34a3892-8e78-3256-5578-145555647ea7.png)
- What application is this webhook for? には **Slack** と入力して接続をクリックします。
    ![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/704fd016-7b7a-eb79-d883-f858193812a8.png)
- コネクションが作成されたことを確認します。
    ![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/40bcdc80-0b95-2508-4197-f5fbe410db1e.png)

- Slackにて **Add apps** をクリックします。
    ![39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/8343e97f-7b87-e104-2a73-87ca1a9c050a.png)

- **UiPath EU** を選択してアプリケーションを追加します。追加された **UiPath** を右クリックし、**View app details** をクリックします。
    ![41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/b5130295-cd3d-2a8e-4e39-7d4797e8a91f.png)

- **Member ID** をコピーしてメモします。
    ![42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/3ae58643-caaa-94e1-d3b0-855cc31c7dce.png)

## 4. Orchestratorの設定
ワークフローの実行環境を整えるためにOrchestratorの設定を行います。
- まずサーバーレスロボットを実行するためのロボットアカウントを作成し、テナントロールを割り当てます。
    - Automation Cloudの管理メニューより **アカウントとグループ** にアクセスします。
        ![68.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/c2737fe0-b90e-fed0-aabb-5a82f060b7aa.png)
    - [ロボットアカウント]タブにて **ロボットアカウントを追加** をクリックし、ロボットアカウントを作成します。
        ![69.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/0d330e72-ab19-430d-f483-2157b71ce44e.png)
- Orchestrator管理画面に移動し、ロボットアカウントにロールを割り当てます。
    - テナント > アクセス権を管理 > ロールを割り当て > ロボットアカウント を順にクリックします。
        ![70.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/8d96804d-f7b1-f4b3-b17f-6e294013aed9.png)
    - 先ほど作成したロボットアカウントを選択し、**Robotロール** を割り当て、**次へ** をクリックします。
        ![71.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/03e081f8-198c-8c94-55d1-7362663379d4.png)
    - 無人オートメーションの設定で **仮想マシンの事前設定済みの資格情報** が選択されていることを確認し、**スキップして割り当て** をクリックします。
        ![72.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/41a9c61a-0850-faa6-2e13-5e60ad47246f.png)

- 次にマシン作成とフォルダーへの割り当てを行います。
    - テナント > マシン > マシンを追加 > **Cloud ロボット - サーバーレス** をクリックし、マシンを作成します。
        ![62.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/9f999d1d-9490-48f5-f0eb-578d69102ad9.png)
    
    - このマシンをSharedフォルダーに割り当てます。
        ![63.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/9b5aac43-e464-609c-d402-f4c1a3c92b9d.png)
    
    - このフォルダーに **Robotロール** でロボットアカウントを割り当てます。
        ![61.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/34e85d79-3900-104c-ce24-3e4f499d63bb.png)

## 5. ワークフローの実装① ～ Slack連携
Slackボットの処理を行うワークフローを実装します。まずはSlackへのメッセージ投稿をトリガーとしてワークフローが実行されるように連携の設定を行います。
- Automation CloudにてHTTP Webhookの設定を行います。
    - Studio Webの管理画面に遷移し、[オートメーション] タブにて **新しいプロジェクト** をクリックします。
        ![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/e0c71aa3-32d4-d29e-9e6a-4eec9f7fa242.png)

    - トリガーとして **HTTP Webhook** を選択します。
        ![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/547c40ca-0170-2f8d-2dd6-bf7f1fd0d904.png)

    - ここで表示されるURLをコピーしてメモします。
        ![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/d231dd1a-1d60-11f7-bf11-735c16ef47a4.png)

    - データフィルターをクリックし、最初のフィールドで **[式エディター]を開く** をクリックします。
        ![26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/971f008b-fdb5-4e24-e171-6c8cd82c7e94.png)

    - `"body.event.channel"` と入力して **保存** をクリックします。
        ![27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/6a173eb0-069b-c7e1-89d7-4271e61b2d81.png)
    - ドロップダウンにて **次の値と等しい** を選択し、`{Channel ID}` を指定します。{Channel ID} はSlackチャンネル作成時にメモしたIDです。このフィルターによって指定チャンネルへの投稿時にのみ、このワークフローが実行されるように制御します。
    - フィルタービルダーにて 追加 > **条件** をクリックします。
    ![43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/740094b8-dd4f-64e4-7bde-41ae540a931f.png)

        - **左辺**: 式エディターを使用して `"body.event.user"`
        - **ドロップダウン**: 次の値と**等しくない** (上のフィルターとは異なることに注意！)
        - **右辺**: `{UiPathアプリ Member ID}` (先ほどメモした"UiPath"アプリのMember ID)

    - **保存** をクリックします。
        ![44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/eb312880-3fde-dbe8-80bb-c9192d959b0f.png)

    :::note info
	ここで作成した2つ目のフィルターの意味は、返信がループすることを防ぐためです。このワークフローはユーザーの投稿をトリガーとして実行されますが、以降の処理にて返信処理を実装すると、この返信処理をトリガーとしてこのワークフローが再帰的に実行され、無限ループに陥ってしまいます。これを防ぐために"UiPath"アプリの返信では以降の処理が実行されないようにフィルターします。
:::

- 上記で設定したHTTP Webhookトリガーと連携するようSlackアプリの設定を行います。
    - [Slack API](https://api.slack.com) にて `uipath-slackbot-app` の設定画面に遷移し、**Event Subscriptions** メニューをクリックします。
        ![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/b9c3537f-3dbe-94f6-ff30-733a42debcca.png)

    - Enable Eventsのトグルをオンにし、Request URLに先ほどコピーしたURLをペーストします。しばらくして `Verified` と表示されることを確認します。
        ![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/16a55c58-a904-63e3-d045-2fc969b22d8a.png)

    - **Subscribe to events on behalf of users** を展開し、**Add Workspace Event** をクリックし、`message.channels` を選択します。
        ![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/360ae3fd-45e0-7e09-e40b-d44d81d800d2.png)

    - **[Save Changes]** をクリックします。
        ![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/1dc1a5f6-58f5-f82a-180d-285e40d04107.png)

    - **Install App** メニューをクリックし、Slackアプリをワークスペースにインストールし、**[Allow]** をクリックしてアクセスを許可します。
        ![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/79441f97-6f3d-932c-8479-ab13b6311c92.png)

        ![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/1138a739-629c-da9f-b113-588ee1a2a425.png)

## 6. ワークフローの実装② ～ Slack返信
- Slackのメッセージ投稿に返信するようにワークフローを実装します。
    - Studio Webのワークフローにて、Create Webhook Triggerの続きで (+) をクリックし、**JSONを逆シリアル化(Deserialize JSON)** アクティビティを選択します。
        ![29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/5612991f-9310-d33f-7aec-74aedcd52bf0.png)

    - JSON文字列として `{Create Webhook Trigger > Webhook Event Payload > Content}` を指定します。
        ![30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/cd3f006e-de61-652a-7aae-547a4b049eed.png)

    - (+) をクリックし、Slackの **返信を送信(Send Reply)** アクティビティを選択します。
        ![31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/96cf9fd5-b606-f940-7ddc-3e1ef0ede335.png)

    - **返信を送信** アクティビティは次のように設定します。
        - **チャンネル名/ID**: `jsonオブジェクト("event")("channel").ToString` (式エディターを使用)
        - **メッセージのタイムスタンプ**: `jsonオブジェクト("event")("ts").ToString` (式エディターを使用)
        - **メッセージ**: `OK`
        - **送信元**: `Bot`

    :::note info
    `jsonオブジェクト`が変数として認識されない場合には、式エディターにて **変数を挿入** をクリックし、`{JSONを逆シリアル化 > JSONオブジェクト}` を選択します。

    ![79.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/7c01bc2d-81bf-9962-cf1e-5974458076cb.png)
:::

- ワークフローの続きを実装します。
    - (+) をクリックし、**待機** アクティビティを選択し、1分間待機するように設定します。これはワークフロー実行が無限ループに陥った時に強制終了する時間を設けるための一時的な実装です。
        ![37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/2530f531-7c54-de8f-481c-d34a5b478e41.png)

        ![38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/c3ded357-864f-ecef-d445-bb43c5e018c9.png)

    - 上部の鉛筆アイコンをクリックしてプロジェクト名を `uipath-slackbot` のように変更し、**パブリッシュ** ボタンをクリックします。
        ![33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/5fedbe7b-0dbc-7d3a-bd11-9fd63b7c1d6e.png)

    - パブリッシュ先として **Orchestrator テナント プロセス フィード** を選択し、 **[パブリッシュ]** をクリックします。
        ![73.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/9bf04337-6c32-4711-61a8-2d0142da6f18.png)

- Orchestratorの管理画面でプロセスのデプロイを行います。
    - Sharedフォルダー > オートメーション > プロセス > **プロセスの追加** をクリックします。パッケージソース名として `uipath-slackbot` を選択し、パッケージ要件でエラーが発生しないことを確認してプロセスを作成します。
        ![74.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/8eef6ec9-238f-9943-b46a-dea6808904c0.png)
    
    - トリガーとしてイベントトリガーが追加されていることを確認します。
        ![75.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/2a0de800-59fd-eb77-465b-4684fbd3cc90.png)

- Slackのユーザーインターフェースにて動作確認を行います。
    -  `uipath-slackbot` チャンネルにて「テスト」と投稿します。
        ![36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/0bdac6ea-d58f-4d8e-d556-94b5a1572bbe.png)

    - Automation CloudにてOrchestrator管理画面に遷移し、Sharedフォルダーのジョブ画面を表示します。サーバーレスロボットにてジョブが実行されていることを確認します。
        ![76.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/125d9672-2020-45b7-b7fd-8c0e45be6e34.png)

    - 実行が完了すると、投稿メッセージに「OK」と返信されることを確認します。
    ![46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/06cf1223-8411-4ee8-4bff-a7919127321d.png)

    :::note warn
    もしOKが連続して投稿されてしまう場合にはワークフローが繰り返し実行され無限ループに陥っている可能性があります。ひとまずOrchestratorジョブ画面にて保留中・実行中のジョブを強制終了し、プロセスを一旦削除します。その上でワークフロー内のHTTP Webhookトリガーのデータフィルター設定を再度確認し修正した上でパブリッシュしなおします。
    
    ![77.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/fb53e793-ebcf-077b-4167-0e7e6bd53c26.png)

    ![78.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/3ff4ee72-5228-7f7a-553d-27c5d24636ed.png)
:::

## 7. ワークフローの実装③ ～ Context-Grounding
最後にワークフローを改修して、Slackへのメッセージ投稿の質問に対してインデックスを参照して回答するように実装します。Context-Groundingは個人用ワークスペースでは動作しないため、ここまでの手順通りSharedフォルダーにパッケージをパブリッシュしてサーバーレスロボットで実行します。

- 関連文書のインデックスは事前に作成します。詳細な手順は [【UiPath】AI Trust LayerによるContext-Grounding機能のメリットと利用手順](https://qiita.com/hidecha/items/6aba3e50e9c3797fc92b) をご参照ください。
- Studio Webにてワークフローを修正します。
    - 既存ワークフローを開き、JSONを逆シリアル化アクティビティと返信を送信アクティビティの間に、UiPath GenAIアクティビティの **コンテンツ生成(Content Generation)** を追加します。
        ![49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/f1a17d29-a033-eafa-49a1-6e68e36f56a7.png)

    - コンテンツ生成アクティビティでは次のように設定します。
        - **モデル名**: `gpt-4o-2024-05-13`
        - **プロンプト**: `jsonオブジェクト("event")("text").ToString` (式エディターを使用)
        - **コンテキストグラウンディング**: `Existing index`
        - **インデックス**: {作成済みインデックス名}

    - 返信を送信アクティビティを修正し、次のように設定します。
        - **メッセージ**: `{コンテンツ生成 > Text}` 変数
        ![51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/b6894636-9bf5-5d0a-d87c-cadb2aa9b54f.png)

    - 待機アクティビティを無効化します。
        ![52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/a106879b-26ff-ad7b-cfb8-54379fe6eda1.png)

    - **パブリッシュ** ボタンをクリックし、 **Orchestrator テナント プロセス フィード** にパブリッシュします。
        ![53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/5223ad7d-8611-2718-c75e-540d004ed473.png)

        ![57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/542ae2f1-2e64-f871-b025-609c71f922f6.png)

- Sharedフォルダーにて `uipath-slackbot` プロセスを最新バージョンにアップグレードします。
    ![80.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/67a9a46f-cf3c-09a6-f807-e0ab0525ef52.png)

- Slackチャンネルにて関連文書にかかわる質問を投稿します。
    - しばらくするとインデックスを参照した回答が返ってくることを確認します。
    ![58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/228595a7-bcd8-0225-e19c-fc568ca1092c.png)

    - 応答がない場合にはOrchestratorのジョブ画面にてジョブの実行結果を確認します。
    ![64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/e9b5d894-3390-c948-13ac-274e89cae9de.png)

    - ジョブがそもそも実行されていない場合にはHTTP Webhookやプロセス・マシン・ロボットアカウントの設定を見直し、ジョブがエラーになっている場合にはワークフローの内容を見直します。

# 更なるワークフローの改善

ここまで実装したワークフローでも一応動作しますが、いくつか改善すべき点がありますのでそれらについて説明します。

## 新規投稿イベントのみに応答
- HTTP Webhookイベントは新規投稿だけでなくメッセージの編集や削除にも実行されます。現時点でのワークフローではコンテンツ生成を呼び出す際のプロンプトで指定される `jsonオブジェクト("event")("text")` の値がメッセージの編集・削除ではNullになるため `Object reference not set to an instance of an object.` というエラーでジョブ実行が失敗します。
- これを回避するためにコンテンツ生成の前に **条件分岐(If)** アクティビティを配置し、**条件** を式エディターにて `jsonオブジェクト("event")("text") IsNot Nothing` と指定し、このオブジェクトが存在した場合に「コンテンツ生成」や「返信を送信」などの後続処理を実行するように修正します。
    ![65.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/bffb5306-e1d0-0425-5dc5-d4174517ad72.png)

## 出力形式の変更
- 現時点での回答文は大規模言語モデル `gpt-4o` が生成した文章をそのまま出力しています。そのためSlackの出力形式に合わない部分があります。たとえばSlackで太字にするためにはアスタリスクで文字を囲みます(例: `*太字*`)が、現在の出力ではアスタリスク2つで囲まれている(例: `**太字**`)ため太字にはなりません。この見栄えを良くするためには回答文を地道に文字列置換するより他にありません。
- 次の手順で、正規表現を使用してアスタリスク2つで囲まれた文字列をアスタリスク1つで囲まる文字列に変換します。
    - データーマネージャーにて `output` というテキスト型の変数を追加
    - **変数の値を設定** アクティビティを配置して次の通り設定
        - **出力**: `output`
        - **設定する値**: `System.Text.RegularExpressions.Regex.Replace(コンテンツ生成.text, "\*\*(.*?)\*\*", " *$1*")`
    - 返信を送信アクティビティの **メッセージ** を `ouput` に変更
    ![66.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/65184826-41b2-42b5-7018-69d1122bb199.png)
    
- パッケージをパブリッシュして、プロセスを最新版にアップグレードします。
- この修正によって見栄えが幾分良くなります。
![67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/217dfbf2-b0f3-d1d6-ed35-d9085edee8eb.png)

# おわりに
今回はSlackへの投稿をトリガーとしてContext-Groundingを実行するSlackボットの実装について解説しました。このようにUiPath製品を組み合わせてフロントエンドの実装も可能になります。皆さまも是非お試しください！