Media > AI活用ユースケース > 物流 > 自動販売機の補充員が撮った前面と庫内の写真を Gemini で読み、売切れの表示と見本の並びを補充の記録にして、次の積込の品目の案を作る

自動販売機の補充員が撮った前面と庫内の写真を Gemini で読み、売切れの表示と見本の並びを補充の記録にして、次の積込の品目の案を作る

実装ステータス:構成例 技術的に実現可能な構成として設計したもの。自社未検証

自動販売機の補充員が機械ごとに撮る前面と庫内の写真を Gemini で読み、売切れのボタンと見本の食い違いを補充の記録の下書きにします。売切れの履歴から、次の巡回で積む品目の案もプログラムで作ります。

サマリー
生成AI
ChatGPT/Claude/Gemini
連携・自動化
Google Apps Script/Python
対象業界
その他/小売/物流/飲食
対象部門
物流
対象業務
データ入力・転記/内容確認・チェック
主な課題
入力作業が多い/期限・対応漏れが起きる/確認ミスが多い
AIで行う処理
画像認識
主な効果
入力漏れ削減/工数削減/機会損失防止
導入難易度
★★☆☆☆
実装レベル
本格構成
費用感
API連携(中)
人間の確認
条件付き
現在工数
150h/月
AI導入後
50h/月
想定削減
67%
年間削減
1,200h
モデル条件による試算値です。実在企業の実績ではありません。

01導入前 / 導入後の業務フロー

導入前(Before)
  1. 補充員が営業所で、その日の巡回の機械の一覧と、前回の記録を見て積込の品目を決め、車に積む
  2. 機械に着いたら前面を見て、売切れの表示が点いているボタンを数え、記録票にボタンの番号を書く
  3. 扉を開け、コラムの減り具合を見て補充する
  4. 見本の並びが棚割りと合っているか、価格のラベルが正しいかを目で見る(忙しい日は省かれる)
  5. 扉を閉め、売切れの表示が消えたかを見る(同じく、省かれることがある)
  6. 回収箱の空き容器を回収し、気づいたこと(汚れ、破損、回収箱のあふれ)を記録票の余白に書く
  7. 営業所に戻ってから、記録票の中身を補充の記録の表に打ち込む
  8. 営業所の担当が記録を見て、売切れが続く品目の積込を増やすか、棚割りを変えるかを考える
導入後(After)
  1. 人補充員が機械に着いたら、前面を決まった位置から1枚撮る(到着時)
  2. 人扉を開けたら、庫内のコラムの上部を1枚撮る(庫内が見える機種のみ)
  3. 人補充を終えて扉を閉めたら、前面をもう1枚撮る(補充後)
  4. 自動写真が共有のフォルダに入ると、数分おきに動くプログラムが機械番号で棚割りの表と価格の台帳を引く
  5. 自動Gemini API が3枚の写真を読み、売切れの表示、見本、価格のラベル、回収箱、庫内のコラムの品目を、ボタンの番号ごとに返す
  6. 自動プログラムが棚割りの表・価格の台帳と突き合わせ、食い違いの候補を決める
  7. 自動補充員のスマートフォンに、その機械の記録の下書きと「補充後も売切れの表示が残っている」などの注意を返す
  8. 人補充員がその場で下書きを確かめ、直すものは直し、補充した数を足して確定する
  9. 自動確定した記録から、売切れの続くボタンを数え、次の巡回の積込の品目の案を作る
  10. 人営業所の担当が、積込の案と、見本・価格の食い違いの一覧を見て、翌日の準備と棚割りの見直しを決める
各工程の詳しい説明を読む
  1. 補充員が営業所で、その日の巡回の機械の一覧と、前回の記録を見て積込の品目を決め、車に積む
  2. 機械に着いたら前面を見て、売切れの表示が点いているボタンを数え、記録票にボタンの番号を書く
  3. 扉を開け、コラムの減り具合を見て補充する
  4. 見本の並びが棚割りと合っているか、価格のラベルが正しいかを目で見る(忙しい日は省かれる)
  5. 扉を閉め、売切れの表示が消えたかを見る(同じく、省かれることがある)
  6. 回収箱の空き容器を回収し、気づいたこと(汚れ、破損、回収箱のあふれ)を記録票の余白に書く
  7. 営業所に戻ってから、記録票の中身を補充の記録の表に打ち込む
  8. 営業所の担当が記録を見て、売切れが続く品目の積込を増やすか、棚割りを変えるかを考える

(a)入力が二度ある。 機械の前で記録票に書き、営業所に戻ってからもう一度表に打ち込みます。1日15台分を夕方にまとめて打つので、どの機械の何番のボタンだったかが記憶頼りになります。

(b)見本の入れ違いは、その場で見ないと分からない。 見本がお茶なのにコラムにはコーヒーが入っている、新商品の見本だけ差し替えて価格のラベルが前のまま。利用者がボタンを押して違うものが出てきて、初めて電話が来ます。 棚割りの表と目の前の見本を1つずつ照らすのは、15台を回る日には難しい作業です。

(c)補充の後の確認が抜ける。 補充を終えて扉を閉め、次の機械へ急ぐと、売切れの表示が消えたかを見ないまま離れてしまうことがあります。 入れたコラムを取り違えていれば、表示は点いたままで、次の巡回までその品目は売れません。

(d)売切れの続く品目が営業所に伝わるのが遅い。 記録は表に入っていても、「この機械のこのボタンは3回続けて売切れ」と数える人がいません。 積込を増やす判断は、補充員の感覚に任されています。

  1. 【人】 補充員が機械に着いたら、前面を決まった位置から1枚撮る(到着時)
  2. 【人】 扉を開けたら、庫内のコラムの上部を1枚撮る(庫内が見える機種のみ)
  3. 【人】 補充を終えて扉を閉めたら、前面をもう1枚撮る(補充後)
  4. 【自動】 写真が共有のフォルダに入ると、数分おきに動くプログラムが機械番号で棚割りの表と価格の台帳を引く
  5. 【自動】 Gemini API が3枚の写真を読み、売切れの表示、見本、価格のラベル、回収箱、庫内のコラムの品目を、ボタンの番号ごとに返す
  6. 【自動】 プログラムが棚割りの表・価格の台帳と突き合わせ、食い違いの候補を決める
  7. 【自動】 補充員のスマートフォンに、その機械の記録の下書きと「補充後も売切れの表示が残っている」などの注意を返す
  8. 【人】 補充員がその場で下書きを確かめ、直すものは直し、補充した数を足して確定する
  9. 【自動】 確定した記録から、売切れの続くボタンを数え、次の巡回の積込の品目の案を作る
  10. 【人】 営業所の担当が、積込の案と、見本・価格の食い違いの一覧を見て、翌日の準備と棚割りの見直しを決める

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どうやって実装するのか

Step1

処理の起点を決める

巡回の時間帯(朝8時から夕方5時)だけ、5分おきに動くプログラムが共有のフォルダを見ます。 Google Apps Script のインストール型の時間主導のトリガーは毎分から月1回までの間隔で動かせ、公式の案内では実行の時刻がわずかにずれることがあるとされています。「撮ってから数分で下書きが返る」くらいの設計にし、補充の作業の数分のあいだに結果が届くようにします。

1台の処理は、補充後の写真が入ったところで始めます。 到着時の写真だけで先に動かすと、売切れの表示が消えたかを見られません。機械番号ごとに arrive と after がそろったかをファイル名で数え、そろったものから処理します。 庫内の写真は、棚割りの表で「庫内が見える機種」とされた機械だけで待ちます。

到着時の写真が入ってから30分たっても補充後の写真が来なければ、補充員のスマートフォンに「補充後の前面が未撮影」と返します。 撮り忘れはそのまま確認の抜けになるからです。処理が終わった写真は日付のフォルダに移し、共有のフォルダに残る枚数を処理待ちの数にします。

Step2

入力データを集める

データ中身取得元
到着時の前面の写真見本の並び、ボタンごとの売切れの表示、価格のラベル、回収箱補充員のスマートフォン
庫内の写真コラムの上部に見える缶・ボトルの品目(庫内が見える機種のみ)同上
補充後の前面の写真補充を終えて扉を閉めた後の売切れの表示同上
棚割りの表機械番号、ボタンの番号、ボタンに割り当てた品目とコラムの番号、温冷の区分、庫内が見える機種か営業所の棚割りの表
価格の台帳品目ごとの価格(設置先ごとに違う場合はその価格)価格の台帳
品目の見本の一覧品目名と、見本の写真(ラベルの見え方)営業所で用意する一覧

質を決めるのは、棚割りの表の正しさです。 表が古ければ、AIが正しく読んでも「食い違い」が出続けます。季節の切り替えのたびに棚割りの表を先に直し、表を直した日付を持たせます。 表の日付が写真の日付より後なら、比べる前に止めます。

品目の見本の一覧は、似た缶を見分けるために渡します。 同じメーカーの無糖と加糖、同じ茶の小さい容量と大きい容量は、見本の小さな写真では見分けにくい組み合わせです。 一覧に「見分ける手がかり(キャップの色、ラベルの帯の色)」を書いておき、AIに渡します。

販売の数は渡しません。 販売の数を通信で取れる機械では、その数は別に記録に入ります。写真から売れた本数を推し量らせると、測っていない数字が記録に紛れます。 写真から分かるのは、表示と見本の見え方だけです。

Step3

データの取得方法を決める

写真の機械番号と種類は、ファイル名から読みます。 補充員は機械の側面に貼った機械番号のコードをスマートフォンで読み取ってから撮り、「日付_機械番号_種類」の名前で保存されるようにします。決まりを外れた名前の写真は処理せず、補充員の画面に「機械番号が読めない」と返します。

棚割りの表と価格の台帳は、機械番号で1行ずつ引きます。 棚割りの表に無い機械番号は処理を止め、営業所の担当に知らせます。新しく設置した機械の表を足し忘れていると、ここで分かります。

Gemini API へは、1台につき1回、3枚の写真と棚割りの行をまとめて渡します。 写真の順番は「到着時の前面、庫内、補充後の前面」に固定し、指示の文で順番を説明します。ボタンの番号は、機械の前面に左上から振った番号を棚割りの表と合わせておきます。 番号の振り方が機種で違うと、AIが正しく読んでも突き合わせがずれます。

有料の利用枠で使い、store を false にします。 Gemini API の規約では、有料のサービスではプロンプトと応答が製品の改善に使われないとされています。Interactions API は既定でやり取りを保存し(有料の枠で55日)、保存しないときは store=false を付けると案内されています。store=false にすると前のやり取りを引き継ぐ使い方はできませんが、この構成は1台ごとに1回で完結するので困りません。

Step4

AIへ渡す前に整形する

  1. ファイル名の確認 … 機械番号・種類がそろっているか。そろわないものは補充員に返します
  2. 写真の向きと大きさの確認 … 縦横を直し、長い辺を一定の大きさに縮めます。20MBを超えないよう3枚の合計を見ます
  3. 明るさの確認 … 夜間・逆光で前面が白く飛んでいる写真は、ボタンの表示が読めません。明るさの平均が極端なものは「撮り直し」と返します
  4. 棚割りの行の取り出し … その機械のボタンの数、ボタンごとの品目、温冷の区分、価格を、AIに渡す短い表にします
  5. 見本の一覧の絞り込み … 品目の見本の一覧から、その機械の棚割りに出てくる品目と、よく取り違える品目だけを渡します
  6. 人が写り込んだ写真の確認 … 機械の前を通る人が大きく写った写真は、撮り直しを求めます。顔が写るほど引いて撮らない決まりにします

3番目を軽く見ないでください。 売切れの表示は小さな光の表示で、屋外の昼の逆光では点いているのか消えているのか、人の目でも迷います。 読めない写真を AI に「読ませる」と、点いていない表示を点いていると返すことがあります。撮り直しを求めるほうが早く済みます。

6番目は、設置場所の写真を扱う以上、最初から決めておきます。 駅や商業施設の前では人が写り込みます。機械の前面に近づいて撮れば、通行人は写りにくくなります。

Step5

AIに処理させる

させるのは、写真に見えるものを、ボタンの番号ごとに書き出すことだけです。 食い違いかどうかは、プログラムが棚割りの表と比べて決めます。

見るもの返させる内容見えないときの扱い
売切れの表示(到着時)ボタンごとに lit(点いている)/off(消えている)反射や逆光で判断できなければ unclear
売切れの表示(補充後)同じくボタンごとに lit/off同じく unclear
見本の品目見本の一覧のどれに見えるか。候補が2つあれば両方見本が無い・隠れていれば not_visible
価格のラベルラベルに見える数字を、そのまま文字で読めなければ unclear。数字を補わない
庫内のコラムの品目コラムの上部に見える缶・ボトルが見本の一覧のどれに見えるか見えないコラムは not_visible
回収箱空き容器があふれて外に出ているか回収箱が写っていなければ not_visible
前面の破損・汚れ割れ、落書き、表示の剥がれに見えるもの写っていない範囲は書かない

右端の列がいちばん大事です。 unclear と not_visible を off や「問題なし」と区別して返させます。「消えている」と「見えなかった」を混ぜると、補充後の表示の消え残りを見落とします。

させないこと理由
売れた本数・残りの本数の推定写真から数えられない。測っていない数字が記録に入る
食い違いの判定棚割りの表と比べるのはプログラムの仕事。表が変わっても判定がぶれない
積込の量・品目の決定営業所の決まりと担当の判断
故障の診断表示が消えない理由が入れ違いか機械の不具合かは、人が扉を開けて確かめる
賞味期限の判断写真から読めず、読めたとしても扱いの判断は人が行う

1行目がいちばん起きやすい失敗です。 庫内の写真を渡すと、コラムの上部に見える缶の数から「残り5本」と書きたがります。コラムの奥は見えず、その数字は当て推量です。

Step6

指示内容を固定する

あなたは飲料の自動販売機の補充の記録を手伝う立場です。
渡された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 と返すのを止めます。

「棚割りから補わない」を書くのは、棚割りを渡しているからです。 渡した表は突き合わせのための手がかりで、見本が隠れているボタンに表の品目を書き入れられると、食い違いの検出が働かなくなります。

Step7

出力形式を固定する

次の形の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 のボタンを記録の「売切れ」に入れ、その回数を機械とボタンごとに数えれば、積込の案の材料になります。

Step8

システムへ連携する

つなぎ先方式内容
共有のフォルダGoogle Apps Script の時間主導のトリガー新しい写真を見つけ、機械番号ごとにそろえる
棚割りの表・価格の台帳表の読み取り機械番号でボタンごとの品目と価格を引く
Gemini APIAPI呼び出し(store=false)3枚の写真からボタンごとの見え方を返す
補充員のスマートフォン共有の表の下書きの行と通知記録の下書きと注意を返す
補充の記録の表表への書き込み補充員が確定した記録を残す
積込の品目の案表への書き込み売切れの回数から翌日の案を作る

積込の品目の案は、次の決まりでプログラムが作ります。

決まり案の中身
直近4回の訪問のうち3回以上、到着時に売切れその品目の積込を増やす案 と、コラムを2つに広げる棚割りの見直しの候補
直近4回の訪問で一度も売切れが無く、販売の数も取れる機械で少ない入れ替えの検討の候補(判断は営業所の担当)
補充後の表示の消え残りが同じボタンで続く機械の点検の依頼の候補

棚割りの表と価格の台帳には書き込みません。 食い違いが見つかっても、正しいのが表か見本かは人が確かめるまで分からないからです。表を直すのは営業所の担当です。

Step9

人が確認する

補充員は、機械の前で下書きの注意だけを見ます。 全ボタンの行を読む必要はありません。

  1. 「補充後も売切れの表示が残っている」を最初に見る … 扉を開け直し、入れたコラムを確かめます。この注意は機械を離れる前に片づけます
  2. 見本・価格の食い違いの候補を見る … 目の前の見本と棚割りを見比べ、見本の差し替えか、表の誤りかを書き残します
  3. 補充した数を足して確定する … 写真からは数えないので、補充した本数は補充員が入れます
  4. AIの読み違いを直したら、そのボタンに印を付ける … どの表示をどちらに直したかを残します

営業所の担当は、夕方に積込の案と食い違いの一覧を見ます。 積込の案はそのまま使わず、翌日の天気と在庫を見て決めます。棚割りの見直しの候補は、設置先との約束(置く品目の取り決め)があるかを確かめてから扱います。

1番目を省かないでください。 消え残りは、次の巡回まで数日その品目が売れないことを意味します。 削減した時間のどこよりも、ここで取り返すものが大きい確認です。

Step10

例外に対処する

起きること対応
補充後の写真が来ない30分たったら補充員に「補充後の前面が未撮影」と返す
逆光・夜間で表示が読めないphoto_quality が retake。影をつくって撮り直す
棚割りの表に無い機械番号処理を止め、営業所の担当に表の追加を頼む
返ってきたボタンの数が棚割りと合わない下書きを作らず、写真を担当の確認に回す
見本の候補が2つに割れる両方を下書きに出し、補充員が選ぶ
人が大きく写り込んでいる処理せずに撮り直しを求め、写真は消す
Gemini API が応答しない・エラーを返す写真を共有のフォルダに残し、次の回で再試行。補充員には手で記録するよう返す
季節の切り替えの途中で棚割りの表が古い表の日付が写真より古ければ、食い違いを出さずに担当に知らせる

上の2行が大半を占めます。 どちらもAIの問題ではなく、撮り方の問題です。 撮る位置と立つ向きを機械ごとに決め、機械の側面に目印を貼るほうが、指示の文を直すより効きます。

Gemini API が止まっても、補充の仕事は止めません。 下書きが返らないときは、これまでどおり手で記録を付ける画面に切り替わるようにしておきます。

Step11

記録を残す

  • 3枚の写真と、撮った日時・補充員・機械番号
  • Gemini API に渡した棚割りの行と、返ってきたJSONの全文
  • プログラムが出した注意と、そのとき参照した棚割りの表と価格の台帳の版
  • 補充員が確定した記録と、AIの読みを直した箇所
  • 積込の品目の案と、営業所の担当が実際に決めた積込
  • 機械ごとの unclear と retake の発生率

3つ目の「そのときの表の版」を残すのは、季節の切り替えで表が変わるからです。 後から食い違いの記録を見たとき、当時の表と比べた結果なのかが分からないと、誤りの元をたどれません。

最後の行は、撮り方を見直す材料になります。 特定の機械だけ retake が続くなら、設置場所の光の向きに理由があります。写真は90日で消し、JSONと確定した記録だけを残す、のように期間を決めておきます。

04実装レベルの3段階

最小構成:写真を手で Gemini の画面に貼り、売切れの表示と見本を読ませる / 1台ごとの写真の読み取り
半自動化:上記+プログラムが共有のフォルダの写真を Gemini API に送り、結果を表に書き出す / 読み取りと記録の下書きの一覧化
本格構成:上記+棚割りと価格の台帳との突き合わせ、補充員への注意の返送、積込の品目の案まで出す / 記録の下書き、その場での注意、翌日の積込の準備

最小構成では台数がさばけません。 1台ずつ貼り付けるので、月3,000件には使えません。写真が読めるかを確かめるための段階です。 半自動化で、1台3分が2分程度になります。 記録票への書き込みと夕方の打ち込みは減りますが、見本・価格の確認は補充員の目に残ります。本格構成で1分になり、この段階が本記事の想定です。 差が大きいのは、棚割りとの突き合わせと補充後の確認が、機械の前での目視だったからです。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、unclear の多い機械と、棚割りの表が古い機械が先に分かります。そこを直してから注意を返す段階に進むほうが、補充員が注意を読み飛ばす癖を付けずに済みます。

05工数削減シミュレーション

前提値(モデル条件)
対象人数
10 名
月間件数
3,000 件
1件あたり現在時間
3 分
1件あたり導入後時間
1 分
現在  3,000件 × 3分 ÷ 60 = 150 時間/月
導入後 3,000件 × 1分 ÷ 60 = 50 時間/月
月間削減時間
100h
削減率
67%
年間削減時間
1,200h
年間金額換算(時間単価2,500円)
300万円
モデル条件による試算であり、実際の効果は業務内容・運用方法によって異なります。

自社条件で導入効果を整理したい方へ

このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。

AI活用について相談する

06向いている企業・向いていない企業

向いている
  1. 飲料の自動販売機を数百台から千台以上受け持ち、補充員が1日十数台を回って、売切れのボタン・補充した品目・気づいたことを紙の記録票か端末に手で入れているオペレーター。機械から販売の数を取る仕組みが一部の機械にしか無く、残りの機械では補充員の目と記録が頼りになっている場合。見本の入れ違いや売切れの表示の消え残りが、利用者からの問い合わせで初めて分かることがある場合。社員食堂・工場・病院の待合などに置いた自社の自動販売機を、総務や売店の担当が回って補充している場合にも当てはまります。
向いていない
  1. すべての機械から販売の数と売切れの状態を通信で取れていて、補充員が記録を書く場面がほとんど無い場合。受け持ちが数十台で、1人の担当が機械ごとの事情を覚えていられる場合。なお、商品の賞味期限の判定、機械の故障の診断、設置先との契約や設置場所の変更、商品の入れ替えの最終の判断は、この構成では代替できません。

07最小構成で試す方法

  1. 先週の巡回で、補充員に到着時と補充後の前面を撮ってもらう(20台分。季節の切り替えをした機械を数台入れる)
  2. その20台の棚割りの表を印刷しておく
  3. Google AI Studio など手元の Gemini の画面に、1台分の写真2枚と棚割りを貼り付ける
  4. 「1枚目は到着時、2枚目は補充後の前面です。ボタンごとに売切れの表示が点いているか、消えているか、判断できないかを書いてください。見本が棚割りのどの品目に見えるかも書いてください。迷ったら判断できないとしてください」と指示する
  5. 出てきた結果を、補充員の記録票と、現地で確かめた事実と突き合わせる

20台は必ずやってください。 プログラムを組む前に、「この機械の写真で、売切れの表示が読めるのか」を確かめます。

出てきた内容判断
記録票と同じ売切れのボタンが出たプログラムとの連携に進む
判断できない表示の多くを「消えている」とした指示の書き方で直る。構成は有効
逆光・反射で読めない写真が多い撮り方が先。 立つ位置と向きを機械ごとに決める

3行目が出ることは珍しくありません。 屋外の機械の前面は光を反射します。その場合は、撮る位置を半歩ずらして同じ20台を撮り直してください。

08実装時につまずきやすいポイント

問題対策
判断できない表示が off になる迷ったら unclear を指示に明記し、enum で値を絞る
逆光・反射で表示が読めない立つ位置と向きを機械ごとに決める。読めない写真は撮り直し
庫内の写真から残りの本数を書く本数を書かせない。 スキーマに本数の項目を作らない
ボタンの番号の振り方が機種で違う全機種で「左上から右へ、上の段から」にそろえ、棚割りの表も合わせる
似た缶(無糖と加糖など)を取り違える見分ける手がかりの一覧を渡し、候補を2つまで返させる
棚割りの表が古い表の日付を持たせ、写真より古ければ食い違いを出さない
補充後の写真を撮り忘れる30分で未撮影の通知。到着時だけで処理を始めない
下書きが届く前に機械を離れるトリガーの間隔を巡回の時間帯だけ短くする
通行人が写り込む近づいて撮る決まりにし、写り込んだ写真は撮り直して消す
注意が多すぎて読まれなくなる最初は「補充後の消え残り」だけを返し、慣れてから項目を足す
積込の案をそのまま使う案は材料。天気と在庫を見て営業所の担当が決める

上の3行が、この構成の失敗のほとんどです。 どれも「見えないものを見えたことにする」という同じ形をしています。見えなかったと返せる値を用意し、それを選ぶよう指示しておくかどうかで、運用に乗るかが決まります。

09セキュリティ・AIガバナンス上の注意点

この構成で扱うデータ: 自動販売機の前面と庫内の写真、機械番号と設置場所、棚割り、価格、補充員の名前と巡回の時刻です。個人の情報はほとんど含みませんが、設置先の名前と場所の一覧は取引の情報です。

  1. 写り込んだ人を扱わない … 駅や商業施設の前では通行人が写ることがあります。近づいて撮る決まりにし、人が大きく写った写真は処理せずに消します。 指示の文でも人について書かせません
  2. 設置先の一覧を外部に出さない … Gemini API に渡すのは機械番号と棚割りの行だけにし、設置先の名前と住所は渡しません
  3. 有料の枠で、store=false で使う … 規約では有料のサービスではプロンプトと応答を製品の改善に使わないとされ、Interactions API は既定でやり取りを保存します。保存を止める指定を最初から入れます
  4. 利用者を18歳以上の社員に限る … Gemini API の規約は、18歳未満が使う、または使いうるサービスでの利用を認めていません。この構成を使うのは補充員と営業所の担当だけで、利用者向けの画面は作りません
  5. AIの結果で機械を止めない・表を書き換えない … 消え残りの注意は確認の依頼で、機械の販売を止める操作や棚割りの表の書き換えには結び付けません
  6. 補充員の働きぶりを測る道具にしない … 撮影の時刻から巡回の速さを比べることができてしまいます。記録は機械のためのもので、人の評価に使わないことを先に決めておきます

誤りが起きた場合のリスクは、消え残りを見落とすことと、正しい見本を食い違いと出すことの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技術仕様の確認日・参考情報

技術仕様確認日:2026-10-27/最終更新:2026-10-27
確認した内容情報源確認日
画像の形式が PNG・JPEG・WEBP・HEIC・HEIF であること。1つのリクエストに複数の画像を入れられること。インラインの送信はプロンプトと合わせて20MBまでで、超える場合は File API を使うこと。画像が大きさに応じてトークンに換算されること。コードの例が Interactions API で書かれていることGoogle AI for Developers: Image understanding2026-10-27
構造化出力を /v1beta/interactions の response_format(mime_type を application/json、schema)で指定すること。enum・minimum・maximum・minItems・maxItems が使え、minLength などは強制されずに外されること。出力の値はアプリ側で検証するよう案内されていることGoogle AI for Developers: Structured output2026-10-27
Interactions API が既定でやり取りを保存し(有料の枠で55日、無料の枠で1日)、store=false で保存を止められること。その場合は前のやり取りを引き継げないことGoogle AI for Developers: Interactions API2026-10-27
有料のサービスではプロンプトと応答を製品の改善に使わないこと。API の利用者は18歳以上で、18歳未満が使う、または使いうるサービスで使えないことGemini API Additional Terms of Service2026-10-27
インストール型のトリガーに時間主導のものがあり、毎分から月1回まで設定できること。実行の時刻がわずかにずれることがあること。ドライブのファイルの作成を起点にするトリガーが一覧に無いことGoogle Apps Script: Installable Triggers2026-10-27

どの品目を積むか、棚割りをどう変えるかは、営業所の担当と設置先との取り決めで決めてください。 本記事は公開されている製品の仕様で確認できた範囲だけを扱っています。

実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。

自社の業務に使えるAI活用候補を整理します

このユースケース(UC-1954)についてのご相談はこちらから。

AI活用について相談する
目次