海外子会社の英文の銀行取引明細を毎月読み取り、会計の残高・明細と照合して、差異の理由の候補と要確認の一覧を作る
海外子会社から毎月集まる英文の銀行取引明細(Bank Statement)のPDFを読み取り、期首・期末の残高と入出金の明細を取り出します。それを子会社の会計の残高・明細と照合し、合わない明細に理由の候補を付けて、要確認の一覧にします。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- AWS Textract/Azure AI/Google Document AI
- 連携・自動化
- Python
- 対象業界
- 商社/物流/製造
- 対象部門
- 経理/財務
- 対象業務
- 内容確認・チェック/比較検討
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/判断支援/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 子会社の経理が、銀行の明細のPDFと、預金勘定の元帳の書き出しを共有フォルダに置く
- 財務部の担当者が、口座ごとにPDFを開き、期首残高・期末残高・入出金の合計を表計算へ打ち込む
- 取引の行を、元帳の行と1行ずつ見比べる。金額と日付で探し、見つかったものに印を付ける
- 印の付かなかった行について、摘要(「SERVICE CHARGE」「INT CR」「FX CONV」など)から理由の見当を付ける
- 見当の付かないものは、子会社の経理へ英語で問い合わせのメールを書く
- 返答が来たら、差異の一覧に理由を書き込み、連結の担当へ渡す
- 人子会社の経理が、明細のPDFと元帳の書き出しを、口座ごとの受付フォルダ(Amazon S3)に置く
- 自動保存をきっかけに AWS Lambda が動き、形式・ページ数・サイズ・パスワードの有無を確かめる
- 自動AWS Textract の非同期の文書分析を始め、表とセル、問いへの答えを受け取る
- 自動Python が口座の台帳を引き、数字と日付の書き方に合わせて、読み取った文字列を数値と日付に直す
- 自動Python が明細の中の計算(期首+入金-出金=期末、行ごとの残高の連続)と、前月の期末残高とのつながりを確かめる。合わなければ読み直しへ回す
- 自動計算が合った明細について、Python が元帳の行と金額・通貨・日付で照合する
- 自動照合できなかった行を Claude API に渡し、摘要と金額から差異の理由の候補を付けさせる
- 自動Python が残高の差異のうち、理由の候補で説明できる額と、説明できない額を計算する
- 人財務部の担当者が要確認の一覧を見て、理由の候補を確かめ、子会社への問い合わせを送るかを決める
各工程の詳しい説明を読む
- 子会社の経理が、銀行の明細のPDFと、預金勘定の元帳の書き出しを共有フォルダに置く
- 財務部の担当者が、口座ごとにPDFを開き、期首残高・期末残高・入出金の合計を表計算へ打ち込む
- 取引の行を、元帳の行と1行ずつ見比べる。金額と日付で探し、見つかったものに印を付ける
- 印の付かなかった行について、摘要(「SERVICE CHARGE」「INT CR」「FX CONV」など)から理由の見当を付ける
- 見当の付かないものは、子会社の経理へ英語で問い合わせのメールを書く
- 返答が来たら、差異の一覧に理由を書き込み、連結の担当へ渡す
(a)数字を打ち直している。 PDFの数字を表計算へ打ち込む時点で、1件あたり20分以上かかります。打ち間違いも、ここで入ります。 打ち間違いは会計との差異として表に出るので、子会社への問い合わせの後で「本社の打ち間違いでした」と分かることがあります。
(b)数字と日付の書き方が口座ごとに違う。 ドイツの銀行の「1.234,56」をそのまま打つと千倍の数字になります。英国の口座の「03/04」を3月4日と読むと、月をまたいだ取引の扱いを誤ります。担当者は口座ごとの癖を覚えていて、その記憶が引き継ぎの資料に書かれていません。
(c)差異の理由を探すのに時間がかかる。 未落ちの支払(会計では出金済み、銀行ではまだ)、入金の未着、銀行手数料や利息の計上漏れ、両替のときの換算差。理由の型は限られていますが、どの型に当たるかを摘要と金額から当てるのは担当者の経験です。
(d)月初に集中する。 60口座の明細が5営業日のうちに届き、連結の締めまでに終わらせる必要があります。丁寧に見るほど締めに間に合わず、忙しい月ほど行の見比べが粗くなります。
- 【人】 子会社の経理が、明細のPDFと元帳の書き出しを、口座ごとの受付フォルダ(Amazon S3)に置く
- 【自動】 保存をきっかけに AWS Lambda が動き、形式・ページ数・サイズ・パスワードの有無を確かめる
- 【自動】 AWS Textract の非同期の文書分析を始め、表とセル、問いへの答えを受け取る
- 【自動】 Python が口座の台帳を引き、数字と日付の書き方に合わせて、読み取った文字列を数値と日付に直す
- 【自動】 Python が明細の中の計算(期首+入金-出金=期末、行ごとの残高の連続)と、前月の期末残高とのつながりを確かめる。合わなければ読み直しへ回す
- 【自動】 計算が合った明細について、Python が元帳の行と金額・通貨・日付で照合する
- 【自動】 照合できなかった行を Claude API に渡し、摘要と金額から差異の理由の候補を付けさせる
- 【自動】 Python が残高の差異のうち、理由の候補で説明できる額と、説明できない額を計算する
- 【人】 財務部の担当者が要確認の一覧を見て、理由の候補を確かめ、子会社への問い合わせを送るかを決める
5番目が、この設計の分かれ目です。 明細の中で計算が合わないものは、会計と照合しません。照合すれば必ず差異が出て、その差異は子会社のせいではないからです。 読み直しに回る口座は、担当者がPDFを開いて該当の行だけを直します。
7番目でAIに計算をさせないのも、意図してのことです。 差異の額、説明できる額、説明できない額は Python が出します。AIが付けるのは、合わなかった行1つずつの「理由の候補」という言葉だけです。
02今回想定するシステム構成
英文の銀行取引明細(PDF)+ 預金勘定の元帳(CSV) ▼【トリガー】受付フォルダ(Amazon S3)への保存 AWS Lambda ── 形式・ページ数・サイズ・パスワードの確認 ▼ AWS Textract(StartDocumentAnalysis:TABLES・QUERIES) │ 表とセル(行・列・列見出し・信頼度)、口座番号・期間・残高への答え ▼ 完了の通知(Amazon SNS)→ AWS Lambda が結果を取る Python ── 口座の台帳の書き方で数値と日付に直す │ ① 明細の中の計算 ② 前月の期末とのつながり ③ 元帳との照合 ▼ Claude API ── 照合できなかった行に、差異の理由の候補を付ける ▼ Python ── 説明できる額と説明できない額の計算 ▼ 判定(reconciled / reconciled_with_items / needs_inquiry / needs_reread) ▼ 【財務部の担当者が要確認のものを確認】 └──▶ 子会社の経理への英文の問い合わせ(下書き)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | AWS Textract(StartDocumentAnalysis の TABLES・QUERIES) | Azure AI Document Intelligence、Google Document AI |
| 生成AI | Claude API(差異の理由の候補と、問い合わせの下書き) | OpenAI API、Gemini API |
| 差異計算 | Python(数値への変換、明細の中の計算、元帳との照合) | 会計システムの預金照合の機能 |
| 連携 | AWS Lambda(保存と完了の通知を起点に処理を動かす) | Amazon EventBridge |
| 保管 | Amazon S3(明細、読み取り結果、照合の結果) | 社内のファイルサーバー |
会計システムと口座の一覧は、新しく足すものではありません。 元帳は書き出したものを読むだけで、この構成から会計には書き込みません。口座の一覧に「数字の書き方」「日付の書き方」「入金と出金の列の形」を足すのが最初の準備作業です。
OCRに AWS Textract を選ぶのは、明細が英文だからです。 対応言語は英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語で、日本語や中国語、タイ語は対象外です。 タイの銀行の明細のうちタイ語と英語を併記したものは、英語の部分だけが読み取りの対象になります。
使う機能は2つです。 入出金の表は TABLES で受け取ります。Textract の表は、セルごとの行と列の位置と信頼度に加えて、列見出し(COLUMN_HEADER)、表の題名、脚注、集計のセル(TABLE_SUMMARY)を区別して返します。 口座番号、明細の期間、期首・期末の残高は QUERIES(「What is the closing balance?」のような英語の問いに、答えと信頼度を返す機能)で取ります。問いは英語の文書でだけ使える機能で、この題材には合っています。
複数ページのPDFは、非同期の処理でしか扱えません。 同期の処理はPDFとTIFFで1ページまでで、非同期の処理はPDFとTIFFで500MB・3,000ページまでです。Textract に人の確認を組み込む Amazon Augmented AI は使いません。 2026年7月に保守モードに入り、新規の受け付けを停止しているためです。
03どうやって実装するのか
処理の起点を決める
受付フォルダに明細のPDFが保存されたことを起点にします。 口座ごとにフォルダを分け、PDFと元帳のCSVがそろった時点で処理を始めます。片方しか無いうちは動かしません。 明細だけで読み取りを進めると、照合の段で元帳が無く、要確認の一覧が「元帳なし」で埋まります。
Textract の非同期の処理は、StartDocumentAnalysis で始め、完了を Amazon SNS のトピックへ通知します。その通知を AWS Lambda で受けて、GetDocumentAnalysis で結果を取ります。 ドキュメントは、Get の操作を繰り返し呼んで完了を待つやり方を勧めていません。呼びすぎると絞られるためです。
同じ明細を二重に処理しないように、ClientRequestToken を付けます。 同じトークンで同じ入力の Start を呼ぶと、同じジョブ番号が返り、処理はやり直されません。トークンには「口座の番号+明細の期間+ファイルのハッシュ」を使います。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 銀行取引明細 | 英文のPDF。期間、口座番号、通貨、期首・期末残高、取引の表 | 子会社の経理 |
| 読み取り結果 | 表とセル(行・列・列見出し・信頼度)、問いへの答えと信頼度 | AWS Textract |
| 預金勘定の元帳 | 日付、金額、通貨、摘要、伝票番号 | 子会社の会計システムの書き出し |
| 口座の台帳 | 子会社、銀行、口座番号(末尾4桁)、通貨、数字と日付の書き方、入出金の列の形 | 財務部が管理する一覧 |
| 前月の結果 | 前月の期末残高と、持ち越した差異の一覧 | この構成の前月の記録 |
質を決めるのは、口座の台帳と前月の結果です。 台帳に書き方が無ければ、「03/04」をどちらの日付と読むかが決まりません。前月の結果が無ければ、先月の未落ちの支払が今月落ちたのかどうかが分かりません。
入出金の列の形は、銀行ごとに3つほどに分かれます。 「入金」と「出金」の列が分かれている形、1つの金額の列に符号(- や末尾の DR)が付く形、金額の列とは別に「DR/CR」の列がある形です。台帳にどの形かを書いておき、Python の変換の規則を選びます。
データの取得方法を決める
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 表とセル | TABLES の TABLE・CELL ブロック | 取引の行(日付、摘要、金額、残高) |
| 列見出し | COLUMN_HEADER のセル | どの列が金額で、どの列が残高か |
| 集計のセル | TABLE_SUMMARY のセル | 入金・出金の合計(照合の行から外す) |
| 問いへの答え | QUERY_RESULT ブロック(信頼度つき) | 口座番号、期間、通貨、期首・期末残高 |
| 全文の行 | LINE ブロック | 表の外にある残高や注記の拾い直し |
問いは、1ページに5つほどにとどめます。 非同期の処理では1ページあたり30問まで使えますが、残高は1ページ目か最後のページにしかないことが多いので、問いに Pages を指定して、聞くページを絞ります。
結果は自社のS3に書き出させます。 非同期の処理の結果は、既定では Textract が持つ場所に7日間だけ保管され、7日を過ぎると取り出せません。OutputConfig で自社のバケットを指定し、照合の記録と同じ場所に残します。
AIへ渡す前に整形する
- 形式の確認 … 受け付けるのはPDF、TIFF、JPEG、PNG。XFA形式のPDFには対応しないため、印刷用のPDFに出し直してもらう
- パスワードの確認 … パスワード付きのPDFは扱えない。子会社にパスワードを外したPDFを置いてもらう
- ページ数とサイズの確認 … 非同期の処理で500MB・3,000ページまで
- 口座の特定 … ファイル名と問いで取った口座番号の末尾4桁を、口座の台帳と突き合わせる
- 数値への変換 … 台帳の書き方で「1.234,56」「(1,234.56)」「1,234.56-」「1,234.56 DR」を符号付きの数値に直す
- 日付への変換 … 台帳の書き方で日・月の順を決める。13以上の数が無い日付は、明細の期間の中に収まるほうを取り、両方収まるなら印を付ける
- 行の整理 … 「Balance brought forward」「Balance carried forward」のような繰越の行と、集計のセルを、取引の行から外す
- ページをまたぐ表の連結 … 各ページの表の列見出しをそろえ、1つの取引の一覧にする
7番目を落とすと、照合が根こそぎ崩れます。 繰越の行は金額を持っているので、取引として数えると入金・出金の合計がずれ、明細の中の計算が全ページで合わなくなります。
AIに処理させる
残高の計算と照合は、すべて Python が行います。 AIにさせるのは、照合できなかった行に、決まった区分の中から理由の候補を付けることと、問い合わせの下書きを書くことだけです。
| 理由の候補 | 手がかり | 次にすること |
|---|---|---|
outstanding_payment(未落ちの支払) | 元帳では出金済み、明細に無い。小切手や月末の送金 | 翌月の明細で落ちるかを見る |
deposit_in_transit(未着の入金) | 元帳では入金済み、明細に無い | 翌月の明細で入るかを見る |
bank_charge_unbooked(手数料の未計上) | 明細の摘要が「CHARGE」「FEE」「COMMISSION」 | 子会社に計上を依頼 |
interest_unbooked(利息の未計上) | 摘要が「INTEREST」「INT CR」 | 子会社に計上を依頼 |
fx_conversion(両替の換算差) | 摘要が「FX」「CONVERSION」、金額が近いが一致しない | 換算に使ったレートを確かめる |
duplicate_booking(二重計上) | 元帳に同じ金額・摘要の行が2つ | 子会社に確認 |
unknown(不明) | 上のどれにも当たらない | 子会社に問い合わせ |
AIに選ばせる区分は、この7つに限ります。 区分が自由文だと、毎月の件数が数えられず、子会社ごとの傾向も見えません。
| させないこと | 理由 |
|---|---|
| 差異の額の計算 | Python が出す。AIの足し算を照合に混ぜない |
| 読み取った金額の補正 | 「たぶんこの数字」に直さない。読み直しは人が行う |
| 仕訳の作成 | 差異をどう処理するかは担当者が決める |
| 理由の断定 | 出すのは候補。確かめるのは子会社への問い合わせ |
| 説明できない額を候補で埋める | unknown を残すことに意味がある |
2行目がいちばん起きやすい失敗です。 「1,234.56 と 1,234.65 の差は読み違いだろう」とAIに直させると、本当に金額が違う取引を消してしまいます。 読み違いを疑うのは、明細の中の計算が合わないときだけで、それは第5章の5番目で読み直しに回っています。
指示内容を固定する
あなたは本社の財務部で、海外子会社の預金残高を確かめる担当者です。
銀行の明細と会計の元帳を照合した結果、照合できなかった行を渡します。
各行について、差異の理由の候補を1つ選んでください。
【選べる区分】
outstanding_payment / deposit_in_transit / bank_charge_unbooked /
interest_unbooked / fx_conversion / duplicate_booking / unknown
【厳守事項】
- 計算をしないでください。差異の額は渡した値をそのまま使ってください。
- 金額や日付を直さないでください。読み違いと考えられる場合も、
直した値を書かずに unknown とし、note に「読み取りの確認が必要」と書いてください。
- 手がかりが摘要と金額に無い場合は unknown を選んでください。
もっともらしい区分で埋めないでください。
- evidence には、判断の根拠にした摘要の文字列をそのまま写してください。
- 前月から持ち越した行の一覧に同じ金額のものがあれば、
carried_from に前月の行の番号を入れてください。
- 仕訳の案や、処理の方法を書かないでください。
- 子会社への問い合わせの下書きは英語で、unknown と duplicate_booking の行だけについて、
日付・金額・摘要を示して理由を尋ねる文にしてください。
【口座】{account_profile}(数字・日付の書き方を含む)
【照合できなかった行(明細側)】{unmatched_statement_lines}
【照合できなかった行(元帳側)】{unmatched_ledger_lines}
【前月から持ち越した行】{carried_items}
「直した値を書かない」を明記しないと、直してきます。 1桁違いの金額が2つ並んでいれば、人の目にも読み違いに見え、AIは親切に揃えます。揃えた瞬間に、照合の記録から事実が消えます。
「もっともらしい区分で埋めない」も同じ理由です。 7つのうちどれかを選べと言われれば、手がかりが薄くても fx_conversion あたりを選びます。unknown が残ることを、指示の側で許します。
出力形式を固定する
次の形のJSONで受け取ります。 Claude API の構造化出力で、output_config.format にJSONスキーマを指定し、reason を enum で7つに限ります。オブジェクトには additionalProperties: false を付けます。
{
"account_key": "SG01-USD-4821",
"period": "2026-09",
"items": [
{ "side": "statement | ledger", "line_no": 0,
"reason": "outstanding_payment | deposit_in_transit | bank_charge_unbooked | interest_unbooked | fx_conversion | duplicate_booking | unknown",
"evidence": "", "carried_from": "", "note": "" }
],
"inquiry_draft": ""
}
照合の結果の全体は、Python が次の形でまとめます。
{
"account_key": "SG01-USD-4821",
"statement_opening": 0, "statement_closing": 0, "ledger_closing": 0,
"internal_check": "ok | mismatch",
"continuity_check": "ok | mismatch",
"difference": 0, "explained": 0, "unexplained": 0,
"verdict": "reconciled | reconciled_with_items | needs_inquiry | needs_reread"
}
1つ目の理由は、AIの出力と計算の出力を分けておけることです。 items はAIが埋め、difference と unexplained は Python が計算します。AIの区分が誤っていても、金額は誤りません。
2つ目は、verdict を規則で決められることです。
verdict | 条件 |
|---|---|
needs_reread | internal_check か continuity_check が mismatch |
reconciled | 差異が0 |
reconciled_with_items | 差異があり、すべて outstanding_payment か deposit_in_transit で説明できる |
needs_inquiry | unknown・duplicate_booking があるか、unexplained が0でない |
3つ目は、翌月に持ち越せることです。 outstanding_payment の行は翌月の入力の「前月から持ち越した行」になり、翌月に落ちなければ、2か月続けて残った行として目立たせます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 受付フォルダ(Amazon S3) | 保存の通知で AWS Lambda を起動 | 明細と元帳がそろったら処理を始める |
| AWS Textract | StartDocumentAnalysis/GetDocumentAnalysis | 表と問いの読み取り。完了は Amazon SNS で受ける |
| 口座の台帳 | 読み取りのみ | 書き方と口座の特定 |
| Claude API | API呼び出し | 理由の候補と問い合わせの下書き |
| 照合の一覧 | Python が書き出す | 口座ごとの verdict と差異の明細 |
| 会計システム | 連携しない | 仕訳は担当者が別に起こす |
会計システムへは書き込みません。 手数料や利息の未計上が見つかっても、計上するのは子会社の経理です。この構成が出すのは照合の結果までで、書き込みを足すと、読み違いが仕訳まで一息に進みます。
人が確認する
人が開くのは、needs_reread と needs_inquiry の口座だけです。 reconciled と reconciled_with_items は、一覧で口座と差異の額を流し見ます。
needs_rereadを先に見る … PDFの該当のページを開き、計算が合わない行の数字を目で確かめて直すneeds_inquiryの候補を確かめる …evidenceの摘要と金額を見て、理由の候補が妥当かを判断する- 問い合わせを送るかを決める … 下書きを直して送る。送信は人が行う
- 候補を覆したら記録する … どの行を、どの区分に変えたかを残す
1番目で直した数字は、元の読み取り結果を上書きしません。 直した値と直した人を別に記録し、どの口座のどの列で読み違いが多いかを数えます。
例外に対処する
| 起きること | 対応 |
|---|---|
| パスワード付きのPDF | 扱えない。子会社にパスワードを外したものを置いてもらう |
| XFA形式のPDF | 対応しない。印刷用のPDFに出し直してもらう |
| 英語以外の言語だけの明細 | 読めない。口座の台帳で対象外とし、従来どおり目視 |
| 文字が小さすぎる | 文字の高さの下限は15ピクセル(150dpiで8ポイント)。画質の良いPDFを取り直す |
| 口座番号が台帳と合わない | 処理を止める。別の口座の明細が置かれていないかを先に疑う |
| 期首残高が前月の期末と合わない | needs_reread。明細の期間の抜けか、前月の読み違いを疑う |
| 日付の日・月の順が決まらない | 印を付けて照合の幅を広げ、一覧で人が確かめる |
| 表の列見出しが読めない | 前月の同じ口座の列の並びを使い、needs_reread を付ける |
| Textract の結果が取れない | 7日を過ぎると取り出せない。結果は自社のS3に書き出しておく |
上から3行目は、運用で決めておく話です。 タイ語だけの明細や、中国語の明細はこの構成では読めません。対象外の口座をはっきりさせ、そこだけ従来の手順を残します。
記録を残す
- 元の明細のPDFと元帳のCSV、受け取った日時と置いた人
- Textract の読み取り結果の全文(自社のS3に書き出したもの)
- 数値と日付への変換に使った口座の台帳の内容(そのときの書き方の設定)
- 照合の結果(
internal_check、difference、unexplained、verdict) - AIの出力(
items、inquiry_draft)と、人が覆した記録 - 子会社への問い合わせと返答、持ち越した行の翌月の結果
台帳の設定を残すのは、書き方の設定を後から直すことがあるためです。 日付の順を誤って設定していた口座は、過去の照合をどこまでやり直すかを、そのときの設定から決めます。
04実装レベルの3段階
最小構成では60口座はさばけません。 確かめるための段階です。 半自動化で、1件50分が15分程度になります。 打ち込みと見比べは無くなり、残るのは要確認の口座の確認と、問い合わせの判断です。 この段階が本記事の想定です。本格構成では、先月の未落ちの支払が今月落ちたかの確認も自動になり、問い合わせが要る行がさらに絞られます。 段階を飛ばさないでください。 半自動化を2か月回すと、needs_reread の多い口座と、unknown の多い子会社が見えます。そこを直してから持ち越しの管理を自動にするほうが、誤った持ち越しが積み上がりません。
05工数削減シミュレーション
導入後 60件 × 15分 ÷ 60 = 15 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 海外に子会社や支店を複数持ち、現地の銀行口座が数十あり、本社の財務部が毎月その残高を確かめている商社・製造業・物流業。現地の銀行から電子データ(取引明細のファイル連携)を受け取れず、英文の銀行取引明細をPDFで集めている場合。子会社の会計の残高と明細を表計算や会計システムから書き出せる場合。月次の連結の前に、預金残高の差異の理由を子会社に問い合わせる作業が担当者の経験に頼っている場合。
- 明細が英語以外(日本語・中国語・タイ語など)だけで書かれている場合(この構成のOCRは英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語しか読めません)。銀行から取引明細を電子データで受け取れる場合(OCRより先にそちらを使うべきです)。口座が数口座で、目視で足りる場合。なお、差異をどう処理するか(仕訳を起こすか、銀行へ照会するか)の判断は、この構成では代替できません。
07最小構成で試す方法
- 先月の明細から、様式の違う銀行の口座を5つ選ぶ(うち1つは、差異の理由が分かっている口座にする)
- 5口座のPDFと元帳の書き出しを用意する
- 手元のAIサービスにPDFを貼り、「期首残高、期末残高、取引の表を、日付・摘要・入金・出金・残高の列で書き出してください。数字は見えたとおりに写し、直さないでください」と指示する
- 書き出した表を表計算に貼り、期首+入金-出金=期末が合うかを確かめる
- 元帳と見比べ、合わない行について理由の区分を選ばせ、当時の担当者の判断と突き合わせる
5口座は必ずやってください。 Textract とワークフローを組む前に、口座ごとの様式で表が取れるのかを確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 表が取れ、計算も合う | Textract と Python の照合に進む |
| 表は取れるが、繰越の行が取引に混ざる | 前処理で外せる。構成は有効 |
| 計算が合わない口座が多い | 書き方の設定が先。 数字と日付の書き方を台帳に書く |
3行目が出ることは珍しくありません。 ドイツの口座の「1.234,56」や、末尾の DR の扱いで計算がずれます。AIの読み取りの問題ではなく、数字の解釈の問題です。 台帳に書き方を書いてから、同じ5口座で試し直してください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 読み違いが会計との差異として出る | 明細の中の計算を先に確かめ、合わなければ照合しない |
| 繰越の行が取引に数えられる | 「brought forward」などの行と集計のセルを外す |
| 「1.234,56」が千倍になる | 口座の台帳に数字の書き方を持たせる |
| 日・月の順を取り違える | 台帳に日付の書き方を持たせ、決まらないものに印を付ける |
| AIが金額を直して照合を通す | 直した値を書かせない。 指示とスキーマで縛る |
| 手がかりの薄い行に区分を当てはめる | unknown を許すと指示に書く |
| パスワード付きのPDFで止まる | 扱えない。子会社に外したものを置いてもらう |
| 複数ページの明細が同期の処理で通らない | 同期は1ページまで。非同期の処理を使う |
| 結果が後から取り出せない | 7日で消える。OutputConfig で自社のS3へ |
| 同じ明細を二重に処理する | ClientRequestToken を付ける |
| タイ語・中国語だけの明細 | 読めない。対象外の口座として台帳に記す |
| 子会社への問い合わせが自動で飛ぶ | 下書きまでにする。 送信は人が行う |
上の2行が、この構成の失敗のほとんどです。 どちらも、明細の中で閉じるべき誤りが会計との差異に混ざる問題です。照合の前に明細そのものの計算を確かめる1段を置くかどうかで、運用に乗るかが決まります。
5行目も、同じくらい早く効いてきます。 AIが親切に金額を揃えると、照合の一覧はきれいになりますが、本当に違っていた取引が見えなくなります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 海外子会社の口座番号、残高、すべての入出金の金額と相手先の名前が書かれた摘要です。取引先との取引の規模が、そのまま読み取れる情報です。
- AIに渡す範囲を、照合できなかった行に限る … 明細の全体はOCRの段で読みますが、生成AIに渡すのは合わなかった行と、その口座の書き方の設定だけにします。口座番号は末尾4桁にします
- 読み取り結果の置き場所を自社に固定する …
OutputConfigで自社のバケットを指定すると、暗号化に自社の鍵を指定することもできます。明細と結果を同じ権限の範囲で管理します - 受付フォルダの権限を子会社ごとに分ける … 子会社の経理は自社の口座のフォルダにだけ置けるようにします。他社の明細が見える設計にしません
- 差異の処理を自動で決めない … 手数料の計上、二重計上の取り消し、銀行への照会は担当者が決めます。この構成が出すのは理由の候補です
- 問い合わせを自動で送らない … 下書きまでにします。子会社の経理との関係と、問い合わせの文面の正確さに関わります
- パスワードを仕組みに預けない … パスワード付きのPDFを自動で外す設計にすると、パスワードの管理そのものが重くなります。 外したものを置いてもらう運用にします
誤りが起きた場合のリスクは、本当の差異を見落とすことと、存在しない差異を子会社に問い合わせることの2つです。 前者はAIに金額を直させると起き、後者は読み違いを照合に混ぜると起きます。どちらも、明細の中の計算と会計との照合を別の段に置くことで守ります。
10まず何から始めるか
1週目:口座の台帳に書き方の列を足す
口座の一覧に、数字の書き方、日付の書き方、入出金の列の形の3列を足します。60口座を一度に埋める必要はありません。取引の多い決済用の口座10から埋めます。 あわせて、英語で読めない明細の口座に「対象外」の印を付けます。
2週目:5口座で試す
様式の違う5口座のPDFを手元のAIサービスに貼り、表と残高を書き出させます。期首+入金-出金=期末が合うかを最優先で見ます。
3週目:子会社の置き方を決める
子会社ごとに受付フォルダを分け、明細のPDF(パスワードを外したもの)と元帳のCSVを口座ごとに置く手順を決めます。元帳の書き出しの列の並びもそろえてもらいます。
4週目:Textract から明細の中の計算までをつなぐ
保存をきっかけに Textract の非同期の処理を動かし、Python で変換と明細の中の計算を行うところまで作ります。この時点では元帳と照合せず、internal_check が合うかだけを見ます。
2か月目: 元帳との照合と、AIによる理由の候補を足し、verdict を出します。needs_reread と needs_inquiry の口座を毎月数えます。3か月目以降: 持ち越した行の翌月の確認を足し、1件50分が何分になったかを実測します。needs_reread が月に数口座まで減り、子会社への問い合わせが unknown の行だけになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 受け付ける形式がJPEG、PNG、PDF、TIFFで、XFA形式のPDFに対応しないこと。同期処理が10MB・PDFとTIFFで1ページまで、非同期処理がPDFとTIFFで500MB・3,000ページまでであること。パスワード付きPDFを扱えないこと。問いが同期で1ページ15問、非同期で30問までであること。対応言語が英・仏・独・伊・葡・西で、問いは英語の文書だけで使えること。縦書きに対応しないこと。文字の高さの下限が15ピクセル(150dpiで8ポイント)であること | AWS: Amazon Textract の固定のクォータ | 2026-10-01 |
AnalyzeDocument の FeatureTypes(TABLES・FORMS・QUERIES・SIGNATURES・LAYOUT)。表とセル、問いと答え(信頼度つき)のブロック。同期処理であり、非同期は StartDocumentAnalysis を使うこと。Amazon Augmented AI が2026年7月に保守モードに入り新規の受け付けを停止したこと | AWS: AnalyzeDocument | 2026-10-01 |
| 表のセル、結合されたセル、列見出し、表の題名・脚注、集計のセルが区別されて返ること。表の種類(構造化・半構造化)。セルの行・列の位置と信頼度 | AWS: Tables | 2026-10-01 |
非同期処理がS3の文書を対象に、完了を Amazon SNS に通知し、Get の操作で結果を取ること。Get を繰り返し呼んで完了を待つやり方を勧めないこと。ClientRequestToken で二重の処理を防げること。結果が既定で7日間保管され、OutputConfig で自社のバケットと暗号化の鍵を指定できること | AWS: 非同期処理の呼び出し | 2026-10-01 |
構造化出力で output_config.format にJSONスキーマを指定できること。enum が使えること。オブジェクトに additionalProperties: false が必要なこと | Claude: Structured outputs | 2026-10-01 |
差異をどう処理するか、どの口座を照合の対象とするかは、自社の財務部と経理部、子会社の経理で決めてください。 本記事は上記の公開情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0409)についてのご相談はこちらから。
