海外の販売代理店から届く英文の保証修理請求書を読み取って台帳に転記し、保証期間外・重複請求・部品単価の食い違いの疑いを拾う
海外の販売代理店から毎月届く英文の保証修理請求書を読み取り、シリアル・故障内容・交換部品・工数を保証請求台帳へ転記します。あわせて、保証期間外・重複請求・部品単価の食い違いの疑いを拾い、審査の担当者に回します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- AWS Textract/Azure AI/Google Document AI
- 連携・自動化
- Python
- 対象業界
- 商社/製造
- 対象部門
- 品質管理/営業
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 入力作業が多い/属人化している/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/品質標準化/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 代理店からメールで届いた請求書のPDFと添付の写真を、代理店ごとのフォルダに保存する
- 担当者が請求書を開き、請求番号・機種・シリアル・故障日・稼働時間・部品・工数・金額を台帳に写す
- シリアルで出荷の記録と納入の報告を探し、保証期間の内外を確かめる
- 台帳を同じシリアルで検索し、同じ部品の請求が最近無いかを見る
- 部品の行ごとに価格表を引き、単価と標準の修理時間を確かめる
- 故障の記述を読んで、社内の故障区分を付ける
- 疑わしいものは海外営業を通じて代理店に照会し、承認・一部承認・否認を決める
- 【人/自動】 代理店からの請求書と添付を受付フォルダへ入れる(請求の受け取り用のメールアドレスから自動で保存してもよい)
- 自動保存をきっかけに、形式・ページ数・パスワードの有無を確かめる
- 自動OCRが請求書のキーと値、部品の表、質問への答え(シリアル・故障日・稼働時間など)を、信頼度とともに返す
- 自動生成AIが、項目を台帳の形にそろえ、部品の行を整え、故障の記述を社内の故障区分の候補に対応付ける
- 自動シリアルで納入日を引き、保証期間・稼働時間の条件を規則で照らす
- 自動台帳の過去の請求と照らし、重複の疑いを拾う
- 自動価格表と標準の修理時間で、単価と工数の上限を照らす
- 自動請求ごとに `clean` / `out_of_warranty` / `duplicate_suspect` / `price_diff` / `labor_over` / `needs_human` を付けて審査の一覧に出す
- 人審査の担当者が `clean` 以外を開き、代理店へ照会するか、承認・一部承認・否認とするかを決める
- 人照会が要るものは、海外営業が代理店へ連絡する
各工程の詳しい説明を読む
- 代理店からメールで届いた請求書のPDFと添付の写真を、代理店ごとのフォルダに保存する
- 担当者が請求書を開き、請求番号・機種・シリアル・故障日・稼働時間・部品・工数・金額を台帳に写す
- シリアルで出荷の記録と納入の報告を探し、保証期間の内外を確かめる
- 台帳を同じシリアルで検索し、同じ部品の請求が最近無いかを見る
- 部品の行ごとに価格表を引き、単価と標準の修理時間を確かめる
- 故障の記述を読んで、社内の故障区分を付ける
- 疑わしいものは海外営業を通じて代理店に照会し、承認・一部承認・否認を決める
(a)写すだけで時間がかかる。 2番で、書式ごとに項目の場所が違います。シリアルが表の上にある書式も、部品の行の中にある書式もあり、まず探すところから始まります。 手書きの作業報告が付いていれば、それも読みます。
(b)起算日を毎回調べ直している。 3番で、納入の報告が届いていないシリアルは、出荷の記録から推し量るしかありません。担当者によって、出荷日から何か月を足して見るかが違います。
(c)重複を見落とす。 4番で、同じ修理が別の請求番号で再送される、同じ部品の交換が数週間おいて二度請求される、といったものがあります。台帳の検索はシリアルの表記ゆれ(ハイフンの有無、先頭のゼロ)で当たらないことがあり、見落とすと二重に支払います。
(d)故障区分が人によって違う。 6番は品質の改善の材料になる工程ですが、忙しい月ほど「その他」が増えます。
- 【人/自動】 代理店からの請求書と添付を受付フォルダへ入れる(請求の受け取り用のメールアドレスから自動で保存してもよい)
- 【自動】 保存をきっかけに、形式・ページ数・パスワードの有無を確かめる
- 【自動】 OCRが請求書のキーと値、部品の表、質問への答え(シリアル・故障日・稼働時間など)を、信頼度とともに返す
- 【自動】 生成AIが、項目を台帳の形にそろえ、部品の行を整え、故障の記述を社内の故障区分の候補に対応付ける
- 【自動】 シリアルで納入日を引き、保証期間・稼働時間の条件を規則で照らす
- 【自動】 台帳の過去の請求と照らし、重複の疑いを拾う
- 【自動】 価格表と標準の修理時間で、単価と工数の上限を照らす
- 【自動】 請求ごとに
clean/out_of_warranty/duplicate_suspect/price_diff/labor_over/needs_humanを付けて審査の一覧に出す - 【人】 審査の担当者が
clean以外を開き、代理店へ照会するか、承認・一部承認・否認とするかを決める - 【人】 照会が要るものは、海外営業が代理店へ連絡する
4番目でAIに任せるのは「そろえる」ところまでです。 保証の内外も、重複も、単価の差も、AIには判断させません。判断の材料は社内のデータにあり、照らし方は規則で決まっているからです。
9番目で人が見るのは全件ではありません。 clean のものは台帳の一覧で流し見て承認に回し、疑いのあるものだけに時間を使います。 全件を開く運用にすると、写す作業が無くなっても時間はあまり減りません。
02今回想定するシステム構成
代理店からの英文の保証修理請求書(PDF・写真・作業報告) ▼【トリガー】受付フォルダ(Amazon S3)への保存 AWS Lambda ── 形式・ページ数・サイズ・パスワードの確認 ▼ AWS Textract(StartDocumentAnalysis:FORMS/TABLES/QUERIES) │ キーと値、部品の表、質問への答え、信頼度 ▼ Claude API ── 項目を台帳の形にそろえ、故障の記述を故障区分の候補に対応付ける ▼ Python ── 保証期間・重複・単価・工数を社内のデータで照らす │ ① 納入日と稼働時間 ② 過去の請求 ③ 価格表 ④ 標準の修理時間 ▼ 判定(clean / out_of_warranty / duplicate_suspect / price_diff / labor_over / needs_human) ▼ 【品質保証の担当者が clean 以外を確認】 ├──▶ 代理店への照会(英文の下書き、海外営業が送る) └──▶ 保証請求台帳へ確定
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | AWS Textract(StartDocumentAnalysis/GetDocumentAnalysis) | Azure AI Document Intelligence、Google Document AI |
| 生成AI | Claude API(項目の整形と故障区分の候補の対応付け、照会文の下書き) | OpenAI API、Gemini API |
| 差異計算 | Python(保証期間・重複・単価・工数の照合) | 保証管理の仕組みの照合の機能 |
| 連携 | AWS Lambda(保存と完了の通知を起点に処理を動かす) | Amazon EventBridge |
| 保管 | Amazon S3(請求書、読み取り結果、照合の結果) | 社内のファイルサーバー |
出荷の記録・価格表・標準の修理時間の表は、新しく足すものではありません。 最初の準備は、シリアルごとの納入日を1つの表にまとめることと、社内の故障区分の一覧に英語の説明を付けることです。
OCRに AWS Textract を選ぶのは、請求書が英文だからです。 対応言語は英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語で、日本語は読めません。 手書きの文字が読めるのは英語だけです。代理店の技術者が手書きで作業報告を付けてくる場合も、英語なら読めます。
使う機能は、文書の分析(AnalyzeDocument と、その非同期版の StartDocumentAnalysis)です。 FeatureTypes に FORMS を入れると「Serial No.: ABC12345」のようなキーと値の組が、TABLES を入れると部品の表がセルごとに、QUERIES を入れると「What is the machine serial number?」のような質問への答えが返ります。保証修理請求書は請求書というより書式のある申請書に近いので、請求書の専用の分析ではなく、こちらを使います。
質問(Queries)は英語の文書でしか使えません。 公式の上限の表に、質問の検出は英語の文書だけとあります。フランス語やスペイン語の書式では質問を外し、キーと値と表だけで読みます。 代理店の一覧に書式の言語を持たせておき、呼び出しの設定を切り替えます。
請求書は写真や作業報告と一緒に数ページになるので、非同期の処理で読みます。 同期の処理はPDFで1ページ・10MBまで、非同期はPDFで500MB・3,000ページまでです。
03どうやって実装するのか
処理の起点を決める
受付フォルダ(Amazon S3)に請求書が保存されたことを起点にします。 代理店は修理を終えたものから順に請求を送ってくるため、月末にまとめて流すより、届いたものから照らして疑いを出すほうが、照会の時間を確保できます。
請求の受け取り用のメールアドレスを代理店に案内しておき、添付を自動で受付フォルダへ保存する形にすると、担当者の保存の手間がなくなります。写真や作業報告が別のメールで届くこともあるので、請求番号で後から束ねられるようにします。
処理が終わった請求書は処理済みの場所へ移し、移すのは審査の一覧への書き出しまで成功したときだけにします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 請求書 | PDF。送り元の代理店、受け取った日時、添付の写真と作業報告 | 受付フォルダ |
| 読み取り結果 | キーと値、部品の表のセル、質問への答え、値ごとの信頼度 | AWS Textract |
| 納入日の表 | シリアル、機種、出荷日、エンドユーザーへの納入日、納入の報告の有無 | 出荷の記録と納入の報告をまとめた表 |
| 保証の条件 | 機種ごとの保証の月数と稼働時間の上限、部品ごとの延長保証 | 保証の規定 |
| 価格表 | 部品番号、代理店向けの価格、上乗せを認める率、その部品が付く機種 | 部品の価格表 |
| 標準の修理時間 | 修理の作業コードごとの標準の時間、代理店ごとの時間単価 | 標準の修理時間の表 |
| 故障区分の一覧 | 社内の故障区分のコードと、英語の説明と言い換えの例 | 品質保証部で用意する一覧 |
| 過去の請求 | シリアル、部品番号、修理日、請求番号、判定 | 保証請求台帳 |
| 代理店の一覧 | 代理店のコード、書式の言語、数字と日付の書き方、時間単価 | 自社で用意する一覧 |
質を決めるのは、納入日の表と故障区分の一覧です。 納入日が無ければ保証の内外が照らせず、故障区分の一覧に英語の説明が無ければ、AIの対応付けが社内の区分とずれます。
データの取得方法を決める
読み取りは、Lambda から StartDocumentAnalysis を呼んで始めます。 文書はS3の場所で指定し、完了の通知先にSNSのトピックを渡します。ClientRequestToken に受付のファイルごとの値を入れると、同じ請求書の処理が二重に始まりません。JobId は7日間しか有効でないので、完了を受けたらすぐに GetDocumentAnalysis で結果を取り、自社のバケットへ書き出します。
質問は QueriesConfig に並べます。 1件ごとに Text(質問の文)と Alias(答えの名前)を持たせ、非同期の処理では1ページに30個まで使えます。
質問の文(Text) | Alias | 何に使うか |
|---|---|---|
| What is the machine serial number? | SERIAL_NO | 納入日と過去の請求を引く第一の手がかり |
| What is the model number? | MODEL | 価格表の機種の照合 |
| What is the failure date? | FAILURE_DATE | 保証期間の照合 |
| What is the hour meter reading? | HOUR_METER | 稼働時間の上限の照合 |
| What is the dealer claim number? | CLAIM_NO | 重複の照合 |
| What is the total labor hours? | LABOR_HOURS | 標準の修理時間の照合 |
答えは QUERY_RESULT の塊として返り、質問の塊と ANSWER の関係でつながります。 答えにも信頼度が付きます。答えが見つからないときは、答えの要素が空のまま返ります。 空を「0」や「該当なし」に読み替えないことが大事です。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 質問への答え | QUERY と QUERY_RESULT | 主要な項目の値と信頼度 |
| キーと値の組 | KEY_VALUE_SET | 質問を使えない言語の書式と、質問で取れなかった項目 |
| 部品の表 | TABLE と CELL(列見出しは COLUMN_HEADER) | 部品番号・数量・単価・金額の行 |
| チェック欄 | SELECTION_ELEMENT の SelectionStatus | 「故障部品を返送済み」などの欄 |
| 全文 | LINE と WORD | 症状・原因・処置の自由な記述 |
部品の表は、列見出しで列の意味を決めます。 表の塊には、列見出し・表の題・表の脚・合計のセルなどの種類が付いて返ります。合計の行(TABLE_SUMMARY)を部品の行として数えないように、セルの種類で外します。複数ページにまたがる表は、ページごとの表をつないでから渡します。
AIへ渡す前に整形する
- 形式の確認 … 扱えるのはJPEG、PNG、PDF、TIFFです。XFA形式のPDFには対応していません
- パスワードの確認 … パスワードで保護されたPDFは読めません。 代理店に保護のないものを送り直してもらいます
- 解像度の確認 … 読み取れる文字の高さは15ピクセル以上(150dpiで8ポイント)。作業報告の手書きの小さな文字が、この下限に近いことがあります
- 言語の切り替え … 代理店の一覧の書式の言語が英語なら
QUERIESを入れ、それ以外はFORMSとTABLESだけにします - シリアルの正規化 … ハイフン・空白を外し、大文字にそろえます。元の文字列は残します
- 数値と日付の正規化 … 代理店の一覧の書き方で、「1.250,00」や「03/04/2026」を自社の形に直します
- 重複の検知 … 同じ代理店・同じ請求番号のものが既にあれば、再送の印を付けます
6番目はAIに任せません。 「03/04/2026」を3月4日と読むか4月3日と読むかは、代理店の国の書き方で決まります。 生成AIに決めさせると、もっともらしい方を選んで保証期間の内外がひっくり返ります。書き方は代理店の一覧で決め打ちします。
AIに処理させる
させるのは、読み取り結果を台帳の形にそろえ、部品の行を整え、故障の記述を社内の故障区分の候補に対応付けることだけです。
| 見るもの | 書き出す内容 | 判断できないときの扱い |
|---|---|---|
| 主要な項目 | 請求番号、機種、シリアル、故障日、修理日、稼働時間、合計 | 書かれていなければ「不明」 |
| 部品の行 | 部品番号、品名、数量、単価、金額、故障部品か付随部品か | 区別できなければ unknown |
| 工賃の行 | 作業の内容、時間、時間単価、作業コードの記載 | 時間が書かれていなければ「不明」 |
| 症状・原因・処置 | それぞれの原文と、故障区分の候補(最大3つ)と根拠 | 候補が無ければ unclassified |
故障区分の候補を最大3つまで出させるのは、記述があいまいなことが多いからです。 「engine won't start」だけでは、燃料系か電気系かが決まりません。1つに決めさせると、もっともらしい方を選んで集計に偏りが出ます。
| させないこと | 理由 |
|---|---|
| 保証の対象かの判断 | 納入日と保証の条件で規則が照らす |
| 重複かの判断 | 過去の請求と規則で照らす |
| 単価や工数が妥当かの判断 | 価格表と標準の修理時間で照らす |
| 合計の作り直し | 行の合計が合わなくても、合わないまま出す |
| 承認・否認の判断 | 品質保証の担当者が決める |
1行目がいちばん起きやすい失敗です。 故障日と納入日を一緒に渡すと、AIは頼まなくても月数を数えて「保証期間内」と書きます。納入日の報告が遅れているシリアルでは、その数え方の前提がずれていても気づけません。 だから納入日はAIに渡しません。
指示内容を固定する
あなたは機械メーカーの品質保証部で、海外の販売代理店から届いた
保証修理請求書を、社内の保証請求台帳の形にそろえる立場です。
渡すのは、OCRが返した読み取り結果と、社内の故障区分の一覧です。
そこに書かれたことだけを使ってください。
【書き出すこと】
1. 主要な項目: claim_no, model, serial_no, failure_date, repair_date,
hour_meter, total_claimed
2. 部品の行: part_no, description, qty, unit_price, amount,
role(causal_part / related_part / consumable / unknown)
3. 工賃の行: labor_description, hours, rate, labor_code
4. 出張費の行: distance, travel_hours, amount
5. 症状・原因・処置の原文と、故障区分の候補(最大3つ)とその根拠
【厳守事項】
- 書かれていない項目は「不明」としてください。推測で埋めないでください。
- 金額・日付・シリアル・部品番号は、読み取り結果の文字列のまま写してください。
桁を補ったり、書き方を直したりしないでください。
- 金額を計算したり、合計を作り直したりしないでください。
- 保証期間の内外、重複かどうか、単価や工数が妥当かを書かないでください。
- 故障区分の候補は、渡した一覧のコードからだけ選んでください。
当てはまるものが無ければ unclassified とし、新しい区分を作らないでください。
- 故障区分を1つに絞れないときは、無理に絞らず複数を挙げてください。
- role は記述から分かる範囲で付け、分からなければ unknown としてください。
- evidence には、根拠にした文字列をそのまま写してください。
- 保証修理請求書でない書類(見積、作業報告だけ、写真だけなど)と判断した
場合は、そろえる作業をせず document_type に種類を書いてください。
【読み取り結果】{textract_result}
【故障区分の一覧】{failure_codes}
【この代理店の書式の言語】{form_language}
「渡した一覧のコードからだけ選ぶ」を書かないと、AIは新しい区分を作ります。 「Hydraulic seal failure」のような、それらしい名前の区分が台帳に増え、社内の区分で集計したときに数え漏れが出ます。
出力形式を固定する
次の形のJSONで受け取ります。 Claude API の構造化出力(output_config.format に type: "json_schema" とJSONスキーマを渡す)を使うと、スキーマどおりの形で返り、必須の項目が欠けません。
{
"document_type": "warranty_claim",
"claim_no": "",
"dealer_code": "",
"model": "",
"serial_no": "",
"failure_date": "",
"repair_date": "",
"hour_meter": "",
"total_claimed": "",
"parts": [
{ "part_no": "", "description": "", "qty": "", "unit_price": "",
"amount": "", "role": "causal_part", "evidence": "" }
],
"labor": [ { "labor_description": "", "hours": "", "rate": "", "labor_code": "" } ],
"travel": { "distance": "", "travel_hours": "", "amount": "" },
"failure": {
"complaint": "", "cause": "", "correction": "",
"code_candidates": [ { "code": "", "evidence": "" } ]
}
}
この後に、Python が照合を足します。
| 確かめること | 規則 | 結果 |
|---|---|---|
| 納入日 | シリアルで納入日の表を引けるか | 引けなければ needs_human(納入の報告の抜け) |
| 保証期間 | 故障日が納入日から機種ごとの月数の内か、稼働時間が上限の内か | 外なら out_of_warranty |
| 重複 | 同じシリアル・同じ部品番号の請求が決めた日数の内にあるか、同じ請求番号が既にあるか | あれば duplicate_suspect と過去の請求番号 |
| 機種 | 部品がその機種に付くものか | 付かなければ needs_human |
| 単価 | 価格表の価格に認める率を乗せた額を超えないか | 超えたら price_diff と差額 |
| 工数 | 作業コードの標準の時間を超えないか | 超えたら labor_over と超過の時間 |
| 合計 | 行の合計と請求の合計が合うか | 合わなければ needs_human |
| 信頼度 | シリアル・日付・稼働時間の信頼度が決めた値を下回らないか | 下回れば needs_human |
1つ目の理由は、保証期間を規則で照らすことで、起算日の扱いをそろえられることです。 納入の報告が無いシリアルを needs_human にしておけば、出荷日から推し量るかどうかを担当者ごとに決める余地が無くなります。 推し量る規則を作るなら、それも規則の側に書きます。
2つ目は、price_diff と labor_over を差額と超過の時間で出せることです。 どこまでを許すかは、代理店との取り決めで決めます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 受付フォルダ(Amazon S3) | 保存の通知で Lambda を起動 | 請求書の受け取り |
| AWS Textract | StartDocumentAnalysis/GetDocumentAnalysis | キーと値、部品の表、質問への答え |
| Claude API | API呼び出し | 項目の整形と故障区分の候補、照会文の下書き |
| 納入日の表・価格表・標準の修理時間の表 | 読み取り | 照合の材料 |
| 保証請求台帳 | 審査の結果の書き込み | 担当者が確定したものだけ |
| 審査の一覧 | 表への書き出し | 品質保証の担当者が確認する一覧 |
代理店への支払の登録には書き込みません。 審査の一覧までで止め、承認した金額の支払は既存の手順で行います。台帳への書き込みも、担当者が承認・一部承認・否認を決めたものだけです。 照合の途中の値を台帳に入れると、「審査中」と「確定」の区別が消えます。
人が確認する
人が開くのは clean 以外の請求です。 種類ごとに見る順を決めます。
duplicate_suspectを最優先で見る … 過去の請求番号と並べ、本当に同じ修理か、同じ部品が短い期間で再び壊れたのかを確かめます。後者なら、それ自体が品質の情報ですout_of_warrantyを見る … 納入日の表が正しいかをまず疑います。納入の報告が遅れて届いていないかを海外営業に確かめますprice_diffとlabor_overを見る … 差額と超過の時間を見て、代理店の説明を求めるか、許すかを決めます- 故障区分を確定する … 候補から選ぶか、別の区分にします。確定した区分だけを台帳に積みます
2番目で納入日を先に疑うのは、out_of_warranty の多くが納入の報告の遅れから出るからです。 代理店の在庫に長く置かれた機械は、出荷日から見ると保証の外でも、納入日から見ると内に入ります。否認する前に、起算日を確かめます。
目標は、240件をならして1件10分です。 clean は数分、duplicate_suspect や照会の要るものは20分以上かかる想定です。
例外に対処する
| 起きること | 対応 |
|---|---|
| パスワードで保護されたPDF | 読めない。代理店に保護のないものを送り直してもらう |
| XFA形式のPDF | 対応していない。印刷してPDFにし直す |
| 英語以外の書式で質問が使えない | FORMS と TABLES で読み、主要な項目は生成AIがキーと値から拾う |
| 日本語など対応外の言語が混ざる | 読めない。その請求は人が台帳に入れる |
| シリアルが納入日の表に無い | needs_human。納入の報告の抜けか、シリアルの読み違いか |
| シリアルの信頼度が低い | 読み直しの対象にし、写真のネームプレートと照らす |
| 行の合計と請求の合計が合わない | 直さずに needs_human。画像で確かめる |
| OCRが応答しない | 受付フォルダに残す。処理済みへ移すのは成功時だけ |
5行目と6行目は、どちらも「保証の外」と出かねない形です。 シリアルが表に無いのを「保証の対象外」と読むと、正しい請求を否認することになります。 代理店との関係に直接ひびくので、必ず人に回します。
記録を残す
- 元の請求書のPDFと添付、受け取った日時・送り元
- OCRが返したJSONの全文
- AIが返したJSONと、そのとき参照した故障区分の一覧の版
- 照合に使った納入日・価格表・標準の修理時間の版と、照合の結果
- 人が判定と故障区分を確定・変更した記録
- 代理店への照会と回答、承認した金額
「そのとき参照した版」を残すのは、価格表と保証の条件が後から変わるためです。当時の版が残っていないと、どの判定が正しかったかが決まりません。
04実装レベルの3段階
本記事の想定は半自動化です。 1件30分が10分になります。本格構成の納入の報告の取り込みは、代理店ごとに出し方が違います。 半自動化で needs_human の理由を3か月集め、納入の報告の抜けが多い代理店から順に取り込みを整えるほうが早く効きます。
05工数削減シミュレーション
導入後 240件 × 10分 ÷ 60 = 40 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 建設機械・農業機械・産業用の機器などを海外の販売代理店経由で販売し、代理店が行った保証修理の費用をメーカーが負担している製造業。代理店から英文の保証修理請求書が月に百件以上届き、本社の担当者が台帳へ手で写している場合。製品のシリアルごとの納入日(保証の起算日)と、部品の価格表・標準の修理時間を社内で持っている場合。海外の代理店を束ねる商社が、メーカーに代わって保証請求を取りまとめている場合。
- 代理店からの請求書が日本語・中国語・韓国語で届く場合(この構成のOCRは英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語しか読めず、手書きは英語のみです)。代理店がメーカーの保証システムに直接入力しており、紙やPDFの請求書が無い場合。月の請求が数十件で、目で見て足りる場合。なお、保証の対象とするか、どこまで支払うかの判断と、代理店との交渉は、この構成では代替できません。
07最小構成で試す方法
- 先月の請求書から10件を選ぶ(部品の行の多いもの、手書きの作業報告が付いたもの、英語以外の書式のものを入れる)
- 10件について、担当者が台帳に入れた内容と付けた故障区分を書き出しておく
- 請求書のPDFと故障区分の一覧を手元のAIサービスに貼り付ける
- 「この保証修理請求書から、シリアル・故障日・稼働時間・部品の行・工数を書き出し、故障の記述に一覧の区分の候補を最大3つ挙げてください。書かれていない項目は『不明』としてください。保証の内外は判断しないでください」と指示する
- 出てきた内容を、担当者の台帳と突き合わせる
10件は必ずやってください。 組む前に、「書式の違う請求書から、同じ項目を同じ形で取れるか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 担当者の台帳とほぼ同じ値が出た | OCRと照合の仕組みに進む |
| 保証の内外や妥当性を書いた | 指示の書き方で直る。構成は有効 |
| 故障区分の候補がほとんど外れる | 故障区分の一覧に英語の説明と言い換えを足す |
3行目が出たら、一覧の側の問題です。 区分ごとに、代理店がよく使う英語の言い回しを3つずつ足すと、候補の当たり方が変わります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| AIが保証の内外を書いてしまう | 納入日を渡さず、規則で照らす |
| 日付の月と日が入れ替わる | 代理店の一覧で書き方を決め打ちし、AIに読ませない |
| シリアルの表記ゆれで重複が当たらない | ハイフン・空白・大文字小文字をそろえてから照らす |
| 英語以外の書式で質問が空になる | 質問は英語の文書だけ。 書式の言語で設定を切り替える |
| 合計の行を部品として数える | 表のセルの種類で合計の行を外す |
| 故障区分が勝手に増える | 一覧のコードからだけ選ばせる |
| 納入の報告の遅れで保証の外と出る | out_of_warranty は否認の前に起算日を確かめる |
| 写真だけのページまで読んで費用がかさむ | 写真のページを読み取りから外す |
| 照会のメールを自動で送る | 下書きまでにする。 送るのは海外営業 |
| 故障区分が台帳で育たない | 担当者が確定した区分だけを積み、一覧の言い換えを足していく |
上の2行が、この構成の失敗のほとんどです。 どちらも、AIに読ませてはいけないもの(保証の判断と日付の読み方)を読ませたことから出ています。読み取りと整形はAI、判断の材料と照らし方は規則、という分け方を崩さないことです。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 代理店の名前と時間単価、部品の代理店向けの価格、修理の内容、エンドユーザーの名前と所在地(請求書に書かれていれば)、機械のシリアルと稼働時間です。代理店向けの価格と時間単価は、代理店どうしにも見せない取引の条件です。
- 外部へ渡す範囲を、整形に必要な項目に限る … 生成AIに渡すのは読み取り結果と故障区分の一覧だけです。価格表・時間単価・納入日は渡しません。 照らすのは社内の Python です
- エンドユーザーの個人情報を台帳に積まない … 請求書に個人の名前や住所があっても、台帳に要るのはシリアルと修理の内容です。読み取り結果から外す項目を決めておきます
- 承認と否認を自動にしない … 審査の一覧までで止め、判断は品質保証の担当者が行います
- 代理店への照会を自動で送らない … 照会文は下書きまでです。代理店との関係に直接ひびきます
- 保存先を暗号化する … 非同期の分析では、結果を自社のバケットに出し、KMSの鍵で暗号化する設定ができます
- 人の確認を Textract の仕組みに頼らない … Textract の人の確認の仕組みが使う Amazon Augmented AI は、2026年7月から新規の受付をしていません。確認は自社の審査の一覧で行います
誤りが起きた場合のリスクは、払いすぎと、正しい請求の否認の2つです。 前者は重複と単価の見落としで、後者は起算日の取り違えで起きます。どちらも、照らす材料と規則を社内に置く設計で防ぎます。
10まず何から始めるか
1週目:納入日の表を作る
出荷の記録と代理店からの納入の報告を、シリアルごとに1行の表にまとめます。納入の報告が無いシリアルが何台あるかを数えます。これが needs_human のおおよその数になります。
2週目:10件で試す
手元のAIサービスで項目と故障区分の候補を出させます。保証の内外を書いていないか、日付を書き換えていないかを最優先で見ます。
3週目:故障区分の一覧と照合の規則を整える
故障区分の一覧に英語の説明と言い換えを足します。保証期間・重複の日数・単価の上乗せの率・工数の上限を、品質保証部と海外営業部で合わせます。
4週目:受付から審査の一覧までをつなぐ
S3 の受付フォルダから StartDocumentAnalysis を呼び、整形と保証期間・重複の照合を一覧に書き出すところまで作ります。この時点では単価と工数の照合は手で行い、一覧の判定だけを見ます。
2か月目: 価格表と標準の修理時間の照合を足し、clean 以外の件数を毎週数えます。3か月目以降: 照会文の下書きと故障区分の集計を足し、1件30分が何分になったかを実測します。故障区分の候補が担当者の確定とほぼ一致するようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
StartDocumentAnalysis がJPEG・PNG・TIFF・PDFを非同期で分析し、完了をSNSに通知し、GetDocumentAnalysis で結果を取ること。FeatureTypes に TABLES・FORMS・QUERIES・SIGNATURES・LAYOUT を指定できること。ClientRequestToken に同じ値を使うと同じ JobId が返ること、JobId が7日間有効なこと、OutputConfig と KMSKeyId で自社のバケットへの出力と暗号化ができること | AWS: StartDocumentAnalysis | 2026-10-06 |
AnalyzeDocument がキーと値(KEY_VALUE_SET)、表とセル、質問(QUERY・QUERY_RESULT、答えに信頼度)、チェック欄(SELECTION_ELEMENT)を返すこと。QueriesConfig が Text・Alias・Pages を持つこと。HumanLoopConfig が使う Amazon Augmented AI が2026年7月から新規の受付をしていないこと | AWS: AnalyzeDocument | 2026-10-06 |
質問の答えが ANSWER の関係で QUERY_RESULT につながり、信頼度と位置が付くこと、答えが見つからないときは空のまま返ること | AWS: Queries | 2026-10-06 |
| 表がセル・結合セル・列見出し・表の題・表の脚・合計のセルなどの種類とともに返ること | AWS: Tables | 2026-10-06 |
| 同期の処理がPDFで1ページ・10MBまで、非同期がPDFで500MB・3,000ページまで、XFA形式とパスワード保護のPDFは不可、対応言語が6言語で手書きは英語のみ、質問の検出は英語の文書だけ、質問は非同期で1ページ30個まで、文字の高さが15ピクセル以上(150dpiで8ポイント)であること | AWS: Set Quotas in Amazon Textract | 2026-10-06 |
構造化出力を output_config.format(type: "json_schema")で指定でき、スキーマどおりの形で必須の項目が欠けずに返ること | Claude Docs: Structured outputs | 2026-10-06 |
保証の条件と支払の上限は、自社と代理店との取り決めで決めてください。 本記事は上記の公開仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0586)についてのご相談はこちらから。
