見出し画像

OpenAI APIのJSON modeで請求書を構造化データに変換する

前回はGPT4 Vision APIを用いて請求書からの情報抽出を試みましたが、現状ではOCRのような使い方は難しいことがわかりました。OpenAIも非英語での利用に制約があることを認めており、日本語で活用するには次期モデルを待つ必要がありそうです。

↓前回の記事

今回は同じくOpenAI Dev Day2023で発表、公開されたJSON modeについて試してみます。
JSON modeに関するドキュメントは下記のとおりです。

API呼び出しの際にresponse_formatを{ "type": "json_object" }に設定することで、JSON modeを有効にできます。JSON modeが有効になると、モデルが有効なJSONにパースされる文字列だけを生成するように固定することができます。
実装に当たっては下記shi3zさんの記事を参考にしました。

JSON modeを有効にしたコードを用意します。

from openai import OpenAI
import openai
import os
from google.colab import userdata
os.environ["OPENAI_API_KEY"] = userdata.get("OPENAI_API_KEY")

client = OpenAI()

def gpt(utterance):
    response = client.chat.completions.create(
        model="gpt-3.5-turbo-1106",
        response_format={"type":"json_object"},
        messages=[
            {"role": "system", "content": "あなたは役に立つ会計アシスタントで、請求書の項目をJSON形式で出力します。"},
            {"role": "user", "content": utterance},
        ]
    )
    return response.choices[0].message.content

prompt=input()

gpt(prompt)

JSON modeを使用する際の留意点として、systemプロンプトやuserプロンプトにJSONを生成するよう指示を含める必要があり、「JSON」の文字列を含まない場合は必ずエラーが返ります。
今回はsystemプロンプトで請求書の項目をJSON形式にまとめるよう指示を行いました。

使用する請求書は前回同様にfreeeが配布するインボイス請求書サンプルです。

https://www.freee.co.jp/kb/template/invoice/template-1/

Vision APIで情報抽出を行うことはできなかったため、Googleドライブ(Google docs)の機能を用いてテキスト抽出を行います。

抽出されたテキストは下記のとおりです。

○○○○株式会社 御中
T100-0001
東京都千代田区0-1-2 ○○ビル 3F
請求書
発行日
2023/1/1
請求番号
0000001
登録番号
T012345...
●●●株式会社
100-0000
下記の通り、ご請求申し上げます。
住所: 東京都千代田区 0-1-2
●ビル 1F
ご請求金額(税込)
電話: 00-0000-0000
メール: *****@
¥119,800
〇〇銀行 ○○支店 普通口座 0123456
振込先
(カ
|振込期日 2023年2月末
振込手数料は御社のご負担にてお願いいたします。
日付
2022/12/1
2022/12/15 ΔΔΔΔ
内容
※は軽減税率対象です。
税率区分
消費稅
金額(税抜)
10%対象
¥5,000
¥50,000
8%対象
¥4,800
¥60,000
備考
軽減税率 数量
単位 単価(税抜) 税率
金額(税抜)
1
30
式 個
¥50,000
10%
¥50,000
¥2,000
8%
¥60,000
小計
消費税
¥110,000
¥9,800
合計
¥119,800

文字列の位置情報などは含まないため、人間の目には意味のまとまりを理解するのが難しいテキストです。果たしてGPTは適切にまとめることができるでしょうか。
さきほどのコードに請求書のテキストデータを渡して、実行した結果は下記のとおりです。

{
  "請求先": {
    "会社名": "○○○○株式会社",
    "郵便番号": "T100-0001",
    "住所": "東京都千代田区0-1-2 ○○ビル 3F"
  },
  "請求書情報": {
    "種類": "請求書",
    "発行日": "2023/1/1",
    "請求番号": "0000001",
    "登録番号": "T012345..."
  },
  "請求内容": {
    "請求金額(税込)": "¥119,800",
    "支払期日": "2023年2月末",
    "振込先口座": "〇〇銀行 ○○支店 普通口座 0123456",
    "振込手数料": "御社のご負担にてお願いいたします。"
  },
  "請求明細": {
    "発行日範囲": "2022/12/1 - 2022/12/15",
    "内容": "※は軽減税率対象です。",
    "税率区分": {
      "消費税": {
        "10%対象": {
          "金額(税抜)": "¥50,000",
          "税額": "¥5,000"
        },
        "8%対象": {
          "金額(税抜)": "¥60,000",
          "税額": "¥4,800"
        }
      }
    },
    "備考": "軽減税率 数量, 単位 単価(税抜) 税率 金額(税抜)",
    "合計": {
      "小計": "¥110,000",
      "消費税": "¥9,800",
      "合計金額": "¥119,800"
    }
  }
}

どうでしょうか。確かに有効なJSONフォーマットで応答が返ってきました。
内容も「あの雑多な文字列からよくまとめたな」といえるものです。
OCRを行ったテキストデータに座標データなどが含まれていれば、帳票の意味まとまりをより的確に捉えることができたのではないでしょうか。

JSONフォーマットのみの出力が保証されることは、システムの一環としての生成AIの利活用に有用です。しかし、JSON  modeでは出力がJSONフォーマットとして有効であり、エラーなしで解析されることが保証されますが、特定のスキーマと一致することは保証されません。システムの一環として機能させたい場合、必要なスキーマを与えて情報を抽出させるタスクを与えたいところですが、その保証はないということです。
この点、現状ではFunction callingを使用したほうがよいでしょう。今後はFunction callingのデータ抽出方法を模索してみようと思います。

今回はここまでです。
最後までお読みいただきありがとうございました。


この記事を書いている人

兎耳山ルカ

会計Vtuber/会計修士/公認会計士/公認情報システム監査人CISA/公認内部監査人CIA/AFP/G検定/元銀行員/大手監査法人でAIを用いた業務変革に取り組んでいました/メタバースやYouTubeにおいて会計の魅力を発信する会計Vtuberとして活動しています。
X: @TomiyamaLuca


会計人コースに記事を執筆しました🎉

会計人コースWebでは、会計プロフェッションを目指している若い方々向けて、生成AI時代の会計人材に必要とされるスキルについて記事を執筆しました。ぜひ御覧ください!

【未来予想図2035】監査現場と会計人に必要とされるスキルとは | 会計人コースWeb

この記事が気に入ったらサポートをしてみませんか?