OCRとしてのGPT4-oはどれほど進化したのか検証してみた


OpenAIから新モデル、”GPT4-o”がリリースされました。
OpenAIによると、GPT4-oはGPT4に比べ、賢さとしては同じ程度であるものの、視覚と聴覚が統合されたモデルであるとの説明がありました。

では、実際にドキュメントの解析能力はどの程度上がっているのでしょうか？という点が気になりましたので、本記事にて検証をしていきたいと思います。


## 検証方法

### 利用イメージ
まず、以下の請求書のイメージを利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/8a4de3e2-1796-acfd-290c-fc40742c3b9e.png)
取得元：https://biz.moneyforward.com/invoice/templates/3831/#js-preview-modal

### 検証シナリオ

多くの会社様では、取引先様からの請求書を人が確認し、その内容をもとにシステムに請求金額や支払日などの情報を打ち込むといった業務が発生しているのではないかと思います。

ChatGPT使ってドキュメントの情報を正確に読み取ることができれば、この業務の自動化または効率化を実現できる可能性が高まります。

します。本シナリオでは、取引先から受け取った請求書を読み取り、必要な情報をjson形式で出力することができるかどうかを検証したいと思います。

### 利用プロンプト

両方のモデルに、以下のプロンプトにて指示を出します。


このイメージを読み取って、以下のJSONを出力してください。
出力はJSONだけする様にしてください

```
{ 
  "customer_name": string,  // 取引先名称
  "customer_address": stirng, //取引先住所
  "register_number": string, //登録番号
  "invoice_amount": number, // 請求金額（円）
  "invoice_amount_before_tax": number // 小計（税抜）
  "invoice_date": date, // 請求日
  "bank_transfer_distination": string, // 振込先銀行
  "items": // 明細情報
  [
      { 
          "item_name": string, // 品目名
          "unit" : number, // 数量
          "unit_price": number, // 金額
          "transaction_date": date, // 取引日
          "is_keigen_zeiritsu: boolean //軽減税率対象？
      }
  ]
  
```

## 検証結果
### 総合スコア
結果は以下の通りとなりました。
GPT4の方では、いくつかの読み取りミスがありましたが、GPT4-oの方は全て期待通りの動きをしてくれています。

| 項目名 | GPT4 | GPT4-o |
|:-----------|------------:|:------------:|
| 取引先名称       | ❌        |  ⭕️         |
| 取引先住所     | ❌      |  ⭕️       |
| 登録番号       | ⭕️        |  ⭕️         |
| 請求金額       |  ⭕️        |  ⭕️         |
| 小計       |  ⭕️        |  ⭕️         |
| 請求日       |  ⭕️        |  ⭕️         |
| 振込先銀行       | ❌         |  ⭕️         |
| 登録番号       |  ⭕️        |  ⭕️         |
| 品目名       |  ⭕️        |  ⭕️         |
| 数量       |  ⭕️        |  ⭕️         |
| 金額       |  ⭕️        |  ⭕️         |
| 取引日       |  ⭕️        |  ⭕️         |
| 提言税率対象       | ❌         |  ⭕️         |
| トータルスコア       | 9/13        | 13/13         |

### GPT4
実際に得られたJSONファイルは以下の通りです
```json
{
  "customer_name": "株式会社OO 御中", // ❌ 御中はいらない
  "customer_address": "東京都港区芝浦2-11-1 OOビル", // ❌ 階の情報が抜けている、芝浦2ではなく1が正解
  "register_number": "T0123456",
  "invoice_amount": 4360,
  "invoice_amount_before_tax": 4000,
  "invoice_date": "2023-01-01",
  "bank_transfer_destination": "OO銀行OO支店", // ❌ 00ではなく○○
  "items": [
    {
      "item_name": "A",
      "unit": 2,
      "unit_price": 1000,
      "transaction_date": "2023-01-01",
      "is_keigen_zeiritsu": false // ❌ trueが正解
    },
    {
      "item_name": "B",
      "unit": 1,
      "unit_price": 2000,
      "transaction_date": "2023-01-02",
      "is_keigen_zeiritsu": false
    }
  ]
}
```


### GPT4-o
実際に得られたJSONファイルは以下の通りです。
こちらは全て期待通りのデータが返ってきていました。

```json
{
  "customer_name": "株式会社○○",
  "customer_address": "東京都港区芝1-1-11 ○○ビル □階",
  "register_number": "T0123456",
  "invoice_amount": 4360,
  "invoice_amount_before_tax": 4000,
  "invoice_date": "2023-01-01",
  "bank_transfer_destination": "○○銀行○○支店",
  "items": [
    { 
      "item_name": "A",
      "unit": 2,
      "unit_price": 1000,
      "transaction_date": "2023-01-01",
      "is_keigen_zeiritsu": true
    },
    { 
      "item_name": "B",
      "unit": 1,
      "unit_price": 2000,
      "transaction_date": "2023-01-02",
      "is_keigen_zeiritsu": false
    }
  ]
}
```


## まとめ

今回は請求書の読み取り精度の検証をGPT4とGPT4-oを使って行いました。

GPT4でもそれなりの精度が出ていましたが、細かい箇所の読み取りがうまくいっていないことがありました。
しかし、GPT4-oでは表の情報の読み取りなども正しくできる様になっていることが検証できました。

今回の検証により、GPT4-oではこれまでのモデルよりも精度が向上していることが確認できました。
今回の検証だけではどの程度複雑なドキュメントの認識ができるのかわかりませんが、GPT4-oを使えば、これまで以上にさまざまなことを自動化することができそうです。

今回は時間の制約上、一つの請求書の検証にとどまってしまいましたが、他のフォーマットでも同じ情報が取れるのかについても検証を進めていきたいと思います。