飲食チェーンの店舗が撮った料理の盛り付けの写真を本部の基準の写真と比べ、量・配置・付け合わせの違いを指摘して、店への直しの連絡の下書きを作る
店舗が毎日撮って送る料理の盛り付けの写真を、本部の基準の写真と盛り付けの基準書に照らし、量・配置・付け合わせ・器の違いを項目ごとに位置付きで指摘します。品質管理の担当は違いの出た写真だけを確かめ、店への直しの連絡を下書きから送ります。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/Power Automate
- 対象業界
- 宿泊/小売/飲食
- 対象部門
- 品質管理
- 対象業務
- 内容確認・チェック/比較検討
- 主な課題
- 人手が足りない/属人化している/確認ミスが多い
- AIで行う処理
- 画像認識
- 主な効果
- 品質標準化/属人化解消/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 店舗が、指定のメニューを盛り付けた直後に撮り、チャットの店舗のスレッドに送る
- 品質管理の担当が、届いた写真を順に開く
- 基準書のPDFを開き、基準の写真と並べて、量・配置・付け合わせ・器を見比べる
- 違いがあれば、チャットで店に指摘を書く。違いが無ければ「確認しました」と返す
- 指摘した内容を、表計算の一覧に店舗・メニュー・内容で書き写す
- 月末に一覧を集計し、スーパーバイザーが店舗の巡回で取り上げる
- 人店舗が、撮影の場所に置いた印の上に皿を置き、真上から1枚撮る。フォームで店舗とメニューを選んで送る
- 自動フォームの送信をきっかけに、写真の形式と大きさを確かめる
- 自動メニューから基準の写真と基準書の項目を引く
- 自動写り具合を確かめ、撮り直しが要るものは店に返す
- 自動2枚を比べ、基準書の項目ごとに `ok` / `diff` / `not_visible` を付け、違いの位置を返す
- 自動項目の結果から、`pass` / `review` / `retake` を規則で決める
- 自動`review` のものについて、店への直しの連絡の下書きを作る
- 人品質管理の担当が、`review` のものだけを開き、写真に重ねた枠と下書きを確かめる
- 人送ると決めたものに印を付けると、店にメールが送られる
- 自動指摘の内容が一覧に残り、月末の集計に使われる
各工程の詳しい説明を読む
- 店舗が、指定のメニューを盛り付けた直後に撮り、チャットの店舗のスレッドに送る
- 品質管理の担当が、届いた写真を順に開く
- 基準書のPDFを開き、基準の写真と並べて、量・配置・付け合わせ・器を見比べる
- 違いがあれば、チャットで店に指摘を書く。違いが無ければ「確認しました」と返す
- 指摘した内容を、表計算の一覧に店舗・メニュー・内容で書き写す
- 月末に一覧を集計し、スーパーバイザーが店舗の巡回で取り上げる
(a)確認が追いつかない。 1日120枚が昼の営業の初めに集中して届きます。午後の会議が入ると、その日の写真は翌日に回り、指摘が届くのは店がそのメニューを何十食も出した後になります。
(b)見る人によって指摘が違う。 付け合わせのパセリが小さいことを指摘する人もいれば、気にしない人もいます。基準書にどこまで書いてあるかを、担当者が覚えている範囲で見ています。
(c)一覧への書き写しが漏れる。 チャットで指摘した後に一覧へ書き写すのを忘れると、月末の集計に出てこず、同じ違いが繰り返されていても気づけません。
(d)撮り方がばらばら。 斜めから、暗い場所で、皿の一部だけ。写真の撮り方が悪いのか盛り付けが違うのかを、担当者がチャットで聞き返すことになります。
- 【人】 店舗が、撮影の場所に置いた印の上に皿を置き、真上から1枚撮る。フォームで店舗とメニューを選んで送る
- 【自動】 フォームの送信をきっかけに、写真の形式と大きさを確かめる
- 【自動】 メニューから基準の写真と基準書の項目を引く
- 【自動】 写り具合を確かめ、撮り直しが要るものは店に返す
- 【自動】 2枚を比べ、基準書の項目ごとに
ok/diff/not_visibleを付け、違いの位置を返す - 【自動】 項目の結果から、
pass/review/retakeを規則で決める - 【自動】
reviewのものについて、店への直しの連絡の下書きを作る - 【人】 品質管理の担当が、
reviewのものだけを開き、写真に重ねた枠と下書きを確かめる - 【人】 送ると決めたものに印を付けると、店にメールが送られる
- 【自動】 指摘の内容が一覧に残り、月末の集計に使われる
8番目が、この設計の分かれ目です。 担当者が見るのは review の写真だけです。pass の写真は一覧で流し見て、店には自動で「確認しました」と返します。
6番目を規則で決めているのも意図してのことです。 付け合わせが1つ欠けたら直しを頼むのか、器の向きの違いは見逃すのかは、メニューと時期によって品質管理部が決めることです。 AIには違いの事実だけを書かせます。
02今回想定するシステム構成
店舗のタブレット ── 盛り付けのフォーム(店舗・メニュー・写真1枚) ▼【トリガー】Google フォームの送信 Google Apps Script ── 写真の形式と大きさの確認 ▼ Google スプレッドシート ── メニューの基準(基準の写真のファイル・確認の項目) ▼ Gemini API ── ①写り具合の確認 ├── retake ──▶ 店に撮り直しを返す ▼ Gemini API ── ②基準の写真との比較(項目ごと ok/diff/not_visible + 位置) ▼ Google Apps Script ── 規則で pass/review を決める ├── pass ──▶ 店へ「確認しました」 ▼ Gemini API ── ③直しの連絡の下書き ▼ 確認の一覧(Google スプレッドシート) ▼【品質管理の担当が印を付ける】 Google Apps Script ──▶ 店へメール、指摘の一覧に記録
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 処理 | Gemini API(写り具合の確認、基準の写真との比較、直しの連絡の下書き) | Claude API、OpenAI API |
| 連携 | Google フォーム(店舗・メニューの選択と写真の受け取り) | Microsoft Forms、自社で用意する撮影用の画面 |
| 連携 | Google Apps Script(呼び出し、規則の判定、一覧への書き込み、メールの送信) | Make、Power Automate |
| 連携 | Google スプレッドシート(メニューの基準、確認の一覧、指摘の一覧) | Microsoft Lists |
| 保管 | Google ドライブ(店の写真と基準の写真) | Microsoft OneDrive、SharePoint |
チャットで写真を受け取るのをやめ、フォームに変えるのが最初の変更です。 チャットの写真は店舗とメニューが文で書かれるだけで、機械で読めません。フォームならメニューを一覧から選ばせられます。 「ファイルのアップロード」の質問では、ファイルはフォームのオーナーの Google ドライブの新しいフォルダに保存され、回答者は Google アカウントへのログインが必要です。 形式・数・最大サイズを決められます。共有ドライブのフォームや、データ損失防止が有効な場合は使えないので、置き場所を先に確かめます。フランチャイズの店にも、本部が発行する Google アカウントを使ってもらいます。
判定の土台は Gemini API の画像理解です。 対応する形式は PNG、JPEG、WEBP、HEIC、HEIF で、1回の入力に複数の画像を並べられます。店の写真と基準の写真を同時に渡して比べさせます。 物体の検出では、位置を [ymin, xmin, ymax, xmax] の形で、0から1000に正規化した座標で返します。違いのある箇所に枠を付け、担当者は写真に重ねた枠を見て確かめます。
画像を直接入れる場合、指示と合わせたリクエスト全体が20MBまでです。 2枚と指示で収まるよう、タブレットの写真の大きさを中程度にします。
03どうやって実装するのか
処理の起点を決める
フォームの送信を起点にし、1枚ずつその場で処理します。 1回の送信は写真1枚で、呼び出しは多くて3回です。Apps Script の1回の実行の上限6分に十分収まります。 昼の営業の初めに40店舗から集中して届いても、送信ごとに別々の実行になります。
まとめて1日1回の処理にはしません。 盛り付けの違いは、その日の昼の営業のうちに直してもらうことに意味があります。夕方にまとめて指摘しても、昼の何十食はもう出ています。
もう1つのトリガーは、確認の一覧の編集です。 担当者が「送る」の列に印を付けたことを、スプレッドシートの編集のトリガーで受け、メールを送ります。インストール型のトリガーは作った人のアカウントで動くので、品質管理部の共用のアカウントで作ります。 メールは共用のアカウントから送られることになります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 店の写真 | 真上から撮った1枚。店舗とメニューと撮影の時刻 | 盛り付けのフォーム(Google ドライブ) |
| 基準の写真 | メニューごとの、本部が撮った基準の盛り付け。店と同じ撮影の印の上で撮る | Google ドライブ |
| 確認の項目 | メニューごとの、器・個数・配置・付け合わせ・ソースの項目と、その許容の幅 | メニューの基準(スプレッドシート) |
| 店の連絡先 | 店長のメールアドレス | 店舗の一覧(スプレッドシート) |
| 過去の指摘 | その店・そのメニューの直近の指摘 | 指摘の一覧(スプレッドシート) |
質を決めるのは、確認の項目です。 基準書のPDFをそのままAIに渡すと、AIがどれを確かめるかを選ぶことになり、担当者ごとの違いが、今度はAIの呼び出しごとの違いに変わるだけです。 基準書から確かめる項目を1行ずつ抜き出し、スプレッドシートに持たせます。
| メニュー | 項目ID | 項目 | 基準 | 許容 |
|---|---|---|---|---|
| 唐揚げ定食 | K01 | 器 | 白の角皿(大) | なし |
| 唐揚げ定食 | K02 | 唐揚げの個数 | 5個 | なし |
| 唐揚げ定食 | K03 | キャベツの位置 | 皿の奥側 | なし |
| 唐揚げ定食 | K04 | キャベツの量 | 基準の写真と同程度 | 見た目で明らかに少なければ違い |
| 唐揚げ定食 | K05 | 付け合わせ | レモン1切れ、パセリ | なし |
| 唐揚げ定食 | K06 | マヨネーズ | 小皿に入れて右手前 | なし |
「許容」の列が、品質管理部の判断を表に出す場所です。 キャベツの量は写真で数えられないので、「明らかに少なければ違い」と幅を書いておきます。 幅を書かずに渡すと、AIは少しの差でも違いと答えます。
過去の指摘はAIに渡しません。 「この店は前回唐揚げが足りなかった」と知らせると、今回も足りないと答えやすくなります。過去との比較は、スクリプトが一覧で行います。
データの取得方法を決める
フォームの送信のイベントから、アップロードされたファイルのIDと、選ばれた店舗・メニューが取れます。Apps Script で Google ドライブから店の写真を読み、メニューで基準の写真のファイルと確認の項目を引きます。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 店の写真 | フォームの回答のファイル | 比較の対象 |
| 基準の写真 | メニューで引く Google ドライブのファイル | 比較の基準 |
| 確認の項目 | メニューの基準の、そのメニューの行 | 指示に差し込む項目の一覧 |
| 店長の宛先 | 店舗の一覧 | 連絡の送り先 |
基準の写真は、メニューを変えるたびに撮り直します。 器や付け合わせを変えたのに基準の写真が古いままだと、全店が「違い」と出ます。 メニューの基準の行に、基準の写真の撮影日と有効になる日を持たせます。
枠を重ねた表示は、Apps Script のウェブアプリで作ります。 doGet で HTML を返すウェブアプリにし、店の写真の上に box_2d の位置で枠を描きます。座標は0から1000に正規化されているので、表示する画像の幅と高さに掛けて1000で割れば、そのまま枠の位置になります。 実行のユーザーは「アクセスしたユーザー」にし、写真のフォルダを見られる人だけが開けるようにします。確認の一覧の各行には、このウェブアプリへのリンクを写真のIDを付けて置きます。
基準の写真も同じ画面の左に並べます。 担当者は左右を見比べ、枠の位置の基準側を確かめます。チャットで写真と基準書のPDFを行き来していた時間の大半は、この並べた表示で消えます。
AIへ渡す前に整形する
- 形式の確認 … PNG、JPEG、WEBP、HEIC、HEIF のどれかであることを確かめます
- 大きさの確認 … 2枚と指示を合わせて20MBを超えないよう、大きすぎるものは縮めます
- メニューの有効性の確認 … 選ばれたメニューが、その日に有効な基準を持っているかを確かめます。持っていなければ「基準なし」で止めます
- 重複の確認 … 同じ店・同じメニュー・同じ日の写真が2枚あれば、後のものを使います
撮影の印を店に置いてもらうのが、前処理の代わりになります。 調理台の端に、皿を置く位置と向きを示すシールを貼ります。皿の向きがそろえば、「キャベツが奥」の判定がぶれません。 斜めから撮った写真を後から補正するより、撮る位置をそろえるほうが確実です。
AIに処理させる
させるのは3つの段階です。 写り具合の確認、基準の写真との比較、直しの連絡の下書きです。1つ目で止まったものは比較に進めません。
1つ目の段階
| 見るもの | 判定の仕方 | 判断できないときの扱い |
|---|---|---|
| 撮影の角度 | 真上から撮られているか | 斜めなら retake |
| 写っている範囲 | 皿の全体が写っているか | 一部が切れていれば retake |
| 明るさ・ぶれ | 具材の形が分かるか | 分からなければ retake |
| メニュー | 選ばれたメニューと料理が合っているか | 明らかに違えば wrong_menu |
2つ目の段階
確認の項目の1行ずつについて、次を返させます。
| 返すもの | 中身 |
|---|---|
status | ok(基準どおり)/diff(違う)/not_visible(写真では判断できない) |
observed | 写真で見えたもの(例:「唐揚げが4個見える」) |
box_2d | 違いのある箇所の位置 |
evidence | 判断の根拠にした見た目 |
diff と not_visible の区別が、この構成でいちばん大事です。 唐揚げの1個がキャベツの陰に隠れて見えないのか、無いのかは、写真によっては分かりません。「4個見える」とだけ書かせ、5個目が隠れている可能性があれば not_visible にします。 店に「足りない」と伝えるのは、はっきり足りないと分かるときだけです。
3つ目の段階
diff の項目だけを渡し、店長あての連絡の下書きを作らせます。下書きに入れるのは、項目、基準、写真で見えたもの、基準書のどこを見ればよいかです。 叱る言葉や、理由の推測は入れさせません。
| させないこと | 理由 |
|---|---|
| 確認の項目にない点の指摘 | 担当者ごとの違いを、AIの違いに置き換えるだけになる |
| グラムの見込み | 写真から重さは分からない |
| 味・温度・鮮度の評価 | 写真から分からない |
| 違いの理由の推測 | 「忙しかったのでは」は店との関係を損なう |
| 直しを頼むかの判断 | 規則と担当者が決める |
指示内容を固定する
あなたは飲食チェーンの本部で、店舗の盛り付けを基準と比べる立場です。
1枚目は本部の基準の盛り付け、2枚目は店舗が撮った盛り付けです。
2枚の写真に写っているものだけを見て、下の確認の項目を1つずつ判定してください。
【メニュー】{menu_name}
【確認の項目】
{check_items}
(項目ID、項目、基準、許容 の順に並んでいます)
【status の選び方】
- ok .......... 基準どおり。許容の範囲内の差は ok
- diff ........ 基準と違うことが写真ではっきり分かる
- not_visible . 写真では判断できない(隠れている、写っていない、ぼけている)
迷ったときに diff を選ばないでください。迷ったら not_visible です。
【厳守事項】
- 確認の項目にない点については書かないでください。見栄えの評価もしないでください。
- 個数は、見えている数を observed にそのまま書いてください。
隠れている可能性がある場合は、見えない分を足したり引いたりせず、not_visible にしてください。
- 量を重さ(グラム)で見込まないでください。基準の写真との見た目の差だけを書いてください。
- 味、温度、鮮度、衛生については書かないでください。
- diff のときは、違いのある箇所の位置を box_2d に [ymin, xmin, ymax, xmax] で
0〜1000 に正規化して入れてください。
- evidence には、判断の根拠にした見た目を短く書いてください。
- 違いが生じた理由は書かないでください。
「迷ったら not_visible」を明記しないと、diff が増えます。 違いを探すように頼まれると、AIは小さな差を違いとして挙げる方向に寄ります。店に誤って直しを頼むほうが、見逃すより店との関係に響くので、迷いを not_visible に寄せます。
「確認の項目にない点については書かない」も同じ理由です。 「ご飯の盛り方がやや平たい」のような指摘は、基準書に書かれていない限り、担当者が書いていた個人の好みと同じです。
出力形式を固定する
次の形のJSONで受け取ります。 Gemini API の構造化出力では、response_format に mime_type: "application/json" と JSON Schema を渡し、status を enum で3つに限ります。公式の案内では、出力はJSONとして正しくても、値はアプリケーションの側で必ず検証するようにとされています。
{
"photo_quality": "good | retake | wrong_menu",
"checks": [
{ "item_id": "K02", "status": "ok | diff | not_visible",
"observed": "", "evidence": "", "box_2d": [0, 0, 0, 0] }
]
}
1つ目の理由は、項目ごとの結果と、店への判断を別の層に置けることです。 checks はAIが埋め、verdict はスクリプトが規則で決めます。
verdict | 条件 |
|---|---|
retake | photo_quality が retake か wrong_menu |
review | diff が1つでもある、または not_visible が項目の半分以上 |
pass | 上のどれにも当たらない |
2つ目は、スクリプトで検証できることです。 返ってきた item_id が確認の項目と1対1で対応しているか、box_2d が0から1000の範囲か、diff に box_2d があるかを確かめます。項目の数が合わなければ review にします。 AIが1つの項目を読み飛ばしたまま pass になるのを防ぎます。
3つ目は、集計に使えることです。 item_id ごとの diff の数を店舗とメニューで数えれば、どの店でどの項目が繰り返し違うかが、月末を待たずに分かります。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| Google フォーム | フォームの送信のトリガー | 写真と、店舗・メニューを受け取る |
| メニューの基準 | スプレッドシートの読み取り | 基準の写真と確認の項目を引く |
| Gemini API | Apps Script から呼び出し | 写り具合、比較、下書き |
| 確認の一覧 | スプレッドシートへの書き込み | 写真へのリンク、項目ごとの結果、下書き、「送る」の列 |
| 店長 | メール | 直しの連絡、撮り直しの依頼、確認済みの返信 |
| 指摘の一覧 | スプレッドシートへの書き込み | 送った指摘を店舗・メニュー・項目IDで残す |
pass の「確認しました」は自動で返します。 店にとっては、写真を送ったことが本部に届いたという合図です。review の連絡は、担当者が印を付けるまで送りません。
メールの送信には1日の上限があります。 Google Workspace のアカウントで1日あたり1,500名の受信者まで、とされています。1日120枚に対して、確認済みの返信、撮り直し、直しの連絡を合わせても収まります。店舗ごとに1日1通にまとめると、さらに余裕が出ます。
人が確認する
品質管理の担当は、review の行だけを開きます。 確認の一覧には写真に box_2d の枠を重ねた画像へのリンクと、項目ごとの結果、下書きが並びます。
- 枠を見る … 違いと出た箇所が本当に違うかを、写真で確かめます
not_visibleを見る … 店に撮り直しを頼むか、見送るかを決めます- 下書きを直す … 店の事情を知っている場合は、言い方を整えます
- 「送る」に印を付ける … 印を付けると、その行の連絡が店に送られます
- 判定を覆したら記録する …
diffをokに直したら、その理由を一言残します
5番目を省かないでください。 担当者が覆した項目が多ければ、確認の項目の基準か許容の幅が実態と合っていません。 メニューの基準を直す材料になります。
pass の写真も、週に1回は抜き取りで見ます。 店舗ごとに数枚を選び、AIが見逃した違いが無いかを確かめます。見逃しは review の確認だけでは見つからないので、抜き取りが唯一の手がかりです。見逃しが見つかった項目は、許容の幅を狭めるか、指示の書き方を直します。
スーパーバイザーは、店舗ごとの diff の推移を巡回の前に見ます。 同じ項目が2週続けて出ている店は、写真での指摘では直らない理由(器の在庫、仕込みの量、新人の配置)がある可能性が高く、巡回で話を聞く対象になります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 写真が斜め・暗い・皿が切れている | retake。店に撮り直しを返す。昼の営業中なら次の1食で撮り直してもらう |
| 選んだメニューと料理が違う | wrong_menu。店に選び直しを頼む |
| 基準が有効でないメニュー | 「基準なし」で止める。品質管理部に基準の写真の撮り直しを頼む |
| 季節の付け合わせの切り替え期間 | メニューの基準に有効になる日を持たせ、切り替えの日の前後は両方の基準を許す |
| 店が意図して変えた(食材の欠品で代替) | 店のフォームに「代替あり」の欄を置き、印があれば review にして担当者が見る |
| 1日に同じメニューを2回送った | 後のものを使い、前のものに印を付ける |
| 店の写真に湯気や照明の反射が強い | 具材の形が分からなければ retake。撮影の場所の照明を店ごとに確かめる |
| ソースのかけ方など見え方が揺れる項目 | 許容の幅を広めに書くか、項目から外して巡回で見る |
| 盛り付けの基準そのものが店の器に合わない | 店の器が本部の指定と違う。器の発注の問題として、商品開発へ回す |
| 締め切りの時刻を過ぎても写真が届かない | 昼の営業の初めから2時間たっても届かない店を、一覧の先頭に「未提出」で出す |
| Gemini API が応答しない | 確認の一覧に「未処理」で残し、1時間おきの時間主導型のトリガーで再度処理する。3回失敗したら担当者が目で見る |
4行目と5行目は、AIの問題ではなく基準の問題です。 季節で付け合わせが変わる時期、食材が届かず代替した日は、基準どおりでないことが正しい状態です。 その情報がどこから来るかを、先に決めておきます。
記録を残す
- 店の写真と基準の写真(そのときに有効だった基準の写真のファイル)
- 指示の全文と、返ってきたJSONの全文
verdictと、担当者が覆した項目とその理由- 店に送った連絡の本文と、送った日時
- 店舗・メニュー・項目IDごとの
diffの数の推移
「そのときに有効だった基準の写真」を残すのは、基準が変わるからです。 付け合わせを変えた後に過去の指摘を見直すと、当時の基準が分からなければ、その指摘が正しかったかを判断できません。
覆した理由は、短い選択肢で残します。 「隠れていた」「許容の範囲」「代替あり」「基準が古い」の4つ程度にしておくと、月末に数えられます。「隠れていた」が多ければ撮り方、「許容の範囲」が多ければ許容の幅、「基準が古い」が多ければ基準の写真の更新の手順を直します。 覆した理由が、そのまま次に直す場所を教えてくれます。
04実装レベルの3段階
半自動化で、1枚3分が1.5分程度になります。 見比べは自動になりますが、全件の結果を見て、連絡を書き、一覧に書き写す作業が残ります。本格構成で1分になり、この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化の一覧を2週間見ると、diff が出やすい項目と、許容の幅が狭すぎる項目が分かります。そこを直してから連絡を自動にするほうが、店への誤った指摘が減ります。
05工数削減シミュレーション
導入後 3,000件 × 1分 ÷ 60 = 50 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 定食・丼・ランチプレートなど盛り付けの決まったメニューを数十店舗で出しており、本部の品質管理やスーパーバイザーが店から送られる写真で盛り付けを確かめている飲食チェーン。メニューごとに盛り付けの基準書と基準の写真がある場合。店が毎日決まったメニューを撮って送る運用ができる場合。ホテルの朝食ビュッフェの盛り付けや、惣菜の売場の盛り付けを本部が写真で見ている場合にも当てはまります。
- 店舗が数店で、料理長が毎日すべての店の料理を見られる場合。盛り付けを料理人の裁量に任せている業態で、基準の写真が無い場合。グラム単位の量が問題になる場合(写真ではグラムは測れません)。なお、味・温度・衛生の確認は、この構成では代替できません。
07最小構成で試す方法
- 売れ筋のメニューを1つ選び、基準書から確認の項目を5〜6行に抜き出す
- 先週チャットで届いた、そのメニューの写真を30枚集める(担当者が指摘したものを数枚入れる)
- 手元の Gemini の画面に、基準の写真と店の写真を2枚並べて貼り、第7章の指示を貼り付ける
- 項目ごとの判定を、当時の担当者の指摘と並べる
| 出てきた内容 | 判断 |
|---|---|
| 当時の指摘と同じ違いが出た | フォームとスクリプトの連携に進む |
| 隠れた具材を「足りない」とする | 指示の「迷ったら not_visible」を強める。撮る位置をそろえる |
| 項目にない点を指摘してくる | 指示の書き方で直る。構成は有効 |
| 斜めの写真で配置の判定がぶれる | 撮影の印が先。 AIの問題ではない |
4行目が出たら、撮影の印を2〜3店で試してから同じ30枚分を撮り直してください。 撮り方をそろえると判定がどれだけ変わるかが分かります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 隠れた具材を「足りない」とする | 迷ったら not_visible。 見えた数をそのまま書かせる |
| 項目にない見栄えを指摘する | 確認の項目だけを渡し、それ以外は書かせない |
| 基準書のPDFをそのまま渡す | 項目を1行ずつ表に直す。 許容の幅も書く |
| 斜めの写真で配置がぶれる | 撮影の印で皿の位置と向きをそろえる |
| メニューを変えたのに基準の写真が古い | 基準に撮影日と有効になる日を持たせる |
季節の切り替えで全店が diff | 切り替えの前後は両方の基準を許す |
| 食材の代替が違いと出る | フォームに「代替あり」の欄を置く |
| リクエストが大きすぎて失敗する | 2枚と指示で20MBまで。写真の大きさを中程度に |
| 共用のアカウントの人が異動して止まる | トリガーは作った人のアカウントで動く。部署の共用のアカウントで作る |
| 店への連絡が自動で飛ぶ | review は担当者の印の後にだけ送る |
上の2行が、この構成の失敗のほとんどです。 どちらも、AIが「違いを探す」方向に寄ることから来ます。 迷いを not_visible に寄せ、項目を表で縛ることで、指摘が店にとって受け入れられるものになります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 料理の写真、店舗名、メニュー、店長のメールアドレスです。個人の情報はほとんど含みません。 ただし、撮影の場所によっては従業員の顔や手元が写ります。
- 写真に人を写さない … 撮影の印を調理台の端に置き、皿だけが写る角度で撮ると決めます。人が写った写真は、確認の一覧で削除します
- 新メニューの写真の扱い … 発売前のメニューの基準の写真は、社外に出ていない情報です。Gemini API の利用規約では、無料の枠では送った内容が製品の改善に使われ、人が読むことがあるとされ、有料の枠では製品の改善に使わず、禁止事項の違反を見つけるために限った期間だけ記録するとされています。有料の枠で使い、写真のフォルダを見られる人を品質管理部と商品開発に絞ります
- 店への指摘は人が送る …
reviewの連絡は担当者の印の後にだけ送ります。フランチャイズの店との関係に関わるため、自動では送りません - この構成は衛生と味の確認を代替しません … 見るのは写真に写る盛り付けだけです。異物、温度、加熱の状態、味は、店の確認と本部の巡回で見ます
- 指摘の集計を評価に直結させない … 店舗ごとの
diffの数は、撮り方や基準の幅の影響を受けます。数だけで店の評価を決めず、スーパーバイザーが巡回で確かめます
誤りが起きた場合のリスクは、正しく盛った店に直しを頼むことと、違いを見逃すことの2つです。 前者は迷いを diff に寄せると起き、後者は not_visible を pass に混ぜると起きます。not_visible が項目の半分以上なら review に回す規則で、両方を防ぎます。
10まず何から始めるか
1週目:確認の項目を表にする
売れ筋の5メニューの基準書から、確かめる項目を1行ずつ抜き出し、基準と許容の幅を書きます。品質管理の担当とスーパーバイザーの4名で、許容の幅をそろえます。 ここで担当者ごとの違いが表に出ます。
2週目:30枚で試す
1メニューについて、先週届いた写真30枚を手元の Gemini の画面で判定させ、当時の指摘と並べます。隠れた具材を「足りない」としていないかを最優先で見ます。
3週目:撮影の印を配る
5店舗に撮影の印を貼ってもらい、フォームで写真を送ってもらいます。チャットでの受け取りは、この5店舗だけ止めます。
4週目:フォームから一覧までをつなぐ
フォームと Apps Script で、写真を受け取り、Gemini API を呼び、確認の一覧に書き出すところまで作ります。この時点では店への連絡を自動にせず、担当者が一覧から手で送ります。
2か月目: 規則で pass と review を分け、pass の確認済みの返信を自動にします。メニューを20に広げます。3か月目以降: 直しの連絡の下書きと印での送信を足し、全40店舗に広げます。担当者が覆す項目の割合が落ち着き、許容の幅の見直しが月1回の作業になった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
対応する画像の形式が PNG、JPEG、WEBP、HEIC、HEIF であること。1回の入力に複数の画像を並べて渡せること。画像を直接入れる場合、指示などと合わせたリクエスト全体が20MBに制限されること。物体の検出で位置を box_2d として [ymin, xmin, ymax, xmax] の形で0〜1000に正規化して返すこと | Gemini API: Image understanding | 2026-10-07 |
構造化出力を /v1beta/interactions の response_format に mime_type: "application/json" とスキーマを入れて指定すること。enum と required が使えること。出力がJSONとして正しくても値はアプリケーションの側で検証するよう案内されていること | Gemini API: Structured output | 2026-10-07 |
| インストール型トリガーにフォームの送信、スプレッドシートの編集、時間主導型があること。トリガーは作った人のアカウントで動くこと | Google Apps Script: Installable triggers | 2026-10-07 |
| 1回の実行時間が6分まで、メールの受信者が Google Workspace のアカウントで1日1,500名までであること | Google Apps Script: Quotas for Google Services | 2026-10-07 |
| ファイルのアップロードの質問で、ファイルがフォームのオーナーの Google ドライブの新しいフォルダに保存され、回答者は Google アカウントへのログインが必要なこと。形式・数・最大サイズを設定できること。共有ドライブのフォームやデータ損失防止が有効な場合は使えないこと | Google ドキュメント エディタ ヘルプ: フォームでファイルをアップロードする | 2026-10-07 |
ウェブアプリには doGet か doPost が要り、HtmlOutput か TextOutput を返すこと。「アクセスしたユーザーとして実行」ではその人として動くこと | Google Apps Script: Web Apps | 2026-10-07 |
| 無料の枠では送った内容が製品の改善に使われ、人が読むことがあること。有料の枠ではプロンプトや画像などを製品の改善に使わず、禁止事項の違反を見つけるために限った期間だけ記録すること | Gemini API Additional Terms of Service | 2026-10-07 |
フランチャイズの店に写真の提出を求める範囲と、指摘の扱いは、加盟店との契約と本部の運用の決まりに合わせてください。 本記事は上の公開情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0663)についてのご相談はこちらから。
