自動販売機の補充員が撮った前面と庫内の写真を Gemini で読み、売切れの表示と見本の並びを補充の記録にして、次の積込の品目の案を作る
自動販売機の補充員が機械ごとに撮る前面と庫内の写真を Gemini で読み、売切れのボタンと見本の食い違いを補充の記録の下書きにします。売切れの履歴から、次の巡回で積む品目の案もプログラムで作ります。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- その他/小売/物流/飲食
- 対象部門
- 物流
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 入力作業が多い/期限・対応漏れが起きる/確認ミスが多い
- AIで行う処理
- 画像認識
- 主な効果
- 入力漏れ削減/工数削減/機会損失防止
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 補充員が営業所で、その日の巡回の機械の一覧と、前回の記録を見て積込の品目を決め、車に積む
- 機械に着いたら前面を見て、売切れの表示が点いているボタンを数え、記録票にボタンの番号を書く
- 扉を開け、コラムの減り具合を見て補充する
- 見本の並びが棚割りと合っているか、価格のラベルが正しいかを目で見る(忙しい日は省かれる)
- 扉を閉め、売切れの表示が消えたかを見る(同じく、省かれることがある)
- 回収箱の空き容器を回収し、気づいたこと(汚れ、破損、回収箱のあふれ)を記録票の余白に書く
- 営業所に戻ってから、記録票の中身を補充の記録の表に打ち込む
- 営業所の担当が記録を見て、売切れが続く品目の積込を増やすか、棚割りを変えるかを考える
- 人補充員が機械に着いたら、前面を決まった位置から1枚撮る(到着時)
- 人扉を開けたら、庫内のコラムの上部を1枚撮る(庫内が見える機種のみ)
- 人補充を終えて扉を閉めたら、前面をもう1枚撮る(補充後)
- 自動写真が共有のフォルダに入ると、数分おきに動くプログラムが機械番号で棚割りの表と価格の台帳を引く
- 自動Gemini API が3枚の写真を読み、売切れの表示、見本、価格のラベル、回収箱、庫内のコラムの品目を、ボタンの番号ごとに返す
- 自動プログラムが棚割りの表・価格の台帳と突き合わせ、食い違いの候補を決める
- 自動補充員のスマートフォンに、その機械の記録の下書きと「補充後も売切れの表示が残っている」などの注意を返す
- 人補充員がその場で下書きを確かめ、直すものは直し、補充した数を足して確定する
- 自動確定した記録から、売切れの続くボタンを数え、次の巡回の積込の品目の案を作る
- 人営業所の担当が、積込の案と、見本・価格の食い違いの一覧を見て、翌日の準備と棚割りの見直しを決める
各工程の詳しい説明を読む
- 補充員が営業所で、その日の巡回の機械の一覧と、前回の記録を見て積込の品目を決め、車に積む
- 機械に着いたら前面を見て、売切れの表示が点いているボタンを数え、記録票にボタンの番号を書く
- 扉を開け、コラムの減り具合を見て補充する
- 見本の並びが棚割りと合っているか、価格のラベルが正しいかを目で見る(忙しい日は省かれる)
- 扉を閉め、売切れの表示が消えたかを見る(同じく、省かれることがある)
- 回収箱の空き容器を回収し、気づいたこと(汚れ、破損、回収箱のあふれ)を記録票の余白に書く
- 営業所に戻ってから、記録票の中身を補充の記録の表に打ち込む
- 営業所の担当が記録を見て、売切れが続く品目の積込を増やすか、棚割りを変えるかを考える
(a)入力が二度ある。 機械の前で記録票に書き、営業所に戻ってからもう一度表に打ち込みます。1日15台分を夕方にまとめて打つので、どの機械の何番のボタンだったかが記憶頼りになります。
(b)見本の入れ違いは、その場で見ないと分からない。 見本がお茶なのにコラムにはコーヒーが入っている、新商品の見本だけ差し替えて価格のラベルが前のまま。利用者がボタンを押して違うものが出てきて、初めて電話が来ます。 棚割りの表と目の前の見本を1つずつ照らすのは、15台を回る日には難しい作業です。
(c)補充の後の確認が抜ける。 補充を終えて扉を閉め、次の機械へ急ぐと、売切れの表示が消えたかを見ないまま離れてしまうことがあります。 入れたコラムを取り違えていれば、表示は点いたままで、次の巡回までその品目は売れません。
(d)売切れの続く品目が営業所に伝わるのが遅い。 記録は表に入っていても、「この機械のこのボタンは3回続けて売切れ」と数える人がいません。 積込を増やす判断は、補充員の感覚に任されています。
- 【人】 補充員が機械に着いたら、前面を決まった位置から1枚撮る(到着時)
- 【人】 扉を開けたら、庫内のコラムの上部を1枚撮る(庫内が見える機種のみ)
- 【人】 補充を終えて扉を閉めたら、前面をもう1枚撮る(補充後)
- 【自動】 写真が共有のフォルダに入ると、数分おきに動くプログラムが機械番号で棚割りの表と価格の台帳を引く
- 【自動】 Gemini API が3枚の写真を読み、売切れの表示、見本、価格のラベル、回収箱、庫内のコラムの品目を、ボタンの番号ごとに返す
- 【自動】 プログラムが棚割りの表・価格の台帳と突き合わせ、食い違いの候補を決める
- 【自動】 補充員のスマートフォンに、その機械の記録の下書きと「補充後も売切れの表示が残っている」などの注意を返す
- 【人】 補充員がその場で下書きを確かめ、直すものは直し、補充した数を足して確定する
- 【自動】 確定した記録から、売切れの続くボタンを数え、次の巡回の積込の品目の案を作る
- 【人】 営業所の担当が、積込の案と、見本・価格の食い違いの一覧を見て、翌日の準備と棚割りの見直しを決める
7番目と8番目が、この設計の分かれ目です。結果を機械の前にいるうちに返します。 営業所に戻ってから知らされても、もう一度その機械まで行く時間はありません。扉の鍵を閉める前に「4番の売切れが消えていない」と分かれば、その場で直せます。
9番目を AI ではなくプログラムで作るのは、何回続けて売切れたら積込を増やすかが営業所の決まりだからです。
02今回想定するシステム構成
補充員のスマートフォン(到着時の前面/庫内/補充後の前面) │ ファイル名:日付_機械番号_種類(arrive/inside/after) ▼ 共有のフォルダ(Google ドライブ) Google Apps Script(巡回の時間帯だけ数分おきに動く時間主導のトリガー) ├── 棚割りの表(機械番号ごとのボタンと品目)を読む ├── 価格の台帳(品目と価格)を読む ▼ Gemini API(画像の理解・構造化出力)── 3枚の写真+棚割り │ ボタンごとの売切れの表示(到着時/補充後) │ 見本の品目、価格のラベル、回収箱の様子、庫内のコラムの品目 ▼ Google Apps Script ── 棚割り・価格との突き合わせ、注意の作成 ├──▶ 補充員のスマートフォンへ下書きと注意を返す ▼ 【人】補充員が機械の前で確かめて確定する ▼ 補充の記録の表 ──▶ Google Apps Script ── 売切れの回数を数え、積込の品目の案を作る ▼ 【人】営業所の担当が翌日の積込と棚割りの見直しを決める
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 処理 | Gemini API(3枚の写真から売切れの表示・見本・価格のラベルを読み、構造化出力で返す) | Claude API、OpenAI API |
| 連携 | Google Apps Script(フォルダの確認、棚割りと価格の読み込み、呼び出し、突き合わせ、積込の案の計算) | Python |
| 撮影 | 補充員のスマートフォンと、機械ごとの撮影位置の目印 | 業務用の端末 |
| 記録 | 補充の記録の表、棚割りの表、価格の台帳(共有の表計算) | 自販機の管理の仕組み |
新しく足すのは、撮影の決まりと、プログラム、Gemini API の契約です。 スマートフォン、棚割りの表、価格の台帳、補充の記録の表は、すでにあるものです。巡回の順番や積込の量を最終的に決める人は変えません。
写真を読む土台は、Gemini API の画像の理解です。 公式の案内では、対応する形式は PNG、JPEG、WEBP、HEIC、HEIF で、1つのリクエストに複数の画像を入れられます。 到着時・庫内・補充後の3枚を同じリクエストに入れ、比べさせます。インラインで送る場合はプロンプトと画像を合わせて20MBまでとされ、それを超えるときは File API を使います。スマートフォンの写真は縮小してから送れば、3枚でこの範囲に収まります。
出力は構造化出力で受けます。 /v1beta/interactions に送り、response_format で mime_type を application/json にし、schema にスキーマを入れます。公式の案内では enum・minimum・maximum・minItems・maxItems が使える一方、minLength などは強制されずに外されます。出力は JSON として正しくても、値はアプリ側で検証するよう書かれています。
プログラムは Google Apps Script の時間主導のトリガーで動かします。 インストール型のトリガーは毎分から月1回までの間隔で動かせるとされ、ドライブにファイルができたことを起点にするトリガーは一覧に無いため、数分おきにフォルダを見に行く形にします。
03どうやって実装するのか
処理の起点を決める
巡回の時間帯(朝8時から夕方5時)だけ、5分おきに動くプログラムが共有のフォルダを見ます。 Google Apps Script のインストール型の時間主導のトリガーは毎分から月1回までの間隔で動かせ、公式の案内では実行の時刻がわずかにずれることがあるとされています。「撮ってから数分で下書きが返る」くらいの設計にし、補充の作業の数分のあいだに結果が届くようにします。
1台の処理は、補充後の写真が入ったところで始めます。 到着時の写真だけで先に動かすと、売切れの表示が消えたかを見られません。機械番号ごとに arrive と after がそろったかをファイル名で数え、そろったものから処理します。 庫内の写真は、棚割りの表で「庫内が見える機種」とされた機械だけで待ちます。
到着時の写真が入ってから30分たっても補充後の写真が来なければ、補充員のスマートフォンに「補充後の前面が未撮影」と返します。 撮り忘れはそのまま確認の抜けになるからです。処理が終わった写真は日付のフォルダに移し、共有のフォルダに残る枚数を処理待ちの数にします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 到着時の前面の写真 | 見本の並び、ボタンごとの売切れの表示、価格のラベル、回収箱 | 補充員のスマートフォン |
| 庫内の写真 | コラムの上部に見える缶・ボトルの品目(庫内が見える機種のみ) | 同上 |
| 補充後の前面の写真 | 補充を終えて扉を閉めた後の売切れの表示 | 同上 |
| 棚割りの表 | 機械番号、ボタンの番号、ボタンに割り当てた品目とコラムの番号、温冷の区分、庫内が見える機種か | 営業所の棚割りの表 |
| 価格の台帳 | 品目ごとの価格(設置先ごとに違う場合はその価格) | 価格の台帳 |
| 品目の見本の一覧 | 品目名と、見本の写真(ラベルの見え方) | 営業所で用意する一覧 |
質を決めるのは、棚割りの表の正しさです。 表が古ければ、AIが正しく読んでも「食い違い」が出続けます。季節の切り替えのたびに棚割りの表を先に直し、表を直した日付を持たせます。 表の日付が写真の日付より後なら、比べる前に止めます。
品目の見本の一覧は、似た缶を見分けるために渡します。 同じメーカーの無糖と加糖、同じ茶の小さい容量と大きい容量は、見本の小さな写真では見分けにくい組み合わせです。 一覧に「見分ける手がかり(キャップの色、ラベルの帯の色)」を書いておき、AIに渡します。
販売の数は渡しません。 販売の数を通信で取れる機械では、その数は別に記録に入ります。写真から売れた本数を推し量らせると、測っていない数字が記録に紛れます。 写真から分かるのは、表示と見本の見え方だけです。
データの取得方法を決める
写真の機械番号と種類は、ファイル名から読みます。 補充員は機械の側面に貼った機械番号のコードをスマートフォンで読み取ってから撮り、「日付_機械番号_種類」の名前で保存されるようにします。決まりを外れた名前の写真は処理せず、補充員の画面に「機械番号が読めない」と返します。
棚割りの表と価格の台帳は、機械番号で1行ずつ引きます。 棚割りの表に無い機械番号は処理を止め、営業所の担当に知らせます。新しく設置した機械の表を足し忘れていると、ここで分かります。
Gemini API へは、1台につき1回、3枚の写真と棚割りの行をまとめて渡します。 写真の順番は「到着時の前面、庫内、補充後の前面」に固定し、指示の文で順番を説明します。ボタンの番号は、機械の前面に左上から振った番号を棚割りの表と合わせておきます。 番号の振り方が機種で違うと、AIが正しく読んでも突き合わせがずれます。
有料の利用枠で使い、store を false にします。 Gemini API の規約では、有料のサービスではプロンプトと応答が製品の改善に使われないとされています。Interactions API は既定でやり取りを保存し(有料の枠で55日)、保存しないときは store=false を付けると案内されています。store=false にすると前のやり取りを引き継ぐ使い方はできませんが、この構成は1台ごとに1回で完結するので困りません。
AIへ渡す前に整形する
- ファイル名の確認 … 機械番号・種類がそろっているか。そろわないものは補充員に返します
- 写真の向きと大きさの確認 … 縦横を直し、長い辺を一定の大きさに縮めます。20MBを超えないよう3枚の合計を見ます
- 明るさの確認 … 夜間・逆光で前面が白く飛んでいる写真は、ボタンの表示が読めません。明るさの平均が極端なものは「撮り直し」と返します
- 棚割りの行の取り出し … その機械のボタンの数、ボタンごとの品目、温冷の区分、価格を、AIに渡す短い表にします
- 見本の一覧の絞り込み … 品目の見本の一覧から、その機械の棚割りに出てくる品目と、よく取り違える品目だけを渡します
- 人が写り込んだ写真の確認 … 機械の前を通る人が大きく写った写真は、撮り直しを求めます。顔が写るほど引いて撮らない決まりにします
3番目を軽く見ないでください。 売切れの表示は小さな光の表示で、屋外の昼の逆光では点いているのか消えているのか、人の目でも迷います。 読めない写真を AI に「読ませる」と、点いていない表示を点いていると返すことがあります。撮り直しを求めるほうが早く済みます。
6番目は、設置場所の写真を扱う以上、最初から決めておきます。 駅や商業施設の前では人が写り込みます。機械の前面に近づいて撮れば、通行人は写りにくくなります。
AIに処理させる
させるのは、写真に見えるものを、ボタンの番号ごとに書き出すことだけです。 食い違いかどうかは、プログラムが棚割りの表と比べて決めます。
| 見るもの | 返させる内容 | 見えないときの扱い |
|---|---|---|
| 売切れの表示(到着時) | ボタンごとに lit(点いている)/off(消えている) | 反射や逆光で判断できなければ unclear |
| 売切れの表示(補充後) | 同じくボタンごとに lit/off | 同じく unclear |
| 見本の品目 | 見本の一覧のどれに見えるか。候補が2つあれば両方 | 見本が無い・隠れていれば not_visible |
| 価格のラベル | ラベルに見える数字を、そのまま文字で | 読めなければ unclear。数字を補わない |
| 庫内のコラムの品目 | コラムの上部に見える缶・ボトルが見本の一覧のどれに見えるか | 見えないコラムは not_visible |
| 回収箱 | 空き容器があふれて外に出ているか | 回収箱が写っていなければ not_visible |
| 前面の破損・汚れ | 割れ、落書き、表示の剥がれに見えるもの | 写っていない範囲は書かない |
右端の列がいちばん大事です。 unclear と not_visible を off や「問題なし」と区別して返させます。「消えている」と「見えなかった」を混ぜると、補充後の表示の消え残りを見落とします。
| させないこと | 理由 |
|---|---|
| 売れた本数・残りの本数の推定 | 写真から数えられない。測っていない数字が記録に入る |
| 食い違いの判定 | 棚割りの表と比べるのはプログラムの仕事。表が変わっても判定がぶれない |
| 積込の量・品目の決定 | 営業所の決まりと担当の判断 |
| 故障の診断 | 表示が消えない理由が入れ違いか機械の不具合かは、人が扉を開けて確かめる |
| 賞味期限の判断 | 写真から読めず、読めたとしても扱いの判断は人が行う |
1行目がいちばん起きやすい失敗です。 庫内の写真を渡すと、コラムの上部に見える缶の数から「残り5本」と書きたがります。コラムの奥は見えず、その数字は当て推量です。
指示内容を固定する
あなたは飲料の自動販売機の補充の記録を手伝う立場です。
渡された3枚の写真に見えるものだけを、ボタンの番号ごとに書き出してください。
推測で埋めないでください。
【写真の順番】
1枚目:到着したときの前面
2枚目:扉を開けたときの庫内のコラムの上部(無い場合があります)
3枚目:補充を終えて扉を閉めた後の前面
【この機械の棚割り】{planogram}
ボタンの番号は、前面の左上から右へ、上の段から下の段へ数えます。
【見分ける手がかりの一覧】{sample_guide}
【書き出すもの】
- sold_out_arrive / sold_out_after:ボタンごとの売切れの表示
lit(点いている)/off(消えている)/unclear(反射や逆光で判断できない)
- sample_item:見本が一覧のどの品目に見えるか。迷うときは候補を2つまで
- price_label:ラベルに見える数字をそのまま。読めなければ unclear
- inside_columns:庫内の写真で、コラムの上部に見える品目
- recycle_box:回収箱から空き容器があふれているか(yes/no/not_visible)
- damage:前面の割れ・落書き・表示の剥がれに見えるもの
【厳守事項】
- 迷ったときに off を選ばないでください。判断できなければ unclear です。
- 写っていないボタンやコラムは not_visible とし、棚割りから補わないでください。
- 価格の数字を補ったり、台帳の値に合わせて直したりしないでください。
- 売れた本数・残りの本数を書かないでください。写真からは数えられません。
- 見本と棚割りが合っているか、補充が正しかったかの判定は書かないでください。
- 人が写っている場合も、その人について何も書かないでください。
- evidence には、その判断の手がかりにした見え方を短く書いてください。
「迷ったときに off を選ばない」を明記しないと、補充後の表示はほとんど off になります。 売切れの表示は点いていない時間のほうが長く、写真の多くも off です。その傾向に引きずられて、判断できない表示まで off と返すのを止めます。
「棚割りから補わない」を書くのは、棚割りを渡しているからです。 渡した表は突き合わせのための手がかりで、見本が隠れているボタンに表の品目を書き入れられると、食い違いの検出が働かなくなります。
出力形式を固定する
次の形のJSONで受け取ります。
{
"machine_id": "",
"photos": { "arrive": true, "inside": false, "after": true },
"buttons": [
{ "button_no": 1,
"sold_out_arrive": "lit | off | unclear | not_visible",
"sold_out_after": "lit | off | unclear | not_visible",
"sample_item": ["", ""],
"price_label": "",
"evidence": "" }
],
"inside_columns": [
{ "column_no": 1, "item": "", "evidence": "" }
],
"recycle_box": "yes | no | not_visible",
"damage": [ { "where": "", "what": "" } ],
"photo_quality": "ok | retake"
}
1つ目の理由は、ボタンの番号で棚割りの表とそのまま突き合わせられることです。 プログラムが button_no で表を引き、次のように食い違いを決めます。
| 条件 | プログラムが出す注意 |
|---|---|
sold_out_after が lit | 補充後も売切れの表示が残っている。 入れたコラムを確かめる |
sample_item が棚割りの品目を含まない | 見本と棚割りの食い違いの候補 |
price_label が価格の台帳と違う | 価格のラベルの食い違いの候補 |
inside_columns の品目がボタンの品目と違う | コラムへの入れ違いの候補 |
unclear が3つ以上 | 撮り直しを求める |
2つ目は、AIの出した値を enum で絞れることです。 表示の状態を決まった4つの値に絞っておけば、「たぶん点いている」のような自由な言葉が記録に入りません。 button_no は minimum と maximum でボタンの数の範囲に絞れます。それでも公式の案内どおり、ボタンの数と返ってきた行の数が合うかはプログラムで確かめます。
3つ目は、記録の下書きと積込の案に同じデータを使えることです。 sold_out_arrive が lit のボタンを記録の「売切れ」に入れ、その回数を機械とボタンごとに数えれば、積込の案の材料になります。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 共有のフォルダ | Google Apps Script の時間主導のトリガー | 新しい写真を見つけ、機械番号ごとにそろえる |
| 棚割りの表・価格の台帳 | 表の読み取り | 機械番号でボタンごとの品目と価格を引く |
| Gemini API | API呼び出し(store=false) | 3枚の写真からボタンごとの見え方を返す |
| 補充員のスマートフォン | 共有の表の下書きの行と通知 | 記録の下書きと注意を返す |
| 補充の記録の表 | 表への書き込み | 補充員が確定した記録を残す |
| 積込の品目の案 | 表への書き込み | 売切れの回数から翌日の案を作る |
積込の品目の案は、次の決まりでプログラムが作ります。
| 決まり | 案の中身 |
|---|---|
| 直近4回の訪問のうち3回以上、到着時に売切れ | その品目の積込を増やす案 と、コラムを2つに広げる棚割りの見直しの候補 |
| 直近4回の訪問で一度も売切れが無く、販売の数も取れる機械で少ない | 入れ替えの検討の候補(判断は営業所の担当) |
| 補充後の表示の消え残りが同じボタンで続く | 機械の点検の依頼の候補 |
棚割りの表と価格の台帳には書き込みません。 食い違いが見つかっても、正しいのが表か見本かは人が確かめるまで分からないからです。表を直すのは営業所の担当です。
人が確認する
補充員は、機械の前で下書きの注意だけを見ます。 全ボタンの行を読む必要はありません。
- 「補充後も売切れの表示が残っている」を最初に見る … 扉を開け直し、入れたコラムを確かめます。この注意は機械を離れる前に片づけます
- 見本・価格の食い違いの候補を見る … 目の前の見本と棚割りを見比べ、見本の差し替えか、表の誤りかを書き残します
- 補充した数を足して確定する … 写真からは数えないので、補充した本数は補充員が入れます
- AIの読み違いを直したら、そのボタンに印を付ける … どの表示をどちらに直したかを残します
営業所の担当は、夕方に積込の案と食い違いの一覧を見ます。 積込の案はそのまま使わず、翌日の天気と在庫を見て決めます。棚割りの見直しの候補は、設置先との約束(置く品目の取り決め)があるかを確かめてから扱います。
1番目を省かないでください。 消え残りは、次の巡回まで数日その品目が売れないことを意味します。 削減した時間のどこよりも、ここで取り返すものが大きい確認です。
例外に対処する
| 起きること | 対応 |
|---|---|
| 補充後の写真が来ない | 30分たったら補充員に「補充後の前面が未撮影」と返す |
| 逆光・夜間で表示が読めない | photo_quality が retake。影をつくって撮り直す |
| 棚割りの表に無い機械番号 | 処理を止め、営業所の担当に表の追加を頼む |
| 返ってきたボタンの数が棚割りと合わない | 下書きを作らず、写真を担当の確認に回す |
| 見本の候補が2つに割れる | 両方を下書きに出し、補充員が選ぶ |
| 人が大きく写り込んでいる | 処理せずに撮り直しを求め、写真は消す |
| Gemini API が応答しない・エラーを返す | 写真を共有のフォルダに残し、次の回で再試行。補充員には手で記録するよう返す |
| 季節の切り替えの途中で棚割りの表が古い | 表の日付が写真より古ければ、食い違いを出さずに担当に知らせる |
上の2行が大半を占めます。 どちらもAIの問題ではなく、撮り方の問題です。 撮る位置と立つ向きを機械ごとに決め、機械の側面に目印を貼るほうが、指示の文を直すより効きます。
Gemini API が止まっても、補充の仕事は止めません。 下書きが返らないときは、これまでどおり手で記録を付ける画面に切り替わるようにしておきます。
記録を残す
- 3枚の写真と、撮った日時・補充員・機械番号
- Gemini API に渡した棚割りの行と、返ってきたJSONの全文
- プログラムが出した注意と、そのとき参照した棚割りの表と価格の台帳の版
- 補充員が確定した記録と、AIの読みを直した箇所
- 積込の品目の案と、営業所の担当が実際に決めた積込
- 機械ごとの
unclearとretakeの発生率
3つ目の「そのときの表の版」を残すのは、季節の切り替えで表が変わるからです。 後から食い違いの記録を見たとき、当時の表と比べた結果なのかが分からないと、誤りの元をたどれません。
最後の行は、撮り方を見直す材料になります。 特定の機械だけ retake が続くなら、設置場所の光の向きに理由があります。写真は90日で消し、JSONと確定した記録だけを残す、のように期間を決めておきます。
04実装レベルの3段階
最小構成では台数がさばけません。 1台ずつ貼り付けるので、月3,000件には使えません。写真が読めるかを確かめるための段階です。 半自動化で、1台3分が2分程度になります。 記録票への書き込みと夕方の打ち込みは減りますが、見本・価格の確認は補充員の目に残ります。本格構成で1分になり、この段階が本記事の想定です。 差が大きいのは、棚割りとの突き合わせと補充後の確認が、機械の前での目視だったからです。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、unclear の多い機械と、棚割りの表が古い機械が先に分かります。そこを直してから注意を返す段階に進むほうが、補充員が注意を読み飛ばす癖を付けずに済みます。
05工数削減シミュレーション
導入後 3,000件 × 1分 ÷ 60 = 50 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 飲料の自動販売機を数百台から千台以上受け持ち、補充員が1日十数台を回って、売切れのボタン・補充した品目・気づいたことを紙の記録票か端末に手で入れているオペレーター。機械から販売の数を取る仕組みが一部の機械にしか無く、残りの機械では補充員の目と記録が頼りになっている場合。見本の入れ違いや売切れの表示の消え残りが、利用者からの問い合わせで初めて分かることがある場合。社員食堂・工場・病院の待合などに置いた自社の自動販売機を、総務や売店の担当が回って補充している場合にも当てはまります。
- すべての機械から販売の数と売切れの状態を通信で取れていて、補充員が記録を書く場面がほとんど無い場合。受け持ちが数十台で、1人の担当が機械ごとの事情を覚えていられる場合。なお、商品の賞味期限の判定、機械の故障の診断、設置先との契約や設置場所の変更、商品の入れ替えの最終の判断は、この構成では代替できません。
07最小構成で試す方法
- 先週の巡回で、補充員に到着時と補充後の前面を撮ってもらう(20台分。季節の切り替えをした機械を数台入れる)
- その20台の棚割りの表を印刷しておく
- Google AI Studio など手元の Gemini の画面に、1台分の写真2枚と棚割りを貼り付ける
- 「1枚目は到着時、2枚目は補充後の前面です。ボタンごとに売切れの表示が点いているか、消えているか、判断できないかを書いてください。見本が棚割りのどの品目に見えるかも書いてください。迷ったら判断できないとしてください」と指示する
- 出てきた結果を、補充員の記録票と、現地で確かめた事実と突き合わせる
20台は必ずやってください。 プログラムを組む前に、「この機械の写真で、売切れの表示が読めるのか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 記録票と同じ売切れのボタンが出た | プログラムとの連携に進む |
| 判断できない表示の多くを「消えている」とした | 指示の書き方で直る。構成は有効 |
| 逆光・反射で読めない写真が多い | 撮り方が先。 立つ位置と向きを機械ごとに決める |
3行目が出ることは珍しくありません。 屋外の機械の前面は光を反射します。その場合は、撮る位置を半歩ずらして同じ20台を撮り直してください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
判断できない表示が off になる | 迷ったら unclear を指示に明記し、enum で値を絞る |
| 逆光・反射で表示が読めない | 立つ位置と向きを機械ごとに決める。読めない写真は撮り直し |
| 庫内の写真から残りの本数を書く | 本数を書かせない。 スキーマに本数の項目を作らない |
| ボタンの番号の振り方が機種で違う | 全機種で「左上から右へ、上の段から」にそろえ、棚割りの表も合わせる |
| 似た缶(無糖と加糖など)を取り違える | 見分ける手がかりの一覧を渡し、候補を2つまで返させる |
| 棚割りの表が古い | 表の日付を持たせ、写真より古ければ食い違いを出さない |
| 補充後の写真を撮り忘れる | 30分で未撮影の通知。到着時だけで処理を始めない |
| 下書きが届く前に機械を離れる | トリガーの間隔を巡回の時間帯だけ短くする |
| 通行人が写り込む | 近づいて撮る決まりにし、写り込んだ写真は撮り直して消す |
| 注意が多すぎて読まれなくなる | 最初は「補充後の消え残り」だけを返し、慣れてから項目を足す |
| 積込の案をそのまま使う | 案は材料。天気と在庫を見て営業所の担当が決める |
上の3行が、この構成の失敗のほとんどです。 どれも「見えないものを見えたことにする」という同じ形をしています。見えなかったと返せる値を用意し、それを選ぶよう指示しておくかどうかで、運用に乗るかが決まります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 自動販売機の前面と庫内の写真、機械番号と設置場所、棚割り、価格、補充員の名前と巡回の時刻です。個人の情報はほとんど含みませんが、設置先の名前と場所の一覧は取引の情報です。
- 写り込んだ人を扱わない … 駅や商業施設の前では通行人が写ることがあります。近づいて撮る決まりにし、人が大きく写った写真は処理せずに消します。 指示の文でも人について書かせません
- 設置先の一覧を外部に出さない … Gemini API に渡すのは機械番号と棚割りの行だけにし、設置先の名前と住所は渡しません
- 有料の枠で、
store=falseで使う … 規約では有料のサービスではプロンプトと応答を製品の改善に使わないとされ、Interactions API は既定でやり取りを保存します。保存を止める指定を最初から入れます - 利用者を18歳以上の社員に限る … Gemini API の規約は、18歳未満が使う、または使いうるサービスでの利用を認めていません。この構成を使うのは補充員と営業所の担当だけで、利用者向けの画面は作りません
- AIの結果で機械を止めない・表を書き換えない … 消え残りの注意は確認の依頼で、機械の販売を止める操作や棚割りの表の書き換えには結び付けません
- 補充員の働きぶりを測る道具にしない … 撮影の時刻から巡回の速さを比べることができてしまいます。記録は機械のためのもので、人の評価に使わないことを先に決めておきます
誤りが起きた場合のリスクは、消え残りを見落とすことと、正しい見本を食い違いと出すことの2つです。 前者は unclear を off に混ぜると起き、後者は棚割りの表が古いと起きます。前者は指示とスキーマで、後者は表の日付で守ります。
10まず何から始めるか
1週目:ボタンの番号と撮影位置を決める
受け持ちの機種ごとに、ボタンの番号の振り方を「左上から右へ、上の段から」にそろえ、棚割りの表の番号も合わせます。 機械の側面に機械番号のコードを貼り、前面を撮る立ち位置の目印を決めます。全台を一度にやる必要はありません。1つのルートの150台から始めます。
2週目:20台で試す
補充員1名に、到着時と補充後の前面を20台分撮ってもらい、手元の Gemini の画面で売切れの表示と見本を読ませます。記録票と現地の事実に突き合わせ、判断できない表示を「消えている」としていないかを最優先で見ます。
3週目:食い違いの決まりを決める
何を注意として補充員に返すかを、営業所の担当と補充員で決めます。 最初は「補充後も売切れの表示が残っている」だけに絞ります。積込の案の決まり(直近4回のうち3回の売切れ、など)もここで決めます。
4週目:共有のフォルダから下書きまでをつなぐ
Google Apps Script で共有のフォルダを見張り、Gemini API を呼び、ボタンごとの結果を表に書き出すところまで作ります。この時点では補充員に注意を返さず、一覧だけを営業所の担当が見ます。
2か月目: 消え残りの注意を補充員のスマートフォンに返し、見本・価格の食い違いを足します。unclear と retake の件数を毎週数えます。3か月目以降: 積込の品目の案を足し、1台3分が何分になったかを実測します。季節の切り替えの月を一度、この仕組みで越えた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 画像の形式が PNG・JPEG・WEBP・HEIC・HEIF であること。1つのリクエストに複数の画像を入れられること。インラインの送信はプロンプトと合わせて20MBまでで、超える場合は File API を使うこと。画像が大きさに応じてトークンに換算されること。コードの例が Interactions API で書かれていること | Google AI for Developers: Image understanding | 2026-10-27 |
構造化出力を /v1beta/interactions の response_format(mime_type を application/json、schema)で指定すること。enum・minimum・maximum・minItems・maxItems が使え、minLength などは強制されずに外されること。出力の値はアプリ側で検証するよう案内されていること | Google AI for Developers: Structured output | 2026-10-27 |
Interactions API が既定でやり取りを保存し(有料の枠で55日、無料の枠で1日)、store=false で保存を止められること。その場合は前のやり取りを引き継げないこと | Google AI for Developers: Interactions API | 2026-10-27 |
| 有料のサービスではプロンプトと応答を製品の改善に使わないこと。API の利用者は18歳以上で、18歳未満が使う、または使いうるサービスで使えないこと | Gemini API Additional Terms of Service | 2026-10-27 |
| インストール型のトリガーに時間主導のものがあり、毎分から月1回まで設定できること。実行の時刻がわずかにずれることがあること。ドライブのファイルの作成を起点にするトリガーが一覧に無いこと | Google Apps Script: Installable Triggers | 2026-10-27 |
どの品目を積むか、棚割りをどう変えるかは、営業所の担当と設置先との取り決めで決めてください。 本記事は公開されている製品の仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1954)についてのご相談はこちらから。
