店舗ごとに紙やPDFで届く電気・ガス・水道・通信の請求書を読み取って拠点別の費用台帳に転記し、前月・前年同月より増え方の大きい拠点を拾う
店舗や倉庫ごとに届く電気・ガス・水道・通信の請求書を読み取り、拠点別の費用台帳に転記します。使用期間の日数をそろえて前月・前年同月と比べ、増え方の大きい拠点を一覧にします。
- 生成AI
- Azure OpenAI Service/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 対象業界
- 介護/小売/物流/飲食
- 対象部門
- 経理/総務
- 対象業務
- データ入力・転記/集計・分析
- 主な課題
- データ分析に時間がかかる/入力作業が多い/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/判断支援/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 会員サイトからPDFを取り出し、共有フォルダに保存する。店舗から届いたスキャンも同じフォルダに入る
- 1枚ずつ開き、宛名・住所・お客さま番号を見て、どの拠点の請求書かを決める
- 使用期間、使用量、請求金額を台帳の該当するセルに入れる
- 前月の値と見比べ、大きく違えばメモを残す
- 月末に、台帳の合計と会計システムの支払額を突き合わせる
- 気になった拠点に、総務から電話で事情を聞く
- 人これまでどおり、会員サイトのPDFと店舗のスキャンを受領フォルダに保存する
- 自動ファイルの保存をきっかけに処理が動き、形式とページ数を確かめる
- 自動OCRが請求書の項目(請求元、宛名、使用期間、請求金額など)と、全テキスト・表・信頼度を返す
- 自動生成AIが、使用量・単位・契約の番号など請求書モデルの項目に無い値を本文から取り出す
- 自動契約の番号で契約マスタを引き、拠点と種別(電気・ガス・水道・通信)を決める
- 自動使用期間の日数で割った1日あたりの使用量と金額を計算し、前月・前年同月と比べる
- 自動拠点を決められなかったもの・信頼度の低いものを確認待ちに、それ以外を台帳の下書きに入れる
- 自動増え方が基準を超えた拠点を一覧にし、総務に通知する
- 人経理が確認待ちのものだけを開き、拠点と値を確かめて台帳に確定する
- 人総務が一覧の拠点に事情を確かめ、結果を台帳のメモ欄に残す
各工程の詳しい説明を読む
- 会員サイトからPDFを取り出し、共有フォルダに保存する。店舗から届いたスキャンも同じフォルダに入る
- 1枚ずつ開き、宛名・住所・お客さま番号を見て、どの拠点の請求書かを決める
- 使用期間、使用量、請求金額を台帳の該当するセルに入れる
- 前月の値と見比べ、大きく違えばメモを残す
- 月末に、台帳の合計と会計システムの支払額を突き合わせる
- 気になった拠点に、総務から電話で事情を聞く
(a)どの拠点の請求書かを決めるのに時間がかかる。 宛名に店舗名が無く、住所だけの請求書があります。同じ商業施設に2店舗入っている場合は、住所でも決まりません。 お客さま番号で契約の一覧を引こうとしても、その列が空の拠点があります。
(b)期間をそろえずに比べている。 4番の見比べは、請求金額をそのまま前月と並べています。検針日がずれた月は、何も変わっていない拠点が増えたように見えます。 逆に、本当に増えていても、検針期間が短かった月には目立ちません。
(c)前年同月とは比べていない。 空調の使い方は季節で大きく変わるため、前月と比べるだけでは夏の増加がすべて「増えた」に見えます。前年の同じ月と比べるべきですが、台帳の列が遠く、手作業では続きません。
(d)気づくのが遅い。 漏水や冷蔵ケースの不具合で使用量が増えても、転記が月末にまとめて行われるため、気づくのは翌月以降です。 その間の分は、そのまま支払われます。
- 【人】 これまでどおり、会員サイトのPDFと店舗のスキャンを受領フォルダに保存する
- 【自動】 ファイルの保存をきっかけに処理が動き、形式とページ数を確かめる
- 【自動】 OCRが請求書の項目(請求元、宛名、使用期間、請求金額など)と、全テキスト・表・信頼度を返す
- 【自動】 生成AIが、使用量・単位・契約の番号など請求書モデルの項目に無い値を本文から取り出す
- 【自動】 契約の番号で契約マスタを引き、拠点と種別(電気・ガス・水道・通信)を決める
- 【自動】 使用期間の日数で割った1日あたりの使用量と金額を計算し、前月・前年同月と比べる
- 【自動】 拠点を決められなかったもの・信頼度の低いものを確認待ちに、それ以外を台帳の下書きに入れる
- 【自動】 増え方が基準を超えた拠点を一覧にし、総務に通知する
- 【人】 経理が確認待ちのものだけを開き、拠点と値を確かめて台帳に確定する
- 【人】 総務が一覧の拠点に事情を確かめ、結果を台帳のメモ欄に残す
9番目が、この設計の分かれ目です。人が開くのは全件ではありません。 契約の番号で拠点が決まり、読み取りの信頼度が十分なものは、台帳の下書きに入ったものを流し見て確定します。 全件を開く設計にすると、36.0時間はほとんど減りません。
6番目の比較を機械の計算にしているのも、意図してのことです。 増え方の基準(何%以上、何円以上)は自社で決める取り決めで、生成AIには計算も判定もさせません。
02今回想定するシステム構成
請求書(会員サイトのPDF/店舗でスキャンした紙) ▼【トリガー】受領フォルダ(Blob Storage)への保存 Azure Functions ├──▶ 形式・ページ数の確認、重複の検知 ▼ Azure AI Document Intelligence(事前構築済み請求書モデル) │ 請求元・宛名・使用期間・請求金額・明細・信頼度 ▼ Azure OpenAI(構造化出力)── 使用量・単位・契約の番号を本文から取り出す ▼ Azure Functions ── 契約マスタで拠点を決める │ ── 1日あたりに直して前月・前年同月と比べる ▼ 費用台帳の下書き + 確認待ちの一覧 + 増え方の大きい拠点の一覧 ▼ 【経理が確認待ちだけ確定】【総務が拠点に確認】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Azure AI Document Intelligence(事前構築済み請求書モデル prebuilt-invoice) | Google Document AI |
| 生成AI | Azure OpenAI(Microsoft Foundry)(請求書モデルの項目に無い値の取り出し) | Claude API、Gemini API |
| 連携 | Azure Functions(保存を起点に処理を動かし、拠点の照合と比較を行う) | Azure Logic Apps |
| 保管 | Azure Blob Storage(請求書の原本と読み取り結果) | SharePoint |
| 台帳 | 拠点別の費用台帳(スプレッドシートまたは Microsoft Lists) | 会計システムの補助台帳 |
会計システムには書き込みません。 支払の処理はこれまでどおりで、この構成は拠点別の費用台帳を作るところまでです。契約マスタは、総務が持つ契約の一覧に「契約の番号」の列を足して使います。
土台になるのは、Azure AI Document Intelligence の事前構築済み請求書モデルです。 売上請求書、公共料金、発注書から主要なフィールドと品目を抽出するとされ、対応する文書の種類に光熱費が挙がっています。対応言語には日本語(ja)が含まれ、通貨コードには日本円(JPY)が含まれています。現在27言語の請求書をサポートしています。
取り出せる項目には、使用期間の始まりと終わりがあります。 請求書モデルのスキーマには、請求元(VendorName)、宛名(CustomerName)、顧客の番号(CustomerId)、請求日(InvoiceDate)、支払期限(DueDate)、サービスの期間の始まりと終わり(ServiceStartDate、ServiceEndDate)、サービスの提供場所(ServiceAddress)、請求金額(InvoiceTotal)、支払額(AmountDue)、明細(Items。数量・単位・単価・金額)が並んでいます。光熱費の請求書の「使用期間」と「供給場所」は、この2つに当たります。
ただし、日本の公共料金の請求書で、どの項目がどこまで取れるかは書式によります。 使用量(kWh、㎥)が明細の数量として取れることもあれば、取れないこともあります。取れなかった値は、OCRが返した全テキストから生成AIに取り出させます。 最初の試験で、相手先ごとにどの項目が取れるかを確かめておきます。
03どうやって実装するのか
処理の起点を決める
受領フォルダにファイルが保存されたことを起点にします。 受領フォルダは Azure Blob Storage のコンテナーにし、Azure Functions の Blob ストレージ トリガーで受けます。トリガーにはイベントベースとポーリング型があり、イベントベースのほうが遅延が小さく推奨とされています。
1枚ずつ動かし、月末にまとめて処理しません。 請求書は相手先ごとに届く日がばらばらです。届いた日に読み取って比べれば、漏水のような急増に、その月のうちに気づけます。 第3章の(d)への答えはここにあります。
月に1回、締めの処理も動かします。 毎月10日など決めた日に、今月分の請求書がまだ届いていない拠点と種別を契約マスタから洗い出します。届いていない請求書は、読み取りを起点にした処理では見えないからです。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 請求書ファイル | PDFまたは画像。受け取った日時と経路(会員サイト/店舗のスキャン) | 受領フォルダ |
| 読み取り結果 | 請求書の項目、明細、全テキスト、表、信頼度 | Azure AI Document Intelligence |
| 契約マスタ | 拠点コード、拠点名、種別、相手先、契約の番号(お客さま番号、供給地点の番号、回線番号)、契約の開始・終了 | 総務の契約の一覧 |
| 過去の台帳 | 拠点・種別ごとの使用期間、使用量、金額(前月と前年同月) | 拠点別の費用台帳 |
| 拠点の出来事 | 改装、営業時間の変更、閉店・開店、設備の入替 | 店舗運営部の予定表 |
質を決めるのは、契約マスタの「契約の番号」の列です。 ここが埋まっていないと、第3章の(a)がそのまま残ります。最初の作業は、この列を埋めることです。 過去の請求書を読み取った結果から、番号の候補を作って総務が確かめる、という順番で埋められます。
拠点の出来事は、比較の結果を読むための材料です。 改装で営業時間が延びた月に使用量が増えるのは当然で、それを知らずに一覧を見ると、毎月同じ拠点に問い合わせることになります。
データの取得方法を決める
読み取りは、Azure Functions から請求書モデル(prebuilt-invoice)を呼ぶだけです。返ってくるJSONは3つに分かれ、documentResults に請求書固有の値と品目、pageResults に表とセルと信頼度、readResults に認識された全テキストが入ります。キーと値のペアの返却は既定で無効なので、オプションで有効にします。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 請求元・宛名・顧客の番号 | documentResults の VendorName、CustomerName、CustomerId | 種別と拠点の候補 |
| 使用期間 | ServiceStartDate、ServiceEndDate | 日数の計算 |
| 請求金額・支払額 | InvoiceTotal、AmountDue | 台帳の金額 |
| 供給場所 | ServiceAddress | 拠点の照合の補助 |
| 明細 | Items(数量・単位・金額) | 使用量と単位の候補 |
| 全テキスト・キーと値のペア | readResults、オプションの返却 | 上で取れなかった値を生成AIが拾う |
拠点を決める順は、契約の番号、供給場所の住所、宛名の順です。 番号が契約マスタに一致すれば、それで決めます。番号が取れないか一致しないときだけ住所で引き、住所で1つに決まらなければ確認待ちにします。 同じ商業施設に2店舗あるような場合を、住所で無理に決めないためです。
前月と前年同月の値は、拠点別の費用台帳から拠点コードと種別で引きます。台帳は下書きの行と確定の行を分けて持ち、比較には確定の行だけを使います。
AIへ渡す前に整形する
- 形式の確認 … 請求書モデルの入力はPDFと画像(JPEG/JPG、PNG、BMP、TIFF、HEIF)です。会員サイトからCSVで取れる相手先は、OCRを通さず直接取り込みます
- ページ数とサイズ … PDFとTIFFは最大2,000ページ、有料(S0)レベルで500MBまでです。Free レベルは最初の2ページしか処理されません
- パスワードの解除 … 会員サイトのPDFにパスワードが付く相手先があります。提出前にロックを解除する必要があります
- 1ファイルに複数の請求書 … 店舗でまとめてスキャンされたものは、ページで分けます
- 重複の検知 … 同じ契約の番号・同じ使用期間のものが既にあれば、二重に取り込みません
- 解像度の確認 … 抽出するテキストの最小高さは、1024×768の画像で12ピクセル(150dpiで約8ポイント)です。検針票の小さな文字は、この下限に近いことがあります
6番目を軽く見ないでください。 水道の検針票は小さな用紙に細かい字で印字されていることが多く、使用量の数字だけが読めずに残ることがあります。店舗の複合機のスキャン設定を、本部で一度そろえておきます。
AIに処理させる
OCRが取れなかった値を、全テキストから取り出させることだけです。 拠点の決定、日数の計算、比較はコードで行います。
| 取り出すもの | 取り出し方 | 判断できないときの扱い |
|---|---|---|
| 種別 | 電気・ガス・水道・通信のどれか | 迷えば unknown |
| 契約の番号 | お客さま番号、供給地点の番号、回線番号。書かれた文字列のまま | 見つからなければ空 |
| 使用量と単位 | kWh、㎥ など。通信は空 | 単位が無ければ ambiguous |
| 使用期間 | 請求書モデルで取れなかったときだけ | 検針日しか無ければ ambiguous |
| 金額の内訳 | 基本料金、使用量の料金、調整額、消費税 | 内訳が無ければ空 |
| させないこと | 理由 |
|---|---|
| 拠点を決める | 契約マスタとの照合はコードで行う |
| 番号の補完 | 桁を足す、似た番号に直すと、別の拠点に結び付く |
| 使用量の計算 | 金額から単価で割り戻して埋めない |
| 増えた理由の推測 | 理由は拠点に確かめる |
2行目と3行目がいちばん起きやすい失敗です。 番号の1桁が読めないとき、生成AIは契約マスタに近い番号へ寄せようとし、使用量が読めないときは金額から逆算して埋めます。 どちらも、見つけたかった誤りや異常を消してしまいます。
指示内容を固定する
あなたは経理担当です。公共料金・通信料金の請求書の読み取り結果から、
指定の項目を取り出します。読み取り結果に書かれていることだけを使ってください。
【取り出す項目】
utility_type / contract_numbers / usage / usage_unit /
period_start / period_end / charges
【厳守事項】
- utility_type は electricity / gas / water / telecom / unknown から選んでください。
- 契約の番号(お客さま番号、供給地点の番号、回線番号など)は、
書かれた文字列をそのまま入れてください。桁を補ったり、記号を直したりしないでください。
番号の種類が分かる場合は label に項目名を入れてください。
- 使用量は、請求書に書かれた数値と単位をそのまま入れてください。
金額や単価から計算して埋めないでください。書かれていなければ null です。
- 使用期間は、請求書に「使用期間」「ご使用期間」などとして書かれた日付を入れてください。
検針日しか書かれていない場合は、period_status を ambiguous にしてください。
- charges には、基本料金、使用量の料金、調整額、消費税など、
請求書に内訳として書かれた行だけを入れてください。
- 拠点名や店舗名を推測しないでください。
- 各項目の evidence には、根拠にした文字列をそのまま写してください。
【請求書モデルが返した値】{invoice_fields}
【全テキスト】{read_text}
「金額や単価から計算して埋めない」を明記しないと、使用量が埋まります。 単価が書かれた請求書では、生成AIは金額を単価で割って使用量を出そうとします。埋まった使用量は正しそうに見えるので、読めなかったという事実が消えます。
出力形式を固定する
次の形のJSONで受け取ります。
{
"file_id": "",
"utility_type": "electricity | gas | water | telecom | unknown",
"vendor_name": "",
"contract_numbers": [ { "label": "", "value": "", "evidence": "" } ],
"period_start": null,
"period_end": null,
"period_status": "ok | ambiguous | missing",
"usage": null,
"usage_unit": null,
"invoice_total": 0,
"charges": [ { "label": "", "amount": 0 } ],
"site": { "site_code": null, "match_by": "contract_number | address | none" },
"comparison": {
"per_day_usage": null, "per_day_amount": null,
"vs_last_month_pct": null, "vs_last_year_pct": null,
"flag": "none | increase | first_record | no_history"
},
"status": "ready | needs_review"
}
site と comparison は、生成AIではなくコードが埋めます。 生成AIに返させるのは utility_type から charges までで、Azure OpenAI の構造化出力で形を固定します。json_schema に strict: true を指定し、全フィールドを required にして、省略してよい値は null との組み合わせの型で表します。
per_day_usage で比べる理由は第1章のとおりです。 使用期間の日数で割り、前月と前年同月の同じ値と比べます。flag を increase にする基準は、たとえば次のように決めます。
| 条件 | flag |
|---|---|
| 1日あたりの使用量が前年同月比で30%以上増え、かつ月の金額で1万円以上増えた | increase |
| 前年同月の記録が無く、前月比で50%以上増えた | increase |
| その拠点・種別で初めての請求書 | first_record |
| 前月も前年同月も記録が無い | no_history |
計算の例を1つ挙げます。ある店舗の電気の請求書で、今月は使用期間が33日・使用量が9,900kWh、前年同月は29日・7,250kWhだったとします。
| 使用期間 | 使用量 | 1日あたり | |
|---|---|---|---|
| 今月 | 33日 | 9,900kWh | 300kWh |
| 前年同月 | 29日 | 7,250kWh | 250kWh |
月の使用量で比べると約37%の増加ですが、1日あたりでは20%の増加です。 30%の基準なら、この店舗は一覧に載りません。期間が4日長かっただけの増加を、拠点への問い合わせに回さずに済みます。
基準の数字は例です。 割合だけで判定すると、もともと小さい拠点の小さな変化が毎月並びます。金額の下限と組み合わせることで、問い合わせる価値のある拠点だけが残ります。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 受領フォルダ | Blob ストレージ トリガー | 保存を検知して関数を動かす |
| Azure AI Document Intelligence | 請求書モデルの呼び出し | 項目・明細・全テキスト・信頼度を返す |
| Azure OpenAI | 構造化出力 | 請求書モデルで取れなかった値を返す |
| 契約マスタ | 読み取り | 契約の番号から拠点と種別を引く |
| 拠点別の費用台帳 | 下書きの行の追加 | ready は下書きに、needs_review は確認待ちに |
| 総務への通知 | チャットまたはメール | increase の拠点の一覧 |
台帳の下書きには、拠点・種別・月ごとに次の1行を足します。
| 列 | 中身 |
|---|---|
| 拠点コード・種別・対象月 | 契約マスタで決めた拠点と、使用期間の終わりの月 |
| 使用期間・日数・使用量・金額 | 読み取った値と、計算した日数 |
| 1日あたりの使用量・金額 | 比較に使った値 |
前月比・前年同月比・flag | 比較の結果 |
| 状態 | 下書き/確認待ち/確定 |
| 原本へのリンク | 受領フォルダの請求書ファイル |
原本へのリンクを行ごとに持たせるのは、確認の時間を短くするためです。 台帳の値に疑問を持ったとき、共有フォルダを探さずに1回で原本が開けます。
契約マスタへは書き込みません。 新しい番号が見つかっても、追加するかは総務が契約書と照らして決めます。 読み取った番号をそのまま足すと、読み誤った番号が正しい番号として残ります。
人が確認する
人が開くのは needs_review のものだけです。 ready のものは下書きの一覧で件数と拠点を流し見て、まとめて確定します。
- 拠点が決まらなかったものを先に見る …
match_by: none。契約マスタの番号の抜けが原因なら、総務に追加を頼みます - 信頼度の低い値を原本で確かめる … 使用量・金額・使用期間のどれかの信頼度が低いもの
increaseの拠点を総務が確かめる … 拠点の出来事の表を見てから、店舗に事情を聞きます- 値を直したら記録する … どの請求書の、どの項目を直したかを残します
目標は、360枚をならして1枚2分です。 確認待ちが1〜2割という想定で、それを超える月は、店舗のスキャンの設定か契約マスタの番号の抜けを疑います。
例外に対処する
| 起きること | 対応 |
|---|---|
| パスワード付きのPDF | 解除して再投入。会員サイトの設定でパスワードを外せる相手先は外す |
| 拠点が決まらない | needs_review。契約マスタの番号の抜けを総務へ |
| 使用期間が読めない | 日数の計算をせず、flag を付けない。金額だけ台帳に入れる |
| 請求書でない書類(お知らせ、契約変更の案内) | 種別 unknown で人へ。料金改定のお知らせは総務に回す |
| 同じ請求書が二度届く | 契約の番号と使用期間で照合し、二重に取り込まない |
| 前月の過不足の精算で金額がマイナスや極端に小さい | 比較に使わず needs_review。精算の行を台帳のメモ欄に残す |
| 締めの日に届いていない請求書 | 拠点と種別の一覧を経理に出し、会員サイトを確かめる |
| 関数が何度も失敗する | 既定で5回の再試行の後、webjobs-blobtrigger-poison のキューに入る。毎朝このキューを見る |
4行目の料金改定のお知らせは、捨てずに総務へ回します。 単価が変わった月は、使用量が同じでも金額が増えます。お知らせを見ていれば、その月の increase を問い合わせる前に理由が分かります。
記録を残す
- 元の請求書ファイルと、受け取った日時・経路
- 請求書モデルが返したJSONの全文と、生成AIが返したJSON
- 拠点の決め方(
match_by)と、そのとき参照した契約マスタの行 - 1日あたりの値と比較の結果、
flag - 人が値や拠点を直した記録
increaseの拠点に確かめた結果(理由、対応)
最後の行は、翌年の比較の材料になります。 去年の8月に漏水で増えた拠点は、今年の8月の前年同月比が大きく下がって見えます。理由が残っていれば、その下がり方を正しく読めます。
04実装レベルの3段階
最小構成では枚数がさばけません。 1枚ずつ読み取るので、360枚には使えません。確かめるための段階です。 半自動化で、1枚6分が4分程度になります。 読み取りは自動になりますが、どの拠点の請求書かを決めて台帳のセルに入れる作業が残ります。本格構成で2分になり、この段階が本記事の想定です。 差が大きいのは、拠点の決定と台帳への転記が、1枚ずつの手作業だからです。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、契約の番号が取れない相手先と、契約マスタの番号の抜けが先に分かります。そこを埋めてから本格構成に進むほうが、確認待ちが減ります。
05工数削減シミュレーション
導入後 360件 × 2分 ÷ 60 = 12 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 数十から百を超える店舗・倉庫・事業所を持ち、拠点ごとに電力会社・ガス会社・水道局・通信会社と契約している小売・飲食・物流・介護の事業者。請求書が紙の郵送と各社のWebからのPDFに分かれて届き、本部の経理や総務が拠点別の台帳に手で転記している場合。漏水や空調の不具合による使用量の急増に、翌月以降に気づくことがある場合。
- 拠点が数か所で、請求書が月に十数枚しかない場合。電力・ガスを一括契約にまとめ、拠点別の明細データを契約先から受け取れている場合。費用の配賦や省エネの施策そのものをAIに決めさせたい場合(この構成が出すのは増え方の大きい拠点の一覧までです)。
07最小構成で試す方法
- 先月の請求書から、電気・ガス・水道・通信を合わせて30枚を選ぶ(店舗でスキャンした紙を必ず含める)
- その30枚について、台帳に入れた値を書き出しておく
- Document Intelligence Studio で請求書モデルを選び、30枚を1枚ずつ読み取る
- 取れなかった値について、全テキストを手元の生成AIの画面に貼り、「使用期間・使用量と単位・契約の番号を取り出してください。計算で埋めないでください」と指示する
- 出てきた値を、台帳に入れた値と突き合わせる
30枚で確かめるのは、相手先ごとにどの項目が取れるかです。
| 出てきた内容 | 判断 |
|---|---|
| 使用期間・金額・番号が台帳と一致した | トリガーと契約マスタの照合に進む |
| 使用量を金額から逆算して埋めた | 指示の書き方で直る。構成は有効 |
| 店舗のスキャンだけ文字が読めない | スキャンの設定が先。 AIの問題ではない |
3行目が出ることは珍しくありません。 店舗の複合機の既定の設定は、文字の小さい検針票には足りないことがあります。本部で解像度の設定を決めて店舗に配り、同じ紙で取り直してください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 検針期間の違いで「増えた」と出る | 1日あたりに直してから比べる |
| 夏の空調で全店が「増えた」と出る | 前月ではなく前年同月と比べる |
| 宛名で拠点が決まらない | 契約の番号を鍵にする。 住所は補助 |
| 番号の1桁違いで別の拠点に結び付く | 番号の補完を禁じ、完全一致だけで決める |
| 読めない使用量が計算で埋まる | 指示で禁じ、null を残す |
| 店舗のスキャンが読めない | 解像度の設定を本部で決めて配る |
| パスワード付きのPDFで止まる | 会員サイトの設定で外すか、解除して投入 |
| 小さい拠点の小さな変化が毎月並ぶ | 割合と金額の下限を組み合わせる |
| 料金改定の月に全店が増える | お知らせを総務に回し、拠点の出来事に入れる |
| 届いていない請求書に気づかない | 月1回、契約マスタから未着を洗い出す |
| 改装した拠点に毎月問い合わせる | 拠点の出来事の表を比較の前に見る |
上の3行が、この構成の失敗のほとんどです。 どれも「比べ方」と「結び付け方」の問題で、読み取りの精度を上げても直りません。 日数、前年同月、契約の番号の3つをそろえてから一覧を出してください。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 拠点の住所、契約の番号、使用量と金額、そして会員サイトのPDFに含まれることがある口座振替の情報や担当者の連絡先です。
- 生成AIへ渡す範囲を絞る … 生成AIに渡すのは、請求書モデルで取れなかった値の取り出しに必要な全テキストです。口座番号などが含まれる行は、渡す前に除く設計にできます
- 会員サイトの認証情報を共有しない … PDFを取り出すための会員サイトのIDとパスワードは、担当者の間で表計算に書いて回さず、管理の方法を決めます
- 契約マスタを外部へ出さない … 拠点と契約の番号がまとまった一覧です。照合は Azure Functions の側で行い、マスタそのものを生成AIに渡しません
- 増えた理由を決めつけない … 一覧は「増え方が大きい」という事実です。店舗に確かめる前に、担当者の責任のように扱わないでください
- 原本の保存を決める … 紙の請求書、スキャンしたPDF、読み取りの結果のどれを原本として残すかを決めます
誤りが起きた場合のリスクは、別の拠点の費用として台帳に載ることと、本当の急増を見落とすことの2つです。 前者は番号の完全一致で、後者は日数と前年同月でそろえた比較で防ぎます。
10まず何から始めるか
1週目:契約マスタに番号の列を足す
総務の契約の一覧に、お客さま番号・供給地点の番号・回線番号の列を足します。全拠点を一度に埋める必要はありません。金額の大きい電気から、上位の拠点を先に埋めます。
2週目:30枚で試す
先月の請求書から30枚を選び、Studio で読み取ります。相手先ごとに、使用期間・使用量・番号がどこまで取れるかを表にします。 店舗のスキャンの読めなさもここで分かります。
3週目:比べ方を決める
1日あたりに直す方法、前年同月と前月のどちらを主に見るか、increase の割合と金額の基準を経理と総務で決めます。拠点の出来事の表を誰が更新するかも決めます。
4週目:受領フォルダから一覧までをつなぐ
受領フォルダを起点に、読み取りと生成AIでの取り出しを動かし、結果を一覧に書き出すところまで作ります。この時点では台帳に書き込まず、一覧だけを見ます。
2か月目: 契約マスタでの拠点の決定と、台帳の下書きへの書き込みを足します。3か月目以降: 日数をそろえた前月・前年同月の比較と increase の一覧を足し、1枚6分が何分になったかを実測します。increase の拠点に確かめた理由がたまり、基準を一度見直した時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
請求書モデルが売上請求書・公共料金・発注書から主要なフィールドと品目を抽出し、対応する文書の種類に光熱費が含まれること。現在27言語をサポートすること。入力がPDFと画像(JPEG/JPG、PNG、BMP、TIFF、HEIF)であること。PDFとTIFFが最大2,000ページ(Freeは2ページ)、S0で500MB。画像が50×50〜10,000×10,000ピクセル、テキストの最小高さが1024×768で12ピクセル。パスワード付きPDFは解除が必要なこと。キーと値のペアの返却が既定で無効なこと。JSON出力が readResults/pageResults/documentResults に分かれること | Microsoft Learn: 請求書データの抽出 | 2026-10-06 |
請求書モデル(prebuilt-invoice)の対応言語に日本語(ja)が含まれ、通貨コードに JPY が含まれること | Microsoft Learn: Language and locale support for prebuilt models | 2026-10-06 |
請求書モデルのフィールドに VendorName、CustomerName、CustomerId、InvoiceDate、DueDate、ServiceStartDate、ServiceEndDate、ServiceAddress、InvoiceTotal、AmountDue、Items(数量・単位・単価・金額)があること | GitHub(Azure-Samples): invoice モデル スキーマ 2024-11-30 | 2026-10-06 |
| レイアウトモデルの入力要件(ページ数・サイズ・画像の寸法・テキストの高さ)が請求書モデルと同じであること | Microsoft Learn: ドキュメント レイアウト分析 | 2026-10-06 |
Blob ストレージ トリガーにイベントベースとポーリング型があり、イベントベースが低遅延で推奨されること。既定で5回失敗すると webjobs-blobtrigger-poison キューに入ること | Microsoft Learn: Azure Blob storage trigger for Azure Functions | 2026-10-06 |
構造化出力が json_schema と strict: true で JSON スキーマに従わせ、全フィールドを required にし、省略可能な値は null との組み合わせで表すこと | Microsoft Learn: Structured outputs(Azure OpenAI) | 2026-10-06 |
日本の電力・ガス・水道・通信の請求書で、請求書モデルがどの項目をどこまで取れるかは書式によります。 本記事は Microsoft Learn と公式のサンプルで確認できた範囲だけを扱っています。最初の試験で相手先ごとに確かめてください。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0548)についてのご相談はこちらから。
