【Power Apps】AIを使用した名刺管理アプリを作ってみた

## はじめに
Microsoft社が提供するローコード開発ツール「Power Platform」では、「AI Builder」を使って簡単にAIアプリを開発することができます。
今回は、下記の記事を参考に、AI Builderにより名刺の情報を解析してデータベースに保存するアプリを作ったので、その手順を詳細に残しておきます。

### 参考記事
https://qiita.com/Takashi_Masumori/items/07aba9675f3cf576b393

## 作成したアプリ
今回作成したアプリは、以下のような流れでデータが保存されます。

1. 名刺をアップロードする
2. 名刺のテキストを認識する
3. 編集可能なフィールドに出力する
4. データベースに保存する

※今回使用した名刺に電話番号が含まれていないため「phone列」には誤った情報が出力されていますが、編集可能な列であるため修正してから保存することが可能です。

![580qf-4qzfp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/7d2570e4-b0ae-110b-0a53-551cd0dcb02c.gif)

## 使用する機能
* Power Apps － アプリの操作画面を構築します
* Dataverse － 名刺のデータを保存します
* AI Builder
    * テキスト認識エンジン － 名刺からテキストを抽出します
    * カスタムプロンプト － 抽出したテキストをタグ付けします

## Dataverse の作成
まずは、名刺のデータを保存するテーブルの作成です。
インポートする既存のデータはないので、空白のテーブルを準備します。
❶ Tables -> ❷ New Tables -> ❸ Add columns and data

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/d7732ed0-9eb9-24b4-87f6-1e258ea07131.png)

次に、テーブルの名前を編集します。
デフォルトの値から適当なテーブル名に変更しましょう。
❹ 鉛筆マーク -> ❺ Display name を編集 -> Save

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/d33bf1e7-996d-a06e-14c1-75b52feb877f.png)

続いて、列を編集・追加します。
❻ New column -> ❼ Edit column -> ❽ Display name, Data type, Formatを編集 -> Update

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/3a675dee-8214-2370-0b2c-832232b18e03.png)

❾ ＋ -> ❿ Display name, Data type, Formatを編集 -> Save

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/825fcb55-2895-f863-1995-e4c753d7351c.png)

❾❿を繰り返して必要な列を追加し、テーブルを完成させます。

今回は、メールアドレス[email]、氏名[name]、会社[company]、部署[department]、役職[position]、住所[address]、電話番号[phone]、ウェブサイト[website]の8つを管理します。

最後に、テーブルが完成したら保存しましょう。
⓫ Create 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/2e04223d-e0fb-f636-4c4a-879d0d39b8f0.png)

これにて、テーブルの作成は終了です。

## カスタムプロンプトの作成
次に、テキスト認識エンジンで抽出されたテキストをJSON形式に変換するためのプロンプトを作成します。
1⃣ AIハブ -> 2⃣ GPTでプロンプトを使用してテキストを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/7402e522-6956-2a0a-c7f4-888f808b327f.png)

プロンプトの名前をデフォルトの値から適当な名前に変更しましょう。
3⃣ プロンプトの詳細 -> 名前（名刺解析プロンプト）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/7c05907e-e678-4e5b-eb45-6eba0267a717.png)

続いて、プロンプトの入力を定義します。
このプロンプトはその役割から、「テキスト認識エンジンで抽出されたテキスト」を入力として与えることになります。
4⃣ 入力 -> 名前（名刺）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/b8b06a64-a7a5-a3fc-c34a-c9e12b918d77.png)

先ほど定義した入力を挿入して以下のようなプロンプトを書き、保存します。
5⃣ 挿入 -> 6⃣ 名刺 -> 7⃣ カスタムプロンプトを保存

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/c22a1b25-ab35-8175-2e16-1f2d6d0d97d6.png)

```
以下のインプット情報から情報を抽出し、以下のJSON 形式にしてください 

インプット情報
/ここに入力を挿入する/

JSON {"name": "山田太郎", "company": "株式会社サンプル", "department": "マーケティング部", "position": "部長", "phone": "012-3456-7890", "email": "taro@example.com", "website": "https://www.sample.jp"}
```
※参考記事のプロンプトを今回作成したテーブルの形に合わせて修正したものになります

それでは、プロンプトをテストしてみます。
8⃣ サンプルデータ -> 9⃣ プロンプトのテスト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/3391b682-00de-7adf-c38d-92d42396f993.png)

正しくJSON形式に変換することができたようです。

これにて、カスタムプロンプトの作成は終了です。

## Power Apps の作成
いよいよ、アプリを作成します。
今回は空のキャンバスからアプリを作成していきます。
① Apps -> ② New Apps -> ③ Start with a design -> ④ Blank canvas

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/f7224f86-c114-74cb-0d75-12f400fbf876.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/43e2c053-f21b-eaee-4934-62da5fab5912.png)

アプリを作成したら、新しい画面を追加します。
⑤ 新しい画面 -> ⑥ サイドバー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/984bd26a-f245-bc91-d783-48fd9fde70f1.png)

以下の画面が追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/4b87eeed-afe1-2c49-a6db-a3e9cf4b1551.png)

元の画面 (Screen1) は不要なので削除します。
Screen1 を選択 -> ⑦ ... -> ⑧ 削除

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/89a373b2-e995-be9f-213b-c74ab7da2170.png)

続いて、ヘッダーコンテナにアプリ名を挿入します。
HeadlerContainer1を選択 -> ⑨ 挿入 -> ⑩ テキスト ラベル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/76410811-f344-02f7-4b00-1367ea9802df.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/43e69d1b-f051-cd7e-77f5-1ad786816909.png)

テキストラベルを追加したら内容を編集します。
⑪ プロパティ（テキスト、フォントサイズなど）を編集

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/a0266c68-3ed6-261b-268f-599767f6333b.png)

続いて、ボトムコンテナの比率を調整します。
SidebarContainer1を選択 -> ⑫ プロパティ（部分を塗りつぶす）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/aeab4f1e-548b-11d0-70b3-f302e01840e1.png)

これより、サイドバーコンテナとメインコンテナの比率が3:7になっていることがわかります。SidebarContaier1とMainContainer1のプロパティ（部分を塗りつぶす）をそれぞれ変更して、好みの比率にします。（ここでは1:1に変更します）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/1a440965-6c92-c9a0-9676-9779f8b2de56.png)

次に、テキスト認識エンジンを挿入します。
SidebarContainer1 を選択 -> ⑬ 挿入 -> ⑭ AI Builder - テキスト認識エンジン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/c42801c9-ec54-a360-1d54-1d4091eae962.png)

挿入したらプロパティから横方向に拡大します。
⑮ プロパティ（拡大）を編集

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/ae23f321-5b7a-2f2e-1cc3-a8e186ca8603.png)

次に、ボタンを挿入します。
SidebarContainer1 を選択 -> ⑯ 挿入 -> ⑰ ボタン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/9aba60b2-51e0-0348-83af-7b4fb8a0da0e.png)

ボタンを編集します。
Botton1 を選択 -> ⑱ プロパティ（テキスト、中央揃え）を編集

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/681777a2-b0cb-6cb7-b1c4-7888d709168a.png)

先ほど作成したカスタムプロンプト（名刺解析プロンプト）をアプリに追加します。
⑲ データマーク -> ⑳ データの追加 -> ㉑ 名刺解析プロンプト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/fcc845c8-90fb-5fbb-f54b-fedaa3215b7d.png)

追加したカスタムプロンプトを使用して、ボタンを押したときの動作を追加します。
㉒ ツリービューマーク -> Button1 を選択 -> ㉓ OnSelect -> ㉔ 式を入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/b383dace-d2bb-dd20-1d7d-1352570cf6e5.png)

``` 
// 変数gblBusinessCardJsonDataにカスタムプロンプトの出力をセット
Set(                                 
    gblBusinessCardJsonData, 

    // カスタムプロンプトにConcat(...)を入力してJSON形式に変換
    '名刺解析プロンプト'.Predict(
    
        // テキスト認識エンジンの出力に含まれるテキストを改行コードで結合
        Concat(                      
            TextRecognizer1.Results, // テキスト認識エンジンの出力全体
            Text,                    // テキスト認識エンジンの出力に含まれるText型のデータ
            " "&Char((10)&" ")       // 改行コード
            )
        ).Text                       // カスタムプロンプトの出力のデータ型
);
```

続いて、先ほどと同様に作成したテーブル（Business Cards）をアプリに追加します。
㉕ データマーク -> ㉖ データの追加 -> ㉗ Business Cards

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/061bf0fc-17a4-7e0e-52b4-683fff128561.png)

テーブルの編集フォームを挿入します。
㉘ ツリービューマーク -> MainContainer1 を選択 -> ㉙ 挿入 -> ㉚ 編集フォーム

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/5033baa4-c77b-cdac-8b4f-5cb6668f1ac0.png)

編集フォームのデータソースに先ほど追加したテーブル（Business Cards）を選択します。
㉛ Business Cards

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/f8551f74-42cc-ac50-d6d0-90d9a80e444e.png)

編集フォーム（Business Cards）追加後の画面です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/061bd571-a227-f267-6889-ae23fc6170de.png)

編集フォームのレイアウトを編集します。
㉜ プロパティ（列）を変更（3->1）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/aa0fe5c2-a4e7-6a58-f27e-f9c7ec01094d.png)

㉝ レイアウト -> ㉞ 横

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/fd4e168e-7ff1-a6c7-46ba-42f91718c389.png)

編集フォームのレイアウト編集後の画面です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/09caf63f-961c-f077-77bf-844abe5df824.png)

編集フォームの形式を編集から新規に変更します。
㉟ DefaultMode -> ㊱ FormMode.New（デフォルトはFormMode.Edit）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/6997383a-c535-c610-6c91-5dd1691a2c55.png)

```
FormMode.New
```

編集フォームに含まれる各列の初期値を設定します。
そのためにはプロパティを変更するためにロックを解除する必要があります。
email_DataCard1 を選択 -> DataCardValue1 を選択 -> ㊲ 詳細設定を編集

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/ba912c52-044e-a207-22f7-372a77c48c56.png)

抽出ボタンで設定した変数（gblBusinessCardJsonData）から各列の初期値を設定します。
㊳ Default -> ㊴ 式を入力

```
Text(
    // 変数gblBusinessCardJsonDataをJSONデータに変換
    ParseJSON(                   
        gblBusinessCardJsonData  // JSONの形をしたテキストデータ
        ).email                  // JSONからemailの値を指定
    )
```

㊲~㊴をすべての列に設定します。

編集フォームの保存ボタンを作成します。
MainContainer1 を選択 -> ⑯~⑱ の要領で保存ボタンを作成

ボタンを押したときに編集フォームを保存する処理を追加します。
㊵ OnSelect -> ㊶ 式を入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/17b99ae7-07d9-ac91-aa30-77ab38fd66b6.png)

```
SubmitForm(Form1)
```

最後に、編集フォームの保存に成功したときに変数とフォームを初期化する設定を追加します。
Form1 を選択 -> ㊷ OnSuccess -> ㊸ 式を追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/b120f569-b37c-a222-a8b8-fb97b32996ea.png)

```
Set(
    gblBusinessCardJsonData, 
    "");
NewForm(Form1)
```

完成したら、プレビューで動かしてみましょう。
㊹ アプリのプレビュー（F5）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/3cf8fb99-7ffa-294f-097b-9c2faa83e7ee.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/3f5a44ae-15fb-da1a-a5f1-41fa20d2120d.png)

## おわりに
今回は、Power AppsとDataverse、AI Builderを使用した、AI名刺管理アプリの作成手順を解説してみました。この記事が、Power Platformによるアプリ開発を始めるきっかけになれば幸いです。