Power AutomateでSharePointに置いてある手書き書類をGPT-4oに読み込ませてOCRしてみる


GPT-4oの読み取り精度が高く、OCRに結構使えるよねという話題があります。

Power Automateでもファイルを読み込みOpenAIのAPIに投げることでOCR解析してくれます。

## 全体のフロー


## 手順紹介

### 0. トリガー: 手動トリガー

試すのに便利

### 1. アクション: シェアポイントから`ファイルコンテンツを取得`

シェアポイントのアクションで、`ファイルコンテンツの取得`を選択し、読み取る予定の写真ファイルを選択します。ちなみにOpenAIのAPIでGPT-4oを使う場合、現状画像ファイルにする必要があり、`png`や`jpeg`などを用意するか変換して使います。


> `某書類.png`などの画像ファイルを読み込みましょう。
> ![](https://i.gyazo.com/1ff042ab896a00644ef212669c9e2ff0.png)


### 2. アクション: Base64変換し、変数に格納

ファイルコンテンツの中から取得した画像をBase64変換し、文字列変数に格納します。

- Name: `画像` (なんでも良いですが便宜上、"画像"という名前に)
- Type: `String`
- Value: `base64(body('ファイル_コンテンツの取得'))` らしい


> ![スクリーンショット 2024-06-05 19.56.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/179f2efe-2481-d3df-4da1-bb7da03264d2.png "スクリーンショット 2024-06-05 19.56.39.png")

設定するとこんな感じです。

> ![スクリーンショット 2024-06-05 19.58.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/37ef4a80-f725-4d62-d376-9d25937e0248.png "スクリーンショット 2024-06-05 19.58.50.png")

### 3. アクション: （JSONの）作成

以下を作成します。

OpenAIのAPIへのリクエストになります。

https://zenn.dev/tomioka/articles/74adf0c6bc8bc6

JSONオブジェクトはこちらの記事を参考にしています。

```json
{
  "model": "gpt-4o",
  "messages": [
    {
      "role": "system",
      "content": "You are an Optical Character Recognition (OCR) machine. You will extract all the characters from the image file in the URL provided by the user, and you will only privide the extracted text in your response. As an OCR machine, You can only respond with the extracted text. Be sure to output in JSON.  \n  ## 出力形式  \n - body:{String}"
    },
    {
      "role": "user",
      "content": [
        {
          "type": "image_url",
          "image_url": {
            "url": "data:image/png;base64,@{variables('画像')}",
            "detail": "high"
          }
        }
      ]
    }
  ],
  "temperature": 1,
  "response_format": {
    "type": "json_object"
  }
}
```

#### 少し解説

`"response_format": { "type": "json_object" }`ここの部分でJSONモード指定をしてレスポンスのデータを扱いやすくしています。ここが現状のPower AutomateのOpenAIモジュールだと出来ないんですよね。。

`"url": "data:image/png;base64,@{variables('画像')}",`この動的コンテンツの設定が重要です。このやり方でBase64指定のときは`data:image/png;base64,`の部分は自分で書かないといけません。

> ![](https://i.gyazo.com/423b4033d94adede5540efa1d6f6fb88.png)

またsystemロールに指定している以下の英文はプロンプトになります。[こちらの記事](https://zenn.dev/tomioka/articles/74adf0c6bc8bc6)のものをベースに使わせてもらっています。

> You are an Optical Character Recognition (OCR) machine. You will extract all the characters from the image file in the URL provided by the user, and you will only privide the extracted text in your response. As an OCR machine, You can only respond with the extracted text. Be sure to output in JSON.  \n  ## 出力形式  \n - body:{String}

この部分はGPTへの命令や制約条件なのでここは各自使いたいGPTをイメージしてきましょう。

### 4. アクション: HTTP

先ほど作成したJSONデータをOpenAIのAPIに送ります。

HTTPモジュールを追加して情報を入れます。ここはAPIキーを入れて送るだけでシンプル。コピペがめんどい。

- url: `https://api.openai.com/v1/chat/completions`
- method: post
- headers:
	- Content-Type/ application/json
	- Authorization / Bearer APIキー
- body: `出力`

> ![](https://i.gyazo.com/dbba1478e0f80edeb8910efa929d5d96.png)


### 5. アクション: JSONの解析

APIから帰ってきた結果を処理します。JSONの解析モジュールを利用します。

- Content: HTTPモジュールのBody
- Schema: [こちらのスキーマ](https://zenn.dev/link/comments/fa88eaee133551)を指定

> ![](https://i.gyazo.com/be3ccb0f194f9e78486fddcd8a5e7a03.png)


## 結果 & まとめ

テスト実行すると一番最後の`JSONの解析`の出力に手書き書類から抜き出されたテキストが抽出されます。

> ![](https://i.gyazo.com/ac7efcc82ae5d17492c6c2a941e34741.png)

どんな書類だったかは見せられてないですが、精度がかなり良かったです。

GPT-4oこんな感じでOCRにも利用できますね。もっと活用していきたいところです。