保険会社から毎月届く代理店手数料の明細書を読み取り、契約台帳と照合して、計上漏れ・率の違い・戻入れを理由付きで洗い出す
保険会社から毎月届く代理店手数料の明細書を表として読み取り、契約台帳と証券番号で照合します。計上されていない契約、想定と違う手数料率、解約などに伴う戻入れを、理由の候補を付けた一覧にします。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- AWS Textract/Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Make/n8n/Python
- 対象業界
- 不動産/保険/金融
- 対象部門
- 経理
- 対象業務
- 内容確認・チェック/比較検討
- 主な課題
- 入力作業が多い/属人化している/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/属人化解消/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 保険会社の代理店向けシステムから手数料の明細書のPDFを取得し、共有ドライブに保存する
- 契約管理システムから、その保険会社の契約台帳をCSVで書き出す
- 明細書を1行ずつ見て、証券番号で台帳を検索し、手数料額と率を表計算ソフトに転記する
- 台帳の想定の率で計算した額と、明細の額を比べる
- 台帳にあるのに明細に無い契約を、台帳の側から拾う
- マイナスの行や戻入れの表を見て、どの契約の解約・減額に伴うものかを台帳の履歴で探す
- 説明のつかない差を一覧にし、保険会社へ照会するかを上長と相談する
- 照合が終わったものを会計ソフトに計上する
- 人保険会社の代理店向けシステムから明細書のPDFを取得し、受付用フォルダに保存する
- 自動保存をきっかけに Google Apps Script が動き、ファイル名から保険会社と対象月を確かめる
- 自動Google Document AI の Form Parser が、明細書の表とキーと値の組、信頼度を返す
- 自動保険会社ごとの列の対応表で、明細の列を共通の項目(証券番号・区分・保険料・率・手数料額)にそろえる
- 自動契約台帳のCSVと証券番号で照合し、率と額の差、台帳にあって明細に無い契約、明細にあって台帳に無い契約を出す
- 自動差のある行について、台帳の異動・解約の履歴と備考を添えて Claude API に渡し、理由の候補を選ばせる
- 自動理由の候補と規則から、`explained`(台帳で説明がつく)/`check`(確認が要る)/`inquiry_candidate`(照会の候補)に振り分ける
- 人経理担当が `check` と `inquiry_candidate` の行だけを開いて確かめる
- 人保険会社へ照会するかを上長と決め、台帳の更新漏れは営業事務へ戻す
- 人照合が終わった明細書の合計を会計ソフトに計上する
各工程の詳しい説明を読む
- 保険会社の代理店向けシステムから手数料の明細書のPDFを取得し、共有ドライブに保存する
- 契約管理システムから、その保険会社の契約台帳をCSVで書き出す
- 明細書を1行ずつ見て、証券番号で台帳を検索し、手数料額と率を表計算ソフトに転記する
- 台帳の想定の率で計算した額と、明細の額を比べる
- 台帳にあるのに明細に無い契約を、台帳の側から拾う
- マイナスの行や戻入れの表を見て、どの契約の解約・減額に伴うものかを台帳の履歴で探す
- 説明のつかない差を一覧にし、保険会社へ照会するかを上長と相談する
- 照合が終わったものを会計ソフトに計上する
(a)書式の読み替えに時間がとられる。 3番目の作業の大半は、照合ではなく明細書のどの列が何を意味するのかを読み替えることです。「手数料率」と書かれた列が代理店手数料ポイントを掛けた後の率なのか前の率なのか、「計上区分」の略号が何を指すのか。保険会社ごとの読み替えは、担当者の頭の中にしかありません。
(b)計上漏れは台帳の側からしか見つからない。 明細を上から見ていく作業では、明細に載っていない契約は目に入りません。 5番目の台帳からの拾い出しは時間がかかるため、忙しい月には省かれ、計上されるはずの手数料が数か月後に気づかれることがあります。
(c)戻入れがどの契約のものか追えない。 解約・減額・失効があると、すでに受け取った手数料の一部が戻入れとして差し引かれます。明細には証券番号と金額しか載っていないことが多く、台帳の解約の記録と結び付けるまでに、1件ずつ履歴を開いて探すことになります。 台帳の解約の記録が漏れていると、そもそも探し当てられません。
(d)率の違いは「合っているはず」で流される。 台帳の率と明細の率がずれていても、規定の改定で率が変わったのか、明細の誤りなのか、台帳が古いのかは、その場では分かりません。毎月同じずれが出る契約は、やがて誰も見なくなります。
- 【人】 保険会社の代理店向けシステムから明細書のPDFを取得し、受付用フォルダに保存する
- 【自動】 保存をきっかけに Google Apps Script が動き、ファイル名から保険会社と対象月を確かめる
- 【自動】 Google Document AI の Form Parser が、明細書の表とキーと値の組、信頼度を返す
- 【自動】 保険会社ごとの列の対応表で、明細の列を共通の項目(証券番号・区分・保険料・率・手数料額)にそろえる
- 【自動】 契約台帳のCSVと証券番号で照合し、率と額の差、台帳にあって明細に無い契約、明細にあって台帳に無い契約を出す
- 【自動】 差のある行について、台帳の異動・解約の履歴と備考を添えて Claude API に渡し、理由の候補を選ばせる
- 【自動】 理由の候補と規則から、
explained(台帳で説明がつく)/check(確認が要る)/inquiry_candidate(照会の候補)に振り分ける - 【人】 経理担当が
checkとinquiry_candidateの行だけを開いて確かめる - 【人】 保険会社へ照会するかを上長と決め、台帳の更新漏れは営業事務へ戻す
- 【人】 照合が終わった明細書の合計を会計ソフトに計上する
8番目が、この設計の分かれ目です。人が見るのは差のある行のうち、台帳で説明のつかないものだけです。 解約日が台帳にある戻入れや、率が規定の改定日を境に変わっただけの行は、一覧で件数を見て終わりにします。全行を人が見直す設計にすると、48.0時間はほとんど減りません。
7番目を規則で決めているのも、意図してのことです。 生成AIには理由の候補を選ばせますが、照会するかどうかの振り分けは、差の額と候補の種類から規則で決めます。 どの程度の差から照会するかは代理店の取り決めで、後から変わるからです。
02今回想定するシステム構成
手数料の明細書のPDF(損害保険5社+生命保険11社) │【トリガー】受付用フォルダへの保存 ▼ Google Apps Script ── ファイル名から保険会社・対象月を確認、ページ数で処理方式を選ぶ ▼ Google Document AI(Form Parser) │ 表(headerRows/bodyRows)、キーと値の組(formFields)、信頼度を返す ▼ Google Apps Script ── 保険会社ごとの列の対応表で共通の項目にそろえる │ └─ 対応表に無い列 ──▶【人】対応表に追加 ▼ Google Apps Script ── 契約台帳(CSV)と証券番号で照合、率と額の差を計算 ▼ Claude API ── 差のある行の理由の候補(異動・解約の履歴と備考から選ぶ) ▼ 照合結果のスプレッドシート(差異の一覧・理由の候補・合計の検算) ▼ 【人】照会の判断、台帳の更新漏れの差し戻し ──▶ 会計ソフトへの計上
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Form Parser) | Azure AI Document Intelligence(レイアウトモデル)、AWS Textract(英文の明細に限る) |
| 生成AI | Claude API(差のある行の理由の候補を選ぶ) | Gemini API、OpenAI API |
| 差異計算 | Google Apps Script(証券番号での照合と、率・額の差の計算) | Python |
| 連携 | Google Apps Script(フォルダの監視、対応表の読み込み、結果の書き出し) | Make、n8n |
| 保管 | Google ドライブ(明細書と照合結果) | SharePoint、Box |
契約管理システムと会計ソフトは、今のまま使います。 契約台帳はCSVで書き出したものを読むだけで、この構成から契約管理システムにも会計ソフトにも書き込みません。
OCRに Form Parser を選ぶのは、日本語の書類から表を取り出せるからです。 Document AI の処理プロセッサの一覧では、Form Parser は文書からキーと値の組(項目とチェックボックス)、表、一般的なエンティティを取り出すものとされ、対応言語に日本語が含まれています。手数料の明細書は「代理店コード」「対象月」「支払予定日」のようなキーと値の組と、契約が並ぶ表の2つでできているので、Form Parser の返す形にそのまま合います。
生成AIで項目を取り出す Custom Extractor は使いません。 同じ一覧で、生成AIを使う場合の正式な対応は英語のみとされているためです。日本語の明細は Form Parser で表として読み、列の意味づけは保険会社ごとの対応表で決めます。
Form Parser の表には、構造上の制約が1つあります。 処理結果の説明では、Form Parser は行や列をまたぐセルを持たない従来の表だけを認識し、rowSpan と colSpan は常に1になるとされています。「手数料」の見出しの下に「率」「額」が2段で並ぶような明細は、見出しの対応がずれます。列の対応表を保険会社ごとに持つのは、この見出しのずれを吸収するためでもあります。
生成AIには Claude API の構造化出力を使います。 公式ドキュメントでは、output_config.format に type: "json_schema" とスキーマを渡す形が一般提供とされ、enum で値の候補を縛れます。 理由の候補を決まった語の中から選ばせたいこの業務に合います。
03どうやって実装するのか
処理の起点を決める
受付用フォルダに明細書のPDFが保存されたことを起点にします。 明細書は保険会社ごとに届く日が違い、月初の数日に散らばります。全社分がそろうのを待って一括で処理すると、早く届いた会社の照会が遅れます。 1通ずつ動かします。
Google Apps Script の時間主導のトリガーで、数分おきに受付用フォルダの新しいファイルを見ます。ファイル名は「保険会社コード_対象年月.pdf」に決めておき、名前が規則に合わないものは処理せずに担当者へ知らせます。 保険会社が分からないと、列の対応表を選べないためです。
処理が終わったファイルは処理済みフォルダへ移します。 移すのは照合結果の書き出しまで成功したときだけです。受付用フォルダに残っている数が、そのまま未処理の数になります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 手数料の明細書 | PDF。保険会社、対象月、契約ごとの行(証券番号、区分、保険料、率、手数料額) | 受付用フォルダ |
| 読み取り結果 | 表(見出し行・本体の行・セル)、キーと値の組、要素ごとの信頼度 | Google Document AI |
| 契約台帳 | 証券番号、保険会社、種目、契約者、保険料、払込方法、始期・満期、異動・解約の履歴と日付、想定の手数料率、備考 | 契約管理システムのCSV |
| 列の対応表 | 保険会社ごとに、明細の見出しの文字列と共通の項目の対応、区分の略号の意味 | 経理が作るスプレッドシート |
| 手数料率の改定の記録 | 保険会社・種目ごとの率の改定日と改定後の率 | 経理が作るスプレッドシート |
質を決めるのは、下の3つです。 台帳に解約の日付が無ければ、戻入れは説明がつきません。列の対応表が無ければ、どの列が手数料額なのかを決められません。率の改定の記録が無ければ、規定の改定による差と誤りによる差が区別できません。
率の改定の記録は、保険会社からの通知を経理が1行ずつ書き足していくものです。 最初は空でも構いません。照合で「率の違い」が続いた種目から、通知を探して埋めていきます。
データの取得方法を決める
ページ数で処理の方式を分けます。 Document AI の上限では、Form Parser はオンライン(同期)の処理で15ページ、バッチ(非同期)の処理で100ページまでとされています。オンラインの処理で imageless_mode を有効にすると30ページまで広がりますが、1ページ目から連続して処理する場合に限るとされています。ファイルサイズの上限は、オンラインの処理で40MB、バッチの処理で1GBです。
| 明細書のページ数 | 処理の方式 |
|---|---|
| 15ページ以下 | オンラインの処理 |
| 16〜100ページ | バッチの処理 |
| 100ページ超 | ページで分割してバッチの処理 |
返ってくる結果から取るものは3つです。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 表の見出しと本体 | tables の headerRows/bodyRows/cells | 契約ごとの行を取り出す |
| キーと値の組 | formFields の fieldName/fieldValue | 代理店コード、対象月、支払予定日、明細の合計 |
| 信頼度 | 各要素の confidence | 読み取りの怪しいセルの検出 |
セルの文字は layout の textAnchor から本文を引いて取り出します。 セルに文字そのものは入っておらず、文書全体のテキストのどこからどこまでかが示される形です。ページをまたぐ表は、見出し行が2ページ目以降にも繰り返されるかを保険会社ごとに対応表へ書いておきます。
契約台帳は、照合の前に契約管理システムからCSVで書き出し、所定のフォルダに置きます。書き出しの日付をファイル名に入れ、照合結果にもどの日付の台帳を使ったかを残します。
AIへ渡す前に整形する
- 保険会社と対象月の確認 … ファイル名から取り、明細のキーと値の組(対象月)とも一致するかを確かめます
- 列の対応づけ … 見出しの文字列を対応表で引き、共通の項目に置き換えます。対応表に無い見出しが出たら処理を止め、担当者に知らせます
- 数値の正規化 … 「1,234」「△1,234」「(1,234)」「-1,234」をそろえます。マイナスの書き方は保険会社ごとに対応表へ書きます
- 証券番号の正規化 … 全角と半角、ハイフンの有無、先頭のゼロをそろえます。台帳の側も同じ規則でそろえます
- 区分の読み替え … 「新」「継」「異」「解」のような略号を、
new/renewal/change/cancel/chargebackに置き換えます - 合計の検算 … 本体の行の手数料額を足し、明細のキーと値の組にある合計と比べます。合わなければ、行の読み落としか読み違いがあります
6番目を省かないでください。 読み取りの誤りは、照合の段で「台帳にあって明細に無い」という差に化けます。合計が合わない明細書のまま照合に進むと、計上漏れに見える行の多くが読み落としになります。 合計が合わないものは照合に進めず、担当者に返します。
AIに処理させる
照合と差の計算は、すべて Google Apps Script の規則で行います。 生成AIに渡すのは、規則で差が出た行と、その契約の台帳の履歴・備考だけです。
| 規則で出す差 | 中身 |
|---|---|
missing_on_statement | 台帳では当月に手数料が出るはずなのに、明細に行が無い |
missing_in_ledger | 明細に行があるのに、台帳に証券番号が無い |
rate_diff | 明細の率と台帳の想定の率が違う |
amount_diff | 率は同じなのに、保険料×率と手数料額が合わない |
chargeback | 戻入れ(マイナスの行、または戻入れの表の行) |
生成AIにさせるのは、差のある行ごとに、理由の候補を決まった語の中から1つ選び、根拠にした台帳の記述を写すことだけです。
| 理由の候補 | 根拠にするもの |
|---|---|
cancellation_recorded | 台帳に解約・失効・減額の記録と日付がある |
rate_revision | 率の改定の記録に、該当する種目と改定日がある |
change_recorded | 台帳に異動(保険料の変更など)の記録がある |
timing | 始期や異動日が月末に近く、翌月に計上されうる |
ledger_not_updated | 備考に解約の申し出などの記述があるが、台帳の状態が更新されていない |
unexplained | 台帳と記録のどこにも説明が無い |
| させないこと | 理由 |
|---|---|
| 手数料額や率の計算 | 差は規則で出す。計算させると差が消えることがある |
| 照会するかの判断 | 代理店の取り決め。規則と人で決める |
| 台帳に無い事実の推測 | 「おそらく解約された」と埋めると、台帳の更新漏れが見えなくなる |
| 手数料規定の解釈 | 保険会社と代理店の取り決めの解釈は、人が保険会社に確かめる |
3行目がいちばん起きやすい失敗です。 戻入れの行を渡すと、台帳に解約の記録が無くても「解約に伴う戻入れと考えられる」と書きます。もっともらしい説明が付いた瞬間、台帳の更新漏れという本当の問題が消えます。
指示内容を固定する
あなたは保険代理店の経理で、代理店手数料の明細と契約台帳の差を確認する立場です。
渡された差のある行ごとに、理由の候補を1つ選んでください。
【理由の候補】
- cancellation_recorded ... 台帳に解約・失効・減額の記録と日付がある
- rate_revision ........... 率の改定の記録に、同じ保険会社・種目の改定がある
- change_recorded ......... 台帳に保険料の変更などの異動の記録がある
- timing .................. 始期・異動日が対象月の末日に近く、計上の月がずれうる
- ledger_not_updated ...... 備考に解約・変更の申し出の記述があるが、台帳の状態が変わっていない
- unexplained ............. 渡した記録のどこにも説明が無い
【厳守事項】
- 渡した台帳の履歴・備考・率の改定の記録に書かれていることだけを根拠にしてください。
- 記録に無いことを推測で補わないでください。説明が見つからなければ unexplained です。
- 「戻入れだから解約だろう」と考えないでください。台帳に解約の記録と日付が
なければ cancellation_recorded を選ばないでください。
- 手数料額や率を計算し直さないでください。差の値は渡したものをそのまま使ってください。
- evidence には、根拠にした記録の文字列をそのまま写してください。
- unexplained のときは evidence を空にしてください。
- 照会すべきか、保険会社の誤りかどうかは書かないでください。
- 迷ったときは unexplained を選んでください。
【差のある行】{diff_rows}
【該当する契約の台帳の履歴と備考】{ledger_history}
【率の改定の記録】{rate_revisions}
【対象月】{target_month}
「戻入れだから解約だろう」を名指しで禁じないと、cancellation_recorded が増えます。 戻入れと解約は結び付きやすく、何も言わなければ連想で選びます。禁じるのは、台帳の記録ではなく連想を根拠にする判断です。
「迷ったら unexplained」も同じ理由です。 unexplained は人が見る行で、そこに入りすぎても時間が少し増えるだけです。逆に説明のつかない行が explained に入ると、誰も見ません。
出力形式を固定する
次の形のJSONで受け取ります。
{
"insurer_code": "",
"target_month": "",
"results": [
{
"policy_no": "",
"diff_type": "missing_on_statement | missing_in_ledger | rate_diff | amount_diff | chargeback",
"diff_amount": 0,
"reason": "cancellation_recorded | rate_revision | change_recorded | timing | ledger_not_updated | unexplained",
"evidence": "",
"note": ""
}
]
}
diff_type と diff_amount は規則で出したものをそのまま返させ、生成AIが埋めるのは reason、evidence、note の3つです。スキーマで reason を enum にしておくと、6つ以外の言い方で返ってくることがありません。
そのうえで、振り分けは規則で行います。
| 振り分け | 条件 |
|---|---|
explained | reason が cancellation_recorded/rate_revision/change_recorded/timing で、evidence が空でない |
check | reason が ledger_not_updated。台帳の更新漏れを営業事務へ戻す |
inquiry_candidate | reason が unexplained、または差の額が代理店で決めた額以上 |
| 共通 | 読み取りの信頼度が低いセルを含む行は、理由にかかわらず check |
1つ目の理由は、照合の結果と理由の候補を別の層に置けることです。 差は規則が出し、理由はAIが選び、振り分けはまた規則で決めます。照会の基準額を変えても、直すのは規則だけです。
2つ目は、evidence で確認が速くなることです。 経理担当は台帳を開く前に、何を根拠に説明がつくとされたのかを一覧で読めます。evidence が空なのに explained に入る行は、規則で作れないようにしてあります。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 受付用フォルダ | Google Apps Script の時間主導のトリガー | 新しい明細書の検知 |
| Google Document AI | API呼び出し(オンライン/バッチ) | 表・キーと値の組・信頼度を返す |
| 契約台帳 | CSVの読み取り | 証券番号での照合、履歴と備考の取得 |
| Claude API | API呼び出し(構造化出力) | 差のある行の理由の候補 |
| 照合結果のスプレッドシート | 書き出し | 差異の一覧、振り分け、合計の検算 |
| 会計ソフト | 既存の入力経路 | 照合が終わった明細書の合計を人が計上 |
契約管理システムには書き込みません。 ledger_not_updated の行が出ても、台帳の状態を直すのは営業事務の仕事です。照合の仕組みが台帳を書き換えると、何が本当の状態だったのかが分からなくなります。
人が確認する
人が開くのは check と inquiry_candidate の行だけです。 explained の行は、件数と金額の合計を一覧で見ます。
- 合計の検算を先に見る … 明細の合計と行の合計が合っているか。合わない明細書は照合の結果を使わない
inquiry_candidateを見る … 明細書の該当箇所と台帳を開き、照会するかを決めます。照会の連絡そのものは人が行いますcheckを営業事務へ戻す … 台帳の更新漏れを直してもらい、翌月の照合で消えたかを見ます- 判定を覆したら記録する … どの行の理由を、何に変えたかを残します
目標は、明細書1通あたり45分です。 差のある行が1割前後という想定で、それより多い月は、列の対応表か率の改定の記録が追いついていません。
例外に対処する
| 起きること | 対応 |
|---|---|
| ファイル名が規則に合わない | 処理せず担当者へ知らせる。保険会社が分からないと対応表を選べない |
| 対応表に無い見出しが出た | 処理を止める。書式の変更なので、対応表を直してから再処理 |
| 見出しが2段で、列がずれる | Form Parser は行や列をまたぐセルを認識しない。対応表で列の位置を指定する |
| 合計が合わない | 照合に進めず担当者へ。読み落としのページや行を探す |
| ページ数が上限を超える | オンラインは15ページ(imageless_mode で30)、バッチは100ページ。超えるものは分割 |
| 同じ証券番号が明細に複数行ある | 異動と戻入れが同じ月に出ることがある。行ごとに照合し、合算しない |
| 台帳のCSVが古い | 書き出しの日付が対象月の末日より前なら止める |
| Document AI/Claude API が応答しない | 受付用フォルダに残す。処理済みへ移すのは成功時だけ |
上の3行が大半を占めます。 どれもAIの問題ではなく、保険会社の書式の変更と、ファイルの受け取り方の問題です。 対応表を直すほうが、読み取りの精度を上げるより効きます。
記録を残す
- 元の明細書のPDFと、取得した日時
- Document AI が返したJSONの全文
- そのとき使った列の対応表と率の改定の記録の版
- 照合に使った契約台帳のCSVの書き出し日付
- 規則が出した差と、生成AIが選んだ理由の候補、振り分けの結果
- 人が理由を覆した記録と、照会した結果(保険会社の回答と、差が解消したか)
3つ目で対応表の版を残すのは、書式の変更が後から分かることがあるためです。 どの版で読んだかが残っていないと、過去の照合をどこまでやり直すかが決まりません。
最後の行は、翌年の照合を速くします。 照会して「規定どおり」と回答のあった差は、率の改定の記録に書き足せば、次からは rate_revision として説明がつきます。
04実装レベルの3段階
最小構成では件数がさばけません。 数百行の明細を画面で書き出すと、読み落としの確認に時間がかかります。理由の候補が役に立つかを確かめるための段階です。 半自動化で、1通180分が90分程度になります。 読み替えと転記がなくなりますが、差のある行の理由を台帳の履歴で探す作業が残ります。本格構成で45分になり、この段階が本記事の想定です。 差が大きいのは、戻入れの契約を履歴から探す作業が、1行ずつの手作業だからです。 段階を飛ばさないでください。 半自動化の差の一覧を2〜3か月見ると、率の違いが続く種目と、台帳の更新が遅れがちな契約の型が先に分かります。率の改定の記録をそこで埋めてから本格構成に進むと、unexplained が減ります。
05工数削減シミュレーション
導入後 16件 × 45分 ÷ 60 = 12 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 損害保険と生命保険を合わせて10社以上を扱う乗合代理店で、保険会社ごとに書式の違う手数料の明細書がPDFで毎月届く場合。明細の証券番号を契約台帳と手で突き合わせており、計上されていない契約や率の違いに気づくのが数か月後になっている場合。解約や減額に伴う戻入れが、どの契約のものかを追えていない場合。契約台帳に保険会社の証券番号が記録されている場合。
- 扱う保険会社が1〜2社で、明細の行数が月に数十行にとどまる代理店。保険会社の代理店向けシステムから手数料の明細をCSVで取得でき、PDFを読む必要がない場合。契約台帳に証券番号が無く、明細と契約を結ぶ鍵が無い場合。なお、手数料の差異を保険会社へ照会するかどうか、手数料規定の解釈は、この構成では代替できません。
07最小構成で試す方法
- 先月の明細書から、行数の多い保険会社を1社選ぶ
- その保険会社の契約台帳を、対象月の末日時点でCSVに書き出す
- 明細書のPDFを手元のAIサービスの画面に添付し、「表の行を、証券番号・区分・保険料・率・手数料額の列で書き出してください。読めない値は空欄にしてください」と指示する
- 書き出された表を表計算ソフトに貼り、台帳と証券番号で突き合わせる(ここは関数で行う)
- 差のある行について、台帳の履歴と備考を添えて「理由の候補を、記録に書かれていることだけから選んでください」と指示する
- 先月の照合で担当者が見つけた差と比べる
表の書き出しの段で、明細の合計と行の合計を必ず比べてください。 合わなければ、画面での書き出しは読み落としを起こしています。その場合でも構成が無効なのではなく、OCRの段を専用の製品に任せる必要があるということです。
| 出てきた内容 | 判断 |
|---|---|
| 担当者が見つけた差が同じように出た | Document AI と照合の自動化に進む |
| 台帳に記録の無い戻入れを解約と説明した | 指示の書き方で直る。構成は有効 |
| 合計が合わず、行の読み落としが多い | OCRを Form Parser に置き換える段階に進む |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 見出しが2段の明細で列がずれる | Form Parser は行や列をまたぐセルを認識しない。対応表で列の位置を指定する |
| 合計が合わないまま照合に進む | 読み落としが計上漏れに化ける。合計の検算を照合の前に置く |
| 戻入れを解約と決めつける | 台帳の記録が無ければ選ばせない。指示で名指しして禁じる |
| マイナスの書き方が会社ごとに違う | 「△」「( )」「-」を対応表に書き、正規化する |
| 証券番号の表記がそろわない | 全角・半角、ハイフン、先頭のゼロを、明細と台帳の両方で同じ規則でそろえる |
| 同じ契約の複数行を合算してしまう | 異動と戻入れは別の行として照合する |
| 率の改定で毎月同じ差が出る | 率の改定の記録を書き足す。 照会の回答を記録に戻す |
| 台帳の書き出しが古い | 書き出し日付を照合結果に残し、対象月より前なら止める |
| ページ数が多くオンラインで失敗する | 15ページを超えたらバッチの処理に切り替える |
| 照会の連絡が自動で飛ぶ | 候補の一覧までにする。 照会は人が行う |
上の3行が、この構成の失敗のほとんどです。 どれも「差が出た」「差の理由が付いた」という結果の手前で起きており、結果だけを見ていると気づけません。 列の対応と合計の検算を、照合の前段で確かめる作りにしてください。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 保険契約者の氏名、証券番号、保険料、契約の異動・解約の履歴、そして代理店の手数料率と手数料額です。
- 生成AIに渡す範囲を、差のある行と、その契約の履歴・備考に限る … 明細書全体や台帳全体を渡す必要はありません。契約者の氏名も、理由の候補を選ぶのには要りません。 証券番号と履歴だけを渡す設計にできます
- 手数料率を社外に出さない … 保険会社との取り決めで決まる率は、代理店の経営の情報です。率の改定の記録は社内のスプレッドシートに置き、生成AIには該当する行だけを渡します
- 台帳を自動で書き換えない …
ledger_not_updatedが出ても、直すのは営業事務です。照合の仕組みが台帳を書き換えると、監査のときに説明がつきません - 照会の判断を人に残す … 差を保険会社へ照会するかは、取引関係にかかわります。この構成が出すのは候補の一覧までです
- 委託先の扱いを確かめる … Document AI と Claude API に契約者の情報を含むデータを送ることを、個人情報の取扱いの社内規程と、保険会社との代理店委託契約で認めているかを先に確かめてください
- 明細書の原本を残す … 照会の根拠になるのは保険会社が出した明細書です。読み取った結果ではなく、受け取ったPDFを原本として保管します
誤りが起きた場合のリスクは、計上されるべき手数料を見落とすことと、誤っていない明細を保険会社へ照会することの2つです。 前者は合計の検算を省くと起き、後者は台帳の更新漏れを保険会社の誤りと取り違えると起きます。ledger_not_updated を unexplained と分けておくのは、後者を防ぐためです。
10まず何から始めるか
1週目:列の対応表を3社分作る
明細の行数が多い保険会社から3社を選び、見出しの文字列、区分の略号、マイナスの書き方、ページをまたぐ表の見出しの繰り返しを書き出します。照合に慣れた担当者に聞きながら作ります。ここで書き出した内容が、そのまま引き継ぎの資料になります。
2週目:1社分で試す
先月の明細書を1社分、手元のAIサービスで表にし、台帳と関数で照合します。明細の合計と行の合計が合うか、担当者が見つけた差が出るかを見ます。
3週目:Form Parser で読む
Document AI の Form Parser に同じ明細書を渡し、表の見出しと本体が対応表どおりに取れるかを見ます。見出しが2段の会社は、ここで列のずれが分かります。
4週目:照合までをつなぐ
Google Apps Script で受付用フォルダを見張り、読み取り・列の対応・照合・差の一覧の書き出しまでを作ります。この時点では理由の候補を付けず、差の一覧だけを見ます。
2か月目: 残りの保険会社の対応表を足し、率の改定の記録を作り始めます。3か月目以降: 理由の候補と振り分けを足し、1通あたりの時間を実測します。照会の回答が率の改定の記録に戻り、unexplained が毎月の数行に落ち着いた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| Form Parser が文書からキーと値の組(項目とチェックボックス)、表、一般的なエンティティを取り出すこと。対応言語に日本語が含まれること。Custom Extractor の生成AIによる取り出しは正式な対応が英語のみとされていること | Google Cloud: Document AI processor list | 2026-10-06 |
Form Parser の結果が tables(headerRows/bodyRows/cells)と formFields(fieldName/fieldValue)で返ること。各要素に confidence と layout(textAnchor)が付くこと。Form Parser が行や列をまたぐセルの無い従来の表だけを認識し、rowSpan と colSpan が常に1になること | Google Cloud: Handle the processing response | 2026-10-06 |
Form Parser のページ数の上限がオンライン15ページ、バッチ100ページ、imageless_mode のオンラインで30ページ(1ページ目から連続する場合に限る)であること。ファイルサイズの上限がオンライン40MB、バッチ1GBであること | Google Cloud: Document AI limits | 2026-10-06 |
構造化出力が output_config.format に type: "json_schema" とスキーマを渡す形で一般提供されていること。enum、required、additionalProperties: false が使えること | Claude API: Structured outputs | 2026-10-06 |
手数料の差を保険会社へ照会するかどうか、手数料規定の解釈は、保険会社と自社の責任者で確かめてください。 本記事は、公開されている製品の仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0533)についてのご相談はこちらから。
