飲食店の店舗で手書きされる月末の食材の棚卸表を読み取り、本部の棚卸データにそろえて、原価率の計算と前月から大きく動いた品目を拾う
飲食店の店舗で月末に手書きされる食材の棚卸表を読み取り、品目・数量・単位を本部の棚卸データにそろえます。そのうえで原価率を計算し、前月から大きく動いた品目を店舗への確認の一覧にします。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Python
- 対象業界
- 宿泊/小売/飲食
- 対象部門
- 経理/購買
- 対象業務
- データ入力・転記/集計・分析
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/対応スピード向上/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 店舗が棚卸表をスキャンまたは撮影し、本部の共有フォルダに保存する
- 本部の担当者がファイルを開き、店舗と業態を確かめる
- 1行ずつ、品目と数量を読み、本部の棚卸データ(表計算ソフト)に打ち込む
- 書き足された品目は、品目の一覧から当たる品目コードを探す
- 棚卸の単位と書かれた単位が違う行は、換算の係数で直す
- 最終の仕入単価を掛けて在庫の金額を出し、原価率の集計表に流す
- 前月と比べて原価率が大きく動いた店舗、在庫の金額が大きく動いた品目を見て、店舗にメールで確かめる
- 人店舗が棚卸表をスキャンまたは撮影し、本部が用意したアップロードの画面から送る
- 自動Cloud Storage への保存を起点に関数が動き、形式・サイズ・解像度を確かめる
- 自動Google Document AI の Enterprise Document OCR で文字と画像の品質の点数を取り、Form Parser で表を取る
- 自動関数が、印刷された品目の行と、書き込まれた数量を行ごとに対応づける
- 自動Claude API が、数量の書き方(「2と1/2」「500g」「1ケース」)を数と単位に分け、書き足された品目を品目の一覧に当てはめる
- 自動プログラムが単位を換算し、最終の仕入単価で在庫の金額を出し、原価率を計算する
- 自動プログラムが前月と比べ、大きく動いた品目と店舗、空欄と読めない数量に印を付ける
- 人本部の担当者が、印の付いた行だけを画像で確かめ、店舗に確認する
- 人確認が済んだ店舗から棚卸データを確定し、原価率を確定する
各工程の詳しい説明を読む
- 店舗が棚卸表をスキャンまたは撮影し、本部の共有フォルダに保存する
- 本部の担当者がファイルを開き、店舗と業態を確かめる
- 1行ずつ、品目と数量を読み、本部の棚卸データ(表計算ソフト)に打ち込む
- 書き足された品目は、品目の一覧から当たる品目コードを探す
- 棚卸の単位と書かれた単位が違う行は、換算の係数で直す
- 最終の仕入単価を掛けて在庫の金額を出し、原価率の集計表に流す
- 前月と比べて原価率が大きく動いた店舗、在庫の金額が大きく動いた品目を見て、店舗にメールで確かめる
(a)手書きの数字を読み違える。 「1」と「7」、「0」と「6」、小数点とかすれ。読み違えた1行が、その店舗の原価率を1ポイント以上動かすことがあります。 高単価の牛肉の「1.5kg」を「7.5kg」と打てば、在庫の金額は5倍になります。
(b)単位の書き方がばらばら。 棚卸の単位が「kg」の品目に「500g」と書く、「本」の品目に「1ケース」と書く。3番目で打ち込んだ後に5番目で直すので、直し忘れがそのまま残ります。
(c)空欄の意味が分からない。 数量の欄が空いている行は、在庫が無かったのか、数え忘れたのかが紙からは分かりません。担当者は0として打ち込むことが多く、 後になって数え忘れだったと分かります。
(d)店舗への確認が月の半ばになる。 7番目は打ち込みが全部終わってからしか始められません。店舗に聞くころには、月末の冷蔵庫の中身を誰も覚えていません。
- 【人】 店舗が棚卸表をスキャンまたは撮影し、本部が用意したアップロードの画面から送る
- 【自動】 Cloud Storage への保存を起点に関数が動き、形式・サイズ・解像度を確かめる
- 【自動】 Google Document AI の Enterprise Document OCR で文字と画像の品質の点数を取り、Form Parser で表を取る
- 【自動】 関数が、印刷された品目の行と、書き込まれた数量を行ごとに対応づける
- 【自動】 Claude API が、数量の書き方(「2と1/2」「500g」「1ケース」)を数と単位に分け、書き足された品目を品目の一覧に当てはめる
- 【自動】 プログラムが単位を換算し、最終の仕入単価で在庫の金額を出し、原価率を計算する
- 【自動】 プログラムが前月と比べ、大きく動いた品目と店舗、空欄と読めない数量に印を付ける
- 【人】 本部の担当者が、印の付いた行だけを画像で確かめ、店舗に確認する
- 【人】 確認が済んだ店舗から棚卸データを確定し、原価率を確定する
8番目が、この設計の分かれ目です。 担当者は180ページを全部見るのではなく、印の付いた行だけを見ます。 印の無い行は、店舗ごとの在庫の金額の合計を流し見て確定します。
6番目と7番目をプログラムにしているのも、意図してのことです。 換算、掛け算、前月との比較は答えが1つに決まる作業です。AIに任せると、桁を取り違えた値がそれらしく見えたまま残ります。AIにさせるのは、手書きの書き方を数と単位にそろえることだけです。
02今回想定するシステム構成
店舗(棚卸表のスキャン・写真) ▼【トリガー】Cloud Storage への保存(object finalized) Cloud Run functions ── 形式・サイズ・解像度の確認 ▼ Google Document AI ├─ Enterprise Document OCR(文字・手書き・画像の品質の点数) └─ Form Parser(表の行と列) ▼ Cloud Run functions ── 印刷された品目の行と、書き込まれた数量の対応づけ ▼ Claude API ── 数量の書き方を数と単位に分け、書き足された品目を当てはめる ▼ Python ── 単位の換算・在庫の金額・原価率・前月との比較(規則) ▼ 本部の棚卸データ(案)と確認の一覧 ▼【人】本部の担当者が確認 → 店舗に確認 → 確定
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Enterprise Document OCR と Form Parser) | Azure AI Document Intelligence |
| 生成AI | Claude API(数量の書き方のそろえ、書き足された品目の当てはめ) | Gemini API、OpenAI API |
| 集計 | Python(単位の換算、在庫の金額、原価率、前月との比較) | 表計算ソフトの関数 |
| 連携 | Cloud Run functions(起動、行の対応づけ、結果の書き込み) | Cloud Workflows |
| 保管 | Cloud Storage(棚卸表の画像と読み取り結果) | ― |
品目の一覧と原価率の集計表は、新しく足すものではありません。 この構成は棚卸データの「案」を作るだけで、確定は本部の担当者が行います。品目の一覧には書き込みません。
読み取りは2つのプロセッサを組み合わせます。 Enterprise Document OCR は200以上の言語の文字を読むプロセッサで、日本語の手書きにも対応しています。Form Parser は、OCRの文字に加えてキーと値のペア、表、チェックボックス、一般的なエンティティを取り出すプロセッサで、こちらも日本語の手書きに対応しています。
Form Parser の表の読み取りには、前提が1つあります。 公式の説明では、表の取り出しは行や列をまたぐセルの無い、単純な表が対象とされています。棚卸表の「冷蔵」「冷凍」のような区分の見出しを横いっぱいの結合セルにしていると、表の構造が崩れます。様式の見直しが、最初の準備作業です。
Enterprise Document OCR には、画像の品質を点数で返す機能があります。 0〜1の点数を返し、0.5を下回ると、ぼやけ、ノイズ、暗さ、薄い文字、小さすぎる文字、書類の見切れ、文字の見切れ、反射の8つの欠陥ごとに可能性が付きます。第1章の「読めなかった」を見分ける材料は、この点数です。
処理のリージョンには注意が要ります。 Form Parser の対応リージョンの一覧に、日本のリージョンはありません(2026年10月時点)。近いのはシンガポール(asia-southeast1)です。 棚卸の数量は個人情報ではありませんが、社内の規程でデータの置き場所が決まっている場合は先に確かめます。
03どうやって実装するのか
処理の起点を決める
店舗がアップロードの画面から棚卸表を送り、Cloud Storage に保存されたことを起点にします。 保存先は inventory/2026-09/store-012/ のように月と店舗で分けます。Cloud Run には、バケットでオブジェクトが作られたとき(google.cloud.storage.object.v1.finalized)に関数を呼び出す仕組みがあり、関数とバケットは同じプロジェクトに置く必要があります。
読み取りはファイルが届くたびに行い、原価率の計算は店舗の4ページがそろったときに行います。 4ページが別々の時間に届くことがあり、最初の1ページで原価率を出すと、残りの品目が0の原価率になります。 品目の一覧から店舗の業態のページ数を引き、そろったら計算に進みます。
締め切りも決めます。 月初の2営業日目の正午までにそろわない店舗は、担当者の一覧に「未提出」として出します。共有フォルダに置く運用を続けると、どの店舗が出していないかを人が数えることになります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 棚卸表 | 店舗、業態、ページ番号、品目ごとの数量(手書き)、書き足された品目と数量 | Cloud Storage の店舗のフォルダ |
| 品目の一覧 | 品目コード、品名、別名、棚卸の単位、仕入の単位、換算の係数、最終の仕入単価、業態 | 本部の品目の一覧 |
| 棚卸表の様式 | 業態ごと・ページごとに印刷された品目の並び順 | 様式の版ごとに本部で管理 |
| 前月の棚卸データ | 店舗・品目ごとの前月末の数量と金額 | 本部の棚卸データ |
| 仕入と売上 | 当月の店舗ごとの仕入の額、売上の額 | 仕入のデータ、POSの売上 |
質を決めるのは、棚卸表の様式の並び順です。 印刷された品目の行は、並び順が分かっていれば、品名を読まなくても何行目が何の品目かが決まります。 手書きの品名を読ませるのは、書き足された行だけで済みます。
品目の一覧の「別名」は、書き足された品目の当てはめに使います。 「豚バラ」「バラ(豚)」「豚ばら スライス」のように、店舗で書かれる名前を別名として持っておくと、当てはめの迷いが減ります。
データの取得方法を決める
関数から、すべてのページを先に Enterprise Document OCR に通し、そのあと Form Parser にも通します。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 全文の文字と位置 | Enterprise Document OCR | 品目の行の位置合わせ、書き足された品名 |
| 手書きかどうか | Enterprise Document OCR の書体の情報(computeStyleInfo) | 印刷された文字と書き込まれた数字の区別 |
| 画像の品質の点数と欠陥の種類 | Enterprise Document OCR(enableImageQualityScores) | 「読めなかった」の判定 |
| 表の行と列 | Form Parser | 品目の行と数量の列の対応 |
| チェックボックス | Form Parser | 「在庫なし」の欄(様式に設ける場合) |
画像の品質の点数は、既定では返りません。 enableImageQualityScores を有効にすると、OCRの処理と同じくらいの時間が足されるとされています。月初の数日に180ページが集中するので、写真で届いたページだけで有効にし、複合機のスキャンでは切る運用にします。
言語のヒントに ja を入れます。 languageHints に言語を渡すと、推定に頼らずその言語に合わせて読み取りを調整できるとされています。
行の対応づけは、AIではなく関数で行います。 Form Parser が返した表の行の上から順に、様式の品目の並び順を当てます。行の数が様式と合わないページは、表の読み取りが崩れたとみなして印を付けます。
行の数が合っていても、ずれていることがあります。 1行目の品名が抜けて2行目以降が1つずつ上にずれると、数は合ったまま全行が隣の品目に付きます。そこで、印刷された品名の文字も照らします。 各行の品名の列をOCRの文字で読み、様式の品名と一致するかを関数で見ます。一致しない行が続けて3行以上あれば、row_shift を付けます。印刷された文字は手書きより読みやすいので、品名は位置合わせの目印として使えます。
AIへ渡す前に整形する
- 形式の確認 … PDF、GIF、TIFF、JPEG、PNG、BMP、WebP のいずれかであることを確かめます。HEIC の写真は JPEG に変換します
- サイズの確認 … オンライン処理は1ファイル40MBまでです。超えるものは縮小するかバッチ処理に回します
- 解像度の確認 … スキャンは200dpi以上が最低、300dpi以上が最適とされています。店舗の複合機の設定を300dpiにそろえます
- 画素数の確認 … 画像は1ページ4,000万画素までです。スマートフォンの写真で超えるものは縮小します
- 向きと傾きの補正 … 斜めに撮った写真は、表の行がずれるので補正してから読ませます
- ページの確認 … 様式のページ番号を読み、同じページが2回届いたものは新しいほうを使います
5番目を軽く見ないでください。 棚卸表は1行の高さが小さく、写真が数度傾いているだけで、数量が隣の行の品目に付きます。 行の対応づけの段で印が大量に出たら、まず撮り方を疑います。
AIに処理させる
AIの仕事は2つです。数量の書き方を数と単位に分けることと、書き足された品目を品目の一覧に当てはめることです。
| させること | 中身 |
|---|---|
| 数量の分解 | 「2.5」「2と1/2」「2本半」「500g」「1ケース3本」を、数と単位の組に分ける |
| 単位の読み取り | 書かれた単位があれば取り出す。無ければ空にする |
| 書き足された品目の当てはめ | 手書きの品名を、品目の一覧の品名と別名に当てはめ、候補が複数なら並べる |
| 空欄と読めないものの区別 | 数量の欄に何も無いものと、文字はあるが読めないものを分ける |
| 根拠の文字列 | 行ごとに、OCRが返した文字列をそのまま写す |
| させないこと | 理由 |
|---|---|
| 単位の換算 | 品目の一覧の係数で、プログラムが行う |
| 在庫の金額と原価率の計算 | 決まった計算。プログラムで行う |
| 空欄を0にすること | 数え忘れと区別できなくなる |
| 読めない数字の推測 | 前月の数量や他の店舗から「それらしい数」を入れない |
| 差異の原因の推測 | 店舗に確かめるのは人 |
4行目がいちばん起きやすい失敗です。 読めない数字を渡すと、AIは前月の数量に近い値を選びがちです。前月と同じ数字が入れば、前月との比較で印が付かず、読めなかったことが消えます。 前月の棚卸データをAIに渡さないのは、このためです。
指示内容を固定する
あなたは飲食チェーンの本部で、店舗の月末の食材の棚卸表を集計する担当です。
OCRの結果から、行ごとの数量を「数」と「単位」に分けてください。
OCRの結果に書かれていることだけを根拠にしてください。推測で埋めないでください。
【行ごとにすること】
1. 数量の文字列を、数(quantity)と単位(unit)に分ける
例:「2と1/2」→ 2.5 と 空、「500g」→ 500 と g、
「1ケース3本」→ 2つの組(1 と ケース、3 と 本)
2. 単位が書かれていなければ unit は空にする。品目の棚卸の単位で補わない
3. 書き足された行(印刷された品目の無い行)は、品名を品目の一覧に当てはめる
【status の選び方】
- ok ........ 数が読み取れた
- blank ..... 数量の欄に何も書かれていない
- unreadable 文字はあるが、品質の点数が0.5未満などで数として確定できない
- ambiguous . 数の候補が複数ある(「1」か「7」か決められない等)
【厳守事項】
- 空欄を0にしないでください。blank にしてください。
- 読めない数字を、他の行や常識から推測して埋めないでください。
- 単位の換算、金額の計算をしないでください。
- 書き足された品名に当てはまる品目が複数あれば、すべて candidates に並べ、
1つに決めないでください。
- 根拠にしたOCRの文字列を evidence にそのまま写してください。
【店舗・業態・ページ】{store} / {format} / {page}
【様式の品目の並び(このページの分)】{template_rows}
【品目の一覧(品名・別名・棚卸の単位)】{item_master}
【OCRの結果(行ごと、品質の点数付き)】{ocr_rows}
「単位を品目の棚卸の単位で補わない」は、書いておかないと起きます。 単位の書かれていない「500」を、品目の単位が kg なら 500kg として返します。単位が空なら、プログラムが「棚卸の単位で書かれた」とみなす規則を持てばよく、AIが補う必要はありません。 補われると、500gのつもりの500が500kgになったことに後から気づけません。
出力形式を固定する
次の形のJSONで受け取ります。 Claude の構造化出力(output_config.format に json_schema を指定)を使い、項目の名前と型を固定します。
{
"store_id": "012",
"format": "family",
"page": 2,
"rows": [
{ "row_no": 14, "item_code": "M-0231", "printed": true,
"parts": [ { "quantity": "2.5", "unit": "" } ],
"status": "ok | blank | unreadable | ambiguous",
"quality_score": 0.81, "evidence": "2と1/2" },
{ "row_no": 36, "item_code": "", "printed": false,
"written_name": "豚ばら スライス",
"candidates": ["M-0118", "M-0120"],
"parts": [ { "quantity": "3", "unit": "kg" } ],
"status": "ok", "quality_score": 0.77, "evidence": "豚ばら スライス 3kg" }
]
}
1つ目の理由は、parts で「1ケース3本」を分けて持てることです。 換算はプログラムが品目の一覧の係数で行い、1ケースが何本かは品目の一覧の側で決めます。
2つ目は、status で空欄と読めないものを分けられることです。 プログラムは blank を「数え忘れの確認」、unreadable と ambiguous を「数字の確認」として店舗への確認の一覧に分けて載せます。
3つ目は、数量を文字列で受けることです。 公式の説明では、構造化出力では数値の範囲や文字数の制約は使えないとされています。数への変換と範囲の確認はプログラムで行います。
プログラムが規則で付ける印は、次のとおりです。
| 確認 | 規則 | 印 |
|---|---|---|
| 行の対応 | 表の行の数が様式の品目の数と合わない | row_shift |
| 単位 | 書かれた単位が品目の一覧の換算の係数に無い | unit_unknown |
| 前月との比較 | 品目の在庫の金額が前月から一定の割合と額を超えて動いた | item_jump |
| 原価率 | 店舗の原価率が前月から一定の幅を超えて動いた | ratio_jump |
| 書き足し | 当てはめの候補が複数/無い | item_unmatched |
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| Cloud Storage | オブジェクトの作成のイベント | 棚卸表の保存を検知して関数を起動する |
| Google Document AI | API呼び出し | 文字・手書き・品質の点数、表の行と列を返す |
| Claude API | API呼び出し | 数量の分解と、書き足された品目の当てはめ |
| 品目の一覧・前月の棚卸データ | 読み取り | 係数、単価、前月の数量を引く |
| 本部の棚卸データ | 案の書き込み | 店舗ごとの棚卸データの案と印 |
| 原価率の集計表 | 確定後の書き込み | 担当者が確定した店舗の分だけ流す |
原価率の集計表へは、担当者が確定した店舗の分だけを流します。 案の段階の数字が集計表に出ると、店長や経営への報告に未確認の原価率が混ざります。
人が確認する
row_shiftを先に見る … 表の読み取りが崩れたページは、そのページの全行が疑わしいので画像を開いて確かめますunreadableとambiguousを見る … 画像で読めるものは担当者が入れ、読めないものは店舗に確認しますblankを店舗に確かめる … 在庫が0だったのか、数え忘れかを聞きますitem_jumpとratio_jumpを見る … 読み取りの誤りでなければ、店舗に理由を確かめます- 確定する … 店舗ごとに確定の印を付け、原価率の集計表に流します
1ページあたり4分を目安にします。 印の少ないページは流し見で1〜2分、row_shift のページは全行を見直すので10分近くかかります。ならして4分です。
店舗への確認は、店舗ごとに1通にまとめます。 行ごとに連絡すると、店長は同じ日に何通も受け取ります。確認の一覧を店舗ごとに並べ、数字の確認、数え忘れの確認、大きく動いた理由の確認の3つに分けて送ると、店長は冷蔵庫の前で一度に答えられます。文面は定型で足り、AIで作る必要はありません。
3番目は、毎月の運用で減らせます。 様式に「在庫なし」のチェックボックスを設けて、在庫が0なら0を書くか印を付ける、と店舗に決めてもらうと、空欄は数え忘れだけになります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 品質の点数が低い写真 | 欠陥の種類(暗さ、反射、見切れなど)を添えて、店舗に撮り直しを頼む |
| 表の行が様式とずれる | row_shift。傾きの補正をやり直し、それでもずれれば担当者が画像で確かめる |
| 4ページがそろわない | 原価率を計算せず、「未提出」として担当者の一覧に出す |
| 古い版の様式で書かれている | ページの版の印から様式を選び直す。版が分からなければ担当者へ |
| 書き足された品目が品目の一覧に無い | item_unmatched。購買部に新しい品目として登録するかを確かめる |
| 単位が換算の係数に無い | unit_unknown。係数を足すか、店舗に書き方を確かめる |
| Document AI か Claude が応答しない | 再試行し、続けて失敗したら担当者の一覧に「読み取り未完了」として出す |
4行目は、季節の限定メニューのたびに起きます。 新しい食材は、本部が品目の一覧に登録する前に店舗で使われ始めます。棚卸表に書き足されたものが、品目の一覧の登録漏れを知る機会にもなります。
記録を残す
- 届いた棚卸表の画像と、アップロードの日時・店舗・ページ
- Document AI が返した結果の全文(文字、手書きの情報、品質の点数、表)
- Claude が返したJSONと、使った指示の版
- プログラムが付けた印と、そのとき使った品目の一覧・換算の係数・単価の版
- 担当者が案を直した記録 … どの行を、何から何に変えたか
- 店舗への確認の内容と、店舗からの回答
5つ目は、店舗ごとの書き方の癖を見る材料になります。 同じ店舗で「1」と「7」の直しが続くなら、書き方を店長と話すほうが、読み取りの調整より効きます。
4つ目で単価の版を残すのは、原価率を後から説明するためです。 最終の仕入単価は月の途中でも変わり、同じ数量でも、どの時点の単価を掛けたかで在庫の金額が変わります。 店長から「先月より原価率が上がった理由」を聞かれたとき、数量の変化か単価の変化かを分けて答えられるようにしておきます。
04実装レベルの3段階
最小構成は、確かめるための段階です。 月180ページには使えません。 半自動化で、1ページ12分が7分程度になります。 読み取りと数量のそろえは自動になりますが、換算と前月との比較は担当者が表を見ながら行います。本格構成で4分になり、この段階が本記事の想定です。 差が大きいのは、換算と前月との比較が、1行ずつの手作業だからです。
05工数削減シミュレーション
導入後 180件 × 4分 ÷ 60 = 12 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 数十店舗を持つ飲食チェーンや、レストランを持つホテル・食品の売場を持つ小売で、月末の食材の棚卸を店舗の紙の棚卸表で行い、本部が手で打ち込んでいる場合。品目の一覧が本部で決まっていて、店舗が数量を手書きで記入する形の棚卸表を使っている場合。原価率の確定が月初の数日にずれ込み、店舗への問い合わせが遅れている場合。Google Cloud を使っている、または使える場合。
- 店舗がタブレットや在庫の管理の仕組みに数量を直接入力している場合(読み取りは要りません)。店舗が数店で、本部の担当者が打ち込んでも数時間で終わる場合。データを国内のリージョンだけで処理することが社内の規程で求められている場合(Google Document AI の対応リージョンに日本はありません)。なお、棚卸の差異の原因を突き止めること、店舗の評価に使うかどうかは本部と店長が決めることで、この構成はそれを代わりに行いません。
07最小構成で試す方法
- 先月の棚卸表から、3店舗分(12ページ)を選ぶ(うち1店舗は、打ち込みの後で数字の誤りが見つかった店舗を入れる)
- 当時の棚卸データを用意する
- 手元のAIサービスに、1ページの画像と、そのページの品目の並びを貼る
- 「この棚卸表の数量を、行ごとに数と単位に分けてください。空欄は0にせず『空欄』としてください。読めない数字は推測せず『読めない』としてください」と指示する
- 出てきた結果を、当時の棚卸データと見比べる
組む前に、手書きの数量がどこまで読めるかを確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 当時の棚卸データとほぼ同じ数が出た | Document AI と集計の連携に進む |
| 空欄を0にした、読めない数字を埋めた | 指示の書き方で直る。構成は有効 |
| 行がずれて、数量が隣の品目に付く | 様式と撮り方の見直しが先。 AIの問題ではない |
3行目が出たら、様式の区分の見出しを結合セルにしない形に直し、行の高さを広げます。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 表の行と列が崩れる | Form Parser は行や列をまたぐセルの無い単純な表が対象。 区分の見出しを結合セルにしない |
| 空欄が0として集計される | blank として返させ、店舗に確かめる。様式に「在庫なし」の欄を設ける |
| 読めない数字が前月と同じ値で埋まる | 前月のデータをAIに渡さない。推測を指示で禁じる |
| 単位の無い数字が別の単位に化ける | AIに単位を補わせない。補うのはプログラムの規則 |
| 写真の傾きで数量が隣の行に付く | 傾きを補正する。撮り方の例を店舗に配る |
| 処理が遅い | 画像の品質の点数は写真のページだけで有効にする |
| HEIC の写真が読めない | 対応形式に無い。JPEG に変換する |
| 季節の品目が当てはまらない | item_unmatched を購買部に回し、品目の一覧に足す |
| 日本のリージョンで処理できない | 対応リージョンに日本は無い。社内の規程を先に確かめる |
上の3行が、この構成の失敗のほとんどです。 どれも「数字が入っているように見える」という同じ形で現れ、原価率が静かにずれます。 空欄と読めないものを0にしない、という一点を設計で守ってください。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 店舗ごとの食材の在庫の数量と金額、仕入の単価、原価率です。個人情報は含みませんが、仕入の単価と原価率は取引先との条件や収益に関わる社外秘の情報です。
- 外部へ渡す範囲を、数量のそろえに必要な項目までに限る … Claude に渡すのはOCRの文字と品目の名前・別名・単位で、仕入の単価と原価率は渡しません。 金額の計算は社内のプログラムで行います
- 処理のリージョンを決めておく … Document AI の対応リージョンに日本は無いため、どのリージョンで処理するかを社内で決め、記録しておきます
- 棚卸の数字を店舗の評価に直結させない … 前月から大きく動いた品目の印は、確認を促すものです。店舗の不正やロスを疑う材料として使う前に、読み取りの誤りでないかを必ず確かめます
- 確定は人が行う … 案の数字が原価率の集計表に流れないようにし、確定の印は担当者が付けます
- 画像の保管の期間と見られる人を決める … 棚卸表の画像には店舗のスタッフの署名が入ることがあります。本部の経理と購買の担当者だけが見られるようにします
誤りが起きた場合のリスクは、原価率を実際と違う値で確定することと、店舗に根拠の無い確認をすることの2つです。 前者は空欄や読めない数字を0や推測で埋めると起き、後者は読み取りの誤りを店舗の差異として扱うと起きます。どちらも、status を4つに分けることで防ぎます。
10まず何から始めるか
1週目:様式を見直す
業態ごとの棚卸表を開き、区分の見出しの結合セルをやめ、行の高さを広げ、「在庫なし」の欄を足します。 品目の並び順を、様式の版ごとに一覧にしておきます。
2週目:12ページで試す
先月の棚卸表から3店舗分を選び、手元のAIサービスで数量を数と単位に分けさせます。空欄を0にしていないか、読めない数字を埋めていないかを最優先で見ます。
3週目:Document AI の2つのプロセッサを作る
Enterprise Document OCR と Form Parser を作り、12ページを通します。表の行が様式の並びと合うか、写真の品質の点数が読めなかったページと合うかを確かめます。
4週目:保存から棚卸データの案までをつなぐ
Cloud Storage のイベントから関数を起動し、読み取りと数量のそろえを棚卸データの案として書き出すところまで作ります。この時点では原価率を出さず、担当者が直した行を数えます。
2か月目: 換算・金額・原価率・前月との比較を規則として足し、印を付けます。3か月目以降: 店舗への確認の一覧を出し、1ページ12分が何分になったかを実測します。月初の2営業日のうちに45店舗の原価率が確定できた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| Form Parser がキーと値のペア、表、チェックボックスなどの選択マーク、一般的なエンティティ、文字を取り出すこと。Form Parser 2.0 が200以上の言語に対応すること。表の取り出しが行や列をまたぐセルの無い単純な表を対象とすること。値の無いキーと値のペアを確実には読めないこと。追加の学習ができないこと | Google Cloud: Form Parser | 2026-10-07 |
| Enterprise Document OCR と Form Parser の対応言語に日本語が入り、どちらも日本語の手書きに対応すること。Form Parser の対応リージョンが asia-south1、asia-southeast1、australia-southeast1、eu、europe-west2、europe-west3、northamerica-northeast1、us で、日本のリージョンが無いこと | Google Cloud: Processor list | 2026-10-07 |
画像の品質を0〜1の点数で返し、0.5未満で8つの欠陥の可能性を返すこと。enableImageQualityScores で有効にし、OCRと同程度の処理時間が加わること。languageHints、computeStyleInfo による手書きの検出 | Google Cloud: Enterprise Document OCR | 2026-10-07 |
| オンライン処理の1ファイル40MB、バッチ処理の1GB。画像1ページ4,000万画素。Form Parser のオンライン15ページ・バッチ100ページ、Enterprise Document OCR のオンライン15ページ・バッチ500ページ | Google Cloud: Document AI limits | 2026-10-07 |
| 対応するファイル形式(PDF、GIF、TIFF、JPEG、PNG、BMP、WebP)と、スキャンは200dpi以上、300dpi以上が最適とされること | Google Cloud: Supported files | 2026-10-07 |
Cloud Storage のオブジェクトの作成・上書き(google.cloud.storage.object.v1.finalized)で Cloud Run の関数を起動できること。バケットと同じプロジェクトに置く必要があること | Google Cloud: Cloud Storage triggers | 2026-10-07 |
構造化出力を output_config.format の json_schema で指定すること。数値の範囲や文字数の制約が使えないこと | Claude Docs: Structured outputs | 2026-10-07 |
原価率の計算のしかたと、棚卸の差異の扱いは、自社の会計の方針に従ってください。 本記事は公開仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0711)についてのご相談はこちらから。
