最終更新: 2026/06/22 18:56
MAS-306 結果: MAS-147 請求書 OCR マッチング設計 (Gemini Deep Think v2 回答)
投入プロンプト: MAS-306 メタプロンプト 投入日: 2026-04-21 使用モデル: Gemini Deep Think (v2 再検討版) 関連: dev_mas-147 開発仕様書 (v2)
回答全文 (v2 設計仕様書)
MAS-147 請求書 OCR・マッチング機能 設計仕様書 (v2: Document AI + Gemini ハイブリッド)
1. エグゼクティブサマリ
v2 アーキテクチャの核心は「事実抽出(Fact)と意味推論(Reasoning)の責務分離」です。税法上 1 円のブレも許されない「T 番号」「金額」「日付」「明細行座標」は Google Cloud Document AI に確定的に抽出させ、Gemini は「請求タイプ(定額/従量等)の推論」や「真のベンダー推定」といった文脈処理のみに特化させます。この組み合わせにより、誤マッチによるデータ汚染リスクをゼロに抑えつつ、自動確定(Auto-Link)率の最大化と人間確認(HitL)工数の極限までの削減を実現します。
2. v1 からの継承 / 変更 / 廃止
| 項目 (コンポーネント) | ステータス | 理由・変更の狙い |
|---|---|---|
| T 番号カラム・HitL サイドバー | 🟢 継承 | 誤マッチ 0% を保証する絶対キーと、安全な人間承認の UI 基盤として必須。 |
| 多段 Pass / 1 円差許容 | 🟢 継承 | Pass 0〜3, 5 のロジックと消費税誤差吸収のアルゴリズムは不変。 |
| OCR 抽出エンジン | 🟡 変更 | Gemini 単独 ➔ DocAI (構造抽出) + Gemini (意味推論) のハイブリッド構成へ。 |
| 非同期キューのバッチサイズ | 🟡 変更 | 1 回の処理時間増(DocAI+Gemini で約 10〜15 秒)に伴い、1 バッチ 3〜5 件 ➔ 1〜2 件 へ縮小。 |
| 確信度 (Confidence) スコア | 🟡 変更 | LLM の主観スコアから、DocAI の機械学習確率モデル (0.0-1.0) ベースの複合計算式へ。 |
| 1:N (明細分割) マッチ | 🟡 変更 | ハルシネーション懸念による「見送り」から、DocAI 明細の信頼性を盾に「実装」へ。 |
| ファイル保存・リネーム運用 | 🔵 新規 | MAS-152 (電帳法) と統合し、月次サブフォルダの自動生成と電帳法準拠リネームをパイプライン化。 |
| Gemini JSON Schema 抽出 | 🔴 廃止 | Gemini に金額や日付を抽出させるプロンプトは全廃。推論専用の軽量プロンプトへ再設計。 |
3. Document AI 標準エンティティ → WRK_INVC 完全対応表
| DocAI エンティティ | 取得・加工・推論方針 | WRK_INVC / 活用先 | 備考・代替策 |
|---|---|---|---|
supplier_name | [DocAI] そのまま取得 | 取引先名_OCR | ※ Stripe 等決済代行業者となるリスクあり |
supplier_tax_id | [DocAI] T 番号形式検証 | T 番号 | 読めなければ vat_registration_number 等からフォールバック |
supplier_address 等 | [DocAI] (※ 破棄) | - | GAS メモリ超過防止のため fieldMask で除外推奨 |
supplier_website 等 | [DocAI] | (参考情報) | trueVendorName 推論のコンテキストとして Gemini へ渡す |
supplier_bank_account | [DocAI] | 振込先 (HitL 表示用) | 新規 Ad-hoc 起票時の支払先メモ |
supplier_payment_terms | [DocAI] | (参考情報) | 決済日_計画 の算出ロジック補強用 |
receiver_name | [DocAI] 宛名検証 | 自社宛チェックフラグ | 「bizlp」等を含まない場合は HitL 時に赤色警告 |
invoice_id | [DocAI] | 請求書番号 | リネーム時の重複回避 (docNumber) キー |
invoice_date | [DocAI] YYYY-MM-DD 化 | 発生日 | 和暦は DocAI が西暦変換可能 |
due_date | [DocAI] | 決済日_計画 | 欠損時は invoice_date + 取引先マスタ支払ラグで補完 |
currency | [DocAI] JPY 検証 | 通貨エラーフラグ | JPY または null 以外ならエラーキュー直行 |
total_amount | [DocAI] 最重要 | 税込金額_計画 | 確信度評価のアンカー |
net_amount | [DocAI] | 税抜金額_計画 | 無ければ total_amount - total_tax_amount |
total_tax_amount | [DocAI] | 消費税額_計画 | 軽減税率混在チェック用 |
line_items (配列) | [DocAI] | - | 1:N 分割 (Pass 4) のソースデータ |
└ line_item/description | [DocAI] | (明細品目) | 摘要 とのファジーマッチングキー |
└ line_item/amount | [DocAI] | (明細金額) | 分割起票時の金額 |
tax_details (配列) | [DocAI] | (税率判定用) | 複数税率混在取引の検知 |
| (以下 Gemini 推論) | 🧠 [Gemini 推論] | DocAI の結果をプロンプトに入れ込んで推論 | |
trueVendorName | 🧠 [Gemini 推論] | 真の取引先名 | Stripe 等を排除し真の提供元を推論 |
billingType | 🧠 [Gemini 推論] | 請求タイプ | SUBSCRIPTION / USAGE_BASED / ONE_OFF |
invoiceStructure | 🧠 [Gemini 推論] | 請求構造 | SINGLE_SVC / BUNDLE_SVC / MULTI_INDEP |
mainServiceSummary | 🧠 [Gemini 推論] | 摘要 | 15 文字以内の要約 |
4. 確信度スコア統合設計
複合スコア計算式:
const amtConf = docAi.total_amount.confidence;
const vndConf = docAi.supplier_tax_id ? docAi.supplier_tax_id.confidence : docAi.supplier_name.confidence;
const baseFactConf = Math.min(amtConf, vndConf); // 最弱リンク
const geminiConf = geminiOutput.confidenceScore; // Gemini 推論スコア (0.0-1.0)
const finalScore = (baseFactConf * 0.8) + (geminiConf * 0.2);
閾値とアクション:
- HIGH (0.85 以上): Auto-Link (自動紐付)。T 番号・金額一致でバックグラウンド処理。
- MEDIUM (0.60 〜 0.84): HitL (保留)。T 番号欠損等。サイドバーで人間が 1 クリック承認。
- LOW (0.60 未満): OCR エラー警告。手動補正を促す。
※ total_amount.confidence < 0.80 または currency != JPY の場合は強制的に LOW に落とす 即死ルール を適用。
5. line_items を使った 1:N 分割マッチの可否判定
DocAI の line_items は物理座標に基づくため、ハルシネーションのない決定的データとして 1:N 消込(Pass 4)に活用可能です。
- 照合方式: GAS の
000_infra/004_utils.jsに N-gram Jaccard 係数 または Levenshtein 距離 を実装し、line_item.descriptionと 予算マスタの品目名の類似度(例: 70% 以上)でファジーマッチ。 - 失敗対策:
SUM(line_items.amount) != total_amountとなる場合(割引・送料の分離等)、1:N 探索を放棄しBUNDLE_SVC扱いとして HitL (手動分割) へフォールバック。
6. フォルダ分離・リネーム運用設計 (MAS-152 統合)
- フォルダ階層:
02_processed/請求書/YYYY-MM/(フラットな大フォルダは API タイムアウトの原因となるため月次サブフォルダ必須)。システム実行日ベースで動的生成。 - 命名規則:
YYYYMMDD_取引先名_税込金額_docNumber.pdf(電帳法検索要件担保)。同名衝突時は_(1)を付与。 - 保留/エラー管理: HitL 未承認ファイルは無期限保留。抽出失敗時は
_UNKNOWN_プレフィックスを付与し、HitL 補正後に再リネーム。 - 電帳法対応:
02_processed/の権限を「閲覧者」に絞り、システム以外からの編集・削除を不可とする(MAS-201 連携)。
7. コスト対効果試算 (月間 100 通想定)
- v1 (Gemini 単独): 月額 ~$1.0。ハルシネーション懸念により HitL 確認率が高く(約 60 件)、確認工数は 月 60 分(約 3,000 円相当)。
- v2 (ハイブリッド): 月額 ~$2.0 (DocAI + Gemini)。T 番号と金額の確定的抽出により Auto-Link 率が 85% 超へ向上。HitL は約 15 件となり、確認工数は 月 7.5 分(約 375 円相当)。
- 結論: 月額わずか数百円の追加 API コストで、経営者の「PDF を凝視して金額を再確認する時間」が 50 分以上削減され、ROI は圧倒的にプラス。
8. GAS 実装制約と対応策
- OAuth スコープ崩壊 (失敗パターン #26) の防止: Document AI 呼び出しに必要な
https://www.googleapis.com/auth/cloud-platformをappsscript.jsonに追記する際、必ず「プロジェクト設定」に表示されている 現在の全スコープをコピーして配列に完全記述 すること(部分追加すると Spreadsheet 等の権限が全焼失する)。 - 50MB レスポンス制限回避:
UrlFetchApp時の URL に?fieldMask=entities,textを付与し、Base64 画像やポリゴン座標を除外する。
9. 推奨実装ロードマップ (v2 版)
- Step 1 (W1): DocAI インフラ & OAuth 権限設定 - GCP 設定、安全なスコープ更新、通信テスト。
- Step 2 (W1): 物理ファイル・ルーティング基盤 - 階層フォルダ移動とリネームロジックの実装。
- Step 3 (W2): ハイブリッド抽出パイプライン構築 - DocAI パース → Gemini メタ推論 → 統合 JSON 生成。
- Step 4 (W3-W4): マッチングエンジン & HitL サイドバー実装 - 複合スコア計算、Pass 0〜2 の Auto-Link 開通、未承認候補のサイドバー UI 開発と 1:N サジェストの組み込み。
10. 想定リスクと緩和策
- 多ページ PDF によるタイムアウト: 3 ページ以上の場合、最初の 2 ページのみを DocAI に送信する前処理を挟む(総額・サマリは先頭に集中するため)。
- 外貨(ドル等)の誤読:
currency != JPYなら強制的に LOW スコアとし、HitL に警告を出す。 - 手書き領収書の精度低下: docType 判定で確信度が低い場合は、Gemini への画像直接入力 (v1 方式) へフォールバックさせる。
11. 採否判断マトリクス
- 初期 (〜30 枚/月): Gemini 単独 (v1) を推奨。コスト最安、全件目視でも負担小。
- 成長期 (30〜200 枚/月): DocAI + Gemini (v2) を推奨。AWS 等の 1:N 明細分割消込に対応し、経理の目視工数破綻を防ぐ。
- 成熟期 (1,000 枚〜/月): Cloud Run への移行。GAS と DriveApp の API 制約を超えるためバックエンド刷新が必要。
仕様書への反映方針
本回答を元に、docs/dev/dev_mas-147_invoice_ocr_auto_posting.md を v2 として全面改訂する。主要反映ポイント:
- 責務分離 (Fact vs Reasoning): DocAI = 税法確定値、Gemini = 意味推論
- T 番号カラム必須: 12_mst_partner / 32_wrk_invoice 両方
- 多段 Pass (0〜6) マッチング: T 番号 → 取引先完全一致 → N:1 合算 → 1:N 分割 (格上げ) → ファジー → 新規
- 複合確信度スコア:
baseFactConf × 0.8 + geminiConf × 0.2、HIGH/MEDIUM/LOW (0.85/0.60) + 即死ルール - HitL サイドバー UI: PDF プレビュー + 候補提示 + 承認/オーバーライド
- フォルダ分離・リネーム (MAS-152 統合):
02_processed/請求書/YYYY-MM/+ 電帳法リネーム - 非同期キュー: 1 バッチ 1〜2 件 (DocAI 処理時間増のため縮小)
- 採否判断マトリクス: 30 枚未満 = v1 / 30〜200 枚 = v2 / 1000 枚〜 = Cloud Run
変更履歴
| 日付 | 変更内容 |
|---|---|
| 2026-04-21 | 初版作成 (Gemini Deep Think v2 回答を全文保存) |