UiPath Document Understanding 第4回 基礎編 テンプレートを使おう


[第１回](https://qiita.com/utanesuke/items/8cdcd1276fe248fafea7)、[第２回](https://qiita.com/utanesuke/items/95e49a3f21d81c4393a9)、[第３回](https://qiita.com/utanesuke/items/d26c9636a078a2ebcabb)を通して、UiPath Studioを使用してゼロからワークフローを作成し、英語と日本語のドキュメントの分類や抽出、そして結果の検証ができました。しかし、このワークフローにはエラー処理やログ出力、無人オートメーションなどが考慮されておらず、実際の業務にはまだ耐えられないという問題があります。

今回の記事では、**UiPath Studioに付属しているDocument Understanding Processのテンプレート**を利用して、ドキュメントの処理を行います。

# 1. テンプレートの概要紹介

Document Understanding Process(テンプレート)は、ドキュメント処理のフローをベースにした**UiPath Studioのプロジェクトテンプレート** です。
このテンプレートには、ログ出力、例外処理、リトライなど、Document Understandingワークフローで必要なすべてのメソッドが、オプションとして提供されています。

UiPath Studioを起動して、[スタート]パネル右側の[テンプレートから新規作成]より[Document Understanding Process]を選択して利用可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/565688f5-432f-8d20-9680-93a948953b7b.png)

UiPath Document Understanding Processのテンプレートの構成を見る前に、先にドキュメント処理のフローを見ましょう。

# 2. ドキュメント処理フロー

第１回から第３回まで、以下の処理フローで実装しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/5899eadb-ec69-6271-5673-d8cbc3b673fb.png)
これから紹介するテンプレートでは、以下の図のようなフローを提供し、必要な処理ロジックが全て含まれています。赤い枠の処理は、上記のフローには含まれていない追加の処理です。(＊画像をクリックすると、別ページで大きな画像が表示されます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/3153f5d4-9be6-d647-8981-bbbc3502255c.png)
実際の処理では、ユースケースによって必要なロジックが異なり、複数のロジックが一つに統合されたり、不要となったりすることがあります。そのため、上記のフローチャートよりもシンプルになることがあります。

フロー図での処理の中身を見てみましょう。
| 処理名 | 処理内容 | 
|:-----------|:------------|
| タクソノミー定義       | ドキュメントの論理的な種類や特定のドキュメントの種類で検出・取得が期待される情報の定義です       | 
| デジタル化の前処理       | ドキュメントをデジタル化する前に必要な処理。例：グレースケールの適用、歪みの補正など。        | 
| ドキュメントのデジタル化       |   ドキュメントのデジタル版が作成されます。スキャンされたドキュメントの場合、指定されたOCRエンジンが使用されます。      | 
| ドキュメントの分類      |  ドキュメントが分類されます。       | 
| 分類成功かの判断     |  分類が成功したかどうかを決定するために必要なビジネスロジックが含まれます。この決定に基づいて、分類の検証が必要になる場合があります。<sup>補足1<sup> | 
| 人間による分類結果の検証     |  自動分類が失敗した場合（または信頼性が低すぎる場合）、文書を人間のオペレーターに送信して、手動で分類/検証（または処理に適さない場合は拒否）します。       | 
| 分類結果のフィードバック     |  分類器の学習メカニズム（ある場合）の統合。<sup>補足2<sup>      | 
| データ抽出の前処理     |    実際のデータ抽出が始まる前に必要な処理。例：同じ入力ファイル内に複数の文書がある場合、それらを適切に分割します。     | 
| データ抽出    |    適切な抽出器を使用してデータを抽出します。     | 
| 人間による検証するか     | このステップには、抽出されたデータの人間による検証が必要かどうかを決定するために必要なビジネスロジックが含まれます（信頼度レベル/OCR信頼度/欠落データのチェックなど）。 <sup>補足1<sup>       | 
| 人間による抽出結果の検証     |  人間のオペレーターが自動的に抽出されたデータを修正したり、欠落したデータを手動で抽出したりできます。       | 
| 抽出結果のフィードバック     | 抽出器の学習メカニズム（ある場合）の統合。<sup>補足2<sup>        | 
| 抽出結果の後処理     |  抽出されたデータをエクスポートする前に、関連する処理を行います。例：データを特定のフォーマットに変換することです。       | 
| データエクスポート     |   他のプロセスまたはビジネスユーザーで使用できるように、データをエクスポートすることです。      | 
| データエクスポートの後処理     |    エクスポートされたデータを処理することを意味し、例えば、複数の文書から抽出されたデータを単一の結果にマージすることが挙げられます。     | 


:::note info
- 補足1: 人間の検証が必要かどうかを決定するのはビジネス上の決定です。
- 補足2: 人間によって検証されたデータだけでトレーニングすることが推奨されますが、必須ではありません。
:::

# 3. テンプレートの全体構成

ドキュメント処理フローの全体像が理解できたら、それに対応したテンプレートの全体構成を確認しましょう。
先ほど作成したUiPath Studioのプロジェクトの「DU_Framwork_Sample」を開いて、左側のプロジェクトパンネルの各ファイルとファイルの中身は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/3f8a6898-88bf-11e3-d004-a97644b2f40b.png)
- Data フォルダ：処理対象のドキュメント、処理済みの出力ファイル、設定ファイル
- DocumentProcessing フォルダ：分類や抽出をする際に、利用される設定ファイル
- Framework フォルダ：上記のドキュメント処理フローに沿った各処理のワークフロー
- Main-ActionCenter.xaml：無人オートメーションとして実行する際のメインワークフロー(入口)
- Main-Attended.xaml：有人オートメーションとして実行する際のメインワークフロー(入口)

## 3.1 実行してみよう

テンプレートより作成したプロジェクトを実行して動作を確認します。先に必要最低限な環境設定をします。

### 環境設定

プロジェクトを実行する前に、設定する項目があります。[Data\Config.xlsx]を開いて、「Assets」シートを確認します。「Assets」シートで記載している項目は、Orchestratorに設定するアセット<sup>補足</sup>です。この中で必須設定になっているのは`DocumentUnderstandingApiKey`です。以下の手順で設定します。

- UiPath Cloudの管理ページ `https://cloud.uipath.com/**組織名**/portal_/admin`へアクセスして、ライセンスボタンをクリックします。
-  ライセンスの管理画面で、ロボットとサービスタブに切り替えて、以下の画面のように、**DocumentUnderstandingのAPIキー**を取得して、メモに書きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/c7742768-24f0-d9ef-cc45-6ff4d000fe58.png)

- 次に、Orchestratorのフォルダに該当APIキーのアセットを作成しますので、Orchestratorの画面に遷移してください。
- プロセスが実行するフォルダ(例:AIOCRフォルダ)を選択して、上のアセットタブをクリックして、次に**新しいアセットを作成**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/7e2f847f-f67a-c755-b325-3d3ccd2368db.png)
- [Data\Config.xlsx]「Assets」シートでのアセット名`DocumentUnderstandingApiKey`をアセット名にして、アセット値のTextが先程メモしたAPIキーを入力して、作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/3cb961e7-cc5e-a172-efb9-b3065647b4b4.png)

:::note info
補足:
アセットとは通常、異なるオートメーション プロジェクトで使用可能な共有の変数または資格情報を意味します。アセットを使用して固有の情報を保存することで、ロボットがその情報に容易にアクセスできるようになります。詳細な情報は[アセットについて](https://docs.uipath.com/ja/orchestrator/standalone/2022.10/user-guide/about-assets)をチェックしてください。
:::

:::note info
補足:
Studioで「デバッグ」モードで実行する際に、エラーが発生しますので、「Assets」シートで不要な項目を一旦削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/fd6efe33-d23c-5df1-a67e-4eddc7113909.png)

Studioで「実行」モードで実行すると、異常処理があるため、エラーが発生しないです。
:::

### ワークフロー実行

環境設定が完了したら、ワークフローを実行してみましょう。UiPath Studioから実行する際には、アセットを使用するため、UiPath Studioで選択しているフォルダはアセットの存在フォルダである必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/5f364441-ec85-833f-8e98-051d158e09c7.png)

- テンプレートでは、デフォルトとして、`Main-ActionCenter.xaml`になっています、これが**無人オートメーション**実行時利用するワークフローです。今回のまず**有人オートメーション**で実行するので、以下のように変更して、`Main-Attended.xaml`をメインに設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/122155d1-4141-2d45-94e7-de4202b24bc1.png)

:::note info
Studio ワークフローアナライザーが有効化にしている場合は、ワークフロー実行する際に、Error ST-DBP-024 Persistenceのエラーが発生しますので、`Main-ActionCenter.xaml`ファイルを「パブリッシュから除外」にしてください。
:::

- UiPath Studioからワークフローを実行します。
- 実行開始したら、次のようなファイル選択のダイアログが表示されますので、プロジェクトフォルダ内の[Data\ExampleDocuments\MergedDocuments.pdf]ファイルを選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/5d08a0d0-8e91-6653-7f4e-39ac1127784f.png)
- UiPath Studioでの出力パネルを確認して、どんな処理がされているかを確認してみてください。
- 実行が進むと、UiPath 分類ステーションが表示されます。1つのPDFファイルに複数のページが含まれているため、ページ数の分が分類されます。分類が正しいか確認してください、問題なければ保存をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/acd2f727-3d25-d339-3cba-895c731763e7.png)

- 次に、抽出結果の検証になるので、UiPath 検証ステーションが表示されます。分類ステーションと異なって、こちらは一回の表示で一ページのドキュメントです。抽出結果が正しいか確認して、問題なければ送信をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/679de06a-7178-c66b-b64d-7553577c5962.png)
残りのページの抽出結果の検証ステーションも同様ですので、ここで説明を省略します。
- これで一通り実行が完了したら、プロジェクトの[Data\Exports]に抽出結果のExcelファイルが作成されますので、確認してみてください。

## 3.2 プロジェクトファイルの詳細

テンプレートを利用して、自身のビジネスケースに合わせてカスタマイズする前に、各プロジェクトファイルの中身や役割を理解する必要があります。

:::note info
下記の各ファイルの説明はテンプレートの22.10版に基づいたものです。最新の説明はテンプレートのプロジェクトフォルダ内にある `UserGuide\Document Understanding Process - User Guide.pdf`をチェックしてください。
:::


- \:file_folder: **Data\Config.xlsx**
プロジェクト全体の設定ファイルです。
必要に応じて設定してください。例えば、ActionCenterを利用する場合には、「Settings」シートでの`StorageBucketName`を設定します。詳細に関しては、`Config.xlsx`ファイルでのDescription欄をご参照ください。

- \:file_folder: **Main-Attended.xaml**
有人オートメーションのDocument Understandingプロセスのメインとして設定して使用するワークフローです。
設定するパラメータ：
    - **in_TargetFile**: 処理するドキュメントのファイルパスです。デフォルトは`設定なし`です。
    - **in_UseQueue**: Orchestratorでのキューを利用するかの設定です。デフォルトは`False`です。`True`の場合は、`in_TargetFile`に値が設定されていても無視されます。処理するドキュメントファイルパスがOrchestrator キューから取得します。

- \:file_folder: **Main-ActionCenter.xaml**
無人オートメーションのDocument Understandingプロセスのメインとして設定して使用するワークフローです。
Action Centerを利用して人間による検証を行います。設定するパラメータ：
    - **in_TargetFile**: 処理するドキュメントのファイルパスです。デフォルトは`設定なし`です。
    - **in_UseQueue**: Orchestratorでのキューを利用するかの設定です。デフォルトは`True`です。`True`の場合は、`in_TargetFile`に値が設定されていても無視されます。処理するドキュメントファイルパスがOrchestrator キューから取得します。

- \:file_folder: **Framework\00_ReadConfigFile.xaml**
実行時にConfigファイルの内容を辞書型の変数に読み込みます。(＊Orchestratorでのアセットを取得しません。)

- \:file_folder: **Framework\00_ReadConfigFile.xaml**
タクソノミとOrchestratorアセットをロードするワークフロー。プロセス固有の初期化コードはここに含まれます。

- \:file_folder: **Framework\15_GetTransactionItem.xaml**
Orchestratorキューを使用する場合にTransaction Itemを取得します。処理対象のドキュメントはTransaction ItemのSpecificContent内のTargetFileキーにあります。
また、Configの辞書型変数で使用しやすいように、すべてのTransaction ItemのSpecificContentをConfigの辞書型変数にロードします。

- \:file_folder: **Framework\20_Digitize.xaml**
デジタル化の前処理及びドキュメントのデジタル化のためのワークフローです。
ワークフローでUiPath Document OCRエンジンを使用しています。

- \:file_folder: **Framework\30_Classify.xaml**
ドキュメントの分類のためのワークフローです。
このワークフローでは、すべてのドキュメントタイプに対してインテリジェントキーワード分類器を使用しています。

- \:file_folder: **Framework\35_ClassificationBussinessRuleValidation.xaml**
分類成功かの判断のためのワークフローです。
分類成功を決定するためにカスタムロジックが必要であり、デフォルトではすべての結果が人間の検証に送信されます。

- \:file_folder: **Framework\Framework\40_TrainClassifiers.xaml**
分類結果のフィードバックのためのワークフローです。
このワークフローでは、すべての文書タイプに対してインテリジェントキーワード分類器トレーナーを使用しています。また、学習ファイルを更新する際のアクセスを調整するために、LockFile/UnlockFile再利用可能なワークフローも使用しています。

- \:file_folder: **Framework\50_Extract.xaml**
データ抽出の前処理とデータ抽出のためのワークフローです。
このワークフローでは、以下の四つの抽出器を利用しています。
    - 正規表現ベースの抽出器：定型証明書の抽出用
    - インテリジェントフォーム抽出器：定型W-9書類の抽出用
    - マシンラーニング抽出器：Receiptsの抽出用、既にトレーニング済のReceiptsのエンドポイントを利用してます
    - マシンラーニング抽出器：Invoicesの抽出用、既にトレーニング済のInvoiceのエンドポイントを利用してます
抽出器の設定が以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/eb7f74f9-d343-e67d-15c2-421b26669ee9.png)

- \:file_folder: **Framework\55_ExtractionBussinessRuleValidation.xaml**
人間による抽出結果の検証のためのワークフローです。
抽出成功を決定するために、プロセス固有のビジネスルールに基づくカスタムロジックが必要です。すべてのドキュメントを手動検証するためにフラグを設定することもできます。デフォルトでは、すべての結果は人間の検証に送信されます。

- \:file_folder: **Framework\60_TrainExtractors.xaml**
抽出結果のフィードバックのためのワークフローです。
このワークフローでは、以下の二つ抽出器トレーナーを利用しています。
    - マシンラーニング抽出器トレーナー：Receiptsの抽出用、既にトレーニング済のReceiptsのエンドポイントを利用してます
    - マシンラーニング抽出器トレーナー：Invoicesの抽出用、既にトレーニング済のInvoiceのエンドポイントを利用してます
抽出器の設定が以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/acc604e4-0e88-d628-1916-a3fcdd680b1a.png)

- \:file_folder: **Framework\70_Export.xaml**
抽出結果の後処理とデータエクスポートのためのワークフローです。
このワークフローでは、抽出したデータをExcelファイルに書き込むシンプルな仕組みを使用していますが、データサービス、データベース、CSV、JSON形式などに書き込みも可能です。

- \:file_folder: **Framework\80_EndProcess.xaml**
データエクスポートの後処理や片付けのためのワークフローです。

- \:file_folder: **Framework\ReusableWorkflows\InvoicePostProcessing.xaml**
デフォルトのOOTBモデルを使用して請求書の後処理のためのワークフローです。
チェックするルールセットは、Configファイルの専用シートに定義されています。ルールセットとロジックは、ビジネスプロセスに応じて必要に応じて更新する必要があります。

- \:file_folder: **Framework\ERR_HandleDocumentError.xaml**
分類された文書の処理中に例外が発生した場合に実行されるワークフローです。

- \:file_folder: **Framework\ERR_AbortProcess.xaml**
プロセスが終了する例外が発生した場合に実行されるワークフローです。ここには、エラーのクリーンアップやエラー通知を送信するためのコードが含まれます。

- \:file_folder: **Framework\ReusableWorkflows\GetWritePermission.xaml**
分類器トレーニングファイルへの書き込みアクセスを調整するセマフォメカニズムとして、単一のキューアイテムを使用するヘルパーワークフローです。

- \:file_folder: **Framework\ReusableWorkflows\GiveUpWritePermission.xaml**
分類器トレーニングファイルへの書き込みアクセスを調整するセマフォメカニズムとして、単一のキューアイテムを使用するヘルパーワークフローです。

- \:file_folder: **Framework\ReusableWorkflows\LockFile.xaml**
簡易なロック/アンロック機能を使用して、分類器トレーニングファイルへの書き込みアクセスを制御するヘルパーワークフローです。

- \:file_folder: **Framework\ReusableWorkflows\UnlockFile.xaml**
簡易なロック/アンロック機能を使用して、分類器トレーニングファイルへの書き込みアクセスを制御するヘルパーワークフローです。

- \:file_folder: **Framework\ReusableWorkflows\SetTransactionProgress.xaml**
処理中のトランザクションアイテムのTransactionProgressを更新するワークフローです（キューを使用する場合）。

- \:file_folder: **Framework\ReusableWorkflows\SetTransactionStatus.xaml**
トランザクションのステータスを設定し、ログに記録するワークフローです。


# 4. 終わりに

本記事では、以下の点を説明しました。
- ドキュメント処理に必要な全てのステップ
- テンプレートを利用したプロジェクトを有人オートメーションとして実行する際に、必要な最低限環境設定
- 有人オートメーションとして実行する際の動き
- テンプレートでのファイル構成

次回では、テンプレートを利用して、日本語ドキュメントを処理する際に(有人オートメーション)、どのように修正するかを解説していきます。

# 参考情報

https://www.youtube.com/watch?v=eMa4KP1BeLo


https://docs.uipath.com/ja/document-understanding/automation-cloud/latest/user-guide/document-understanding-framework-capabilities-overview