2025.01.14
OpenAIのビジョンファインチューニングを使って、請求書ファイル認識正確度を上げてみる
1. はじめに
こんにちは、次世代システム研究室のK.X.Dです。
業務において、Google CloudのCloudVisionでテキスト抽出だけにより、請求書の情報を自動取込機能がなかなか精度が上がらないという課題を持ちてます。
現在の生成AIの発展により、Open AI、Gemini、Claudeなどはマルチモデルを当たり前のように導入していますが、
その中に自社サービスの請求書画像、PDFファイルデータにより、AIモデルが強化できるビジョンファインチューニングという機能は、Open AIしか提供してないです。
興味になりますので、調べてみます。
2. なぜビジョンファインチューニングを選んでるのか?
実験してるところで、マルチモデルだけで請求書ファイルの読み取りはそこそこ読み取れてます。
ただ、自社サービスはエンドーユーザーにより請求書をいろいろ形式で提示されてますので、全体的に請求書ファイルの読み取りがそこまで高くないです。
プロンプト改善して、請求書のややこしい仕様をモデルに教えて精度が上げられそうと気にしていますが、
それより、ビジョンファインチューニングはどれぐらい精度が上げられるか調べてみたいです。
3. ビジョンファインチューニング料金
ファインチューニングモデル
トレーニングデータを使ってベースモデルをファインチューニングし、独自のカスタムモデルを作成できます。一度モデルをファインチューニングすると、そのモデルへのリクエストで使用したトークンに対してのみ課金されます。
引用:https://openai.com/ja-JP/api/pricing/
通常のモデルより、ファインチューニングモデルのトークン価格がかなり高くなります。
倍になりますが、まだまだ実用な価格と思います。
参考:
通常のgpt-4o-miniとファインチューニングのgpt-4o-mini価格
– 通常のgpt-4o-mini
– ファインチューニングのgpt-4o-mini
4. ビジョンファインチューニングデータを作成する
Open AIの資料参考で、開発環境で適当な請求書ファイルを作って、
ビジョンファインチューニングの学習セットデータを作るプログラミングを用意しました。
training_datasセットは、該当画像の出力すべき値を表しています。
参考:https://platform.openai.com/docs/guides/fine-tuning#vision
import base64 import glob import json # Function to encode the image def encode_image(image_path): with open(image_path, "rb") as image_file: return base64.b64encode(image_file.read()).decode("utf-8") with open('invoice.jsonl', 'w', encoding='utf-8') as f: for image_path in glob.glob("validation_set/*"): base64_image = encode_image(image_path) url = f"data:image/jpeg;base64,{base64_image}" system_prompt = "あなたは請求書データ抽出専用モーデルです。" user_prompt = """ 下記の項目をJSON形式で正確に抽出してください。 - 請求先の企業名(company_name) - 支払い期日(due_date) - 発行日(issued_date) - 請求金額(total_amount) - 源泉徴収税(withholding_amount) - 申請金額(application_amount) 申請金額(application_amount)は、請求金額(total_amount)から源泉徴収税(withholding_amount)を差し引いた金額です。 抽出できない場合は、空を記入してください。 """ training_datas = { "validation_set/47.jpeg": "{\"application_amount\":\"20000\",\"company_name\":\"XXXX\",\"due_date\":\"2023-02-20\",\"issued_date\":\"2022-12-25\",\"withholding_amount\":\"2000\",\"total_amount\":\"22000\"}", "validation_set/49.pdf" : "{\"application_amount\":\"750000\",\"company_name\":\"XXXX\",\"due_date\":\"2023-03-31\",\"issued_date\":\"2023-01-20\",\"withholding_amount\":\"75000\",\"total_amount\":\"825000\"}", "validation_set/48.pdf" : "{\"application_amount\":\"382720\",\"company_name\":\"XXXX\",\"due_date\":\"2023-03-20\",\"issued_date\":\"2023-01-20\",\"withholding_amount\":\"0\",\"total_amount\":\"382720\"}", "validation_set/62.pdf" : "{\"application_amount\":\"500000\",\"company_name\":\"XXXX\",\"due_date\":\"2023-02-28\",\"issued_date\":\"2023-01-31\",\"withholding_amount\":\"0\",\"total_amount\":\"500000\"}", "validation_set/66.jpeg" : "{\"application_amount\":\"120000\",\"company_name\":\"XXXX\",\"due_date\":\"2023-03-05\",\"issued_date\":\"2023-01-20\",\"withholding_amount\":\"0\",\"total_amount\":\"120000\"}", "validation_set/70.pdf" : "{\"application_amount\":\"26937\",\"company_name\":\"XXXX\",\"due_date\":\"2023-02-28\",\"issued_date\":\"2023-01-20\",\"withholding_amount\":\"3000\",\"total_amount\":\"29937\"}", "validation_set/71.pdf" : "{\"application_amount\":\"1120000\",\"company_name\":\"XXXX",\"due_date\":\"2023-02-05\",\"issued_date\":\"2022-12-24\",\"withholding_amount\":\"112000\",\"total_amount\":\"1232000\"}", "validation_set/invoice_pdf_9.pdf" : "{\"application_amount\":\"74226\",\"company_name\":\"XXXX\",\"due_date\":\"\",\"issued_date\":\"2019-10-05\",\"withholding_amount\":\"7422\",\"total_amount\":\"81648\"}", "validation_set/invoice_pdf_8.pdf" : "{\"application_amount\":\"300000\",\"company_name\":\"XXXX\",\"due_date\":\"2020-09-04\",\"issued_date\":\"2018-09-04\",\"withholding_amount\":\"21000\",\"total_amount\":\"321000\"}", "validation_set/15.pdf" : "{\"application_amount\":\"35570000\",\"company_name\":\"XXXX\",\"due_date\":\"2023-02-28\",\"issued_date\":\"2022-12-30\",\"withholding_amount\":\"3557000\",\"total_amount\":\"39127000\"}", "validation_set/14.PDF" : "{\"application_amount\":\"588500\",\"company_name\":\"XXXX\",\"due_date\":\"2023-02-15\",\"issued_date\":\"2023-01-20\",\"withholding_amount\":\"58850\",\"total_amount\":\"647350\"}", "validation_set/_2023.4.24.pdf" : "{\"application_amount\":\"305000\",\"company_name\":\"XXXX\",\"due_date\":\"2023-08-31\",\"issued_date\":\"2023-04-24\",\"withholding_amount\":\"30500\",\"total_amount\":\"335500\"}", "validation_set/38.pdf" : "{\"application_amount\":\"233509\",\"company_name\":\"XXXX\",\"due_date\":\"2021-12-31\",\"issued_date\":\"2021-11-30\",\"withholding_amount\":\"\",\"total_amount\":\"234000\"}", "validation_set/invoice_pdf_0.pdf" : "{\"application_amount\":\"7126\",\"company_name\":\"XXXX\",\"due_date\":\"2021-12-31\",\"issued_date\":\"2021-11-30\",\"withholding_amount\":\"\",\"total_amount\":\"7140\"}", "validation_set/23.pdf" : "{\"application_amount\":\"89811\",\"company_name\":\"XXXX\",\"due_date\":\"2021-12-31\",\"issued_date\":\"2023-01-17\",\"withholding_amount\":\"\",\"total_amount\":\"90000\"}", "validation_set/37.pdf" : "{\"application_amount\":\"217500\",\"company_name\":\"XXXX\",\"due_date\":\"2023-02-28\",\"issued_date\":\"2023-01-06\",\"withholding_amount\":\"21750\",\"total_amount\":\"239250\"}", "validation_set/invoice_pdf_1.pdf" : "{\"application_amount\":\"10977\",\"company_name\":\"XXXX\",\"due_date\":\"2019-12-31\",\"issued_date\":\"2019-11-28\",\"withholding_amount\":\"\",\"total_amount\":\"11000\"}", "validation_set/invoice_pdf_3.pdf" : "{\"application_amount\":\"30000\",\"company_name\":\"XXXX\",\"due_date\":\"2019-12-31\",\"issued_date\":\"2019-11-20\",\"withholding_amount\":\"3000\",\"total_amount\":\"33000\"}", "validation_set/55.jpeg" : "{\"application_amount\":\"\",\"company_name\":\"XXXX\",\"due_date\":\"2019-12-31\",\"issued_date\":\"2019-11-20\",\"withholding_amount\":\"\",\"total_amount\":\"59269\"}", "validation_set/invoice_pdf_2.pdf" : "{\"application_amount\":\"1000\",\"company_name\":\"XXXX\",\"due_date\":\"2021-01-01\",\"issued_date\":\"2020-01-01\",\"withholding_amount\":\"100\",\"total_amount\":\"1100\"}", "validation_set/invoice_pdf_6.pdf" : "{\"application_amount\":\"370870358\",\"company_name\":\"XXXX\",\"due_date\":\"2031-12-31\",\"issued_date\":\"2031-12-21\",\"withholding_amount\":\"37087035\",\"total_amount\":\"407957393\"}", "validation_set/42.jpeg" : "{\"application_amount\":\"100000\",\"company_name\":\"XXXX\",\"due_date\":\"2023-01-31\",\"issued_date\":\"2031-12-21\",\"withholding_amount\":\"10000\",\"total_amount\":\"110000\"}", "validation_set/27.png" : "{\"application_amount\":\"1069681\",\"company_name\":\"XXXX\",\"due_date\":\"2023-01-31\",\"issued_date\":\"2022-12-31\",\"withholding_amount\":\"97243\",\"total_amount\":\"1069681\"}", "validation_set/25.pdf" : "{\"application_amount\":\"14546\",\"company_name\":\"XXXX\",\"due_date\":\"2023-01-31\",\"issued_date\":\"2022-12-29\",\"withholding_amount\":\"1454\",\"total_amount\":\"16000\"}", "validation_set/19.pdf" : "{\"application_amount\":\"468000\",\"company_name\":\"XXXX\",\"due_date\":\"2023-02-05\",\"issued_date\":\"2023-01-15\",\"withholding_amount\":\"46800\",\"total_amount\":\"514800\"}", "validation_set/24.pdf" : "{\"application_amount\":\"360000\",\"company_name\":\"XXXX\",\"due_date\":\"2023-04-25\",\"issued_date\":\"2023-01-18\",\"withholding_amount\":\"36000\",\"total_amount\":\"396000\"}", "validation_set/invoice_pdf_7.pdf" : "{\"application_amount\":\"330000\",\"company_name\":\"XXXX\",\"due_date\":\"2020-06-30\",\"issued_date\":\"\",\"withholding_amount\":\"33000\",\"total_amount\":\"363000\"}", "validation_set/invoice_pdf_5.pdf" : "{\"application_amount\":\"99790\",\"company_name\":\"XXXX\",\"due_date\":\"2020-04-30\",\"issued_date\":\"2020-02-26\",\"withholding_amount\":\"\",\"total_amount\":\"100000\"}", "validation_set/invoice_pdf_4.pdf" : "{\"application_amount\":\"320000\",\"company_name\":\"XXXX\",\"due_date\":\"\",\"issued_date\":\"2021-03-07\",\"withholding_amount\":\"32000\",\"total_amount\":\"352000\"}", "validation_set/40.pdf" : "{\"application_amount\":\"558900\",\"company_name\":\"XXXX\",\"due_date\":\"\",\"issued_date\":\"2023-01-01\",\"withholding_amount\":\"62100\",\"total_amount\":\"621000\"}", "validation_set/54.pdf" : "{\"application_amount\":\"480000\",\"company_name\":\"XXXX\",\"due_date\":\"2023-02-28\",\"issued_date\":\"2022-12-31\",\"withholding_amount\":\"48000\",\"total_amount\":\"528000\"}", "validation_set/invoice_img_3.png" : "{\"application_amount\":\"250000\",\"company_name\":\"XXXX\",\"due_date\":\"2019-10-31\",\"issued_date\":\"2019-09-30\",\"withholding_amount\":\"0\",\"total_amount\":\"250000\"}", "validation_set/invoice_img_2.png" : "{\"application_amount\":\"44895\",\"company_name\":\"XXXX\",\"due_date\":\"2020-02-29\",\"issued_date\":\"2020-12-24\",\"withholding_amount\":\"5105\",\"total_amount\":\"50000\"}", "validation_set/45.jpeg" : "{\"application_amount\":\"77500\",\"company_name\":\"XXXX\",\"due_date\":\"2020-02-29\",\"issued_date\":\"2022-12-31\",\"withholding_amount\":\"7750\",\"total_amount\":\"85250\"}", "validation_set/43.pdf" : "{\"application_amount\":\"50000\",\"company_name\":\"XXXX\",\"due_date\":\"2023-03-05\",\"issued_date\":\"2023-01-20\",\"withholding_amount\":\"5000\",\"total_amount\":\"55000\"}", "validation_set/invoice_img_0.png" : "{\"application_amount\":\"23000\",\"company_name\":\"XXXX\",\"due_date\":\"2019-12-17\",\"issued_date\":\"2019-11-17\",\"withholding_amount\":\"2300\",\"total_amount\":\"25300\"}", "validation_set/invoice_img_1.jpg" : "{\"application_amount\":\"30000\",\"company_name\":\"XXXX\",\"due_date\":\"2019-12-31\",\"issued_date\":\"2019-12-20\",\"withholding_amount\":\"3000\",\"total_amount\":\"33000\"}", "validation_set/56.pdf" : "{\"application_amount\":\"1340590\",\"company_name\":\"XXXX\",\"due_date\":\"2023-03-31\",\"issued_date\":\"2023-01-31\",\"withholding_amount\":\"134059\",\"total_amount\":\"1474649\"}", "validation_set/52.pdf" : "{\"application_amount\":\"480000\",\"company_name\":\"XXXX\",\"due_date\":\"2023-02-28\",\"issued_date\":\"2023-01-15\",\"withholding_amount\":\"48000\",\"total_amount\":\"528000\"}", "validation_set/invoice_img_5.jpg" : "{\"application_amount\":\"3000\",\"company_name\":\"XXXX\",\"due_date\":\"\",\"issued_date\":\"\",\"withholding_amount\":\"300\",\"total_amount\":\"3300\"}", "validation_set/46.pdf" : "{\"application_amount\":\"415071\",\"company_name\":\"XXXX\",\"due_date\":\"\",\"issued_date\":\"\",\"withholding_amount\":\"46119\",\"total_amount\":\"461190\"}", "validation_set/invoice_img_4.jpg" : "{\"application_amount\":\"143000\",\"company_name\":\"XXXX\",\"due_date\":\"\",\"issued_date\":\"\",\"withholding_amount\":\"10800\",\"total_amount\":\"153800\"}", "validation_set/53.pdf" : "{\"application_amount\":\"830000\",\"company_name\":\"XXXX\",\"due_date\":\"2023-02-28\",\"issued_date\":\"2023-01-20\",\"withholding_amount\":\"83000\",\"total_amount\":\"913000\"}", "validation_set/13.jpeg" : "{\"application_amount\":\"1804578\",\"company_name\":\"XXXX\",\"due_date\":\"2023-01-31\",\"issued_date\":\"2022-12-31\",\"withholding_amount\":\"180457\",\"total_amount\":\"1985035\"}", "validation_set/invoice_img_6.png" : "{\"application_amount\":\"530000\",\"company_name\":\"XXXX\",\"due_date\":\"2020-08-15\",\"issued_date\":\"2020-05-31\",\"withholding_amount\":\"53000\",\"total_amount\":\"583000\"}", "validation_set/invoice_img_7.png" : "{\"application_amount\":\"530000\",\"company_name\":\"XXXX\",\"due_date\":\"2020-08-15\",\"issued_date\":\"2020-05-31\",\"withholding_amount\":\"53000\",\"total_amount\":\"583000\"}", "validation_set/50.pdf" : "{\"application_amount\":\"360000\",\"company_name\":\"XXXX\",\"due_date\":\"2023-02-15\",\"issued_date\":\"2021-01-19\",\"withholding_amount\":\"36000\",\"total_amount\":\"396000\"}", } expected_answer = image_path item = { "messages": [ { "role": "system", "content": system_prompt }, { "role": "user", "content": user_prompt }, { "role": "user", "content": [ { "type": "image_url", "image_url": { "url": url, } } ] }, { "role": "assistant", "content": training_datas[image_path]} ] } f.write(json.dumps(item, ensure_ascii=False) + '\n')せ
請求書のスクリーンキャプチャ
gpt-4oベースで学習データセットとして、上記のプログラミングより出力されるファイルををファインチューニングに入れる
https://platform.openai.com/finetune
ファインチューニング完了
5. 評価
用意されてるPlayground機能を使って、通常のモデルとファインチューニング済みのモデルが比較してみる
左は通常のモデル、右のファインチューニング済みのモデルです。
通常のモデル
– 日付は請求書の画像に記載ある通りに表示する
– 金額が抽出できない
– 企業名が正しく抽出できる
ファインチューニング済みのモデル:
– 日付は学習されたフォーマット通りに表示できる
– 金額が抽出できる
– 企業名が正しく抽出できる
他の請求書ファイルを試しても、ファインチューニング済みのモデルの方が優れてると確認してます。
6. おわりに
ビジョンファインチューニングは確かに優れてる結果が出せてますが、
学習できるファイルはPEG, PNG, WEBPのみです。
請求書としてはPDFファイル提示する人が多いですので、一応、プロンプト改善ベースでカバーしましょう。
7. 技術者募集の案内
次世代システム研究室では、最新技術を活用したシステム開発に興味を持つエンジニアを募集しています。ご興味のある方はこちらからご応募ください。
グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。
Follow @GMO_RD