2024/08/11

つないでみよう:#19)GPT4o は OCR? - 返答を JSON で返す方法

前回まで、GPT4o で画像認識させる方法をまとめました。画像を認識できるなら、挑戦したくなることがありますよね。そう、Optical Character Reader(OCR)です。

ということで、今回から GPT4o を OCR としての利用にチャレンジしたいと思います。

OCR の活用事例として思い浮かぶのは、レシートや領収証、名刺などの読み取りですね。システムでの利用を考えると、単にテキスト化するのではなく、項目と値を関連付けして再利用しやすい形で取得したいですね。

今回は、WebAPI 系の連載らしく OCR としての読み取り結果を JSON 形式で取得することを目指します。


前回作成したアプリでテスト

GPT4o はリクエストに JSON で返答するように伝えると答えてくれます。なかなか優秀ですね。前回作成したテストツールをそのままの状態で、次のようなリクエストを作成します。

AI の役割 あなたはOCRです。ユーザがリクエストした画像データから、必要な文字を認識し、ユーザに返します。返信するフォーマットはJSON形式とし、返信する項目は、ユーザがリクエスト時に指示します。
リクエスト この画像はレシートです。この画像から「店舗名」、「購入日」、「合計金額」を読み取ってください。   

そして適当なレシート画像を添付して GPT4o に送信します。

受信した JSON は次の通りで、返答である content ノードの値は次ようになっていました。


以下は、画像のレシートから読み取った情報です:\n\n```json\n{\n  \"店舗名\": \"FamilyMart 南堀江店\",\n  \"購入日\": \"2024年7月8日\",\n  \"合計金額\": \"¥278\"\n}\n```

改行などが含まれていて見づらいですが、項目名と値がセットになった JSON が確かに含まれています。ただ、セリフなど尾ひれがいっぱいついています。結果をシステム的に処理するためには邪魔になりますね。


JSON だけを返す方法

この問題は、GPT4o に問い合わせを送信する Request Body にオプションを設定することで解決できます。詳しくは下記のリファレンスを参照ください。

response_format


リファレンスの記載に合わせて『#16)GPT4o で画像認識 - 送信する JSON と作成 ①』で作成した xGetJSON 関数を修正します。

Function xGetJSON(vnd As NotesDocument) As String
         ・・・
   Set jo = joCnt.Appendobject("image_url")
   s = "data:image/jpeg;base64,{" & sBase64 & "}"
   Call jo.AppendElement(s, "url")


   'response_format
   Set jo = jnav.Appendobject("response_format")
   Call jo.AppendElement("json_object", "type")


   xGetJSON = jnav.Stringify

End Function

修正後、生成される JSON には次の通り response_format ノードが追加されます。

実行するとレスポンスが次のように変わりました。


{\n  \"店舗名\": \"FamilyMart 南堀江店\",\n  \"購入日\": \"2024年7月8日 7:40\",\n  \"合計金額\": \"¥278\"\n}


返答の精度向上

これで、GPT4o からの返答は JSON だけに限定できました。

ただ、日付値に時刻があったりなかったり、金額に¥が含まれるなど、処理しにくいデータとなっています。そこで、AI の役割でもう少し細かく設定し、返答を向上させます。

AI の役割 あなたはOCRです。ユーザがリクエストした画像データから、必要な文字を認識し、ユーザに返します。返信するフォーマットはJSON形式とし、返信する項目は、ユーザがリクエスト時に指示します。
日付項目はyyyy/mm/dd、金額など数値項目は、\マークやカンマなどの編集文字はつけないでください。

結果は次のように変化しました。

{\n  \"店舗名\": \"FamilyMart 南堀江店\",\n  \"購入日\": \"2024/07/08\",\n  \"合計金額\": 278\n}

次回は、この JSON を分析して、必要な値を取得する部分を作成します。


前回 連載:つないでみよう 次回


0 件のコメント:

コメントを投稿