【UiPath】フォームAIを使ってみた

# はじめに

- 本記事では、UiPath バージョン 23.4 の Document Understanding のフォームAIの使い方を紹介します。
- 記事の内容は、個人の見解または確認結果であり、UiPath の公式見解ではありません。
- 製品仕様や参考画像は 23.4 バージョンで構成しています。

# フォームAIとは

UiPath のドキュメント処理製品（Document Understanding）のデータ抽出方法の一つで、***最も手軽に作成できる抽出器***です。

https://docs.uipath.com/ja/document-understanding/automation-cloud/latest/user-guide/forms-ai

どのくらい手軽？
→　例えば、***領収書（レシート）などの抽出器の作成であれば、次の4ステップでつくれます。***（5分あればできます）
1. フォームAIの新規作成
1. サンプルドキュメント（2個でも可能）のアップロード
1. ラベリング
1. パブリッシュ

「データ抽出オートメーションビルダー」を使う場合はサンプルドキュメントは1つでもデータ抽出可能です。（以下の記事参考）

https://qiita.com/Kajiita/items/19931c8b6c6248ec0055#2%E3%83%87%E3%83%BC%E3%82%BF%E6%8A%BD%E5%87%BA%E3%82%AA%E3%83%BC%E3%83%88%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%93%E3%83%AB%E3%83%80%E3%83%BC

# そんなに手軽なら基本フォームAIを使えばいいの？

いいえ。AIと名のつく製品は学習とセットになるため、***事前学習済みのモデルが存在しないドキュメント（帳票）については導入は現実的ではありません。***

すぐに使える事前トレーニング済みの ML パッケージ（公式ガイド参考）：

https://docs.uipath.com/ja/document-understanding/automation-suite/2023.4/user-guide/out-of-the-box-pre-trained-ml-packages

UiPath が提供する事前学習済みのモデルは ***数千、それ以上？（正確な学習量は知ることができません）の学習データにてトレーニングがなされています。***
事前学習済みのモデルを利用できない場合、フォームAIとはいえ、利用者自身で大量の機械学習をおこなう必要があるのです。

事前学習済みのモデルがある場合、サンプルドキュメントをアップロードした時点で、
適用される既存の学習済みモデルが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/44d9e6e4-aaae-466d-4d0e-79f31b0de601.png)
適用可能なモデルがあるのであれば、フォームAIは活躍できる可能性があるため最初に使ってみることをお勧めします。

# 抽出器の作り方

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/1c830337-fcd4-0541-e376-c25384540782.png)
Document Understanding の対象プロジェクトのトップ画面右上の「新しいドキュメント種類」の選択肢から「フォームAIを使用」を選びます。
![checkPositionData.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/79d28ee7-b7fc-542e-6cc8-4bcb3f7dfb4c.jpeg)
サンプルドキュメントをインポートします。（***画像は1枚ですが、パブリッシュする際は最低2枚以上必要なので、サンプルは複数枚用意しましょう***）
![checkPositionData2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/66015c87-0f8d-2728-ee50-ef6c16bfc31f.jpeg)
インポートしたドキュメントをラベリングします。
（フィールドを追加したら、認識させたい文字を選択してラベリング用のキーを押下するだけです。参考キャプチャを例にすると、A2の「入力例です。」を選択してキーボードの「2」を押下すればOKです）
![checkPositionData3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/e20ca40f-d4ef-3c9f-013e-160ed7a7b5c8.jpeg)
![checkPositionData4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/a74aeaad-2f1c-e1ab-64e3-b10d49c802dc.jpeg)
画面右上の「パブリッシュ」ボタンを押下します。
![checkPositionData5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/a363e816-5890-41f1-7322-24ff6cca830c.jpeg)
これだけですよ！！これだけでAIの抽出器モデルがつくれるんです(@_@)

# 抽出器の使い方

![checkPositionData6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/134dc96c-2a03-837b-b28b-419a6e1ef1a4.jpeg)
「パッケージを管理」より UiPath.DocumentUnderstanding.Activities をインストールします。
今回は最も簡単にドキュメントデータの抽出・結果取得ができる「ドキュメント データを抽出」アクティビティを使います。
こちらのアクティビティは、入力データを IResource 型で指定する必要があります。
このため、***「パスの存在を確認」アクティビティなどを配置し IResource 型の出力を用意しましょう。***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/f19cd920-47a2-35cf-c837-169db4bc8551.png)
「ドキュメント データを抽出」アクティビティの出力オブジェクトは ***「オブジェクト名.Data.フィールド名.Value」で値を取り出すことが可能です。***
![checkPositionData9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/e2019e81-a193-bade-803d-7ef919c31e22.jpeg)

::: note warn
プロジェクト名に日本語が入っていると以下のエラーが発生するので、プロジェクト名は半角英数字のみとしましょう。
***ドキュメント データを抽出: Request headers must contain only ASCII characters.***
:::

さて、事前学習済みのモデルはありませんが、とりあえず動くモデルができたので挙動確認します。

以下を学習（トレーニング）させた後、
![トレーニングデータ1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/8c8fda1c-82d3-b449-4336-488ea1d18b67.jpeg)
こちら（↓）が完璧に読めて
![トレーニングデータ8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/c37a34d1-cc61-589c-541d-e05234920cf6.jpeg)
こちら（↓）が一切読めないことから
![トレーニングデータ7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/e3748f78-96da-10a0-b16b-5da39fe4e9f4.jpeg)
***各フィールド、学習させた領域のサイズを超えたインプットは認識できない様です。
（※領域のサイズ内は読めた）
= つまり、フォームAIで入力欄の値を漏れなく読み取ろうとおもったら、少なくとも入力欄に対する最大インプットの学習が必須になるということです。***

![トレーニングデータ5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/f21bcc75-1b73-3c9d-bb2c-6b45e1b7e419.jpeg)
領域の判定ロジックを見極めたいため、上の様な半角数字のみのサンプルを幾つか（5桁、10桁、15桁、それ以上）投入しましたが
数字のみのデータは学習方法に何かコツがいるのかもしれませんが、数枚の追加トレーニング後では値を認識することはできませんでした。
![checkPositionData11_数字のみの文字列は学習させても読めなかった.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/c16bbcd3-1596-4560-8eb4-fb412002c7ef.jpeg)
「：（コロン）」が抽出されているので、何かを学習して、抽出ロジックに反映してるのは間違いないのですが、詳細は不明・わからない。

なお、数値を含む文字列についても、***10枚学習させた際に以下の様に認識しました！！***
![checkPositionData15_10枚学習させた成果がちょっと出た例.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/72355fc7-5276-14bf-99d6-ef30e2477fcd.jpeg)
***真ん中のA2フィールドは入力文字数を短めに制限していたので、抽出文字列が「遷加学」となっています。（※読み込ませたドキュメントの文字列は「追加学習12345」です。）***

事前学習済みのモデルをつかえば、サンプルドキュメントが1つでも多くの項目は自動で意図した値で抽出できます↓↓（以下、参考記事）

https://qiita.com/Kajiita/items/19931c8b6c6248ec0055#2%E3%83%87%E3%83%BC%E3%82%BF%E6%8A%BD%E5%87%BA%E3%82%AA%E3%83%BC%E3%83%88%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%93%E3%83%AB%E3%83%80%E3%83%BC

::: note warn
挙動確認中に躓いたポイントをシェアします↓↓
***再学習して、新しい抽出器をパブリッシュした際、Studio の「ドキュメント データを抽出」アクティビティでは、抽出器の変更にあわせて”出力変数”も再作成しましょう。***
抽出器のみ変更して、出力変数をあらためない場合、以下のエラーが発生します。
ドキュメント データを抽出: Unable to cast object of type 'UiPath.IntelligentOCR.StudioWeb.Activities.DataExtraction.DocumentData`1[UiPath.IntelligentOCR.StudioWeb.Activities.SWEntities.ExtendedExtractionResultsForDocumentData.ExtractionTest4.Bundle.ExtractionTest4]' to type 'UiPath.IntelligentOCR.StudioWeb.Activities.DataExtraction.IDocumentData`1[UiPath.IntelligentOCR.StudioWeb.Activities.SWEntities.ExtendedExtractionResultsForDocumentData.CheckPositionData.Bundle.CheckPositionData]'.
:::

# さいごに

フォームAIは抽出器の作成およびStudioからの呼び出し実装のコストが極めて低いため、マッチしそうな案件であれば積極的にお試しいただくのをお勧めします。
逆に、とりあえず身近のちょっとしたデータの読み取りをおこないたいんだけど、といった場合はフォームAIではなく『フォーム抽出器』をご利用ください！
フォームAIでやる場合は相応の学習コストが必要なんだということを覚えておいていただけますと幸いです。(-ω-)/