地元の加工業者・工事業者からFAXで届く手書きの見積書を読み取って見積比較表にそろえ、合計の計算違いと見積条件の抜けを購買担当へ返す
地元の加工業者・工事業者からFAXで届く手書きの見積書を読み取り、品名・数量・単価・納期を見積比較表の行にそろえます。あわせて、明細と合計の計算が合っているかと、運賃や有効期限などの見積条件が書かれているかを点検し、購買担当へ返します。
- 生成AI
- Azure OpenAI Service/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 対象業界
- 建設/物流/製造
- 対象部門
- 購買
- 対象業務
- データ入力・転記/比較検討
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/品質標準化/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- インターネットFAXが受信したFAXをPDFにして、購買課の共有メールボックスへ転送する
- 担当がPDFを開き、どの見積依頼への見積かを、依頼番号か業者名と品名から探す
- 品名・数量・単位・単価・金額・納期を、見積比較表のシートに打ち込む
- 明細の金額(数量×単価)、小計、消費税、合計を電卓で検算する
- 運賃・据付費・材料の手配・有効期限・支払条件が書かれているかを見て、無いものをメモする
- 計算が合わないものや条件の抜けがあれば、業者に電話かFAXで確かめる
- 比較表がそろったら課長に回し、発注先を決めてもらう
- 自動インターネットFAXが転送したPDFを受信用の保管場所に置く
- 自動保管をきっかけに処理が動き、送信元のFAX番号から業者を特定する
- 自動OCRがFAXをレイアウトとして読み、表のセル・単語ごとの信頼度・手書きかどうかを返す
- 自動生成AIが、読み取った表と文字を比較表の項目(品名・数量・単位・単価・金額・納期)と見積条件に対応づける
- 自動プログラムが、数量×単価、明細の合計、消費税、総額を検算する
- 自動合わないところについて、関係する数字の読み取りの信頼度を見て、`calc_mismatch`(業者の計算違いの疑い)か `read_uncertain`(読み違いの疑い)に分ける
- 自動見積依頼の一覧と照らして依頼番号を決め、比較表のシートに行を足す
- 人購買担当が、印の付いたセルだけをFAXの画像と見比べて直す
- 人`calc_mismatch` と条件の抜けについて、業者に確かめるかを決める
- 人比較表を課長に回し、発注先を決めてもらう
各工程の詳しい説明を読む
- インターネットFAXが受信したFAXをPDFにして、購買課の共有メールボックスへ転送する
- 担当がPDFを開き、どの見積依頼への見積かを、依頼番号か業者名と品名から探す
- 品名・数量・単位・単価・金額・納期を、見積比較表のシートに打ち込む
- 明細の金額(数量×単価)、小計、消費税、合計を電卓で検算する
- 運賃・据付費・材料の手配・有効期限・支払条件が書かれているかを見て、無いものをメモする
- 計算が合わないものや条件の抜けがあれば、業者に電話かFAXで確かめる
- 比較表がそろったら課長に回し、発注先を決めてもらう
(a)手書きの数字を打ち直すのに時間がかかる。 FAXの手書きは、太いペンでつぶれた「8」、かすれた「1」、桁区切りのない「12000」が混ざります。数字を1つずつ画像と見比べながら打つので、明細が10行を超える工事の見積では1枚に20分以上かかることもあります。
(b)検算が忙しいときに省かれる。 4番は「たぶん合っている」と思える作業です。急ぎの修繕の見積が重なった日には省かれ、発注後に請求書で合計が違うことに気づくことがあります。手書きの見積は、業者の側でも電卓で計算しているので、桁の打ち間違いはそれなりに起きます。
(c)条件の書き方がばらばら。 運賃を「別途」と書く業者、「込み」と書く業者、何も書かない業者があります。何も書いていないものを「込み」と読むか「別途」と読むかが担当によって違い、比較表の上では安く見えた業者が、運賃と据付費を足すと高かったということが起きます。
- 【自動】 インターネットFAXが転送したPDFを受信用の保管場所に置く
- 【自動】 保管をきっかけに処理が動き、送信元のFAX番号から業者を特定する
- 【自動】 OCRがFAXをレイアウトとして読み、表のセル・単語ごとの信頼度・手書きかどうかを返す
- 【自動】 生成AIが、読み取った表と文字を比較表の項目(品名・数量・単位・単価・金額・納期)と見積条件に対応づける
- 【自動】 プログラムが、数量×単価、明細の合計、消費税、総額を検算する
- 【自動】 合わないところについて、関係する数字の読み取りの信頼度を見て、
calc_mismatch(業者の計算違いの疑い)かread_uncertain(読み違いの疑い)に分ける - 【自動】 見積依頼の一覧と照らして依頼番号を決め、比較表のシートに行を足す
- 【人】 購買担当が、印の付いたセルだけをFAXの画像と見比べて直す
- 【人】
calc_mismatchと条件の抜けについて、業者に確かめるかを決める - 【人】 比較表を課長に回し、発注先を決めてもらう
8番目が、この設計の分かれ目です。 人はすべての数字を見直すのではなく、信頼度が低いセルと、検算が合わなかったセルだけを見ます。 全部を見直す設計にすると、①の打ち込みが「見比べ」に変わるだけで、時間はほとんど減りません。
6番目を機械の規則で分けているのも意図してのことです。 検算が合わないという事実はプログラムが出し、それが読み違いか書き間違いかの手がかりは、OCRが返した信頼度という数値に置きます。AIに「たぶん読み違いでしょう」と言わせないためです。
02今回想定するシステム構成
見積書(手書き・FAX) │ インターネットFAXがPDFにしてメール転送 ▼【トリガー】受信用の保管場所へのPDFの保存 Azure Functions ├──▶ 送信元のFAX番号から業者を特定 ▼ Azure AI Document Intelligence(レイアウトモデル) │ 表のセル・単語ごとの信頼度・手書きかどうかを返す ▼ Azure OpenAI ── 表と文字を比較表の項目と見積条件に対応づける(JSONで返す) ▼ Azure Functions ── 検算(数量×単価/明細の合計/消費税/総額) │ 信頼度による calc_mismatch と read_uncertain の振り分け │ 見積依頼の一覧との照合 ▼ 見積比較表(依頼番号ごとのシート)+購買担当への通知 ▼ 【人が印の付いたセルだけ確認】→ 課長が発注先を決める
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Azure AI Document Intelligence(レイアウトモデル) | Google Document AI(Form Parser) |
| 生成AI | Azure OpenAI(Microsoft Foundry)(表の列と見積条件の対応づけ) | Claude API、Gemini API |
| 連携 | Azure Functions(業者の特定、検算、依頼の照合、比較表への書き込み) | Azure Logic Apps |
| 保管 | Azure Blob Storage(受信したPDFと読み取り結果) | SharePoint のドキュメントライブラリ |
購買管理システムには書き込みません。 この構成が作るのは比較表の行と点検の結果までで、発注は購買担当がこれまでどおり購買管理システムで行います。仕入先マスタからは、業者名・FAX番号・業者の区分(加工/工事)を読むだけです。
土台になるのは、Azure AI Document Intelligence のレイアウトモデルです。 テキスト、テーブル、選択マーク、ドキュメントの構造を抽出するモデルで、手書きのテキストの対応言語に日本語(ja)が含まれています(v4.0 のレイアウトモデル)。入力はPDFと画像(JPEG/JPG、PNG、BMP、TIFF、HEIF)などで、インターネットFAXが転送するPDFをそのまま渡せます。
この構成で効くのは、3つの返り値です。 1つ目は表で、セルごとに rowIndex と columnIndex、見出しのセルかどうかを示す kind(columnHeader)が返ります。2つ目は単語ごとの confidence で、手書きの数字を読めたかどうかの根拠になります。3つ目は styles で、各テキスト行が手書きのスタイルかどうかが信頼度とともに返ります。印刷された見積用紙の枠と、手で書き込んだ数字を分けて扱えます。
OCRと生成AIを同じ Azure のサブスクリプションにそろえているのは、処理の地域と権限を1か所で管理するためです。 代替候補の製品に替える場合は、その製品がどの地域で処理するかを導入前に確かめてください。
03どうやって実装するのか
処理の起点を決める
受信用の保管場所にPDFが置かれたことを起点にします。 インターネットFAXの多くは、受信したFAXをPDFにしてメールに添付して転送します。共有メールボックスに届いた添付ファイルを保管場所に移すところまでは、メールの振り分けの機能か、小さなプログラムで行います。
1日1回のまとめ処理にはしません。 急ぎの修繕の見積は、届いた当日に比較表がほしいものです。届くたびに1枚ずつ処理します。 処理が終わったPDFは処理済みの場所へ移し、移すのは成功したときだけにします。受信用の場所に残っている数が、そのまま未処理の数になります。活字のPDFやメール本文の見積はこの経路に混ぜません。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 見積書のPDF | FAXの画像。受信日時と送信元のFAX番号 | インターネットFAXの転送メール |
| 読み取り結果 | 表のセル、単語ごとの信頼度、手書きかどうか、全文(Markdown) | Azure AI Document Intelligence |
| 業者の情報 | 業者コード、名称、FAX番号、区分(加工/工事)、過去の見積で使っていた単位の書き方 | 仕入先マスタ |
| 見積依頼の一覧 | 依頼番号、依頼先の業者、品名、数量、図面番号、希望納期、回答期限 | 購買課の依頼の一覧 |
| 確かめる条件の一覧 | 区分ごとに、見積に書かれているべき条件 | 購買課で用意する一覧 |
質を決めるのは、下の2つです。 確かめる条件の一覧が無ければ、生成AIは「書かれていた条件」を並べるだけで、「書かれていなかった条件」を拾えません。 抜けは、あるべきものの一覧と比べて初めて見えます。
条件の一覧は、加工と工事で分けます。
| 区分 | 確かめる条件 |
|---|---|
| 加工 | 材料の手配(支給か業者手配か)、表面処理・熱処理の有無、検査成績書の要否、運賃、有効期限、支払条件 |
| 工事 | 材料費・労務費などの内訳、工程ごとの日数、据付・撤去・産業廃棄物の処理の費用、夜間・休日の作業の扱い、有効期限、支払条件 |
工事の行の「内訳」と「工程ごとの日数」は、建設業法の第20条に沿ったものです。 建設業者は、工事の種別ごとの材料費・労務費などの内訳と、工程ごとの作業とその準備に必要な日数を記載した見積書(材料費等記載見積書)を作るよう努めなければならないとされています(2025-12-12 施行の改正後の条文)。書かれていなければ「記載なし」と拾い、業者にお願いする材料にします。
データの取得方法を決める
読み取りは、レイアウトモデル(prebuilt-layout)を呼ぶだけです。出力の形式は Markdown を指定します(outputContentFormat=markdown)。v4.0 では表が HTML のテーブルとして出力され、結合されたセルや複数行の見出しも表現できます。 手書きの見積用紙は「品名」の欄が2行にまたがっていることが多く、この形のほうが生成AIに渡したときに列を取り違えにくくなります。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 全文(Markdown) | content | 生成AIに渡して、比較表の項目と条件に対応づける |
| 表とセル | tables(rowIndex/columnIndex/kind) | 明細の行と列の位置を決める |
| 単語ごとの信頼度 | pages の words(confidence) | 数字のセルを読めたかどうかの判定 |
| 手書きかどうか | styles(isHandwritten) | 印刷された枠の文字と、書き込まれた値を分ける |
| 選択マーク | selectionMarks(selected/unselected) | 「運賃 込・別」のような丸やチェックの欄 |
数字の信頼度は、セルではなく単語で見ます。 表のセルの文字列は返りますが、信頼度は単語ごとに返ります。セルの範囲に入る単語の信頼度のうち、いちばん低いものをそのセルの信頼度として扱います。「12,800」のうち「8」だけが怪しいとき、平均を取ると埋もれます。
AIへ渡す前に整形する
- ページ数の確認 … 見積が2枚以上にわたるFAXは、明細が次のページに続きます。ページをまたぐ表は、読み取った後で1つの表につなぎます
- 送付状の除外 … 1枚目がFAXの送付状だけのことがあります。表が無く「送付状」「FAX送信票」の文字があるページは明細の対象から外します(業者名と日付は拾います)
- 文字の大きさの確認 … 抽出するテキストの最小の高さは、1024×768ピクセルの画像で12ピクセルとされ、150dpiで約8ポイントの文字に当たります。FAXの細かい但し書きは、この下限に近いことがあります
- 業者の特定 … 送信元のFAX番号から業者を引き、区分(加工/工事)を決めます。社名から先に引くと「㈲山田製作所」と「山田製作所」で引けません
- 依頼の候補の絞り込み … その業者に出していて、回答期限が過ぎていない見積依頼だけを候補にします。全部を渡すと、品名の似た別の依頼に紐づけます
- 重複の検知 … 同じ業者から同じ日に同じ枚数のFAXが来ていれば、送り直しの疑いとして印を付けます
AIに処理させる
させるのは、業者ごとにばらばらな書き方を、比較表の決まった項目に対応づけることだけです。
| させること | 中身 |
|---|---|
| 明細の列の対応づけ | 「品名」「名称」「内容」→ item_name、「数」「数量」→ quantity のように、見出しの書き方の違いを吸収する |
| 単位の書き分け | 「ヶ」「個」「pcs」「式」「m」を、比較表の単位の書き方にそろえる。「式」は数量1として扱わず unit に残す |
| 依頼番号の特定 | 見積書に書かれた依頼番号を拾う。無ければ候補の中から品名・数量・図面番号が合うものを選び、根拠を書く |
| 見積条件の拾い出し | 条件の一覧の項目ごとに、stated(書かれている)/not_stated(書かれていない)/unclear(書かれているが読めない・意味が決まらない)を付け、根拠の文字列を写す |
| 但し書きの写し | 「材料支給の場合」「足場別途」のような但し書きを、そのまま写す |
| させないこと | 理由 |
|---|---|
| 金額の計算・検算 | プログラムで行う。 生成AIに計算させると、合わない合計を合うように「読み直す」ことがある |
| 読めない数字の補完 | 前後の行や合計から逆算して埋めると、見つけたかった計算違いが消える |
| 「別途」「込み」の推測 | 書かれていなければ not_stated。業界の慣習から推し量らない |
| 業者の比較・推薦 | どこに発注するかは購買担当と課長が決める |
| 金額の妥当性の評価 | 高い・安いの判断は、この構成の役目ではない |
2行目がいちばん起きやすい失敗です。 1桁が読めない単価を数量と金額から割り戻して埋めると、比較表はきれいにそろいますが、業者の計算違いだった場合、その証拠が消えます。
指示内容を固定する
あなたは製造業の購買課で、業者からFAXで届いた見積書を比較表の項目に
そろえる担当です。OCRの読み取り結果だけを見て作業してください。
【やること】
1. 明細の表の各行を、item_name / spec / quantity / unit / unit_price /
amount / delivery の項目に対応づける
2. 見積書に書かれた見積依頼番号を拾う。無ければ【依頼の候補】の中から
品名・数量・図面番号が合うものを1つ選び、選んだ根拠を書く。
合うものが無い、または2つ以上合うときは request_no を空にする
3. 【確かめる条件】の項目ごとに、stated / not_stated / unclear を付ける
4. 但し書き・備考は、そのまま写す
【厳守事項】
- 数字はOCRが返した文字列をそのまま写してください。
桁区切りの「,」の有無を直す以外の書き換えをしないでください。
- 読めない桁があるときは、その数字を空にせず、読めた文字列のまま
返し、digits_unclear を true にしてください。
- 計算をしないでください。数量と単価から金額を出す、合計から単価を
割り戻す、消費税を計算する、のいずれもしないでください。
書かれていない金額は空のままにしてください。
- 「式」「一式」は単位です。数量を1に書き換えないでください。
- 運賃・据付費・材料の手配などが書かれていないときは not_stated です。
「一般に込みである」などの推測で stated にしないでください。
- 「別途」「別」「含まず」は、その費用が見積に含まれていないと
書かれているので stated です。value に書かれたとおり写してください。
- 印刷された見出しの文字(例:「運賃」という欄の名前)があるだけで、
値が空なら not_stated です。欄の名前を値として扱わないでください。
- evidence には根拠にした文字列をそのまま写してください。
- 業者の比較、発注先の推薦、金額の高い安いの評価は書かないでください。
- 見積書でない書類(送付状だけ、請求書、納品書)と判断したときは、
document_type に種類を書き、明細を作らないでください。
【業者の区分】{vendor_category}
【確かめる条件】{required_terms}
【依頼の候補】{candidate_requests}
【読み取り結果(Markdown)】{ocr_markdown}
「欄の名前を値として扱わない」を明記しないと、条件の抜けが拾えません。 業者の見積用紙には「運賃」「納期」「有効期限」の欄が印刷されていて、空欄のまま送られてくることがよくあります。読み取り結果には「運賃」という文字が確かにあるので、何も言わなければ stated にします。styles の手書きの判定と組み合わせ、書き込まれた値があるかで見ます。
「別途」を stated にするのも明記が要ります。 「運賃別途」は含まれていないことがはっきり書かれている状態で、抜けではありません。
出力形式を固定する
次の形のJSONで受け取ります。 Azure OpenAI の構造化出力で、response_format に json_schema を strict: true で渡し、形を固定します。すべての項目を必須にし、additionalProperties を false にする必要があるので、値が無い項目も空文字で返させます。
{
"document_type": "quotation",
"vendor_code": "V0231",
"request_no": "RQ-2610-045",
"request_match_reason": "見積書右上に「RQ-2610-045」と手書き",
"quote_date": "2026-10-08",
"valid_until": "",
"lines": [
{ "row": 1, "item_name": "ブラケット追加工", "spec": "図面 B-1182 穴あけ4か所",
"quantity": "120", "unit": "個", "unit_price": "380",
"amount": "45,600", "delivery": "10/24", "digits_unclear": false },
{ "row": 2, "item_name": "黒染め", "spec": "",
"quantity": "1", "unit": "式", "unit_price": "",
"amount": "8,000", "delivery": "", "digits_unclear": true }
],
"subtotal": "53,600",
"tax": "5,360",
"total": "58,960",
"terms": [
{ "term": "freight", "status": "stated", "value": "運賃別途", "evidence": "※運賃別途" },
{ "term": "valid_until", "status": "not_stated", "value": "", "evidence": "" },
{ "term": "material", "status": "unclear", "value": "", "evidence": "材料 支給・手配(どちらにも丸なし)" }
],
"notes": ["材料支給の場合は単価-50円"]
}
金額を文字列で受け取るのは、読み取ったとおりの形を残すためです。 検算はプログラムが数値に直してから行います。
検算の結果は、プログラムが次の形で足します。
| 項目 | 中身 |
|---|---|
checks[].kind | line_amount(数量×単価)/subtotal(明細の合計)/tax(消費税)/total(総額) |
checks[].result | ok / calc_mismatch / read_uncertain / not_checkable |
checks[].low_conf_cells | 関係するセルのうち、信頼度がしきい値を下回るもの |
missing_terms | not_stated と unclear の条件の一覧 |
review_needed | 人が見るべきセルがあるか(true/false) |
calc_mismatch と read_uncertain の分け方は、次の規則で決めます。
| 状態 | 判定 |
|---|---|
| 計算が合い、関係するセルの信頼度がすべてしきい値以上 | ok |
| 計算が合わず、関係するセルの信頼度がすべてしきい値以上 | calc_mismatch(業者の計算違いの疑い) |
計算が合わず、関係するセルに信頼度の低いものがある、または digits_unclear | read_uncertain(読み違いの疑い) |
| 単価が書かれていない「一式」の行など | not_checkable |
しきい値は最初は厳しめに置き、人が直したセルの記録を見て動かします。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 共有メールボックス | 添付ファイルの取り出し | FAXのPDFを受信用の保管場所に置く |
| Azure AI Document Intelligence | REST API | レイアウトの読み取り(Markdown、表、信頼度、手書きの判定) |
| Azure OpenAI | Chat Completions API(構造化出力) | 項目の対応づけと条件の拾い出し |
| 仕入先マスタ | 読み取りのみ | FAX番号から業者と区分を引く |
| 見積依頼の一覧 | 読み取りのみ | 依頼の候補を取り出す |
| 見積比較表 | 行の追加 | 依頼番号のシートに業者の行を足し、印の付いたセルに色を付ける |
| 購買担当への通知 | メール | 新しい見積が入ったこと、calc_mismatch・read_uncertain・条件の抜けの件数 |
比較表へは「行の追加」だけにします。 訂正の見積が届いたら新しい行として足し、古い行に「訂正あり」の印を付けます。 購買管理システムと仕入先マスタには書き込みません。
人が確認する
人が見るのは、印の付いたセルと条件の抜けだけです。 read_uncertain のセルは黄色、calc_mismatch のセルは赤で表示し、FAXの画像の該当箇所へのリンクを添えます。
- 黄色(読み違いの疑い)を先に直す … 画像と見比べて直すと、そのセルを含む検算をやり直します
- 赤(計算違いの疑い)を確かめる … 業者の書いた数字が読み取りと同じなら、業者の計算違いとして扱います
- 業者に確かめるかを決める … 計算違いと条件の抜けは、まとめて1回で聞きます。文面は担当が作り、自動では送りません
- 依頼番号の紐づけを確かめる …
request_match_reasonを読み、候補から選ばれた紐づけが正しいかを見ます - 直した記録を残す … どのセルを何から何に直したかが自動で記録されます
2番目を省かないでください。 赤のセルは「業者が計算を間違えた」という疑いで、それを業者に伝えるのは購買担当です。読み違いだったのに業者に指摘すると、その業者との次のやり取りに残ります。
目標は、240枚をならして1枚5分です。 印が5か所を超える見積が続く業者は、FAXの画質か用紙の書き方に理由があります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 送信元のFAX番号が仕入先マスタに無い | 社名から候補を出し、担当に業者を選ばせる。選ぶまで比較表に載せない |
| 依頼番号が無く、候補が0件または2件以上 | request_no を空にして担当に回す。推測で紐づけない |
| 見積でない書類(請求書・納品書・送付状だけ) | document_type を見て、比較表に載せずに担当に回す |
| ページをまたぐ表がつながらない | ページごとの表をそのまま載せ、review_needed を true にする |
| 文字が小さすぎて読めない | 1024×768の画像で12ピクセルが下限。下回る箇所は read_uncertain で人へ |
| 画像が真っ黒・真っ白に近い | 読み取れる単語がほとんど無いものは処理を止め、業者に送り直しを頼む |
| 同じ見積が2回届く | 業者・日付・合計が同じなら、2通目に「重複の疑い」の印を付けて載せない |
| OCRや生成AIが応答しない | PDFを受信用の場所に残し、次の回にやり直す |
上の2行が、運用の最初の数か月で多く出ます。 どちらもAIの問題ではなく、仕入先マスタのFAX番号と、見積依頼に番号を書いてもらう習慣の問題です。 依頼書に「ご回答の際は依頼番号をご記入ください」と大きく書くだけで、2行目はかなり減ります。
記録を残す
- 受信したFAXのPDFと、受信日時・送信元のFAX番号
- Document Intelligence が返したJSONの全文
- 生成AIに渡した指示と、返ってきたJSON
- 検算の結果(
checks)と、そのときのしきい値 - 人が直したセルの記録(直す前の値、直した後の値、そのセルの信頼度、直した人)
- 業者に確かめた内容と、その回答
- 業者ごとの
read_uncertainとcalc_mismatchの件数
5番目の記録が、しきい値を決める材料になります。 直されたセルの信頼度の分布を見れば、どこから下を人に回すべきかが分かります。最後の行は、業者に数字の欄を大きく書いてもらうといったお願いの材料です。
04実装レベルの3段階
最小構成では枚数がさばけません。 1枚ずつ画面に貼るので、240枚には使えません。確かめるための段階です。 半自動化で、1枚15分が9分程度になります。 打ち込みと検算は自動になりますが、どの依頼への見積かを探して比較表に貼る作業と、どのセルを見直すかを自分で決める作業が残ります。本格構成で5分になり、この段階が本記事の想定です。 差が大きいのは、依頼の照合と、信頼度で見るセルを絞るところが、1枚ずつの手作業だからです。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、信頼度が低い業者と依頼番号を書かない業者が分かります。
05工数削減シミュレーション
導入後 240件 × 5分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 部品の追加工・治具の製作・設備の修繕や小工事を地元の小さな業者に頼んでおり、見積が手書きのFAXで届く工場。購買担当が見積を表計算に打ち直して比較表を作り、電卓で検算している場合。見積依頼に番号を振っており、FAXをインターネットFAXや複合機でPDFとして受け取れる場合。
- 見積がすべて購買システムや電子見積の仕組みから届き、明細がデータで受け取れる場合。手書きのFAXの見積が月に数枚で、目で見て打ち直しても間に合う場合。見積依頼に番号が無く、どの依頼への見積かを後から決められない場合。なお、どの業者に発注するかの判断と、見積の金額の妥当性の判断は、この構成では代替できません。
07最小構成で試す方法
- 先月FAXで届いた手書きの見積書から20枚を選ぶ(計算違いや条件の抜けがあったと分かっているものを数枚入れる)
- その20枚について、比較表に打ち込んだ値と、業者に確かめた内容を手元に用意する
- 20枚のPDFを Document Intelligence Studio でレイアウトモデルにかけ、表と信頼度を見る
- 読み取り結果の Markdown を手元の生成AIの画面に貼り、「この見積の明細を品名・数量・単位・単価・金額・納期の表にしてください。計算はしないでください。読めない数字は読めたとおりに書いてください。運賃・有効期限・材料の手配が書かれているかを、書かれている・書かれていない・読めないに分けてください」と指示する
- 出てきた表を、当時打ち込んだ値と突き合わせ、合計を電卓で検算する
20枚は必ずやってください。 仕組みを組む前に、「手書きのFAXの数字をどこまで読めるか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 数字がほぼ当時の打ち込みと同じで、怪しい桁の信頼度が低く出た | 検算と比較表への書き込みに進む |
| 生成AIが合計に合わせて数字を直した | 指示の書き方で直る。構成は有効 |
| 読めない数字が多すぎる | FAXの画質が先。 業者の送信の設定か、受信の解像度を見直す |
3行目が特定の業者だけなら、その業者にメールでのPDFの送付をお願いするほうが早く片づきます。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 生成AIが合計に合わせて数字を直す | 計算を禁じ、文字列のまま写させる。 直された形跡は、OCRの文字列との突き合わせで見つける |
印刷された欄の名前で条件が stated になる | styles の手書きの判定と組み合わせ、書き込まれた値があるかで見る |
| 「一式」が数量1になる | 単位として残すよう指示に書き、not_checkable で検算から外す |
| セルの信頼度を平均で見て、怪しい桁が埋もれる | セルに入る単語の信頼度の最小値で見る |
| 品名の欄が2行にまたがって列がずれる | 出力を Markdown にし、HTML のテーブルとして渡す |
| ページをまたぐ明細が2つの表になる | 読み取り後に、見出しの列が同じ表をつなぐ |
| 依頼番号の無い見積を別の依頼に紐づける | 候補をその業者に出した依頼に絞る。合うものが2つ以上なら空にする |
| 訂正の見積が前の見積を上書きする | 行の追加だけにし、古い行に印を付ける |
| 比較表の並び順で発注先が決まったように見える | 金額の順に並べない。依頼番号の行は届いた順 |
| 業者への問い合わせが自動で飛ぶ | 文面は担当が作り、送信も人が行う |
上の2行が、この構成の失敗のほとんどです。 どちらも「見積書に書かれていること」を「書かれているように見えること」で置き換える失敗です。数字は文字列のまま、条件は書き込まれた値の有無でと、判断の根拠をOCRの返した事実に置けるかで、運用に乗るかが決まります。
下から2行目も効いてきます。 比較表を金額の安い順に並べると、運賃や据付費が別途の業者が上に来ます。条件をそろえる前の金額は、比べられる数字ではありません。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 業者の名称・FAX番号・担当者名、見積の品名・数量・単価・金額、図面番号、そして見積書に書かれていることがある振込先の口座や、他社との取引をうかがわせる但し書きです。
- 見積の金額は取引先の営業上の情報として扱う … 単価は業者にとって他社に知られたくない情報です。比較表の閲覧は購買課と承認者に限り、読み取り結果のJSONも同じ範囲で保管します
- 処理の地域を決めておく … Document Intelligence と Azure OpenAI のリソースを同じ地域に置き、保管場所も合わせます。業者の情報が国外で処理されるかを、社内で説明できる形にします
- 比較表を値下げの交渉の道具にしすぎない … 工事の見積について、建設業法は注文者が材料費等の額を、通常必要と認められる額を著しく下回るような変更を求めてはならないとしています。比較表で安い業者の材料費を他社に示して下げさせる使い方は、この規定に触れるおそれがあります。この構成は条件の抜けをそろえるもので、価格の引き下げの根拠を作るものではありません
- 業者への指摘を自動で送らない … 計算違いの指摘は、相手の仕事への指摘です。読み違いだった場合の失礼は、削減した時間より高くつきます
- AIに発注先を選ばせない … 生成AIには比較・推薦を書かせず、比較表の並びも金額順にしません
- 元のFAXを残す … 比較表の数字は人が直した後の値で、何が書かれていたかの証拠はFAXの画像です
誤りが起きた場合のリスクは、計算違いを見落として発注することと、正しい見積を出した業者に誤りを指摘することの2つです。 前者は read_uncertain を ok に混ぜると起き、後者は read_uncertain を calc_mismatch に混ぜると起きます。どちらも信頼度による振り分けから出ているので、そこだけは設計で守ります。
10まず何から始めるか
1週目:仕入先マスタのFAX番号と区分をそろえる
見積をFAXで送ってくる約60社について、FAX番号と、加工か工事かの区分を仕入先マスタに入れます。一度に全部でなくても、月の見積の多い上位20社から始めれば、枚数の大半が埋まります。
2週目:20枚で試す
先月の見積から20枚を選び、Studio で読み取り、手元の生成AIの画面で明細の表にさせます。当時の打ち込みと突き合わせ、生成AIが合計に合わせて数字を直していないかを最優先で見ます。
3週目:確かめる条件の一覧を作る
加工と工事のそれぞれについて、見積に書かれていてほしい条件を購買課で決めます。 工事は、材料費・労務費などの内訳と工程ごとの日数を入れます。あわせて、見積依頼書に「ご回答の際は依頼番号をご記入ください」の一文を足します。
4週目:受信から読み取りと検算までをつなぐ
インターネットFAXの転送から保管場所、読み取り、対応づけ、検算までを作り、結果を一覧に書き出すところで止めます。 この時点では比較表に書き込まず、一覧と比較表を担当が見比べます。
2か月目: 依頼の照合と比較表への書き込みを足し、黄色と赤の印を付けます。人が直したセルの記録を集め、信頼度のしきい値を見直します。3か月目以降: 業者ごとの read_uncertain の件数を見て、FAXの画質や書き方をお願いし、1枚15分が何分になったかを実測します。しきい値が記録から決まり、印の付いたセルだけを見る運用が定着した時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
レイアウトモデル(prebuilt-layout)がテキスト、テーブル、選択マーク、ドキュメントの構造を抽出すること。入力がPDFと画像(JPEG/JPG、PNG、BMP、TIFF、HEIF)などであること。PDFとTIFFが最大2,000ページ(Free レベルは最初の2ページのみ)、ファイルの大きさが有料(S0)で500MB、Free(F0)で4MBであること。テキストの最小の高さが1024×768の画像で12ピクセル(150dpiで約8ポイント)であること。表のセルが rowIndex/columnIndex/kind(columnHeader)付きで返ること。単語ごとに confidence が返ること。各テキスト行が手書きのスタイルかどうかが信頼度とともに styles で返ること。選択マークの state が selected/unselected で返ること。outputContentFormat=markdown で Markdown を出力でき、v4.0 では表が HTML のテーブルになり結合セルや複数行の見出しを表現できること。ページの angle が返ること | Microsoft Learn: レイアウトモデル | 2026-10-09 |
v4.0 のレイアウトモデルの手書きテキストの対応言語に日本語(ja)が含まれていること | Microsoft Learn: 言語サポート(OCR) | 2026-10-09 |
response_format に json_schema を strict: true で渡して応答の形を固定できること。すべての項目を必須にし、additionalProperties を false にすること。入れ子は最大5レベル、オブジェクトのプロパティは最大100個であること | Microsoft Learn: 構造化出力 | 2026-10-09 |
| 建設業法第20条で、建設業者が材料費・労務費などの内訳と工程ごとの作業及びその準備に必要な日数を記載した見積書(材料費等記載見積書)を作成するよう努めること、注文者が材料費等の額を通常必要と認められる額を著しく下回るような変更を求めてはならないこと。この条文が令和6年法律第49号による改正で2025-12-12に施行されたものであること | e-Gov 法令API: 建設業法 | 2026-10-09 |
どの業者に発注するか、見積の金額が妥当かは、購買課と承認者が決めてください。 本記事は各製品の公式ページと法令の条文で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1157)についてのご相談はこちらから。
