海外の仕入先から届く英文のクレジットノートを読み取り、対象の請求書と返品・値引きの内訳を買掛金の明細と返品の記録に照らして、計上漏れと金額の食い違いを拾う
海外の仕入先から届く英文のクレジットノートを読み取り、対象の請求書番号と返品・値引きの内訳を取り出します。買掛金の明細と返品の記録に照らし、計上漏れ・金額の食い違い・二重計上の候補を理由付きで担当者に返します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- AWS Textract/Azure AI/Google Document AI
- 連携・自動化
- Python
- 対象業界
- 商社/小売/製造
- 対象部門
- 経理/購買
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/工数削減/機会損失防止
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 共有の受信箱に届いたクレジットノートのPDFを開き、仕入先とクレジットノートの番号を確かめる
- 明細を表計算に書き写す(品番、数量、単価、金額、理由)
- 書かれた請求書番号で買掛金の明細を探し、元の請求書の行を特定する
- 返品なら返品の記録、値引きなら購買のメールを探し、数量と金額が合うかを見る
- 既に同じ減額を計上していないかを、前月までの計上の記録で確かめる
- 合えば買掛金から差し引く起票をし、合わなければ購買の担当に知らせる
- 月末に、返品したのにクレジットノートが届いていない分を、購買の担当が気づいたときだけ催促する
- 自動共有の受信箱に届いたクレジットノートのPDFを、受付フォルダに保存する
- 自動保存をきっかけに処理が動き、形式・ページ数・パスワードの有無を確かめる
- 自動OCRが番号・日付・合計・明細の行を、信頼度付きで返す
- 自動生成AIが、対象の請求書番号・減額の理由・明細の行ごとの品番と数量を切り出す
- 自動プログラムが買掛金の明細・返品の記録・前月までの計上と照らし、金額を計算する
- 自動行ごとに `ok` / `amount_diff` / `no_source` / `duplicate` / `invoice_not_found` / `unreadable` を付け、クレジットノートごとに `post` / `query` / `needs_human` を規則で決める
- 自動返品を出荷してから決めた日数を過ぎてもクレジットノートが無いものを、`missing_credit` として毎週一覧にする
- 人経理の担当が `query` と `needs_human` のものを開き、購買の担当と食い違いを確かめる
- 人`post` のものと確認の済んだものを起票し、`missing_credit` の催促を購買が仕入先へ送る
各工程の詳しい説明を読む
- 共有の受信箱に届いたクレジットノートのPDFを開き、仕入先とクレジットノートの番号を確かめる
- 明細を表計算に書き写す(品番、数量、単価、金額、理由)
- 書かれた請求書番号で買掛金の明細を探し、元の請求書の行を特定する
- 返品なら返品の記録、値引きなら購買のメールを探し、数量と金額が合うかを見る
- 既に同じ減額を計上していないかを、前月までの計上の記録で確かめる
- 合えば買掛金から差し引く起票をし、合わなければ購買の担当に知らせる
- 月末に、返品したのにクレジットノートが届いていない分を、購買の担当が気づいたときだけ催促する
(a)対象の請求書を探すのに時間がかかる。 クレジットノートに書かれた請求書番号が、仕入先の番号なのか自社の発注番号なのか、仕入先ごとに違います。番号が書かれていないものは、品番と時期から当たりを付けて探します。
(b)減額の額が合っているかを確かめきれない。 返品数量×元の単価で計算すべきところを、仕入先が最新の単価で計算していることがあります。単価の版の違いは小さな差額なので、件数の多い月に見過ごされます。
(c)二重の計上に気づけない。 仕入先が同じ減額のクレジットノートを再発行し、番号だけが違うことがあります。前月までの計上と照らさないと、同じ減額を2度差し引き、仕入先との残高が合わなくなります。
(d)届いていないクレジットノートを誰も数えていない。 7番目の手順は、購買の担当の記憶に頼っています。返品から数か月たってから、元の金額のまま支払っていたことが分かることがあります。
- 【自動】 共有の受信箱に届いたクレジットノートのPDFを、受付フォルダに保存する
- 【自動】 保存をきっかけに処理が動き、形式・ページ数・パスワードの有無を確かめる
- 【自動】 OCRが番号・日付・合計・明細の行を、信頼度付きで返す
- 【自動】 生成AIが、対象の請求書番号・減額の理由・明細の行ごとの品番と数量を切り出す
- 【自動】 プログラムが買掛金の明細・返品の記録・前月までの計上と照らし、金額を計算する
- 【自動】 行ごとに
ok/amount_diff/no_source/duplicate/invoice_not_found/unreadableを付け、クレジットノートごとにpost/query/needs_humanを規則で決める - 【自動】 返品を出荷してから決めた日数を過ぎてもクレジットノートが無いものを、
missing_creditとして毎週一覧にする - 【人】 経理の担当が
queryとneeds_humanのものを開き、購買の担当と食い違いを確かめる - 【人】
postのものと確認の済んだものを起票し、missing_creditの催促を購買が仕入先へ送る
8番目が、この設計の分かれ目です。 担当者は180件のクレジットノートを読みません。印の付いた行について、原本と照合の相手を見比べることに時間を使います。
6番目を規則で決めているのも、意図してのことです。 端数の違いをどこまで許すか、単価の版の違いを受け入れるかは仕入先との取り決めで決まり、後から変わります。その判断をAIに置かず、規則として持ちます。
02今回想定するシステム構成
海外の仕入先から届く英文のクレジットノート(PDF) ▼【トリガー】受付フォルダ(Amazon S3)への保存 AWS Lambda ── 形式・ページ数・パスワードの確認 ▼ AWS Textract(StartExpenseAnalysis/GetExpenseAnalysis) │ 番号・日付・合計・明細の行と、信頼度 ▼ Claude API ── 対象の請求書番号・減額の理由・明細の切り出し │ ① 対象の請求書番号 ② 減額の理由 ③ 品番 ④ 数量 ⑤ 単価・金額 ▼ Python ── 買掛金の明細・返品の記録・前月までの計上との照合、金額の計算 ▼ 行ごとの判定 + クレジットノートごとの判定(post / query / needs_human) ▼ + 届いていない減額の一覧(missing_credit) 【経理と購買が印の付いたものを確認】 ├──▶ 仕入先への照会・催促の下書き └──▶ 買掛金の起票へ
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 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 を選ぶのは、クレジットノートが英文だからです。 公式の上限の表で、対応言語は英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語とされ、中国語・韓国語・日本語は読めません。 東南アジアの仕入先でも英文で発行してもらうことを前提にします。
使うのは請求書と領収書の分析(StartExpenseAnalysis)です。 テンプレートなしに、番号・日付・合計などを標準の項目名(INVOICE_RECEIPT_ID、INVOICE_RECEIPT_DATE、TOTAL など)にそろえ、明細は LineItemGroups として1行ずつ ITEM・QUANTITY・UNIT_PRICE・PRICE・PRODUCT_CODE に分けて返します。ただし公式の説明は請求書と領収書を対象としており、クレジットノートを名指ししていません。 様式は請求書とほぼ同じですが、最小構成で実際のクレジットノートがどう返るかを必ず確かめます。
03どうやって実装するのか
処理の起点を決める
受付フォルダ(Amazon S3)にクレジットノートが保存されたことを起点にします。 仕入先ごとに発行の時期がばらばらで、返品の数日後に来るものも、月末にまとめて来るものもあるため、1日1回の定時実行にはしません。 届いた日に照らせば、支払の締めの前に減額を反映できます。
S3 への保存を AWS Lambda が受け、StartExpenseAnalysis を呼びます。ClientRequestToken に仕入先のコードとファイルのハッシュから作った値を入れると、同じトークンで呼び直しても同じ JobId が返り、同じクレジットノートを二度読みません。 JobTag には仕入先のコードを入れ、完了の通知(Amazon SNS)から仕入先を引けるようにします。通知の状態が SUCCEEDED であることを確かめてから結果を取り、すぐ S3 に保存します。 JobId は7日間しか有効ではありません。
届いていない減額の一覧は、別のトリガーで動かします。 毎週月曜に返品の記録を読み、出荷から仕入先ごとに決めた日数を過ぎてもクレジットノートの記録が無い返品を数えます。支払の締めの前の週に必ず1回回るように曜日を決めます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| クレジットノートのPDF | 番号、日付、対象の請求書番号、減額の理由、明細、合計、通貨 | 受付フォルダ(S3) |
| 読み取り結果 | 標準の項目、明細の行、信頼度、ページ番号 | AWS Textract |
| 買掛金の明細 | 仕入先、請求書番号、発注番号、品番、数量、単価、金額、通貨、支払予定日 | 基幹システムの出力 |
| 返品の記録 | 返品番号、仕入先、品番、数量、元の請求書番号、出荷日、理由 | 基幹システムの出力 |
| 値引きの合意 | 仕入先、対象の請求書、値引きの率または額、合意日 | 購買が登録する一覧 |
| 前月までの計上 | 計上済みのクレジットノートの番号、対象の請求書、品番、数量、金額 | この構成が残した照合の記録 |
質を決めるのは、下の3つです。 返品の記録が無ければ「減額されるはずの分」を数えられず、値引きの合意が無ければ値引きの額を確かめられず、前月までの計上が無ければ二重計上を見つけられません。値引きの合意は、購買がメールで済ませていることが多いため、一覧に登録する手順を最初に決めます。
データの取得方法を決める
結果は GetExpenseAnalysis で取ります。1回の呼び出しで返る件数は既定・最大20で、NextToken が返る限り続けて取ります。 JobStatus が PARTIAL_SUCCESS のときは Warnings に出たページを記録し、そのクレジットノートを needs_human にします。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 番号・日付・合計 | SummaryFields の Type と ValueDetection | クレジットノートの特定、合計の検算 |
| 書かれていた見出しの文字 | LabelDetection | 「Credit Note No.」か「Invoice No.」かの見分け |
| 標準に当たらない項目 | Type が OTHER のもの | 「Original Invoice」「Reason」「RMA No.」などを拾う |
| 明細の行 | LineItemGroups の LineItems | 品番・数量・単価・金額 |
| 通貨 | Currency の Code | 元の請求書の通貨との一致 |
| 信頼度とページ番号 | 各項目の Confidence と PageNumber | unreadable の判定と、原本に戻る手がかり |
ここに、この題材に固有の落とし穴があります。 クレジットノートにはそれ自身の番号と、対象の請求書の番号の両方が書かれています。標準の項目 INVOICE_RECEIPT_ID にどちらが入るかは様式次第です。LabelDetection に残る見出しの文字(「Credit Note No.」「Ref. Invoice」など)を必ず見て、2つの番号を取り違えないようにします。
金額の符号も様式次第です。 「-1,250.00」と書く仕入先、「1,250.00 CR」と書く仕入先、符号なしで見出しだけ「Credit」とする仕入先があります。プログラムでは符号を当てにせず、「クレジットノートの金額はすべて減額」として扱います。
AIへ渡す前に整形する
- 形式の確認 … 請求書の分析で非同期に扱えるのは JPEG、PNG、PDF です。TIFFで届いたものはPDFに変換します
- パスワードの確認 … PDFはパスワードで保護されていてはいけません。保護されたものは仕入先に解除したものを頼みます
- ページ数とサイズの確認 … 非同期の処理でPDFは500MB・3,000ページが上限です。返品の明細書や検査の報告書が添付されているものは、クレジットノートの部分と分けます
- 文字の大きさの確認 … 文字の高さが15ピクセルを下回ると検出されません。150 DPIで8ポイント相当です
- 書類の種類の確認 … 請求書・デビットノート・取引残高の明細が同じ受信箱に届きます。見出しに「Credit Note」「Credit Memo」が無いものは、この処理から外します
- 照合の相手の準備 … その仕入先の買掛金の明細(直近12か月)、返品の記録、値引きの合意、前月までの計上を読み込みます
5番目を省かないでください。 請求書を減額の書類として読むと、買掛金を増やすべきものを減らす起票の候補が出ます。 見出しで分けられないものは needs_human にします。
AIに処理させる
させるのは、対象の請求書番号・減額の理由・明細の行を切り出し、元の請求書の行に対応付ける手がかりを添えることだけです。
| 取り出す項目 | 中身 | 取り出せないときの扱い |
|---|---|---|
| クレジットノートの番号 | それ自身の番号 | 書かれていなければ not_found |
| 対象の請求書番号 | 減額の相手の請求書番号(複数のこともある) | 書かれていなければ not_found。推測で埋めない |
| 減額の理由 | return・shortage・discount・price_correction・other | 書かれていなければ not_stated |
| 明細の品番・数量 | 行ごとの品番と数量 | 書かれていなければ not_found |
| 明細の単価・金額 | 行ごとの単価と金額(原文のまま) | 読めなければ unreadable |
| 返品番号(RMA) | 仕入先が付けた返品の受付番号 | 書かれていなければ not_found |
理由の区分は、照らす相手を決めるために使います。 return なら返品の記録、shortage なら入荷の検品の記録、discount なら値引きの合意、price_correction なら元の請求書の単価です。区分を誤ると、照らす相手そのものが間違います。
| させないこと | 理由 |
|---|---|
| 金額の計算・検算 | 返品数量×元の単価と値引きの率はプログラムが計算する |
| 対象の請求書番号の推測 | 品番が同じ別の請求書に結び付けると、正しい減額が食い違いに見える |
| 減額を受け入れてよいかの結論 | 仕入先との取り決めの解釈は担当者が行う |
| 通貨の換算 | 換算はしない。通貨が違えば照会する |
| 理由の書かれていない減額に理由を付ける | 根拠の無い減額を、根拠のある減額に見せてしまう |
2行目がいちばん起きやすい失敗です。 対象の請求書番号が書かれていないクレジットノートを渡すと、AIは品番と日付から「おそらくこの請求書」と埋めがちです。埋めた瞬間、どの請求書の減額かという肝心の点が、AIの推測にすり替わります。 無ければ not_found と返させ、品番と時期からの候補探しはプログラムに任せます。
指示内容を固定する
あなたは専門商社の経理部で、海外の仕入先から届いた英文のクレジットノートを点検する担当です。
OCRが返した読み取り結果だけを見て、項目を切り出してください。推測で埋めないでください。
【やること】
1. クレジットノート自身の番号と、減額の対象になっている請求書の番号を分けて写す
2. 減額の理由を下の区分から選ぶ
3. 明細の各行から、品番・数量・単価・金額を原文のまま写す
4. 各項目の根拠にした原文の文字列を evidence に入れる
【番号の見分け方】
- 「Credit Note No.」「Credit Memo No.」などの見出しの番号は credit_note_no に入れる
- 「Original Invoice」「Ref. Invoice」「Against Invoice」などの見出しの番号は ref_invoice_nos に入れる
- 見出しから見分けられなければ、両方を "ambiguous" にする
【減額の理由の区分】
- return ............ 返品(Return、RMA の記載がある)
- shortage .......... 数量不足(Short shipment、Shortage)
- discount .......... 値引き(Discount、Allowance、Price concession)
- price_correction .. 単価や数量の訂正(Price correction、Invoice error)
- other ............. 上のどれにも当たらない
- 理由が書かれていなければ "not_stated" にする。明細から理由を推測しないでください
【厳守事項】
- 対象の請求書番号が書かれていなければ "not_found" にしてください。品番や日付から推測しないでください。
- 金額を計算しないでください。単価×数量や合計を検算しないでください。
- 金額の符号(マイナス、CR)は原文のまま写してください。付け足したり外したりしないでください。
- 通貨を換算しないでください。
- 減額を受け入れてよいかどうかを書かないでください。
- confidence は OCR が返した値をそのまま入れてください。
【読み取り結果】{expense_result}
【この仕入先の番号の書き方の例】{supplier_hint}
「番号の見分け方」を手順の中に書いているのは、2つの番号の取り違えがこの題材でいちばん響くからです。 厳守事項の側に「取り違えないこと」と書くだけでは防げません。見出しの文字で見分ける手順と、見分けられないときの返し方を、具体的に示します。
出力形式を固定する
次の形のJSONで受け取ります。 Claude API の構造化出力(output_config.format に type: "json_schema" とスキーマを指定)を使い、形の崩れた応答を照合のプログラムに流さないようにします。
{
"supplier_code": "",
"credit_note_no": { "value": "", "status": "ok | not_found | ambiguous", "evidence": "" },
"ref_invoice_nos": { "values": [], "status": "ok | not_found | ambiguous", "evidence": "" },
"rma_no": "",
"reason": "return | shortage | discount | price_correction | other | not_stated",
"currency": "",
"total_as_written": "",
"lines": [
{ "line_no": 1, "product_code": "", "quantity": "", "unit_price": "", "amount": "",
"confidence": 0, "evidence": "", "page": 1 }
]
}
照合のプログラムは、この lines に次の判定を付けます。
| 判定 | 意味 |
|---|---|
ok | 元の請求書の行と照合の相手(返品・値引きの合意)の両方と合う |
amount_diff | 減額の額が、返品数量×元の単価、または合意した値引きの額と違う |
no_source | 返品の記録・値引きの合意に当たるものが無い |
duplicate | 前月までに同じ請求書・品番・数量の減額が計上されている |
invoice_not_found | 対象の請求書番号で買掛金の明細を引けない |
unreadable | 読み取りの信頼度が低い、または ambiguous |
理由は、AIの出力とプログラムの判定を別の層に置けることです。 lines はAIが原文から埋め、判定はプログラムが買掛金と返品の記録を相手に付けます。取り決めが変わっても、直すのは照合の規則だけです。
| クレジットノートごとの判定 | 条件 |
|---|---|
post | すべての行が ok、かつ合計が明細の和と一致 |
query | amount_diff・no_source・duplicate のいずれかがある |
needs_human | invoice_not_found・unreadable がある、または reason が not_stated |
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 共有の受信箱 | メールのルール | クレジットノートの添付を受付フォルダへ移す |
| 受付フォルダ(S3) | AWS Lambda の起動 | 保存を検知し、読み取りを始める |
| AWS Textract | 非同期のAPI呼び出しと SNS の通知 | 番号・日付・合計・明細の行を返す |
| Claude API | API呼び出し | 番号と理由と明細の切り出し、照会文の下書き |
| 基幹システム | 出力ファイルの読み取り | 買掛金の明細と返品の記録を照合用に読み込む |
| 買掛金の起票 | 既存の入力経路 | 確認の済んだものだけを担当者が起票する |
基幹システムへは書き込みません。 この構成が出すのは照合の結果と起票の候補までで、買掛金を減らす起票は担当者が行います。 書き込みを足すと、番号の取り違えがそのまま別の請求書の減額になります。
人が確認する
経理の担当が開くのは query と needs_human のものと、届いていない減額の一覧です。 post のものは一覧で仕入先と合計を流し見て起票します。全件を開く設計にすると、第10章の6分には収まりません。
needs_humanを先に見る …invoice_not_foundは原本の番号を読み直し、自社の発注番号で書かれていないかを確かめますamount_diffの根拠を確かめる … どの単価で計算した差かを見ます。元の請求書の単価と、仕入先が使った単価のどちらが取り決めに沿うかは購買が決めますduplicateを確かめる … 再発行なのか、別の返品の減額なのかを、返品番号と数量で見分けます- 照会文と催促を直して送る … 送るのは購買の担当です
- 判定を変えたら記録する … どの行を、どの判定に、なぜ変えたかを残します
3番目を急がないでください。 同じ品番を同じ数量だけ2回返品していることもあり、本当の二重計上と、2回の正当な返品は、返品番号でしか見分けられません。
例外に対処する
| 起きること | 対応 |
|---|---|
| 英語以外のクレジットノート | この構成では読めない。英文での発行を仕入先に依頼する |
| パスワード付きのPDF | 解除したものを仕入先に頼む |
| 請求書やデビットノートが混ざる | 見出しで分け、分けられなければ needs_human |
| 1つのクレジットノートが複数の請求書にまたがる | 行ごとに対象の請求書を切り出し、行単位で照合する |
| 通貨が元の請求書と違う | 換算せずに query。為替の扱いは取り決めで決まる |
| 値引きの合意が一覧に無い | no_source。購買に合意の登録を頼む |
| 返品の記録に元の請求書番号が無い | 品番と出荷日で候補を出し、needs_human |
PARTIAL_SUCCESS で一部のページが読めない | Warnings のページを記録し、needs_human に |
| OCRが応答しない | 受付フォルダに残す。処理済みに移すのは成功したときだけ |
上から6行目が、立ち上げの時期にいちばん多く出ます。 購買がメールで値引きを取り決め、一覧に登録していないためです。値引きを合意したら一覧に1行足す、を購買の手順に入れると、この行は減ります。
記録を残す
- クレジットノートの原本と、受け取った日時・仕入先
- OCRが返したJSONの全文(
GetExpenseAnalysisの全ページ分) - AIの切り出しの結果(番号・理由・
lines) - 照合の結果と、そのとき参照した買掛金の明細・返品の記録・値引きの合意の内容
- 担当者が判定を変えた記録
- 照会・催促の内容と仕入先の回答、起票の日時
- 仕入先ごとの
missing_creditの件数と、返品からクレジットノートまでの日数
最後の行は、仕入先との交渉の材料になります。 返品から減額までの日数が長い仕入先は、支払と相殺する取り決めに変えるほうが、毎月の催促より確実です。
04実装レベルの3段階
最小構成では件数がさばけません。 1件ずつ貼り付けるので、180件には使えません。確かめるための段階です。 半自動化で、1件20分が11分程度になります。 書き写しと対象の請求書を探す作業は無くなりますが、返品の記録と前月までの計上との照合が残ります。本格構成で6分になり、この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、番号の書き方が崩れやすい仕入先と、値引きの合意が一覧に無い仕入先が先に分かります。そこを直してから本格構成に進むほうが、人に回る件数が減ります。
05工数削減シミュレーション
導入後 180件 × 6分 ÷ 60 = 18 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 海外の仕入先から輸入しており、返品・数量不足・品質不良による値引き・価格の訂正のたびに英文のクレジットノートを月に百件以上受け取っている商社・メーカー・小売。クレジットノートの明細を表計算に書き写し、どの請求書の減額かを買掛金の明細から探している場合。返品したのにクレジットノートが届いていない分を、誰も数えていない場合。
- 仕入先とEDIで減額のデータを受け取れており、紙やPDFのクレジットノートを読む必要がない場合。クレジットノートが英語以外(中国語・韓国語・日本語など)で届く仕入先が中心の場合(この構成のOCRは英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語しか読めません)。月の件数が数十件で目視で足りる場合。なお、食い違いのある減額を受け入れるか、仕入先と交渉するかの判断は、購買と経理の担当が行うもので、この構成では代替できません。
07最小構成で試す方法
- 先月のクレジットノートから、仕入先の違う20件を選ぶ(うち数件は、食い違いを照会したものを入れる)
- 20件を AWS Textract のコンソールで請求書として分析し、番号と明細の行がどう返るかを見る
- 読み取り結果を手元のAIサービスに貼り、「クレジットノート自身の番号と対象の請求書の番号を分け、減額の理由と明細を写してください。書かれていない番号は推測しないでください。金額は計算しないでください」と指示する
- 出てきた結果を、当時の担当者の書き写しと突き合わせる
20件は必ずやってください。 ワークフローを組む前に、「クレジットノートが請求書の分析で読めるのか」と「2つの番号を見分けられるのか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 当時と同じ番号と明細になった | 買掛金と返品の記録との照合に進む |
| 対象の請求書番号を推測で埋めた | 指示の書き方で直る。構成は有効 |
| 明細の行がまとまって返る、番号が取れない | 分析の方式が合っていない。 文書の分析(表とキーと値)で読み直す |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| クレジットノート自身の番号と対象の請求書番号を取り違える | 見出しの文字で見分ける手順をプロンプトに書く |
| 対象の請求書番号を推測で埋める | not_found を返させ、候補探しはプログラムに任せる |
| 返品したのに届いていない減額を数えていない | 返品の記録の側から毎週数える |
| 金額の符号の書き方が仕入先ごとに違う | 符号を当てにせず、すべて減額として扱う |
| 再発行と2回の正当な返品を見分けられない | 返品番号と数量で見分ける |
| 値引きの合意がメールにしか無い | 合意を一覧に登録する手順を購買に足す |
| 請求書を減額の書類として読む | 見出しで書類の種類を分ける |
| 通貨の違う減額を換算して照合する | 換算せずに照会する |
上の3行が、この構成の失敗のほとんどです。 1行目と2行目は正しい減額を別の請求書に付ける誤り、3行目は来ていない減額に気づかない誤りです。どちらも支払の額に直接出ます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 仕入先の名前と取引の条件、品番と単価、返品と値引きの内訳、買掛金の残高です。個人の情報はほとんど含みませんが、仕入の単価と値引きの条件は、競合に知られたくない取引の情報です。
- 生成AIに渡す範囲をクレジットノートの読み取り結果に限る … 買掛金の明細と返品の記録はプログラムの側で照合します。仕入先ごとの単価の一覧を外部のAIに渡しません
- 保管の暗号化を決める …
StartExpenseAnalysisのKMSKeyIdを指定すると、利用者のバケットに出力するときにそのキーで暗号化されます。指定しない場合は SSE-S3 で暗号化されます - 起票を自動で確定させない … 出すのは起票の候補までです。番号の取り違えは、別の請求書の残高を狂わせます
- 照会と催促を自動で送らない … 出すのは下書きまでです。仕入先との関係と、取り決めの解釈に関わります
- 書類の保存を規程に合わせる … クレジットノートは取引に関する書類です。原本と照合の記録を、自社の帳簿書類の保存の規程に合わせて残します
誤りが起きた場合のリスクは、減額されるべき分を支払い過ぎることと、正しい減額を別の請求書に付けて残高を狂わせることの2つです。 前者は届いていない減額の見落としから、後者は番号の取り違えと推測の補完から起きます。
10まず何から始めるか
1週目:返品の記録と値引きの合意をそろえる
基幹システムの返品の記録に、元の請求書番号と出荷日が入っているかを確かめます。あわせて、直近3か月の値引きの合意を購買のメールから拾い、一覧に起こします。件数の多い上位20社から始めます。
2週目:20件で試す
先月のクレジットノートから仕入先の違う20件を選び、コンソールで読み取り、手元のAIサービスで番号と明細を切り出させます。2つの番号を取り違えていないか、対象の請求書番号を推測で埋めていないかを最優先で見ます。
3週目:照合の規則を決める
端数の違いをどこまで許すか、単価の版の違いをどう扱うか、返品から何日でクレジットノートが届かなければ催促するかを、購買と経理で決めます。
4週目:受付フォルダから一覧までをつなぐ
S3 と Lambda で受付フォルダを見張り、OCRを呼び、番号と明細を買掛金の明細と照らした一覧を書き出すところまで作ります。この時点ではクレジットノートごとの判定を出さず、行ごとの結果だけを見ます。
2か月目: 返品の記録・値引きの合意・前月までの計上との照合を足し、判定と届いていない減額の一覧を出します。3か月目以降: 照会文の下書きを足し、1件20分が何分になったかを実測します。届いていない減額の一覧が毎週回り、仕入先への催促が購買の手順に定着した時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 対応言語が英・仏・独・伊・葡・西であること。非同期の処理でPDFが500MB・3,000ページまで。パスワード付きPDF不可。文字の高さ15ピクセル(150 DPIで8ポイント)が下限 | AWS: Set Quotas in Amazon Textract | 2026-10-09 |
テンプレートなしで請求書・領収書の項目を抽出し、異なる見出しを INVOICE_RECEIPT_ID などの標準の項目にそろえること。標準に当たらない項目が OTHER になること。明細の ITEM・QUANTITY・UNIT_PRICE・PRICE・PRODUCT_CODE、LabelDetection・ValueDetection・Confidence・PageNumber が返ること。対象が請求書と領収書と説明されていること | AWS: Analyzing Invoices and Receipts | 2026-10-09 |
StartExpenseAnalysis が JPEG・PNG・PDF を扱うこと。ClientRequestToken で同じ JobId が返ること。JobTag が完了の通知に含まれること。KMSKeyId の扱い。JobId が7日間有効なこと | AWS: StartExpenseAnalysis | 2026-10-09 |
MaxResults が既定・最大20で NextToken で続きを取ること。SummaryFields・LineItemGroups・Currency の構造。JobStatus に PARTIAL_SUCCESS があること | AWS: GetExpenseAnalysis | 2026-10-09 |
構造化出力を output_config.format(type: "json_schema")で指定すること | Claude: Structured outputs | 2026-10-09 |
食い違いのある減額を受け入れるか、仕入先と交渉するかは、購買と経理の担当で決めてください。 本記事は公開仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1186)についてのご相談はこちらから。
