12人のキッチンマネージャーが「鶏肉はどれくらい必要か」を当てずっぽうで決めていたのを3つのMLモデルに置き換えました。全アーキテクチャを公開します。

Dev.to / 2026/4/11

💬 オピニオンDeveloper Stack & InfrastructureIdeas & Deep AnalysisTools & Practical Usage

要点

  • この記事では、12拠点のレストランチェーンにおける在庫・購買の業務フローを取り上げます。そこでは、信頼できるデータ追跡ではなく、マネージャーの勘、スプレッドシート、電話連絡に依存しています。
  • 大きな「廃棄データのギャップ」がある点を強調します。具体的には、日中に使用された食材が、注文された量と突合されないため、実際の損失と消費パターンが不明のままになります。
  • 著者は、「鶏肉はどれくらい必要か」という12人の人間による判断を、より体系的な発注につなげるための3つの機械学習モデルに置き換えることを提案します。
  • 現行プロセスには、自動化可能な複数の機械的ステップ(発注の入力、仕入れ先見積もりの比較、納品の突合、月末レポート)が含まれている一方で、学習と最適化に必要なフィードバックループが欠けている点を説明しています。

これはケーススタディです:サプライチェーンにおけるAI
すべてのレストランチェーンには同じ“汚れた秘密”があります。誰も実際に、どれだけの食べ物を廃棄しているのかを把握していないのです。

私は、12拠点のレストランチェーン向けにシステムを手がけました。そこでは在庫管理の全プロセスが“感覚”で回っていました。キッチンマネージャーが朝7時に入ってきてあたりを見て、「鶏肉が少ないな」と思い、調達に電話して「20kg送って」と言う。それだけです。それがシステムでした。

データはない。追跡もない。フィードバックループもない。人間が冷蔵庫を見て、電話をかけるだけです。

混乱として始まったもの

12のレストランすべてで、毎日実際に何が起きているのかを説明します。

  1. 朝(店舗ごと):
    キッチンマネージャーが目視で巡回します。直感と経験に基づいて、何が不足しているかを決めます。それを紙に書きます。書かないこともあり、その場合はただ覚えています。中央の調達オフィスに電話し、必要なものを口頭で伝えます。

  2. 調達オフィス:
    担当者がスプレッドシートに注文を入力します。次に3〜4社の仕入先に電話して見積もりを聞きます。同じ仕入先。 同じ会話。毎週、同じことが繰り返されます。見積もりを比較して、最安のものを選び、発注します。

  3. 翌日:
    配送が到着します。すべて揃っている場合もあれば、そうでない場合もあります。キッチンマネージャーが注文書と照合します。何かおかしければ、また調達に電話します。電話が増えるだけです。

  4. 誰も話さないギャップ:
    日中、キッチンは食材を使います。しかし、実際にどれだけ使ったのかと、どれだけ注文したのかを誰も追跡していません。鶏肉を20kg注文しました。POSシステムには、約12kg使うはずの料理を売ったことが表示されます。日が終わると、3kg残っています。残りの5kgはどこへ行ったのでしょうか。誰も知りません。そもそも誰もその問いをしていません。

  5. 月末:
    12人の各店舗マネージャーが、発注コストをそれぞれスプレッドシートにまとめます。そして本部にメールします。本部側の誰かが、12個のスプレッドシートを手作業で統合してP&Lレポートを作ります。だいたい8時間かかります。レポートには誤りだらけですが、誰も確認するだけのエネルギーがありません。

本部は統合されたレポートを見て、問題を見つけようとします。しかしできません。廃棄データがありません。仕入先のパフォーマンスデータもありません。どの店舗が過剰発注しているのかも分かりません。つまり、判断は手探りなのです。

私はこのワークフローに14ステップをマッピングしました。以下が内訳です。

Steps in tables

パターンは明確です。大半のステップは機械的で、ツールで自動化できます。判断が必要なステップはMLモデルで置き換えられます。そして最大の問題(ステップ11)は、そもそも“悪いプロセス”ですらなく、“プロセス自体が欠けている”ことです。

# 在庫&調達オートメーション・パイプライン

| ステップ                          | コンポーネント                              | 理由 |
|-----------------------------------|---------------------------------------------|-----|
| 目視での在庫確認        | TOOL(デジタル計量器+POSデータ)をトリガーとして使用 | 目視ではなく実測で置き換える。POSは何が売れたかを教えてくれる。計量器は何が残っているかを示す。毎朝届くこのデータが、システム全体を起動するトリガーになる。 |
| 注文リストを書き込む              | 決定論的ML(需要予測器)    | 回帰モデルが曜日、予約、天気、過去の販売、現在の在庫を受け取り、正確な注文数量を出力する。これは言語の問題ではない。数学の問題だ。 |
| 調達に電話する              | TOOL(自動ルーティング)               | 電話そのものが不要になる。システムが計算された注文を調達ワークフローへ送る。 |
| スプレッドシートに入力する        | TOOL(データベース)                        | スプレッドシートを構造化データベースに置き換える。注文は自動的に記録される。 |
| 見積もりのために仕入先へ電話する         | TOOL(仕入先API)                    | 仕入先はAPIまたは週次のアップロードで価格リストを提供する。システムが自動で問い合わせる。 |
| 見積もり比較、仕入先を選ぶ | 決定論的ML(仕入先スコアラー)     | 価格+オンタイム納品率+品質の却下率でスコアリングする。LLMに“考えさせる”のではなく、重み付きスコアリングモデルだ。 |
| 発注する                   | TOOL(仕入先API)                    | ガードレール内で自動実行する。 |
| 配送が到着                 | TOOL(配送確認)           | キッチンマネージャーがアプリで受け取りを確認する。数量は注文に紐づけて記録される。 |
| 注文と配送の照合         | TOOL(自動マッチング)              | システムが受領分と注文分を比較する。食い違いを検知する。 |
| 食い違いを解決            | HUMAN CHECKPOINT                       | 10%を超える食い違いは、完全な文脈付きで調達マネージャーにエスカレーションする。小さな差異は自動で承認され、ログに記録される。 |
| 使用量を注文量と追跡        | 決定論的ML(廃棄検知)      | 20kgを注文。POSは料理に使った分として12kgを示す。計量器は3kgが残っていることを示す。未計上の5kg=廃棄。モデルはベンチマーク以上の店舗をフラグする。 |
| 月次のコスト集計      | TOOL(自動レポート)                | すべての注文はすでにデータベースに入っている。月次合計はSQLクエリで取得できる。 |
| 12店舗を統合            | TOOL(ダッシュボード)                       | すべての拠点にまたがる1つのクエリ。リアルタイム。 |
| 異常のレビュー          | LLM(ナラティブ)+HUMAN CHECKPOINT     | LLMが読みやすい要約を生成する。「店舗7の鶏肉コストはチェーン平均より23%高い。廃棄率はチェーン平均9%に対して18%。」人間が読み、次に何をするか判断する。 |

注: LLMはちょうど1回だけ登場します。最後にです。ナレーションのために。つまり、このパイプライン全体でLLMが意思決定を1つも行うことはありません。

システムアーキテクチャ

システムには並行して動作する3つのレイヤーがあります。

レイヤー1:レストランエージェント(x12、独立して稼働)

各レストランが独自のエージェントを動かします。同じロジック、異なるデータです。互いを待ちません。

トリガー:毎日 午前5時

→ [TOOL] POSの売上データを取得(昨日分)
→ [TOOL] デジタル計量器の読み取りを取得(現在の在庫)

→ [決定論的ML] 需要予測器
    入力:曜日、予約、天気、
            昨日の売上、過去の傾向、
            現在の在庫
    出力:食材ごとの注文数量
            信頼区間付き

→ [決定論的ML] 廃棄検知器
    入力:昨日の開店時在庫、
            受領した配送、POS由来の使用量、
            計量器からの閉店時在庫
    出力:食材ごとの廃棄量
            閾値を超えるかどうかのフラグ

→ [TOOL] API経由で仕入先価格を照会

→ [決定論的ML] 仕入先スコアラー
    入力:現在の価格、過去のオンタイム率、
            品質の却下率
    出力:食材ごとの順位付けされた仕入先

レイヤー2:意思決定の分岐

ここでシステムが「人間が必要なもの」と「不要なもの」を決めます。

IF 注文 < ₹50K
   AND すべての品目が優先仕入先
   AND 廃棄レベルが通常:
   → 仕入先API経由で自動実行
   → データベースへログ記録

IF 注文 ≥ ₹50K
   OR 標準外の仕入先
   OR 異常な数量(平均の>2倍):
   → 人間のチェックポイント
   → 調達マネージャーが承認/修正/却下
   → 承認された注文を実行

返却形式: {"translated": "翻訳されたHTML"}IF waste flag triggered (>15% waste on any ingredient):
   → ALERT restaurant manager + head office
   → [LLM] 廃棄分析ブリーフを生成
   → HUMAN が調査して根本原因を記録

自動実行の経路はルーチンを処理します。人間のチェックポイントが異常を捉えます。廃棄アラートが未知の事態を扱います。3つの経路、明確なルール、曖昧さなし。

Layer 3: Head office consolidation agent

毎日および毎月実行します。すべてを集約します。

DAILY:
→ [TOOL] 12拠点にわたる注文・コスト・廃棄を集計
→ [DETERMINISTIC ML] 異常検知器
   原価ベンチマークより上/下に位置するレストランをフラグ付け
→ ダッシュボード更新

MONTHLY:
→ [TOOL] データベースから連結P&L(損益計算書)を生成
→ [DETERMINISTIC ML] トレンド分析
→ [LLM] 月次ナラティブを生成:
   「チェーン全体のフードコスト:売上の32.4%(目標30%)。
    上位:レストラン2が28.1%。
    要注意:レストラン9が37.2%。
    野菜で22%の廃棄率が要因。」
→ HUMAN CHECKPOINT:本部がレビューし意思決定

The feedback loop

これが、システムが時間とともに賢くなる理由です。
すべての注文、すべての配送、すべての廃棄測定、すべての需要予測が保存されます。システムは予測精度を追跡します。

「火曜日のレストラン3について18kgの鶏肉需要を予測しました。実際は21kgでした。誤差:16%。」

これは需要予測器にフィードバックされます。数週間、数か月にわたって、モデルは各レストランのパターンを学習します。レストラン5は毎週金曜日に必ず急増することを学習します。

レストラン9は、毎回のモンスーン期に野菜の廃棄が高くなります。サプライヤーBは、祝祭日の間に配送時間が遅れます。

MLモデルは静止しません。メモリ層が、単なる意思決定ではなく結果を捉えるため、改善されます。

Failure mode analysis

すべてのコンポーネントは、いずれ必ず故障します。問題は「故障するかどうか」ではなく、「故障したときに何が起こるか」です。

POSデータフィードが停止: キッチンマネージャーが昨日の推定カバー数を手動で入力します。システムは、直近の類似した日の実績を代理として使用します。アラートはITへ送られます。

スケールの誤動作またはスタッフが計量を飛ばす: システムは欠落した読み取り値を検知し、計算された在庫へフォールバックします:昨日の在庫 + 配送 - POSの使用量。完璧ではありませんが、何もしないよりはましです。

需要予測器が大きく外す: 最近の誤差が大きい場合、信頼区間は自動的に広がります。低信頼の予測には20%のバッファを付け、人間によるレビューをフラグ付けします。モデルは週次で再学習します。

サプライヤーAPIがダウン: 注文はキューに積まれます。注文の詳細を添えて、調達担当者にSMS通知を送信し、電話で手作業での発注を行います。確認された時点でアプリに注文を記録します。

廃棄検知器が誤検知(false positive)を出す: 廃棄アラートは、エスカレーションの前にしきい値超えが2日以上連続して必要です。単日の急増は記録されますが、アラームは発動しません。アラート疲れを減らします。

自動実行のバグが発注数量を10倍にする: 強力なガードレール。自動発注が、そのレストランにおけるその食材の直近4週間平均の3倍を超えることはありません。3倍を超えるものは人間の承認が必要です。各拠点ごとの日次支出上限。

LLMが月次レポートで数字を幻覚する: LLMは数値を生成しません。すべての数値は、構造化データとしてデータベースから取得されます。LLMはそれらを自然言語で包むだけです。LLMが利用できない場合でも、元の数値を載せたダッシュボードは引き続き動作します。

設計原則: いずれかのMLコンポーネントが失敗した場合、システムは現在の手作業プロセスへ劣化(フォールバック)します。より悪い何かへは劣化しません。最悪のシナリオは「今日のやり方に戻ること」です。これは崖ではなく下限です。

結論:
MLが判断します。LLMが説明します。人間が承認します。これがパターンです。

返却形式: {"translated": "翻訳されたHTML"}