UiPath Communications Mining 応用編 AIモデルを利用して予測結果取得のRPA処理

[準備編](https://qiita.com/utanesuke/items/3568cc02e1743ad56ad1)と[構築編<sup>注</sup>]()にて、UiPath Communications Mining(以下はCMと略称)プラットフォームで結果予測のAIモデルを構築できました。

本記事では、構築したAIモデルを応用し、予測結果を取得する方法を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/583a3683-fc01-106c-b195-2e1a04b504a3.png)

:::note info
注:構築編の記事は現在も作成中です。構築に関する詳細な情報については、以下のリンクからご参照いただけます。
https://docs.uipath.com/ja/communications-mining/automation-cloud/latest/user-guide/train
:::

# UiPath Communications Miningでの自動化

構築したAIモデルを活用することで、新着メッセージやメールから予測データを抽出し、そのデータを基に後続処理を自動化することが可能になります。たとえば、次のようなメールを受信した場合を想定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/8f2d8d26-3edd-8039-eaa6-894a92b26b9e.png)
AIモデルは、受信したメールから次のような情報を予測結果として出力することができます：
- ラベル：「予約の問い合わせ > 予約のキャンセル要求」、「移動方法 > バス」
- エンティティ：「予約番号:123456」

この予測データを用いて、RPAは業務システム内で該当する予約のキャンセル処理を実行し、その結果をお客様へ自動的に返信するという一連の作業を自動化します。

これからは、AIモデルから予測データを取得し、それを解析する方法について詳しく説明します。

# モデル バージョンのピン留め

モデルのバージョンをピン留めすることにより、特にデータのストリームを扱う場合、予測結果に対する一貫性と確定性を提供することが可能です。

この操作によって、選択したモデルのバージョンが固定され、そのバージョンに基づいて確定的なエンドポイントが作成されます。このエンドポイントは、通信内容のラベル付けやエンティティの特定を自動化する目的で使用されるモデルとして機能します。

モデルのバージョンをピン留めする手順は以下の通りです：
- 上部のナビゲーションバーから「モデル」ページへ移動します。
- 現在のモデルバージョンをピン留めするために、「ピン留め」トグルを使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/0305de6c-0b2d-7b62-0b89-997c80fcd986.png)

# ストリームの作成

ストリームとは、オートメーションによって未読のコミュニケーション（例えば、新着メール）を読み出す機能を提供するキューのことを指します。このプロセスでは、予測されるラベルや抽出されるエンティティ、そしてそれらの信頼度レベルも同時に取得することが可能です。

ストリームを作成および設定する手順は以下の通りです：
1. ストリーム作成：
    - データセットページにある「ストリーム」タブをクリックし、新しいストリームを作成します。

2. モデルバージョン選択：
    - API名と事前にピン留めしたモデルのバージョンを選択します。
3. 信頼度閾値設定：
    - モデルのバージョンを選択した後、表示される画面で、ラベルごとの信頼度閾値を設定します。
    - 信頼度が設定した閾値以下のラベル予測は出力されません。注意点として、信頼度が100%に達することはありませんので、100%に設定されたラベルは出力されないことになります。
    - 各ラベルの閾値を調整バーで設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/7dff42f0-d429-56d0-5992-ca2a9e379435.png)

適切な閾値を選択するための詳細なガイドは、こちらのページからご参照いただけます。

https://docs.uipath.com/ja/communications-mining/automation-cloud/latest/user-guide/selecting-label-confidence-thresholds

# ストリームよりデータの取得と解析

ストリームからデータ（コミュニケーションデータや予測結果など）を取得するためには、バッチ取得と前進によるループを実装する必要があります。

```mermaid
graph LR
  Start([開始])-->B[バッチ取得]
  B-->C{データがあるか？}
  C-->|あり| D[データ解析...]
  D-->E[バッチを前進させる]
  E-->B
  C-->|なし| End([終了])
```

## データの取得

ストリームからデータがなくなるまで、データの取得と処理を続けるには、繰り返し処理を実装することが必要になります。

ワークフローを以下の手順で実装します：
1. 「繰り返し (後判定)」アクティビティをワークフローに追加します。この段階では、条件は後で設定するため、現時点では条件欄を空にしておきます。
1. 「繰り返し (後判定)」アクティビティの内部に、「ストリームからバッチを取得」アクティビティを追加します。そして、「プロジェクト名」、「データセット名」、「ストリーム名」の各フィールドに、対象となる具体的な値を設定します。
1. 「ストリームからバッチを取得」アクティビティのプロパティで、取得したデータを格納するための変数を設定します。変数名は任意に設定できますが、この説明では streamfeed という名前を使用します。
1. 次に、データ解析のための準備として、「シーケンス」アクティビティをワークフローに追加します。
1. データ解析を完了した後、バッチを次に進めるために、「ストリームを前進」アクティビティを追加します。
1. 最後に、「繰り返し (後判定)」の条件として not streamfeed.IsEndSequence を設定し、これによりストリームの終わりに達しているか否かを判定します。この条件が真（つまり、ストリームがまだ終わっていない）の場合、繰り返し処理が継続されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/1c0ea166-e3a6-57a1-998d-b37a9722613f.png)

## データの解析(エンティティ)

一回のバッチ取得で、モデルから得られる256件のメッセージにはそれぞれ予測結果が含まれています。これらのメッセージから、予測結果のエンティティとレベルを抽出する手順は次の通りです：
以下の手順でワークフローを実装します。
- 「データの解析」セクション内に、「繰り返し (コレクションの各要素)」アクティビティを追加します。
    - 「繰り返す項目のリスト」として「streamfeed.results」を指定し、「項目」には「result」を入力します。」
- 各「result」(メッセージ)では、複数のエンティティやラベルが含まれているため、さらに詳細なデータ抽出を行うために、「繰り返し (コレクションの各要素)」アクティビテ内でもう一つ繰り返しアクティビテに追加します。
    - 繰り返す「項目のリスト」では「result.Entities」を指定し、「項目」では「result_entity」を入力します。
    - アクティビテの本体(Body)に、「一行を書き込み」アクティビテを追加し、テキストに`result_entity.Name + " : " + result_entity.FormattedValue`を入力して、予測結果のエンティティの名前と整形された値を出力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/639b332e-41b7-15b0-c7b0-e08568984c6f.png)

出力したエンティティは以下の通り(例)です。

```python 
flight_no : JT320
Destination_city_name : 東京
Destination_city_name : オーストラリア
start_date : 2022年04月15日 09:00 JST
travel_agency : ジャパントラベルエージェンシー
```

## データの解析(ラベル)
予測結果のラベル解析はエンティティ解析とほぼ同様の手順を要します。そのため、この部分の実装に関する詳細な説明は省略します。必要に応じて、エンティティ解析の手順を参照して、ラベル解析にも適用してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/ccdb3627-1c87-3785-be08-84ecbd30d435.png)

:::note info
**注：**

階層構造を持つラベルのデータから各階層のラベルを取得するために、2回の繰り返し処理を利用する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/d54bf855-15b9-e8fc-d3ac-6f5dd93f68c0.png)
:::

# 補足説明

## ストリームの前進

ストリームは、オートメーションで未読のコミュニケーション（例えば、新着メール）を読み出すことができるキューのようなものです。これにより、新しいまたは未処理のデータに対して、継続的に処理を適用することが可能になります。
「ストリームを前進」アクティビティを利用することで、次にバッチを取得する際の位置を明確に設定することができます。これには主に二つの方法があります：

- **最新のシーケンスIDに前進：ON** - これを選択すると、システムは自動的に最後に取得したレコードのIDを次の取得開始点として設定します。これにより、常に最新のデータを取得することが保証されます。

- **最新のシーケンスIDに前進：OFF** - このオプションを選択した場合、手動で指定したレコードのIDからデータの取得を開始します。特定のデータセットや過去のデータに対して処理を行いたい場合に有用です。

ストリームからデータを取得する流れは、これらの設定に従って調整されます。これにより、プロセスの柔軟性が高まり、特定の要件に応じたデータ処理が可能になります。

```mermaid
graph LR
  Start([開始])-->B[バッチ取得]
  B-->C{データがあるか？}
  C-->|あり| D[データ解析...]
  D-->E[バッチを前進させる]
  E-->B
  C-->|なし| End([終了])
```

例として、ストリームには合計で513件のメッセージが含まれている状態から始めます。このとき、バッチ取得の開始位置は、ストリーム内の最初のメッセージ、つまりメッセージ1となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/f37d137c-880f-c849-ac5f-6ad6b8524d6b.png)

- 最初のバッチ取得：
    - 最初のバッチ取得ではメッセージ1から256までのデータが取得されます。これは、デフォルトで設定された256件のメッセージを一度に取得する設定によるものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/1ebdba5c-6728-5067-3969-04ed80bc3e12.png)

- 最初のバッチ後の前進：
    - 最新のシーケンスIDに前進するオプションがON<sup>注</sup>に設定されている場合、最初のバッチ取得後、次に取得するバッチの開始位置はメッセージ257に更新されます。これは、最初のバッチで最後に取得したメッセージの次のIDが新たな開始点となるためです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/47f302c8-7ef9-295d-fb4b-c396ff9ee303.png)

- 二回目のバッチ取得：
    - 次に、メッセージ257から始まる二回目のバッチ取得が行われ、メッセージ512までのデータが取得されます。このときも、256件のデフォルト設定に基づいてデータが取得されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/595744b2-646d-8203-04da-caf5c4a0ccf0.png)

- 二回目のバッチ後の前進：
    - 再び、最新のシーケンスIDに前進するオプションがON<sup>注</sup>に設定されている場合、二回目のバッチ取得後の開始位置はメッセージ513に更新されます。これにより、次回のバッチ取得時には、新たに追加されたメッセージがあればそれらを取得する準備が整います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/c75ef446-62fe-04d6-f67a-165c8995619c.png)

::: note info
**注：最新のシーケンスIDに前進：ON**
- **自動前進：** この設定がONの場合、システムは自動的に最新のシーケンスIDまで前進します。つまり、最後に取得したメッセージの次のID（例えば、256の次の257、512の次の513）を新たな開始点として自動設定します。このオプションは、ストリームを通じて新しいデータが継続的に処理されるようにするために便利です。

**注：最新のシーケンスIDに前進：OFF**
- **手動設定：** このオプションがOFFの場合、次に取得するバッチの開始点を手動で指定する必要があります。この方法では、特定のシーケンスIDを指定して、そこからデータ取得を再開することができます。これは、特定の時間点からのデータのみを取得したい場合や、特定のデータセットに対して処理を行いたい場合に有用です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/838efc60-2205-060a-b4d6-d871a5456638.png)
sequenceIDがストリームでの予測結果から取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/6d09c4ea-f144-ae21-72a6-54025f5fac7b.png)
:::


## ストリームのリセット

ストリームをリセット」機能を活用することにより、利用者はストリームの開始時刻を自由に設定することができ、これは特にワークフローをテストする際に非常に便利です。

本番環境での運用時には、ストリームリセットは通常、ストリーム作成直後に一度だけ実行され、日常的なジョブ実行時には再度実行する必要はありません。

例えば、ストリームの開始時刻を「2022年12月31日」と設定することにより、その時刻以降にストリームに追加されたメッセージのみが次のバッチ取得時に読み出されるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/7d2f4df6-32d3-8750-f890-260271264d81.png)

# 最後に

ストリームを使わない場合でも、ワークフローにメールなどの入力データを直接提供し、AIモデルによる予測結果を取得することは可能です。このプロセスには主に以下の2つのアクティビティが関与します：
- レコードを作成（Records.CreateRecord）
- レコードを予測（Predictions.PredictRecords）

詳細について以下のページをご参照ください。

https://qiita.com/shuy/items/a8fb4d56be57b321dd54


# 参照リンク

https://docs.uipath.com/ja/communications-mining/automation-cloud/latest/developer-guide/uipath-official-activities