客室係が手書きするミニバーの補充伝票を読み取って精算の明細にそろえ、チェックアウト前に未精算と記入漏れをフロントへ出す
客室係が清掃のたびに手書きするミニバーの補充伝票を写真で読み取り、部屋番号・品目・数量を精算の明細にそろえます。PMSに計上済みの売上と照らし、チェックアウト前に未精算の部屋と伝票の出ていない部屋をフロントへ知らせます。
- 生成AI
- Azure OpenAI Service/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Make/n8n/Power Automate/Python
- 対象業界
- 宿泊
- 対象部門
- 経理/総務
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 入力作業が多い/期限・対応漏れが起きる/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/工数削減/機会損失防止
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 客室係が清掃の際に冷蔵庫を開け、減った品目を補充して、補充伝票に部屋番号・品目ごとの数量・日付・記入者名を書く
- 伝票はフロアのワゴンにまとめ、昼過ぎと夕方に事務所へ届ける
- 事務担当が伝票を1枚ずつ読み、品目と数量を価格表と照らす
- PMSでその部屋を開き、品目ごとに売上を入力する
- 読めない伝票は付箋を貼って脇に置き、記入者が出勤しているときに聞く
- 出発予定の部屋について、伝票が来ているかをフロントが内線で客室係に確かめる
- チェックアウト後に届いた伝票は、別の帳面に「後日請求」として書き出し、経理へ回す
- 人客室係が清掃の際に補充伝票を書き、フロアのタブレットで伝票を撮影する(紙はワゴンにまとめておく)
- 自動撮影した画像が共有フォルダに保存されたことをきっかけにワークフローが動き、画像の寸法と向きを確かめる
- 自動OCRが伝票の文字・表・チェック欄を読み取り、手書きの行かどうかと文字ごとの信頼度を返す
- 自動生成AIが読み取り結果から、部屋番号・品目ごとの数量・記入者・日付を取り出し、品目名を品目マスタの名前にそろえる
- 自動数量欄ごとに `filled` / `zero` / `blank` / `unreadable` を付ける
- 自動品目マスタから単価と税率区分を引き、精算の明細の案を作る
- 自動PMSから書き出した当日の出発予定と計上済みの売上に照らし、`ready` / `needs_human` / `already_posted` を決める
- 自動清掃が終わったのに伝票が届いていない部屋を、出発予定の時刻順に並べる
- 人事務担当が `needs_human` の伝票と、伝票の届いていない部屋だけを確かめる
- 人`ready` の明細をPMSへ計上する(取り込みの口がある場合は、明細のファイルをまとめて取り込む)
- 人フロントは、出発前に未計上の部屋の一覧を見て、客に確認する
各工程の詳しい説明を読む
- 客室係が清掃の際に冷蔵庫を開け、減った品目を補充して、補充伝票に部屋番号・品目ごとの数量・日付・記入者名を書く
- 伝票はフロアのワゴンにまとめ、昼過ぎと夕方に事務所へ届ける
- 事務担当が伝票を1枚ずつ読み、品目と数量を価格表と照らす
- PMSでその部屋を開き、品目ごとに売上を入力する
- 読めない伝票は付箋を貼って脇に置き、記入者が出勤しているときに聞く
- 出発予定の部屋について、伝票が来ているかをフロントが内線で客室係に確かめる
- チェックアウト後に届いた伝票は、別の帳面に「後日請求」として書き出し、経理へ回す
(a)読みにくい伝票ほど後回しになる。 3番目で読めない字に当たると、その伝票は5番目の付箋の山に行きます。付箋の山が片づくのは記入者に会えたときだけで、そのあいだにその部屋の客が出発することがあります。
(b)伝票が出ていないことに誰も気づかない。 清掃が入ったのに伝票が届いていない部屋は、事務所から見ると「消費が無かった部屋」と区別がつきません。伝票の出し忘れと、本当に何も飲まれなかった部屋が、同じ見た目になります。 気づけるのは、清掃の記録と伝票の束を1部屋ずつ突き合わせたときだけで、毎日その時間はありません。
(c)出発後の精算はほぼ戻らない。 7番目の「後日請求」は、法人の契約客なら請求書に足せますが、個人客ではほとんど回収できません。チェックアウトに間に合わなかった時点で、その売上はたいてい失われます。
(d)全件を目で読み続けるのは重い。 月2,400枚を6名で回すと、1枚3分でも月120時間です。伝票の大半は読みやすく、数量も1か2です。 時間を取っているのは、読みにくい1割と、伝票の出ていない部屋を探す作業のほうです。
- 【人】 客室係が清掃の際に補充伝票を書き、フロアのタブレットで伝票を撮影する(紙はワゴンにまとめておく)
- 【自動】 撮影した画像が共有フォルダに保存されたことをきっかけにワークフローが動き、画像の寸法と向きを確かめる
- 【自動】 OCRが伝票の文字・表・チェック欄を読み取り、手書きの行かどうかと文字ごとの信頼度を返す
- 【自動】 生成AIが読み取り結果から、部屋番号・品目ごとの数量・記入者・日付を取り出し、品目名を品目マスタの名前にそろえる
- 【自動】 数量欄ごとに
filled/zero/blank/unreadableを付ける - 【自動】 品目マスタから単価と税率区分を引き、精算の明細の案を作る
- 【自動】 PMSから書き出した当日の出発予定と計上済みの売上に照らし、
ready/needs_human/already_postedを決める - 【自動】 清掃が終わったのに伝票が届いていない部屋を、出発予定の時刻順に並べる
- 【人】 事務担当が
needs_humanの伝票と、伝票の届いていない部屋だけを確かめる - 【人】
readyの明細をPMSへ計上する(取り込みの口がある場合は、明細のファイルをまとめて取り込む) - 【人】 フロントは、出発前に未計上の部屋の一覧を見て、客に確認する
9番目と10番目が、この設計の分かれ目です。人が読むのは全件ではありません。 読み取りがそろったものは明細の一覧で流し見て計上し、読めなかったものと、伝票が無いものだけに時間を使います。
7番目を規則で決めているのも意図してのことです。 AIは「何が書いてあるか」を返し、それを売上にするかどうかは、マスタとPMSの記録を使った規則の側で決めます。 品目の入れ替えや価格の改定があっても、直すのはマスタだけです。
02今回想定するシステム構成
補充伝票(紙・手書き) │ 客室係がフロアのタブレットで撮影 ▼【トリガー】共有フォルダへの画像の保存 Power Automate ├──▶ 画像の寸法・向き・枚数の確認 ▼ Azure AI Document Intelligence(レイアウトモデル) │ 文字・表・チェック欄・手書きの判定・信頼度を返す ▼ Azure OpenAI(Microsoft Foundry)── 部屋番号・品目・数量の取り出しと品目名の名寄せ ▼ Azure Functions ── 品目マスタの単価・税率区分を付け、PMSの書き出しと照合 ▼ 判定(計上できる ready / 人が確認 needs_human / 計上済み already_posted) ▼ 【人が needs_human と伝票の無い部屋だけ確認】 ├──▶ 事務担当が PMS へ計上 └──▶ フロントへ出発前の未計上一覧
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Azure AI Document Intelligence(レイアウトモデル) | Google Document AI(Form Parser) |
| 生成AI | Azure OpenAI(Microsoft Foundry)(構造化出力で数量欄ごとの値を取り出す) | Claude API、Gemini API |
| 連携 | Power Automate(フォルダの監視と各処理の呼び出し、通知) | Make、n8n |
| 差異計算 | Azure Functions(品目マスタとの突合とPMSの書き出しとの照合) | Python |
| 保管 | SharePoint の文書ライブラリ(伝票の画像と明細の控え) | 社内のファイルサーバー |
PMSと品目マスタは、新しく足すものではありません。 PMSからは当日の出発予定と、部屋ごとに計上済みの売上を書き出して使います。PMSへの書き込みはこの構成では行わず、計上は人が行います。 PMSに明細を取り込む口があるかどうかは製品によって違い、ここは利用環境に応じた個別実装になります。
土台になるのは、Azure AI Document Intelligence のレイアウトモデルです。 文字・表・選択マーク(チェック欄)・文書の構造を取り出すモデルで、表は行数と列数、セルごとの行と列の位置を返します。補充伝票は「品目×数量」の表なので、セルの位置で品目と数量を結び付けられます。
日本語の手書きに対応していることを確かめてあります。 公式の言語対応の表では、Read と Layout の手書きの対応言語に日本語(ja)が載っています。さらにレイアウトモデルは、行ごとに手書きの書体かどうかを styles として信頼度つきで返します。印字された品目名と、手書きの数量を見分ける材料になります。
チェック欄も読めます。 選択マークは selected / unselected の状態と信頼度で返ります。伝票に「補充なし」のチェック欄を設ければ、空欄と「何も無かった」を区別できます。 この欄の設計が、第7章の判定の土台になります。
03どうやって実装するのか
処理の起点を決める
客室係が撮影した画像が共有フォルダに保存されたことを起点にします。 昼と夕方の2回にまとめると、出発日の朝に清掃が入った部屋の伝票が間に合いません。撮影されたら1枚ずつ動かします。
撮影はフロアのタブレットで行い、カメラのアプリから決まったフォルダへ保存する形にします。客室係のスマートフォンは使いません。 伝票には部屋番号が書かれており、個人の端末に残すと宿泊の記録が持ち出されることになるからです。
これとは別に、出発予定の時刻に合わせた定時の点検を毎朝7時・9時・10時半に動かします。こちらは伝票の到着を待たず、清掃が終わったのに伝票が届いていない部屋を探す処理です。届いたものを読むだけでは、届かなかったものは見つけられません。
処理が終わった画像は処理済みのフォルダへ移します。移すのは成功したときだけにします。 元のフォルダに残っている数が、そのまま未処理の数になります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 補充伝票の画像 | 部屋番号、品目ごとの数量、日付、記入者、「補充なし」のチェック欄 | フロアのタブレットから共有フォルダ |
| 読み取り結果 | 文字、表とセル、選択マーク、手書きの判定、文字ごとの信頼度 | Azure AI Document Intelligence |
| 品目マスタ | 品目コード、正式名、伝票に書かれうる略称、単価、税率区分、無料品かどうか | 宿泊部が持つ表 |
| PMSの書き出し | 当日の出発予定(部屋番号・予定時刻)、部屋ごとの計上済みのミニバー売上 | PMSの帳票の書き出し |
| 清掃の記録 | 清掃が終わった部屋と時刻 | 客室係の清掃の記録 |
質を決めるのは、品目マスタの略称の列です。 客室係は「ビール」を「ビ」「BR」「生」と書き、「ミネラルウォーター」を「水」「ミネ」と書きます。略称の一覧が無いと、品目の名寄せをAIに推測させることになります。 推測させないために、書かれうる略称を先に集めてマスタに持たせます。
無料品かどうかの列も要ります。 客室にサービスで置く水やお茶を同じ伝票に書く施設では、補充の数は書かれても売上にはしません。 この列が無いと、無料の水が客室料金に乗ります。
データの取得方法を決める
読み取りは、ワークフローからレイアウトモデルを呼ぶだけです。伝票は1枚1ページなので、ページの指定は要りません。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 表とセル(行・列の位置) | tables | 品目の行と数量の列を結び付ける |
| 選択マークと状態 | pages の selectionMarks | 「補充なし」のチェックを見る |
| 手書きの判定 | styles(isHandwritten と信頼度) | 印字の品目名と手書きの数量を分ける |
| 文字ごとの信頼度 | pages の words | 数量の数字が読めたかを決める |
| 全文 | content | 表から外れて書かれた部屋番号や備考を拾う |
部屋番号は、表の外に書かれることが多い項目です。 伝票の上の欄に書く決まりでも、急いでいると余白に書かれます。表からだけ取ると、部屋番号が見つからない伝票が増えます。 全文から拾い、部屋番号の一覧(PMSの客室マスタ)にある値かどうかで確かめます。
PMSからの書き出しは、朝の点検の前に1回、その後は1時間ごとに取り直します。連携の方式はPMSの製品によって違います。 帳票をCSVで書き出せるなら、それをフォルダに置いてワークフローで読む形が最も手堅い構成です。
AIへ渡す前に整形する
- 形式と寸法の確認 … 画像は 50×50 から 10,000×10,000 ピクセルの間である必要があります。範囲外は撮り直します
- 文字の大きさの確認 … 取り出せる文字の最小の高さは、1024×768 の画像で 12 ピクセルです。150dpi で約8ポイントに相当します。伝票を遠くから撮ると、数量の数字がこれを下回ります
- 向きの確認 … 横向きや逆さまに撮られたものは、返ってくるページの角度で見分けて、回転させてから判定します
- 1枚に1部屋の確認 … 2枚の伝票を重ねて撮ったものは、部屋番号が2つ見つかるので分けて撮り直します
- 重複の検知 … 同じ部屋・同じ日付・同じ記入者の伝票が直前にあれば、撮り直しとして印を付けます
- 清掃の記録との突き合わせ … 伝票の部屋番号が、当日清掃の終わった部屋に入っているかを見ます
2番目を軽く見ないでください。 客室係はワゴンの上で伝票を撮ります。伝票全体を収めようとして離れて撮ると、数字が小さくなりすぎます。 撮影の位置を決めた台紙を用意し、そこに置いて撮る運用にします。
AIに処理させる
させるのは、読み取り結果から部屋番号・品目ごとの数量・記入者・日付を取り出し、品目名を品目マスタの名前にそろえることだけです。
| 取り出すもの | 取り出し方 | 判断できないときの扱い |
|---|---|---|
| 部屋番号 | 伝票の上の欄、なければ全文から | 候補が2つ以上なら ambiguous |
| 品目 | 表の行の品目名を、マスタの正式名と略称に照らす | マスタに無い書き方なら unmatched |
| 数量 | 表の数量のセルの数字 | 下の4区分で返す |
| 「補充なし」のチェック | 選択マークの状態 | 状態の信頼度が低ければ unreadable |
| 記入者・日付 | 伝票の下の欄 | 書かれていなければ空のまま |
数量は、4つの区分のどれかで返させます。
qty_status | 意味 | 次に起きること |
|---|---|---|
filled | 1以上の数字が読み取れた | 明細の案にする |
zero | 0、または「-」「/」など無しを示す記号が書かれている | 明細にしない |
blank | 何も書かれていない | 「補充なし」のチェックが無ければ人へ |
unreadable | 文字は検出されたが、数字として確定できない | 人へ |
blank と zero を分けるのが、この構成でいちばん大事な区別です。 zero は客室係が見て「無かった」と書いたもの、blank は書かれていないもので、数え忘れの可能性が残ります。 伝票の全部の数量欄が blank で、「補充なし」のチェックも無い伝票は、冷蔵庫を開けたかどうかが分かりません。 客室係へ確かめに回します。
unreadable の根拠は、OCRが返した信頼度に置きます。 数字が検出され信頼度が十分なら filled か zero、検出されていても信頼度が低ければ unreadable です。AIに「たぶん2」と読ませません。
| させないこと | 理由 |
|---|---|
| 単価・金額の計算 | マスタから引く。価格の改定はマスタで直す |
| 税率区分の判断 | 酒類と非酒類で税率が違う。マスタの列で決める |
| 読めない数字の推測 | 売上を作る値なので、推測で埋めると誤請求になる |
| 品目の推測による名寄せ | マスタに無い書き方は unmatched で人へ |
| 計上するかの判断 | PMSの計上済みと照らした規則で決める |
4行目がいちばん起きやすい失敗です。 「酎」と書かれた行を、マスタに酎ハイが2種類あるのにどちらかへ寄せると、単価の違う品目で請求されます。 略称が1つの品目に決まらないときは unmatched にします。
指示内容を固定する
あなたはホテルの宿泊部の事務担当で、客室係が手書きした
冷蔵庫・ミニバーの補充伝票を、精算の明細にするための値に直す立場です。
OCRが返した読み取り結果だけを見て答えてください。推測で埋めないでください。
【取り出すもの】
1. 部屋番号(客室の一覧にある値だけ。無ければ空にして status を ambiguous)
2. 品目ごとの数量(伝票の表の行ごと)
3. 「補充なし」のチェック欄の状態
4. 記入者名と日付(書かれていなければ空)
【品目名のそろえ方】
- 伝票の品目名は、下の品目一覧の「正式名」か「略称」のどれかに
完全に当たるときだけ、その品目コードにしてください。
- 当たる候補が2つ以上あるとき、どれにも当たらないときは、
item_code を空にして match を unmatched にしてください。
似ている品目に寄せないでください。
【数量の qty_status の選び方】
- filled ....... 1以上の数字が読み取れた
- zero ......... 0、または「-」「/」「なし」が書かれている
- blank ........ 何も書かれていない
- unreadable ... 文字はあるが、信頼度が低く数字として確定できない
迷ったときに filled を選ばないでください。
【厳守事項】
- 数量の数字が読めないとき、前後の行や他の部屋から補って埋めないでください。
- 「正」の字や線の本数で書かれた数量は、数え方が確定できるときだけ
数字にし、そうでなければ unreadable にしてください。
- 空欄を 0 として扱わないでください。空欄は blank です。
- 単価、金額、税率は書かないでください。
- confidence には、OCRが返した信頼度をそのまま入れてください。
- evidence には、判定の根拠にした文字列をそのまま写してください。
- 補充伝票でない書類と判断した場合は、取り出しをせず document_type に種類を書いてください。
【読み取り結果】{layout_result}
【品目一覧(コード・正式名・略称)】{item_master}
【客室の一覧】{room_list}
「空欄を0として扱わない」を明記しないと、空欄は0になります。 何も書かれていない欄は、文章として読むと「消費なし」に見えるからです。空欄の意味を決めるのは「補充なし」のチェック欄と人の確認であって、AIではありません。
「似ている品目に寄せない」も同じ理由で書きます。 名寄せを任せると、AIはもっともらしい品目を選んで埋めます。埋めた品目が正しいかではなく、確かめるべき行が一覧から消えることが問題です。
出力形式を固定する
次の形のJSONで受け取ります。 Azure OpenAI の構造化出力を使い、strict: true で、すべての項目を required にし、additionalProperties を false にしたスキーマを渡します。
{
"slip_id": "",
"document_type": "minibar_slip",
"room_no": "",
"room_status": "ok | ambiguous",
"no_refill_checked": "selected | unselected | unreadable",
"staff_name": "",
"slip_date": "",
"lines": [
{ "written_name": "", "item_code": "", "match": "matched | unmatched",
"qty": 0, "qty_status": "filled | zero | blank | unreadable",
"confidence": 0, "evidence": "" }
]
}
1つ目の理由は、AIの出力と売上の判定を別の層に置けることです。 lines はAIが埋め、そこから明細を作るかどうかは Azure Functions の規則で決めます。単価や品目が変わっても、直すのはマスタと規則だけです。
2つ目は、構造化出力のスキーマにすべての項目を必須で並べることで、取り出せなかった項目が「抜ける」のではなく「空として残る」ことです。 公式の説明でも、すべての項目を required にし、任意の項目は null との組み合わせで表すとされています。抜けた項目は気づけませんが、空の項目は数えられます。
Azure Functions は、この出力に品目マスタとPMSの書き出しを合わせて、次の形の明細の案を作ります。
| 列 | 中身 |
|---|---|
room_no | 部屋番号 |
item_code / item_name | 品目コードと正式名(マスタから) |
qty | 数量(filled のものだけ) |
unit_price / tax_class | 単価と税率区分(マスタから。AIは関与しない) |
departure_time | PMSの出発予定の時刻 |
verdict | ready / needs_human / already_posted |
reason | needs_human の理由(unreadable、unmatched、全欄 blank など) |
verdict | 条件 |
|---|---|
ready | 部屋番号が ok、すべての行が filled か zero、品目がすべて matched、PMSに同じ明細が無い |
already_posted | PMSに同じ部屋・同じ日付・同じ品目の計上がある |
needs_human | 上のどちらにも当たらないもの |
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 共有フォルダ | Power Automate のトリガー | 伝票の画像の保存を検知する |
| Azure AI Document Intelligence | API呼び出し | 表・チェック欄・手書きの判定・信頼度を返す |
| Azure OpenAI | API呼び出し(構造化出力) | 部屋番号・品目・数量を取り出す |
| Azure Functions | HTTPの呼び出し | マスタとの突合、PMSの書き出しとの照合 |
| PMS | 帳票の書き出しを読む | 出発予定と計上済みの売上を取る |
| Teams | 通知 | フロントへ出発前の未計上一覧を送る |
PMSへは書き込みません。 この構成が出すのは計上の案までで、売上を確定させるのは人の操作です。 誤った明細が自動で計上されると、客の目の前で精算額が違うという形で表に出ます。
フロントへの通知は、出発予定の時刻順に並べます。 部屋番号順に並べると、10分後に出発する部屋が一覧の下に埋もれます。
人が確認する
人が開くのは needs_human の伝票と、伝票の届いていない部屋だけです。 ready のものは明細の一覧で件数と部屋を流し見て計上します。
- 出発の近い部屋から見る … 一覧は出発予定の時刻順です。出発後に回したものは、ほぼ回収できないからです
unreadableとunmatchedは画像を開いて読む … 読めなければ、記入者に内線で聞きます- 全欄
blankの伝票は客室係に確かめる … 冷蔵庫を開けたかどうかを聞きます - 伝票の届いていない部屋は、清掃の担当に聞く … 出発の近い部屋はフロントにも伝え、客に自己申告をお願いするかを決めます
- 判定を直したら記録する … どの欄を、何に直したかを残します
3番目を省かないでください。 全欄が空の伝票を「消費なし」として通すと、数え忘れが売上の漏れとして確定します。
目標は、2,400枚をならして1枚1分です。 開くのは1割前後という想定で、それより多い月は、撮り方か伝票の様式に原因があります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 画像の寸法が範囲外、文字が小さすぎる | 撮り直しを客室係のタブレットに通知する |
| 部屋番号が2つ見つかる | 伝票を重ねて撮ったものとして撮り直す |
| 部屋番号が客室の一覧に無い | needs_human。書き間違いの多くは隣の部屋番号 |
| 品目がマスタに無い | unmatched。新しい品目なら、マスタに追加してから再判定 |
| 「補充なし」がチェックされているのに数量がある | needs_human。どちらが正しいか客室係に聞く |
| 同じ部屋の伝票が同じ日に2枚 | 撮り直しか、2回補充したかを確かめる。二重に計上しない |
| チェックアウト後に届いた | late。経理の後日請求の一覧へ回す |
| OCRまたは生成AIが応答しない | 元のフォルダに残す。処理済みへ移すのは成功時だけ |
上の3行が大半を占めます。 どれもAIの問題ではなく、撮り方と伝票の様式の問題です。 直すほうが、読み取りの精度を上げるより効きます。
記録を残す
- 伝票の画像と、撮影した日時・タブレット・フロア
- OCRが返したJSONの全文と、生成AIが返したJSON
- 明細の案(
verdict、reason)と、そのとき参照した品目マスタの版 - 人が判定を直した記録 … どの欄を、何から何に直したか
- PMSに計上した日時と、計上した担当
- 記入者ごとの
unreadableと全欄blankの件数
品目マスタの版を残すのは、価格と品目が入れ替わるためです。 季節で品目を替えたあとに過去の精算を見直すと、当時の単価が分からなくなります。
最後の行は、客室係への声かけの材料になります。 特定の記入者で unreadable が続くなら、数字の書き方を一度そろえれば片づきます。評価に使うのではなく、伝票の様式と書き方を直すために使います。
04実装レベルの3段階
最小構成は、確かめるための段階です。 1枚ずつ貼り付けるので、月2,400枚には使えません。 本記事の想定は半自動化です。 読み取りと名寄せが自動になり、人はPMSの計上と、needs_human と伝票の無い部屋の確認に時間を使います。 本格構成は、PMSに明細の取り込みの口がある場合に限られ、その仕様は製品ごとに違うため個別の確認が要ります。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、unmatched になる略称と、unreadable の多い記入者が先に分かります。
05工数削減シミュレーション
導入後 2,400件 × 1分 ÷ 60 = 40 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 客室に有料の冷蔵庫・ミニバーを置き、客室係が清掃のたびに紙の補充伝票を書いている旅館・ホテル。伝票をフロントや事務所の担当が1枚ずつ読んで客室管理の仕組み(PMS)へ入力しており、チェックアウトに間に合わない伝票や読めない字で精算漏れが起きている場合。伝票の様式を品目の印字された決まった形に直せる場合。
- 冷蔵庫の中身を無料にしている、または客室に冷蔵庫の販売品を置いていない施設。センサー付きの冷蔵庫や客室のタブレットで消費が自動で記録され、紙の伝票を使っていない施設。客室数が少なく、フロントが客室係から口頭で聞いて入力すれば足りる場合。なお、個々の品目の税率区分の判断や、宿泊客との精算の可否の判断はこの構成では行いません。
07最小構成で試す方法
- 先週の補充伝票から50枚を選ぶ(読みにくいもの、空欄のあるもの、略称のものを必ず入れる)
- その50枚を、当時PMSにどう入力したかと並べておく
- 50枚をタブレットで撮り、手元のAIサービスの画面に1枚ずつ貼り付ける
- 「この伝票の部屋番号と、品目ごとの数量を表にしてください。何も書かれていない欄は空欄、0と書かれた欄は0、読めない欄は読めないと書いてください。品目一覧に無い品目名は、似た品目に寄せないでください」と指示する
- 出てきた表を、当時の入力と突き合わせる
50枚は必ずやってください。 ワークフローを組む前に、「手書きの数量が読めるのか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 当時の入力と同じ数量が出た | OCRとワークフローの連携に進む |
| 空欄を0にした、似た品目に寄せた | 指示の書き方で直る。構成は有効 |
| 数字が読めない伝票が多い | 撮り方と伝票の様式が先。 AIの問題ではない |
3行目が出たら、伝票の様式を見直します。品目名を印字し、数量の欄を1マスずつに区切り、「補充なし」のチェック欄を足すだけで、読めない欄は大きく減ります。 新しい様式で同じ50枚分を書いてもらい、もう一度試してください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 空欄が0として扱われる | blank と zero を分ける。 「補充なし」のチェック欄を伝票に足す |
| 読めない数字が推測で埋まる | 信頼度で unreadable に分け、指示でも推測を禁じる |
| 略称が似た品目に寄せられる | マスタに略称の列を持ち、完全一致だけを名寄せにする |
| 無料の水やお茶が売上に乗る | マスタに無料品の列を持たせ、明細の案から外す |
| ビールとお茶の税率を取り違える | 税率区分はマスタで持つ。 AIに判断させない |
| 遠くから撮って数字が小さい | 撮影の位置を決めた台紙を置く |
| 伝票を重ねて撮る | 部屋番号が2つ出たら撮り直しを通知する |
| 伝票の届かない部屋に気づけない | 清掃の記録と照らす定時の点検を、届いた伝票の処理とは別に動かす |
| 同じ伝票を二度撮る | 部屋・日付・記入者で重複を検知し、二重に計上しない |
| PMSへ自動で計上してしまう | 計上は人が行う。 取り込みの口を使う場合も、人が確定させる |
| 客室係の個人の端末で撮る | フロアのタブレットに限る。宿泊の記録を個人の端末に残さない |
上の2行が、この構成の失敗のほとんどです。 どちらも「何も無いように見える」という同じ見た目から出発しています。判定の根拠を、伝票のチェック欄とOCRの信頼度に置いてあるかどうかで、運用に乗るかが決まります。
5行目も早めに効いてきます。 冷蔵庫の中身を「飲料」と一括りにすると、税率の区分が崩れます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 部屋番号、客室で消費された品目と数量、記入した客室係の名前、そしてPMSから書き出す出発予定と計上済みの売上です。宿泊者の氏名は伝票に書かず、PMSの書き出しからも外します。
- 宿泊者の氏名をAIに渡さない … 伝票の読み取りと名寄せに氏名は要りません。PMSの書き出しは、部屋番号・出発予定の時刻・計上済みの売上の列だけにします
- 撮影の端末を限る … フロアのタブレットだけを使い、客室係の個人の端末に伝票の画像を残しません
- 誤った請求を出さない設計にする … 計上は人が行い、AIの出力は案のままにします。客の目の前で精算額が違うのは、削減した時間よりはるかに高くつきます
- 税率区分はマスタで決める … 国税庁のQ&Aでは、客室の冷蔵庫内の飲料の販売は軽減税率の対象で、酒税法に規定する酒類は除かれています。品目ごとの区分は経理が決め、顧問税理士と確かめてください
- 記入者ごとの集計を評価に使わない …
unreadableの多い記入者が分かっても、それは様式と書き方を直す材料です。 人事の評価に回すと、伝票に書かない人が出てきます - ログの保存期間を決める … 伝票の画像と明細の案は、売上の根拠です。会計の帳簿と同じ考え方で保存期間を決めます
誤りが起きた場合のリスクは、飲まれた分を請求し損ねることと、飲まれていない分を請求することの2つです。 前者は blank を zero に混ぜると起き、後者は unreadable を推測で埋めると起きます。どちらも同じ区別から出ているので、そこだけは設計で守ります。
10まず何から始めるか
1週目:伝票の様式を直す
品目名を印字し、数量の欄を1マスずつに区切り、「補充なし」のチェック欄と部屋番号の欄を上に置いた様式を作ります。あわせて品目マスタに、略称の列と無料品の列を足します。略称は、客室係に実際の書き方を聞いて集めます。
2週目:50枚で試す
新しい様式の伝票を1フロアで使ってもらい、50枚を手元のAIサービスに貼り付けて読ませます。当時の入力と突き合わせ、空欄を0にしていないか、似た品目に寄せていないかを最優先で見ます。
3週目:撮り方を決める
フロアに撮影用のタブレットと台紙を置き、撮る位置と向きを決めます。 撮った画像の文字の大きさを見て、数量の数字が十分な大きさで写る距離を確かめます。
4週目:撮影から明細の案までをつなぐ
Power Automate でフォルダを見張り、OCRと生成AIを呼び、明細の案を一覧に書き出すところまで作ります。この時点ではPMSとの照合をせず、読み取りの一覧だけを見ます。
2か月目: PMSの書き出しとの照合と、伝票の届いていない部屋を探す定時の点検を足し、フロントへの通知を始めます。needs_human の件数を毎週数えます。3か月目以降: 全フロアに広げ、1枚3分が何分になったかを実測します。チェックアウト後に見つかる精算漏れが減っていることを確かめた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
レイアウトモデルが文字・表・選択マーク・文書の構造を取り出すこと。表が行数・列数とセルごとの行と列の位置を返すこと。選択マークが selected/unselected の状態と信頼度で返ること。行ごとに手書きの書体かどうかを styles で返すこと。画像が 50×50 から 10,000×10,000 ピクセル、文字の最小の高さが 1024×768 の画像で 12 ピクセル(150dpi で約8ポイント)であること。ファイルサイズが S0 で 500MB、F0 で 4MB であること | Microsoft Learn: Document layout analysis | 2026-10-08 |
Read と Layout の手書きの対応言語に日本語(ja)が含まれること(v4.0) | Microsoft Learn: Language and locale support for Read and Layout | 2026-10-08 |
構造化出力が渡した JSON Schema に従わせる機能であること。strict: true を使い、すべての項目を required にし、additionalProperties を false にすること。任意の項目は null との組み合わせで表すこと | Microsoft Learn: How to use structured outputs with Azure OpenAI in Microsoft Foundry Models | 2026-10-08 |
| ホテル等の客室に備え付けられた冷蔵庫内の飲料(酒税法に規定する酒類を除く)の販売は「飲食料品の譲渡」に当たり軽減税率の対象となること。ルームサービスは「食事の提供」に当たり軽減税率の対象とならないこと(問72・問73) | 国税庁: 消費税の軽減税率制度に関するQ&A(個別事例編) | 2026-10-08 |
品目ごとの税率区分と、出発後の請求をどう扱うかは、自社の経理と顧問税理士で決めてください。 本記事は公式のページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0898)についてのご相談はこちらから。
