生成AI × Power Appsアプリを高速で開発する_画像処理シナリオ編

# はじめに
みなさん、こんにちは。日本マイクロソフトの佐々木です。

少し期間が空いてしまいましたが、最近お客様と会話していく中で、人気のソリューションについてお話したいと思います。

:::note info
AI BuilderでGPT4oの画像処理がGAしております。
そのため、本ブログで紹介しているようなAzure OpenAIを呼び出す実装は不要となっております！！！
:::

https://qiita.com/tomoyasasaki1204/items/4383f1b1455391b0acd3



## 生成AIアプリを高速で開発したい
Copilot for Microsoft365が登場したことで、エンドユーザーが身近に生成AIを活用する機会は増えてきたかと思います。

一方で、個別具体的な業務に適用するための最適なソリューションがPower Apps×生成AIです。
市民開発・ローコードで実現する業務特化生成AIアプリを開発・活用することが可能となります。


# 紹介するシナリオ
本日の記事で紹介するのは、GPT4oを利用した画像処理シナリオになります。

GPT4oはマルチモーダルのため、様々な入力形式（画像、音声、テキスト）に対応可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/51e9de57-0512-3af0-5ab2-bcc855aec8b6.png)

## GPT4oを利用した画像処理シナリオ例
GPT4oを利用することでプロンプト次第では、あらゆる画像処理シナリオに対応可能となります。
これまではAI OCRソリューションを利用して、シナリオ・帳票ごとに事前学習や定義づけを大量にしていたところ、GPT4oでは画像入力とプロンプトで簡単に対応できるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/b770e558-b846-bf98-98b0-d87413561731.png)


## 検証してみる
いくつかシナリオごとに帳票を用意して検証してみました。
これらはほとんどプロンプトの変更のみで正確に読み取り可能でしたので、1つ開発できればプロンプトの変更のみで横展開は容易かと思います。

画像処理の定番である、名刺、請求書、領収書、契約書などはもちろん正確に読み取り可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/faea6b4f-d9a5-1d37-3f9d-c748d2b83ad1.png)




他には生産現場（工場）で活用できる画像処理の適用例もいくつか紹介します。
ちょっと応用系ですと、生産管理システム（サンプル）のUIを写メでパシャリととって、それを生成AIに入力とし、特定の項目のみ抽出させることも可能です。
画面下部にある、計画台数、実績台数、進捗台数、稼働率などGPT4oが正確に抽出していることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/6d1a0097-f718-cae5-002b-69de5653f255.png)

ほかにも、手書きの作業日報などにも応用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/6b7f5b0d-13a0-ffc2-efe0-1ae33332e4e5.png)

## 活用例
生産現場などでの活用を例にしてイメージしたいと思います。
現場にある出力機能のないレガシーシステムやアナログ計器、作業日報やホワイトボードの情報などを生成AIでデータ化し、データとしてDataverseに格納し、データ利活用を図るようなソリューションとして最適かと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/d67dabc7-b55f-cc74-da68-f263224f9710.png)


# Power Platformで開発する

## Azure OpenAIのリソースを用意する
GPT4oはAzure OpenAI上に用意します。
こちらのステップは割愛しますが、慣れた方であればすぐにモデルのデプロイができると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/42a0cff9-4933-62ab-4814-f9bfc396aa19.png)

エンドポイントの情報やAPIキーなどPower Platformから呼び出すための情報をメモしておきます。

## Power Automateからテストコールする
試しにPower AutomateからGPT4oのAPIをコールしてみます。
まずはレスポンスが返ってくるかだけテストしてみます。
※Azure側で閉域設定をしているなどネットワーク起因でこちらのコールが正常に完了しない場合があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/72924438-7e7e-4d46-8f56-d76dde21f126.png)


```言語:HTTPリクエストの本文
{
  "messages": [
    {
      "role": "system",
      "content": "あなたはAIアシスタントです。"
    },
    {
      "role": "user",
      "content": [
        {
          "type": "text",
          "text": "@{triggerBody()['text']}"
        }
      ]
    }
  ],
  "max_tokens": 800,
  "temperature": 0.7
}
```

問題なくレスポンスが返ってきました。

```言語:応答
{
  "choices": [
  ・・・
      "message": {
        "content": "こんにちは！今日はどのようなお手伝いをしましょうか？",
        "role": "assistant"
      }
・・・
```

## Power Automateフローを作成する
正常にテストできましたら、画像処理用のプロンプトに書き換えてあげたいと思います。
画像を送付するには、messagesプロパティを以下の様に指定します。

また、Power AppsアプリからPower Automateのフローを呼び出したいため、トリガーはPower Apps（V2）に変更し、画像説明用のTextと画像用の引数を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/2a12161a-bc5a-9d34-5b8e-37d6faca12ff.png)



```言語:画像説明用のAPI
{
  "messages": [
    {
      "role": "system",
      "content": "画像について説明するアシスタントです。"
    },
    {
      "role": "user",
      "content": [
        {
          "type": "text",
          "text": "@{triggerBody()['text']}"
        },
        {
          "type": "image_url",
          "image_url": {
            "url": "@{triggerBody()['text_1']}",
            "detail": "high"
          }
        }
      ]
    }
  ],
  "max_tokens": 800,
  "temperature": 0.7
}
```

下記のGPT4oの画像処理用のAPIの説明にある通り、入力される画像はHTTP または HTTPS URL、または base-64 でエンコードされた画像である必要があります。

Power Apps側の処理で検討したいのですが、アプリ内でBase64形式にエンコードする方法はいくつかあります。
・カメラコントロールで撮影
・画像アップロードコントロールで撮影
これらの画像をBase64形式にエンコードして、引数としてGPT4o側に渡す

また、Blobストレージなどを利用してパブリックにアクセスできるURLを作成してもいいかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/03915058-4bba-c99a-61cf-1762a425c149.png)

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/how-to/gpt-with-vision?tabs=rest#call-the-chat-completion-apis


最後にPower Appsへ返答アクションを配置し、HTTPコールアクションの結果を本文とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/a3afa615-b544-a984-39f5-4ac4dc38a83c.png)

:::note info
JSON解析のアクションなどでGPTからの返答を取り扱いしやすい形式にしてあげた方がいいですが、今回は割愛します。
:::


## Power Appsアプリを作成する
今回は最低限の機能をもったアプリを作成していきたいと思います。
1. カメラで画像を撮影
1. Base64形式にエンコード
1. GPT4oをコール
1. 結果を確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/a211b610-ba1a-0275-303a-5438582615f9.png)


## カメラコントロールの配置

今回はPower Appsアプリから画像を撮影したいと思います。
Power Appsにはカメラコントロールがあるため、そちらを利用します。
画質や端末に依存する可能性もあるため、その場合は別のアプローチも検討してください。

https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/controls/control-camera#description


画像コントロールを配置して、撮影した画像を確認してみましょう。
```
Camera1.Photo
```

## Base64形式にエンコード
カメラコントロールのOnSelectプロパティを下記のようにします。

```
Set(pic, Substitute(JSON(Camera1.Photo, JSONFormat.IncludeBinaryData), """", ""))
```

下記がそれぞれの関数の説明です。
GPT4oの画像

・Set(pic, ...)
Set関数は、指定した変数（ここではpic）に値を代入します。この場合、カメラコントロールで撮影した写真を変数picに格納しています。

・JSON(Camera1.Photo, JSONFormat.IncludeBinaryData)
JSON関数は、指定されたデータ（ここではCamera1.Photo、カメラコントロールの写真）をJSON形式に変換します。
JSONFormat.IncludeBinaryData は、バイナリデータ（この場合は画像データ）をJSON出力に含めるよう指定しています。これにより、写真がBase64形式でエンコードされてJSONに含まれます。

・Substitute(..., """", "")
Substitute関数は、指定したテキスト内の特定の文字列を別の文字列に置き換えます。
この場合、"""", ""という指定は、二重引用符 """ を空文字列 "" に置き換えています。JSONエンコードされた文字列にはエスケープされた引用符が含まれる場合があり、これを取り除くために使われています。


最後にテキストラベルコントロールを配置し、Base64形式にエンコードされた画像データを表示してみましょう。


## GPT4oをコール
ボタンコントロールを配置し、OnSelectプロパティに下記の関数を入力します。
```
Set(Result, FlowName.Run(
    Text,
    pic
    ).result
);
```


Textという変数には画像説明用のプロンプトが格納されています。

```
この画像を説明してください。なお出力はJSONのフォーマットのみ出力してください。

##抽出項目
計画台数
実績台数
進捗台数
稼働率

Json形式だけを必ず出力してください
```

## 結果の確認
GPT4oのレスポンスをResultという変数に格納しているため、テキストラベルコントロールを配置し、表示します。
※Power AutomateでParseJSON（JSON解析）など文字列処理をしていない場合、返答内容が全文返ってくると思いますので、適切に処理してあげましょう。

コレクションなどで処理してあげたり、生産計画と予実判断させることでデータ分析にも活用することが可能です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/686dac11-3e98-0278-4f55-134f2a01ffa4.png)



# おわりに
以上でGPT4oをPower Appsアプリから利用する方法についてご紹介しました。
プロンプト次第で様々なシナリオに適応可能ですので、ぜひお試しください！
AI BuilderでGPT4oの画像処理が間もなく利用できる予定です。そちらもお楽しみに！！