Pythonで作成したAIモデルをUiPathから呼び出して予測業務を自動化する方法【UiPath Python連携】

元気しとーと？ 博多に住んどうUiPathプリシェールス @ManabuTechばい。
（お元気でしょうか？ 博多に在住しておりますUiPathプリセールス ManabuTech です）

今回は、Pythonで作成したAIモデルをUiPathから呼び出して予測業務を自動化する具体的な方法を解説します。

今回の予測業務に使用するデータの解説は、AIを業務で利用するポイントと合わせてこちらで解説しています。

https://qiita.com/ManabuTech/items/6fa400d9f9ea20a009fc

Pythonの知識が無くてもAIを業務に適用できるAI Centerを利用した方法はこちらをご覧ください。

[作成したサンプルワークフローはGithubで公開しています](https://github.com/manabutech-kyushu/uipath-ai-boston-python-integ)

## AIモデルの作成方法

AIモデルの作成はPythonで行います。
基本的にPythonが扱えるAIエンジニアの作業となります。
業務担当者はAIエンジニアに作成してもらったPythonスクリプトをUiPath Studioで呼び出します。

データを正しくやり取りするために下記4つを明確にしておきましょう

・Pythonのファイル名
・呼び出すメソッド名
・引数（どのようなデータをメソッドに渡すか）
・戻り値（どのようなデータをメソッドから返してもらうか）

### 1. Pythonのインストール

UiPathはWindowsPCで動作します。
今回はWindows版64bitのversion3.10を利用しています。

https://www.python.org/downloads/windows/

### 2. 使用するPythonパッケージのインストール

pipコマンドでパッケージをインストールします。
今回使用したパッケージは3つです。pickleは標準ライブラリのためインストール不要です。

|パッケージ|概要|インストール|
|-|-|-|
|numpy|配列データの高速演算ライブラリ|必要|
|pandas|表形式データ処理ライブラリ|必要|
|sklearn|機械学習フレームワーク（便利な機能の詰め合わせ）|必要|
|pickle|オブジェクトを保存・復元する標準ライブラリ|不要|

パッケージのインストールはコマンドラインから可能です。
```
pip install numpy
pip install pandas
pip install sklearn
```

### 3. PythonでAIモデルの作成

AIモデルをPythonで作成します。
sklearn（scikit-learn）という機械学習のフレームワークを使用しています。
sklearnを用いることによってAIモデルを簡単に作ることができます。

scikit-learn アルゴリズムチートシートにはどのようなモデルを使用すればよいか書かれています。
今回は回帰（regression）でSGD Regressionなどがありますが、今回は基本的なAIモデルの「LinearRegression」を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/41133cb3-2f10-0578-929e-28df46fd6f86.png)

機械学習のフレームワークは「sklearn」の他には「tensorflow」「pytorch」などがありますが、どれを使用しても構いません。

事前にtrain関数を呼び出してAIモデルを学習しておき、pickleを使用して「model.pickle」というファイルに保存しています。
後ほどUiPath Studioからpredictというメソッドを呼び出しますが、ここでは保存しておいた予測するためのCSVファイルと「model.pickle」のパス（どこにファイルがあるかの情報）を引数として渡して、予測したデータをリスト形式で受け取ります。

```python
import numpy as np
import pandas as pd
import pickle
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

def train(csvFilePath):
    csv_data = pd.read_csv(csvFilePath, sep=',', dtype=np.float64)
    features = csv_data.drop('MEDV', axis=1)
    training_features, testing_features, training_target, testing_target = \
    train_test_split(features, csv_data['MEDV'], random_state=0)

    model = LinearRegression()
    model.fit(training_features, training_target)
    training_pred = model.predict(training_features)
    testing_pred = model.predict(testing_features)

    print('MSE Train : %.3f, Validate : %.3f' % (mean_squared_error(training_target, training_pred), mean_squared_error(testing_target, testing_pred)))
    with open('model.pickle', mode='wb') as f:
        pickle.dump(model, f)


def predict(csvFilePath, picklePath):
    with open(picklePath, mode='rb') as f:
        model = pickle.load(f)

    csv_data = pd.read_csv(csvFilePath, sep=',', dtype=np.float64)
    testing_features = csv_data.drop('MEDV', axis=1)
    testing_target = csv_data['MEDV']
    testing_pred = model.predict(testing_features)
    print('MSE Test : %.3f' % mean_squared_error(testing_target, testing_pred))
    return testing_pred

if __name__ == '__main__':
    train("./boston_train.csv")
    results = predict("./boston_test.csv", "./model.pickle")
    print(results)
```

## AIモデルの呼び出し方法

UiPath Studioから作成してもらったPythonのAIモデルを呼び出します。
Pythonスクリプトの呼び出しは以下のようなステップで進みます。

1. Pythonパッケージの追加
2. Pythonスコープアクティビティの追加
3. Pythonスクリプトを読込アクティビティを追加
4. Pythonメソッドを呼び出しアクティビティを追加
5. Pythonのオブジェクトを取得アクティビティを追加
6. Excelへの書き込み

Python処理はPythonスコープ内にPython関連のアクティビティを並べていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/d832d5c6-52bf-6357-ad11-c26dbccabaaf.png)

### 1. Pythonパッケージの追加

新規にプロジェクトを作成後、UiPath StudioでPythonパッケージを追加します。オフィシャルに「UiPath.Python.Activities」があるのでインストールしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/cba62298-2dff-27c4-d3ba-46d095a29bc2.png)

:::note warn
最新のUiPath Stduioでは新規プロジェクト作成すると「Windows」という形式のプロジェクトが作成されます。Windows形式のプロジェクトの場合は[.NET Desktop Runtime 5.0.17](https://dotnet.microsoft.com/en-us/download/dotnet/5.0)のインストールが必要です。
:::

### 2. Pythonスコープアクティビティの追加

PythonスコープにはインストールしたPythonに合わせて設定を行う必要があります。今回はWindows64bitPCに3.10をインストールしたので、このように設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/74ec9513-b7a6-9f68-9f24-11f07af2d1ef.png)

3.10以降ではライブラリパスを指定する必要があります。
Path.Combineで特殊フォルダパスを結合しています。
特定のPCだけで動くだけであれば固定のパスを指定してもいいのですが、複数のPCで動作できるようにこのように指定しています。

|名前|型|規定値|
|-|-|-|
|PythonPath|String|Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),"Programs\Python\Python310")|
|PythonLibPath|String|Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),"Programs\Python\Python310\Python310.dll")|


### 3. Pythonスクリプトを読込アクティビティを追加

Python3.9以上のバージョンの場合はライブラリパスを設定する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/9f00d62a-6e73-ca69-26e9-0efb2de21f5c.png)

UiPathはプロジェクトフォルダからの相対パスで動作できますが、呼び出されたPythonは相対パスでは実行できないため、GetFullPathでフルパスを取得しています。

|名前|型|規定値|
|-|-|-|
|FileName|String|Path.GetFullPath("PythonScript\LinearRegression.py").ToString|
|PyObj|PythonObject|--|

### 4. Pythonメソッドを呼び出しアクティビティを追加

Pythonメソッドを呼び出すために「Pythonメソッドを呼び出し」アクティビティを使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/8ab6ef7c-34e5-c3dc-a5e7-088d4a8568b6.png)

PythonArgはPythonメソッドに渡す配列です。
波括弧で括り、引数を渡す必要があります。

|名前|型|規定値|
|-|-|-|
|PythonArg|Object[]|{Path.GetFullPath("PythonScript\boston_test.csv").ToString, Path.GetFullPath("PythonScript\model.pickle").ToString}|
|MethodName|String|"predict"|

### 5. Pythonのオブジェクトを取得アクティビティを追加

Pythonから戻り値を取得するため、「Pythonのオブジェクトを取得」アクティビティを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/f38bc4be-ce63-32f5-ecf4-d470b2c5af90.png)

resultsはPython側の戻り値の型によって決まります。
今回はDoubleのlist（正確にはnumpyのデータ）で返ってくるためDoubleの配列を指定します。

|名前|型|規定値|
|-|-|-|
|results|Double[]|--|

### 6. Excelへの書き込み

戻り値を最後にExcelに書き込みます。
コレクションをデータテーブルに変換アクティビティで、Doubleの配列をデータテーブルに変換しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/c3e87f78-ba67-4b6f-be5a-ad023a6d9b77.png)

## Pythonでエラーになった場合の対処方法

UiPathでPython関連のアクティビティでエラーが発生した際には、Pythonのエラー詳細ではなく概要だけしか表示されない場合があります。

エラーの詳細を見るためには、Windowsのイベントビューアー機能を使用しましょう。
WindowsログのApplicationから詳細なエラー情報が確認できます。

## AI Centerを利用した簡単な方法もあります

今回はPythonで作成したAIモデルを呼び出して予測する方法を解説しました。
Pythonでのモデル開発が難しそうだと感じた方、安心してください。より簡単にAIを業務に適用する「UiPath AI Center」を使った方法を解説しています。
データの再学習がPythonを実行しないといけないことから、AIエンジニアが不足している企業では、優先度が低い業務ではAIの導入やAIの再学習が難しくなってきます。

こちらもご覧ください。

https://qiita.com/ManabuTech/items/6a6e0f454446787f639d