前回まで、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 にオプションを設定することで解決できます。詳しくは下記のリファレンスを参照ください。
リファレンスの記載に合わせて『#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 件のコメント:
コメントを投稿