海外のSaaSベンダーから毎月届く英文の請求書と利用量明細を読み取り、契約・部門ごとの利用量で費用を配賦して、前月から急に増えた請求を拾う
海外のSaaSベンダーから毎月届く英文の請求書と利用量明細を読み取り、明細行を契約台帳の品目と部門にそろえて費用を配賦します。前月と比べて急に増えた請求には印を付け、支払の前に担当へ返します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- AWS Textract/Azure AI/Google Document AI
- 連携・自動化
- Python
- 対象業界
- EC/IT・SaaS/広告/製造
- 対象部門
- 情報システム/経理
- 対象業務
- データ入力・転記/集計・分析
- 主な課題
- データ分析に時間がかかる/入力作業が多い/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/判断支援/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 共有のメールボックスに請求書が届き、経理の担当がPDFを月のフォルダに保存する
- 情報システム部の担当が、契約台帳を見て、どの契約の請求かを確かめる
- 請求書を開き、請求番号・請求期間・通貨・小計・税・合計を表計算に写す
- 利用量明細を開き、明細行(品目、数量、単価、金額、ワークスペースなど)を写す
- 明細行ごとに、契約台帳の品目と、どの事業部の利用かを結びつける
- 事業部ごとの金額を按分し、前月の表と並べて大きく増えたものを目で探す
- 増えたものは、契約の担当者に理由を聞き、経理が支払と会計への計上を進める
- 自動共有のメールボックスに届いた請求書のPDFを、受付フォルダ(Amazon S3)に保存する
- 自動保存をきっかけに処理が動き、形式・サイズ・パスワードの有無を確かめる
- 自動OCRが請求書の要約項目(請求番号、日付、ベンダー名、合計など)と明細行、信頼度を返す
- 自動プログラムが、ベンダー名と口座番号(`ACCOUNT_NUMBER`)から契約台帳の契約を引く
- 自動生成AIが、明細行を契約台帳の品目とワークスペースの対応表にそろえ、そろえられない行に印を付ける
- 自動プログラムが、事業部ごとの金額を按分し、前月・前々月と比べて増えた明細行に印を付ける
- 自動生成AIが、増えた明細行の差を並べ、理由の候補を書く(席数・超過料金・単価・新しい品目)
- 人情報システム部の担当が、印の付いた請求だけを開いて確かめ、必要なら契約の担当者に聞く
- 人経理の担当が、配賦の結果を確定して会計システムと管理会計の表に回す
各工程の詳しい説明を読む
- 共有のメールボックスに請求書が届き、経理の担当がPDFを月のフォルダに保存する
- 情報システム部の担当が、契約台帳を見て、どの契約の請求かを確かめる
- 請求書を開き、請求番号・請求期間・通貨・小計・税・合計を表計算に写す
- 利用量明細を開き、明細行(品目、数量、単価、金額、ワークスペースなど)を写す
- 明細行ごとに、契約台帳の品目と、どの事業部の利用かを結びつける
- 事業部ごとの金額を按分し、前月の表と並べて大きく増えたものを目で探す
- 増えたものは、契約の担当者に理由を聞き、経理が支払と会計への計上を進める
(a)明細の転記が終わらない。 明細行が数十行に及ぶ請求書もあり、写す作業が時間の大半です。 写し間違いは、按分の結果がおかしいと気づくまで見つかりません。
(b)明細行の名前がベンダーごとに違う。 同じ「席」でも「seats」「users」「licenses」「members」と書き方が違い、ワークスペースの名前が事業部の名前と一致していないことも多い。 結びつけ方は担当者の記憶にあり、担当が替わると按分の結果が変わります。
(c)増えた請求に気づくのが支払の後。 前月との比較は表を並べて目で見るだけで、急ぐ月は飛ばされます。 超過料金や席の自動追加に、四半期の予算を締めるときに気づくことがあります。
(d)理由を聞きに行くまでに時間がかかる。 増えたことは分かっても、どの明細行が増えたのかを調べてから聞くので、1件の問い合わせの準備に請求書を何度も開きます。 契約の担当者の側も、聞かれてから管理画面を開いて調べるので、答えが返るまでに数日かかります。その間に支払の期日が来ると、理由が分からないまま支払うことになります。
- 【自動】 共有のメールボックスに届いた請求書のPDFを、受付フォルダ(Amazon S3)に保存する
- 【自動】 保存をきっかけに処理が動き、形式・サイズ・パスワードの有無を確かめる
- 【自動】 OCRが請求書の要約項目(請求番号、日付、ベンダー名、合計など)と明細行、信頼度を返す
- 【自動】 プログラムが、ベンダー名と口座番号(
ACCOUNT_NUMBER)から契約台帳の契約を引く - 【自動】 生成AIが、明細行を契約台帳の品目とワークスペースの対応表にそろえ、そろえられない行に印を付ける
- 【自動】 プログラムが、事業部ごとの金額を按分し、前月・前々月と比べて増えた明細行に印を付ける
- 【自動】 生成AIが、増えた明細行の差を並べ、理由の候補を書く(席数・超過料金・単価・新しい品目)
- 【人】 情報システム部の担当が、印の付いた請求だけを開いて確かめ、必要なら契約の担当者に聞く
- 【人】 経理の担当が、配賦の結果を確定して会計システムと管理会計の表に回す
8番目が、この設計の分かれ目です。 人が開くのは、合計が読み取れなかったもの、対応表にない明細行があるもの、前月から増えたものだけです。印の付かない請求は、配賦の結果を一覧で流し見て終わりにします。
6番目をプログラムに置いているのは、按分と比較が計算だからです。 AIに足し算をさせると、合計が1セント合わない配賦表ができます。
02今回想定するシステム構成
英文の請求書・利用量明細(PDF。共有のメールボックスに届く) ▼【トリガー】受付フォルダ(Amazon S3)への保存 AWS Lambda ── 形式・サイズ・パスワードの確認 ▼ AWS Textract(StartExpenseAnalysis / GetExpenseAnalysis) │ 要約項目(SummaryFields)、明細行(LineItemGroups)、通貨、信頼度 ▼ Python ── 契約台帳から契約を引く(ベンダー名・口座番号) ▼ Claude API ── 明細行を品目とワークスペースの対応表にそろえる ▼ Python ── 事業部ごとの按分、前月・前々月との比較 ▼ Claude API ── 増えた明細行の差を並べ、理由の候補を書く ▼ 配賦表の案 + 印の一覧(ok / unmapped / spike / needs_human) ▼ 【情報システム部が印の付いた請求を確認】→【経理が確定】→ 会計システム・管理会計の表
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | AWS Textract(StartExpenseAnalysis/GetExpenseAnalysis) | Azure AI Document Intelligence、Google Document AI |
| 生成AI | Claude API(明細行の対応づけ、理由の候補) | OpenAI API、Gemini API |
| 集計 | Python(契約の特定、按分、前月との比較) | 会計システムの配賦機能 |
| 連携 | AWS Lambda(保存と完了の通知を起点に処理を動かす) | Amazon EventBridge |
| 保管 | Amazon S3(請求書、読み取り結果、配賦表の版) | 社内のファイルサーバー |
会計システムと契約台帳は、新しく足すものではありません。 最初の準備は、契約台帳に「ベンダーの口座番号(請求書に書かれる顧客番号)」「品目の対応表」「ワークスペースと事業部の対応表」を持たせることです。
OCRに AWS Textract を選ぶのは、請求書が英文で、請求書専用の読み取りがあるからです。 請求書・領収書の分析(AnalyzeExpense)は、テンプレートの設定なしに請求番号、日付、ベンダー名、合計、明細行などを取り出し、「Invoice No.」「Bill number」のように違う書き方の見出しを INVOICE_RECEIPT_ID のような標準の名前にそろえて返します。対応言語は英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語で、日本語の請求書は読めません。
非同期の処理を使います。 明細が数十ページになる請求書があるためです。StartExpenseAnalysis は JPEG、PNG、PDF の文書を S3 から読み、完了を Amazon SNS に通知します。
03どうやって実装するのか
処理の起点を決める
受付フォルダ(Amazon S3)にPDFが保存されたことを起点にします。 請求書は月初に集中しますが、ベンダーごとに締め日が違い、月の途中にも届きます。月末にまとめて処理すると、増えた請求に気づくのが支払の直前になります。
共有のメールボックスから受付フォルダへの保存は、メールのルールで添付ファイルを取り出す形にします。件名や送信元でベンダーを決め打ちしません。 送信元のアドレスはベンダーの都合で変わり、決め打ちすると、その月だけ処理されない請求が出ます。
保存を AWS Lambda が受け、StartExpenseAnalysis を呼びます。ClientRequestToken にファイルのハッシュから作った値を入れ、同じPDFが二度保存されても同じ JobId が返るようにします。 JobTag には受け取った月を入れます。
完了は NotificationChannel の Amazon SNS に届きます。状態が SUCCEEDED であることを確かめてから、GetExpenseAnalysis で結果を取ります。 JobId は7日間だけ有効なので、結果は取り次第 S3 に保存します。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 請求書・明細のPDF | ベンダーの請求書と利用量明細。受け取った日時 | 受付フォルダ(S3) |
| 読み取り結果 | 要約項目、明細行、通貨、信頼度 | AWS Textract |
| 契約台帳 | 契約番号、ベンダー、口座番号、契約の形(席・従量・併用)、契約上の単価、更新日 | スプレッドシート |
| 品目の対応表 | ベンダーの明細行の書き方と、自社の品目コードの対応 | 契約台帳の別シート |
| ワークスペースの対応表 | ワークスペース・プロジェクト・組織の名前と、事業部の対応 | 契約台帳の別シート |
| 過去の配賦 | 同じ契約の前月・前々月の明細行と配賦の結果 | S3 の保管領域 |
質を決めるのは、2つの対応表です。 品目の対応表が無ければ、明細行は毎月 unmapped になります。ワークスペースの対応表が無ければ、金額は読めても、どの事業部に配るかが決まりません。
対応表は、最初から全部を埋めなくて構いません。 unmapped の行が出るたびに人が対応を決め、表に1行足します。3か月ほどで、ほとんどの行が対応表で引けるようになります。
データの取得方法を決める
GetExpenseAnalysis の結果から、次のものを取り出します。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 請求番号・請求日・支払期日 | SummaryFields の INVOICE_RECEIPT_ID、INVOICE_RECEIPT_DATE、DUE_DATE | 重複の検知、支払の予定 |
| ベンダー名・口座番号 | VENDOR_NAME、ACCOUNT_NUMBER、CUSTOMER_NUMBER | 契約台帳の契約を引く |
| 小計・税・合計・請求額 | SUBTOTAL、TAX、TOTAL、AMOUNT_DUE | 明細の合計との検算 |
| 通貨 | 値に付く Currency の Code | 換算の前提 |
| 明細行 | LineItemGroups の ITEM、QUANTITY、UNIT_PRICE、PRICE、PRODUCT_CODE | 品目の対応づけと按分 |
| 明細の行全体 | EXPENSE_ROW | ワークスペース名など、標準の名前に入らない列 |
| 標準外の項目 | OTHER | 請求期間(「Billing period」など) |
請求期間は標準の項目にありません。 「Billing period」「Service period」のような見出しは OTHER に入るので、LabelDetection の文字列で拾います。請求期間が取れないと、前月との比較の相手が決まりません。
ワークスペース名は EXPENSE_ROW から取ります。 明細の列にワークスペースやプロジェクトの名前があっても、標準の名前には入らないことがあるからです。行全体の文字列を生成AIに渡し、対応表と照らします。
GetExpenseAnalysis は1回の呼び出しで返す結果の数に上限があり、続きは NextToken で取ります。NextToken が返らなくなるまで取り切ってから保存します。 途中で止めると、明細の後半が無いまま配賦されます。
AIへ渡す前に整形する
- 形式の確認 …
StartExpenseAnalysisは JPEG、PNG、PDF を扱います。TIFFで届いたものはPDFにします - パスワードの確認 … PDFはパスワードで保護できません。保護されたものは担当者へ戻します
- サイズの確認 … 非同期の処理でPDFは500MBが上限です
- 言語の確認 … 英語以外の請求書が混ざっていないかを見ます。日本法人経由の日本語の請求書は、この構成の外で扱います
- 請求書と明細の組み合わせ … 明細が別のPDFで届くベンダーは、請求番号で請求書と組にします
- 重複の検知 … 同じベンダー・同じ請求番号のものが既にあれば止めます
- 利用者の列を落とす … 席ごとに利用者の氏名やメールアドレスが並ぶ明細は、生成AIに渡す前にその列を消します。配賦に要るのはワークスペースと数量だけです
5番目が、この題材で手間のかかるところです。 明細に請求番号が書かれていないベンダーもあり、そのときは請求期間と口座番号で組にし、組にできなければ人へ回します。
AIに処理させる
させるのは2つです。 明細行を対応表にそろえることと、増えた明細行の差に理由の候補を付けることです。
| させること | 中身 | そろえられないときの扱い |
|---|---|---|
| 品目の対応づけ | 明細行の ITEM と PRODUCT_CODE を、品目の対応表の品目コードに結びつける | 対応表に無ければ unmapped |
| ワークスペースの対応づけ | EXPENSE_ROW の文字列からワークスペース名を見つけ、事業部に結びつける | 見つからなければ unmapped |
| 明細行の種類分け | 席・従量・超過料金・一時費用・値引き・税のどれか | 決められなければ unknown |
| 理由の候補 | 増えた明細行について、数量の差・単価の差・新しい行の有無を並べる | 差が説明できなければ「明細からは不明」 |
対応づけには、対応表を必ず渡します。 対応表なしに「この明細はどの事業部の利用か」と聞くと、ワークスペースの名前から事業部を推し量ります。推し量った配賦は、一度入ると誰も直しません。
| させないこと | 理由 |
|---|---|
| 按分と合計の計算 | 計算はプログラムが行う。1セントでも合わない配賦表を作らない |
| 外貨の換算 | 換算のレートと方法は経理の取り決め |
| 対応表に無い対応の決定 | 推し量らずに unmapped で返す。決めるのは人 |
| 増えた理由の断定 | 明細の差から言えることだけを書く。契約の担当者に確かめる |
| 税の扱いの判断 | 国外事業者の役務にかかる消費税の扱いは経理と税理士が決める |
3行目がいちばん起きやすい失敗です。 「design-team」というワークスペースを見れば、AIはデザインの部署に結びつけます。実際には複数の事業部のデザイナーが使っていることもあり、対応表に書かれた結びつけ以外はさせません。
指示内容を固定する
あなたは情報システム部で、海外のSaaSの請求書の明細行を
社内の品目と事業部にそろえる担当です。
OCRが返した明細行と、渡した対応表だけを使ってください。推測で埋めないでください。
【やること】
1. 明細行ごとに、品目の対応表から品目コードを選ぶ
2. 明細行ごとに、行全体の文字列からワークスペース名を見つけ、
ワークスペースの対応表から事業部を選ぶ
3. 明細行の種類を seat / usage / overage / one_time / discount / tax / unknown から選ぶ
4. 前月の明細行が渡されたときは、増えた行について差を並べる
【厳守事項】
- 対応表に無い組み合わせを作らないでください。
見つからなければ mapping_status を unmapped にし、候補を書かないでください。
- ワークスペースの名前から事業部を推し量らないでください。
- 金額の計算、合計、按分、外貨の換算をしないでください。
金額は読み取り結果の文字列をそのまま amount_text に写してください。
- 明細行を足したり、まとめたり、省いたりしないでください。
入力の行数と出力の行数を同じにしてください。
- 増えた理由は、数量の差、単価の差、新しく現れた行、消えた行のうち、
明細から読み取れるものだけを書いてください。
契約の変更や担当者の操作など、明細に書かれていない理由を書かないでください。
説明できなければ「明細からは不明」としてください。
- 税の扱いについて意見を書かないでください。
【明細行】{line_items}
【品目の対応表】{product_map}
【ワークスペースの対応表】{workspace_map}
【前月の明細行】{previous_lines}
「入力の行数と出力の行数を同じに」を書かないと、行がまとめられます。 同じ品目が2行に分かれていると、AIは親切に1行にまとめます。まとめた行は、どちらのワークスペースの行だったかが消えます。 行数をそろえさせ、プログラムで行数を数えて確かめます。
「明細に書かれていない理由を書かない」も同じです。 席数が増えた行を見ると、AIは「新しいメンバーの参加」と書きます。それは推測で、契約の担当者に聞く前に答えが書かれていると、聞かずに済ませてしまいます。
出力形式を固定する
次の形のJSONで受け取ります。 Claude API の構造化出力(output_config.format に json_schema)で形を守らせます。
{
"invoice_id": "",
"contract_id": "",
"lines": [
{ "line_no": 1, "item_text": "", "amount_text": "", "quantity_text": "",
"product_code": "", "workspace": "", "division": "",
"line_type": "seat | usage | overage | one_time | discount | tax | unknown",
"mapping_status": "mapped | unmapped" }
],
"increase_notes": [
{ "line_no": 1, "diff": "quantity | unit_price | new_line | removed_line",
"evidence": "", "reason_candidate": "" }
]
}
1つ目の理由は、按分をプログラムに渡せることです。 division と amount_text がそろえば、按分は機械的に決まります。プログラムは amount_text を数値に直し、明細の合計と SUBTOTAL が一致するかを検算してから按分します。
2つ目は、印を機械的に決められることです。
| 印 | 付く条件 |
|---|---|
ok | すべての行が mapped、検算が一致、増えた行が無い |
unmapped | unmapped の行がある |
spike | 合計または明細行が、前月と前々月の平均から自社で決めた率と額を超えて増えた |
needs_human | 合計・通貨・請求期間のどれかの信頼度が低い、または検算が合わない |
3つ目は、evidence で確認が速くなることです。 担当者はPDFを開く前に、どの行の数量がいくつからいくつに変わったかを読めます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 受付フォルダ(S3) | イベントで AWS Lambda を起動 | 保存を検知し、読み取りを始める |
| AWS Textract | API呼び出し(非同期) | 要約項目と明細行を返す |
| Amazon SNS | 完了の通知 | SUCCEEDED なら結果を取りに行く |
| 契約台帳 | 読み取りのみ | 契約と2つの対応表を引く |
| Claude API | API呼び出し | 対応づけと理由の候補 |
| 配賦表 | 表計算のファイルを書き出す | 確定前の案として月のフォルダに置く |
配賦表は明細行ごとに1行、列は「契約番号/請求番号/請求期間/品目コード/ワークスペース/事業部/通貨/金額/印」とし、事業部ごとの合計は別のシートに出します。明細行の単位で残しておくと、事業部から「なぜこの額か」と聞かれたときに元の行まで戻れます。
会計システムには書き込みません。 確定した配賦表を、経理が既存の取り込みの手順で入れます。契約台帳の対応表も、自動では書き足しません。 unmapped の行の対応を決めるのは人で、決めた結果を人が表に足します。
人が確認する
人が開くのは、印の付いた請求だけです。 ok の請求は、事業部ごとの配賦額を一覧で流し見ます。
needs_humanを先に見る … 合計や通貨が読めなかったもの、検算が合わないものです。PDFを開いて値を確定しますunmappedの行の対応を決める … 決めたら対応表に1行足します。同じ行は来月から自動でそろいますspikeの理由を確かめる …increase_notesを読み、必要なら契約の担当者に聞きます。席の削減や契約の見直しにつなげるかは、契約の担当者が決めます- 経理が配賦表を確定する … 確定した表だけが会計と管理会計に回ります
2番目は手間ではなく投資です。 初月は unmapped が多く出ますが、対応表に足した分だけ翌月の確認が減ります。
目標は、120件をならして1件5分です。 印が付くのは3割前後という想定で、それより多い月は、対応表が追いついていないか、spike の基準が厳しすぎます。 印の件数を毎月数え、どちらが原因かを見分けます。
例外に対処する
| 起きること | 対応 |
|---|---|
| パスワード付きのPDF | PDFはパスワードで保護できない。ベンダーの管理画面から取り直す |
| TIFFで届く | StartExpenseAnalysis は JPEG、PNG、PDF。PDFにして入れ直す |
| 英語以外の請求書 | この構成の外で扱う。手書きの書き込みは英語しか読めない |
| ベンダー名と口座番号で契約が引けない | 新しい契約か、口座番号の変更。needs_human で人へ |
明細の合計が SUBTOTAL と合わない | 明細の読み落としを疑う。NextToken を取り切ったかをまず見る |
| 請求期間が取れない | 前月との比較を止め、needs_human |
| 通貨が前月と違う | 換算を止める。契約の通貨が変わったかを人が確かめる |
処理が FAILED または PARTIAL_SUCCESS | StatusMessage と Warnings のページを記録し、受付フォルダに残す |
| 同じ請求書が二度届く | 請求番号で照合し、二重に配賦しない |
5行目が見落としやすい失敗です。 明細が長い請求書で NextToken を取り切らずに止めると、後半の明細が無いまま、それらしい配賦表ができます。 検算で止まるようにしておきます。
記録を残す
- 元の請求書と明細のPDF、受け取った日時
- AWS Textract の結果のJSON全文と
JobId - Claude API の出力(
lines、increase_notes) - 配賦に使った対応表の版
- 按分の結果と、検算の結果
- 人が対応を決めた記録と、
spikeの確認の結果
4つ目で対応表の版を残すのは、表が毎月育つからです。 後から配賦を見直すとき、どの月にどの対応で配ったかが分からないと、事業部への説明ができません。
04実装レベルの3段階
最小構成では件数がさばけません。 120件を1件ずつ貼るのは現実的でなく、確かめるための段階です。 本記事が想定するのは半自動化です。 受付フォルダへの保存は人またはメールのルールで行い、読み取りから配賦表の案までを自動にします。本格構成は、対応表が育って unmapped がほとんど出なくなってから進めます。 対応表が薄いうちに会計への取り込みまでつなぐと、未対応の行の扱いが毎月の手作業として残ります。
05工数削減シミュレーション
導入後 120件 × 5分 ÷ 60 = 10 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 海外のSaaS・クラウドサービスを数十から百を超える契約で使い、英文の請求書と利用量の明細がPDFで毎月届く企業。費用を部門やプロジェクトに配賦して管理会計に載せているが、明細の転記と按分が情報システム部と経理の手作業になっている場合。利用量の急な増加(席数の追加、超過料金、単価の改定)に、支払の後で気づくことがある場合。
- ベンダーの管理画面から利用量をCSVやAPIで取り出せる契約が大半の場合(その場合は読み取りではなくデータの連携で組むほうが確実です)。請求書が英語以外(日本語・中国語など)で届く契約が中心の場合(この構成のOCRは英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語しか読めません)。契約が数本で、配賦をしていない場合。なお、国外事業者からの役務の提供にかかる消費税の扱いや、外貨の換算方法の判断は経理と顧問税理士が行うもので、この構成では代替できません。
07最小構成で試す方法
- 先月届いた請求書から、明細の多いベンダーを5社選ぶ
- その5社について、先月の按分の表を用意する
- 請求書と明細のPDFを、手元のAIサービスの画面に1件ずつ貼り付ける
- 対応表(品目とワークスペースと事業部)を一緒に貼り、「明細行を1行ずつ、品目と事業部にそろえてください。対応表に無いものは『未対応』としてください。行をまとめたり計算したりしないでください」と指示する
- 出てきた結果を、先月の按分の表と突き合わせる
5社で試すのは、明細の形がベンダーごとに違うからです。 1社でうまくいっても、別のベンダーの明細では列の読み方が変わります。
| 出てきた内容 | 判断 |
|---|---|
| 先月の按分と同じ結果が出た | OCRとの連携に進む |
| 対応表に無いのに事業部を推し量った | 指示の書き方で直る。構成は有効 |
| 行をまとめた | 「行数をそろえる」を指示に足す。直らなければプログラムで行数を検査する |
| 明細の列がずれて読まれた | ベンダーの明細の形の問題。そのベンダーはCSVの取得を先に検討する |
4行目が出たベンダーは、無理に読み取りで続けないでください。 管理画面からCSVが取れるなら、そちらのほうが確実です。この構成は、CSVの取れないベンダーのための仕組みです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| ワークスペース名から事業部を推し量る | 対応表に無い対応を作らせない。 unmapped で返させる |
| 同じ品目の行がまとめられる | 行数をそろえさせ、プログラムで行数を数える |
| 明細の後半が欠ける | NextToken を取り切る。明細の合計と SUBTOTAL で検算する |
| 請求期間が取れず比較の相手が決まらない | OTHER の LabelDetection で拾う。取れなければ人へ |
| 増えた理由をAIが言い切る | 明細の差だけを書かせ、理由は契約の担当者に確かめる |
| 明細の列の読み方がベンダーで違う | ベンダーごとに試す。CSVが取れるならそちらを使う |
| 通貨が混ざる | 通貨の Code で分け、換算は経理の取り決めでプログラムが行う |
| 対応表が育たない | unmapped の行を人が決めたら、その場で表に足す運用にする |
spike の基準が厳しすぎる・緩すぎる | 率と額の両方で決め、最初の2か月で印の件数を見て調整する |
上の3行が、この構成の失敗のほとんどです。 どれも、それらしい配賦表ができてしまうという同じ形をしています。配賦表は事業部の予算の実績になるので、一度出ると誰も明細まで戻りません。検算と行数の検査で、配賦表が出る前に止めます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: SaaSの契約と金額、ワークスペースやプロジェクトの名前、そして明細によっては利用者のメールアドレスや氏名です。
- 明細の個人名とメールアドレスを渡さない … 席ごとに利用者が並ぶ明細があります。配賦にはワークスペースと数量があれば足りるので、生成AIへ渡す前に利用者の列を落とします
- AWS の保存先を自社の管理下に置く … 結果は
OutputConfigで自社のバケットに出し、KMSKeyIdで自社の鍵による暗号化を選べます - プロジェクト名に未公開の情報が含まれうる … 開発中の製品名がワークスペース名になっていることがあります。保管とアクセスの範囲を、情報システム部と経理に限ります
- この構成は、税と換算の判断をしません … 国外事業者の役務にかかる消費税の扱い、外貨の換算方法は経理と顧問税理士が決めます。この構成が出すのは、明細に何が書かれていたかと、取り決めた対応表でどう配ったかだけです
- 契約の見直しを自動で行わない …
spikeが出ても、席を減らす、プランを変えるといった操作は契約の担当者が行います
誤りが起きた場合のリスクは、事業部に誤った費用を配ることと、増えた請求を見逃すことの2つです。 前者は推し量った対応で起き、後者は明細の欠けで起きます。どちらも配賦表の見た目からは分からないので、対応表と検算で守ります。
10まず何から始めるか
1週目:契約台帳に口座番号を足す
契約台帳に、請求書に書かれるベンダーの口座番号(顧客番号)の列を足します。120契約すべてを一度に埋める必要はありません。金額の大きい上位20契約から埋めます。
2週目:5社で試す
明細の多いベンダーを5社選び、手元のAIサービスに請求書と対応表を貼って明細行をそろえさせます。行をまとめていないか、対応表に無い対応を作っていないかを最優先で見ます。
3週目:対応表と spike の基準を決める
品目の対応表とワークスペースの対応表を、上位20契約の分だけ作ります。あわせて、前月から何%かつ何円増えたら印を付けるかを、経理と情報システム部で決めます。
4週目:受付フォルダから読み取りまでをつなぐ
S3、Lambda、Textract、SNS をつなぎ、要約項目と明細行を保存するところまで作ります。この時点では按分をせず、読み取った明細と先月の手作業の表を並べて見ます。
2か月目: 対応づけと按分、前月との比較を足し、配賦表の案を出します。unmapped と spike の件数を毎週数えます。3か月目以降: 対応表が育ったところで、1件20分が何分になったかを実測します。unmapped がほとんど出なくなった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
請求書・領収書の分析が、テンプレートの設定なしに請求日、請求番号、明細の価格、合計、支払条件などを取り出すこと。違う書き方の見出しを INVOICE_RECEIPT_ID などの標準の名前にそろえること。標準の項目(INVOICE_RECEIPT_DATE、VENDOR_NAME、ACCOUNT_NUMBER、CUSTOMER_NUMBER、DUE_DATE、SUBTOTAL、TAX、TOTAL、AMOUNT_DUE、ITEM、QUANTITY、PRICE、UNIT_PRICE、PRODUCT_CODE ほか)と、標準外が OTHER になること。LabelDetection、ValueDetection、Confidence、EXPENSE_ROW、通貨の Code が返ること | AWS: Analyzing Invoices and Receipts | 2026-10-07 |
StartExpenseAnalysis が S3 の JPEG、PNG、PDF を非同期で分析し、Amazon SNS に完了を通知すること。ClientRequestToken、JobTag、OutputConfig、KMSKeyId。JobId が7日間だけ有効なこと。非同期のPDFの上限が500MBであること | AWS: StartExpenseAnalysis | 2026-10-07 |
GetExpenseAnalysis が MaxResults と NextToken で結果を分けて返すこと。JobStatus(IN_PROGRESS/SUCCEEDED/FAILED/PARTIAL_SUCCESS)、StatusMessage、Warnings、SummaryFields と LineItemGroups の構造 | AWS: GetExpenseAnalysis | 2026-10-07 |
| 対応言語が英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語であること。手書きは英語のみであること。PDFはパスワードで保護できないこと | AWS: Set Quotas in Amazon Textract | 2026-10-07 |
構造化出力を output_config.format に json_schema を指定して受け取れること | Claude Docs: Structured outputs | 2026-10-07 |
消費税の扱いと外貨の換算方法は、経理と顧問税理士が決めるものです。 本記事は、請求書と明細の読み取りと、取り決めた対応表による配賦までを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0791)についてのご相談はこちらから。
