【UiPath】マルチモーダル対応アクティビティで画像分析や文字抽出をする

# はじめに
- 本記事では **UiPath GenAIアクティビティ** にて最近追加されました [画像分析アクティビティ](#%E7%94%BB%E5%83%8F%E5%88%86%E6%9E%90%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%93%E3%83%86%E3%82%A3) と [オブジェクトを検出アクティビティ](#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E6%A4%9C%E5%87%BA%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%93%E3%83%86%E3%82%A3) の利用方法について説明します。
- 従来の [コンテンツを生成アクティビティ](https://docs.uipath.com/ja/activities/other/latest/integration-service/uipath-uipath-airdk-content-generation) ではテキストの入出力のみが可能でしたが、画像分析アクティビティおよびオブジェクトを検出アクティビティでは画像とテキストを入力する、いわゆる **マルチモーダル** を扱えるようになりました。
- これらのアクティビティによって指定画像の説明文生成や画像内の文字列抽出など、画像を元にしたテキスト処理が可能になります。

## UiPath GenAIアクティビティとは？
- UiPath GenAIアクティビティとは生成AIアプリの開発をローコードで実現可能な機能群(パッケージ)であり、UiPathのSaaS型サービスであるAutomation Cloud環境にて利用可能です。
- また生成AIアプリに必須となる大規模言語モデル(LLM)はUiPath社が管理・運用しているものを利用するため、ユーザー側で新たにデプロイする必要はなく、Automation Cloudアカウントがあればすぐに利用開始できます。
- 利用可能なアクティビティ一覧は [こちら](https://docs.uipath.com/ja/activities/other/latest/integration-service/uipath-uipath-airdk-activities) をご参照ください。

    :::note warn
    UiPath GenAIアクティビティはAutomation CloudのCommunity版でも現在利用可能ですが、今後 [AIユニット](https://docs.uipath.com/ja/overview/other/latest/overview/service-licensing#ai-units) ライセンスが必要となる可能性があります。
    本番利用にあたってはライセンスのご購入をご検討ください。
:::

# 画像分析アクティビティ
まず [画像分析アクティビティ](https://docs.uipath.com/ja/activities/other/latest/integration-service/uipath-airdk-airdk-image-analysis) の利用手順について説明します。このアクティビティでは指定画像に関する説明文の生成や文字抽出などのテキスト処理を行うことができます。
大まかな利用手順は次の通りです。
1. 処理対象の画像を準備
2. Integration ServiceにてGenAIアクティビティのコネクタを作成
3. 画像分析アクティビティを使う① (画像のPublic URLを指定)
4. 画像分析アクティビティを使う② (OneDrive上の画像ファイルを指定)

## 1. 処理対象の画像を準備
処理対象となる画像を指定フォーマットに従って準備します。
- 利用する言語モデルごとに処理可能な画像フォーマットが決まっています。

|言語モデル|画像フォーマット|
|---|---|
|GPT-4o|PNG, JPEG, WEBP, GIF (ただしアニメーションGIFは除く)|
|Gemini 1.5 Flash|PNG, JPEG|
|Gemini 1.5 Pro|PNG, JPEG|

- 上記以外の画像フォーマットの場合にはあらかじめ画像ツールなどを使ってPNGやJPEGなどに変換しておきます。

## 2. Integration ServiceにてGenAIアクティビティのコネクタを作成
GenAIアクティビティを利用するためにコネクタを作成します。
- [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 > コネクションにて **コネクションを追加** をクリックします。
    ![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/33770e55-fc17-2d70-84fd-a3ae52d83259.png)

- **UiPath GenAI Activities**を選択し、**接続** をクリックします。
    ![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/369acac5-fb7e-76f9-1b34-d0e7ae9a66fd.png)

    ![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/600dff1f-1b35-c820-8d3a-de5f388b140f.png)

## 3. 画像分析アクティビティを使う① (画像のPublic URLを指定)
画像分析を行うためのワークフローを作成します。ここではインターネット上に公開されている画像を使用します。
- 左メニューよりStudio Webの管理画面に遷移します。
    ![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/fbe93fa1-03c0-39e9-a491-bde1a6a38275.png)

- **新しいプロジェクト** をクリックして、新規ワークフローを作成し、オートメーションのトリガーとして「手動のオートメーション」を選択します。
    ![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/d16159ed-a696-04f4-f082-b746bfb21ccb.png)

- (+)をクリックし、UiPath GenAI Activitiesの **画像分析** を選択します。
    ![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/5213d98f-8546-6de2-4b91-84dc3677e595.png)

- **画像分析** アクティビティにて次のように値をセットします。
    - モデル名: `gpt-4o-2024-05-13`
    - プロンプト: 質問文を入力します。今回の例では画像に関する説明文を生成したいので「`指定した画像について日本語で説明してください`」と入力します。
    - 画像の種類: `Public URL`
    - パブリック URL: `https://collectionapi.metmuseum.org/api/collection/v1/iiif/39799/140190/main-image`
        - ここでは [メトロポリタン美術館](https://www.metmuseum.org/) の葛飾北斎の [神奈川沖浪裏](https://www.metmuseum.org/art/collection/search/39799) の画像URLを直接指定しています。
    ![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/e8f916c9-05de-a5fb-63e8-d46cca3f1cb1.png)

- (+)をクリックし、**メッセージをログ** を選択します。
    ![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/54eb2df2-39b7-192a-ee52-1fe622163c02.png)

    - メッセージとして、変数を使用 > 画像分析 > **Text** を選択します。これによって指定画像とプロンプトに対する応答が表示されます。
    ![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/2ac4dc42-1513-a15d-3411-c11fd33db5b4.png)

- **テスト** をクリックしてワークフローを実行します。
    ![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/5fda96fe-8ed9-4aa1-bf54-0cd7c0330524.png)
    - 下記のような回答が出力されていることを確認します。
    ```
    この画像は、葛飾北斎の代表作「富嶽三十六景」の一つである「神奈川沖浪裏」です。
    この浮世絵は巨大な波が押し寄せる瞬間を描き、波の力強さと動きを巧みに表現しています。
    波の中に小舟がいくつか乗り上げ、漕ぎ手たちが必死に波に立ち向かっている様子が描かれています。
    背景には穏やかな富士山が見え、対照的な静と動が強調されています。
    全体として、自然の猛威と人間の小ささ、そして日本のアイコンである富士山の美しさが見事に融合した作品です。
    ```

このように指定画像の説明文を生成することが可能です。

## 4. 画像分析アクティビティを使う② (OneDrive上の画像ファイルを指定)
次にOneDrive上の画像ファイルを分析する手順について説明します。今回の例では画像内の表を読み取ってCSV形式で出力します。
- OneDrive上のファイルにアクセスするには、**Microsoft OneDrive & SharePoint** のコネクタを作成します。左メニューよりIntegration Serviceの画面に遷移します。

    ![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/f84bb6e3-bb07-80d6-e957-3e4ca0c43bf0.png)

- Microsoft OneDrive & SharePoint コネクタを選択し、**Microsoft OneDrive & SharePointに接続** をクリックします。
    ![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/8dad9838-8f1b-2c5b-b4ac-2cdc098f1f62.png)

- 環境は既定値の **Office 365 (default)** を選択して **接続** をクリックし、Microsoftアカウントにてサインインします。
    ![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/801a39ea-af8b-1000-f6ac-5c042c7e7ccd.png)

- 次に同じMicrosoftアカウントにてOneDrive (`https://*-my.sharepoint.com`) にサインインし、テスト用のフォルダーを作成します。
    ![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/21d9fafb-35df-4198-1849-f0bfb9d21da8.png)

- `Images` というフォルダーを作成し、テスト用の画像をアップロードします。
    ![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/6180d233-d065-3a86-c707-b5a17d6ebb36.png)

    - ここでは [UiPathプロダクトライフサイクル > 自動化](https://docs.uipath.com/ja/overview/other/latest/overview/product-lifecycle#automate) の表の一部を画像にしたものを使用します。
    ![UIPath_ProductLifeCycle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/eb8e081b-260e-e83f-dd2a-e8878c1ced7f.png)

- Studio Webにて別のワークフローを作成し、手動トリガーを選択します。(+)をクリックし、Microsoft 365の **ファイル/フォルダーを取得** アクティビティを追加します。
    ![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/c1a0bbf3-b55b-9246-4c89-e9e2f31d40c8.png)

- **ファイル/フォルダーを取得** アクティビティにて **ファイルまたはフォルダー** のアイコンをクリックし、先ほどアップロードした画像ファイルを指定して保存します。
    ![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/f1f1a1e1-ec93-eff4-613c-0d6675ba3863.png)

- (+)をクリックして、**画像分析** アクティビティを追加し、次のように設定します。
    - モデル名: `gpt-4o-2024-05-13`
    - プロンプト: `指定画像の表を読み取ってCSV形式で出力して`
    - 画像の種類: `File`
    - ファイル: 変数を使用 > ファイル/フォルダーを取得 > `ファイルまたはフォルダー`
    ![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/6f42d967-628f-8ee0-c15d-c14bb3c16422.png)

- **その他のプロパティを表示** クリックし、最大トークン数を `4096` に変更します。これは応答文のトークン上限の既定値では出力が途中で途切れてしまう可能性があるため、上限値を増加させています。
    ![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/63d50263-99f7-b172-f5e5-4db085853bbc.png)

- (+)をクリックし、**メッセージをログ** を選択します。
    - メッセージとして、変数を使用 > 画像分析 > **Text** を選択します。これによって指定画像とプロンプトに対する応答が表示されます。
    ![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/4b1a78b0-a45d-70c8-0c1f-d0c38f255600.png)

- **テスト** をクリックしてワークフローを実行します。
    ![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/cc486b2e-22de-9303-a1a7-a028943b48f2.png)

- 下記のような回答が出力されていることを確認します。

    ```
    製品,バージョン,サポート モデル,初回リリース日,メインストリーム サポート終了日,延長サポート終了日
    Studio StudioX,2024.10.1,LTS,2024年7月1日,2026年7月1日,2027年7月1日
    Studio StudioX,2023.10.8,LTS,2023年10月25日,2025年10月25日,2026年10月25日
    Studio StudioX,2023.4.9,LTS,2023年4月27日,2025年4月27日,2026年4月27日
    Studio StudioX,2022.10.14,LTS,2022年10月27日,2024年10月27日,2025年10月27日
    Studio StudioX,2022.4.10,LTS,2022年5月9日,2024年5月9日,2025年5月9日
    Studio StudioX,2021.10.10,LTS,2021年10月27日,2023年10月27日,2024年10月27日
    Studio StudioX,2020.10.15*,LTS,2020年10月28日,2022年10月28日,2023年10月28日
    Data Service 次の値に含まれる Automation Suite,2023.10.5,LTS,2023年11月3日,2025年11月3日,2026年11月3日
    Data Service 次の値に含まれる Automation Suite,2023.4.8,LTS,2023年4月26日,2025年4月26日,2026年4月26日
    Data Service 次の値に含まれる Automation Suite,2022.10.13,LTS,2022年11月14日,2024年11月14日,2025年11月14日
    Data Service 次の値に含まれる Automation Suite,2022.4.14,LTS,2022年5月23日,2024年5月23日,2025年5月23日
    Document Understanding 次の値に含まれる Automation Suite,2023.10.5,LTS,2023年11月3日,2025年11月3日,2026年11月3日
    Document Understanding 次の値に含まれる Automation Suite,2023.4.8,LTS,2023年4月26日,2025年4月26日,2026年4月26日
    Document Understanding 次の値に含まれる Automation Suite,2022.10.13,LTS,2022年11月14日,2024年11月14日,2025年11月14日
    Document Understanding 次の値に含まれる Automation Suite,2022.4.14,LTS,2022年5月23日,2024年5月23日,2025年5月23日
    Document Understanding 次の値に含まれる Automation Suite,2021.10.10,LTS,2021年11月3日,2023年11月3日,2024年11月3日
    ```

このようにOneDrive上の画像から文字列を抽出して特定のフォーマットで出力することが可能です。

# オブジェクトを検出アクティビティ
- 次に [オブジェクトを検出アクティビティ](https://docs.uipath.com/ja/activities/other/latest/integration-service/uipath-airdk-airdk-detect-object) の利用方法について説明します。上記で説明した **画像分析アクティビティ** は画像内のすべての文字を抽出できましたが、特定オブジェクト(エンティティ)に関する文字列をピンポイントで抽出するには **オブジェクトを検出アクティビティ** が便利です。

- 例として不動産物件の間取り図から各部屋の広さを検出してみます。サンプルは [イラストACのサイト](https://www.ac-illust.com/main/detail.php?id=1646253&word=%E9%96%93%E5%8F%96%E3%82%8A-56) より拝借します。

- OneDriveの `Images` フォルダーに間取り図を `madori.jpg` というファイル名でアップロードします。
    ![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/4e1e91d8-7380-39ad-5ae1-ed6464004910.png)

- Studio Webにて **新しいプロジェクト** をクリックして、新規ワークフローを作成し、オートメーションのトリガーとして「手動のオートメーション」を選択します。
    ![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/d16159ed-a696-04f4-f082-b746bfb21ccb.png)

- (+)をクリックし、Microsoft 365の **ファイル/フォルダーを取得** を選択し、ファイルとして `madori.jpg` を指定して保存します。
    ![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/b1255dbb-0307-3aca-d19b-b32256253a2b.png)

- (+)をクリックし、UiPath GenAI Activitiesの **オブジェクトを検出** を選択します。
    ![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/f77501b7-9d4a-a526-1c8d-f4701696b238.png)

- **オブジェクトを検出** アクティビティにて、エンティティ > その他を表示 > **ディクショナリ ビルダー** をクリックします。
    ![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/16e050ff-8b4c-4335-6bf0-85c087716d74.png)

- 検出するエンティティ(今回の例では各部屋の情報)を **Entity name** (検出対象のエンティティ名) と **Description** (エンティティを検出するための指示や説明文) のペアで次のように指定して保存します。
    - `リビング`: `広さ(x畳またはx帖)を検出`
    - `ダイニング`: `広さ(x畳またはx帖)を検出`
    - `キッチン`: `広さ(x畳またはx帖)を検出`
    - `洋室`: `広さ(x畳またはx帖)を検出`
    - `和室`: `広さ(x畳またはx帖)を検出`
    - `クローゼット`: `有または無で検出`
    ![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/ccc5a970-6a94-8dfb-0bec-387a2f3535bb.png)

- Image には 変数を使用 > ファイル/フォルダーを取得> **ファイルまたはフォルダー** を指定します。
    ![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/a25fa79a-311b-b8bf-705b-e2b21f910f37.png)

- (+)をクリックし、**メッセージをログ** を選択します。
    - メッセージとして、変数を使用 > オブジェクトを検出 > **Detected objects string** を選択します。これによって検出されたエンティティとその情報が表示されます。
    ![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/d512bbbe-130f-4b4e-146a-2ca7dcc36826.png)

- **テスト** をクリックしてワークフローを実行します。
    ![23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/a626acb6-d464-22e1-fbfa-e08b730a20ef.png)

- 下記のような回答がJSON形式で出力されていることを確認します。

    ```json
    [
        {
            "name": "リビング",
            "detected": "Yes",
            "details": "広さ9.0畳"
        },
        {
            "name": "ダイニング",
            "detected": "Yes",
            "details": "広さ8.5畳"
        },
        {
            "name": "キッチン",
            "detected": "Yes",
            "details": "広さ5.0畳"
        },
        {
            "name": "洋室",
            "detected": "Yes",
            "details": "広さ10畳"
        },
        {
            "name": "和室",
            "detected": "Yes",
            "details": "広さ6.0畳"
        },
        {
            "name": "クローゼット",
            "detected": "Yes",
            "details": "有"
        }
    ]
    ```

- 定義されたエンティティが検出された場合は `"detected": "Yes"` となります。`details` フィールドで各エンティティの情報が正しいか確認してみましょう。
- 余力があれば他の間取り図を読み込ませてワークフロー内の `Entity name` の項目や `Description` の記述を調整すると良いでしょう。

このように **オブジェクトを検出アクティビティ** は指定したオブジェクト(エンティティ)と指示文・説明文によって、画像内のエンティティの有無や関連する情報を抽出してJSON形式で出力することができます。

# おわりに
今回はUiPath GenAIアクティビティに最近追加されました **画像分析アクティビティ** と **オブジェクトを検出アクティビティ** を利用して、指定画像に関する説明文生成や画像内の特定文字を抽出する手順について説明しました。ぜひ皆さんも様々なユースケースでGenAIアクティビティをお試しください！