系統地圖 大計劃 #P-AI-1 AI-Native POS Phase 1
#P-AI-1 · Phase 1 of 3 · DRAFT

把 ChefsMate 變成有「AI 店長」的 POS — 先做可行性盤點

老闆說想要把產品從「老闆操作 → 系統反應」進化成「AI 主動建議 → 老闆審核」。 這份提案不會直接寫 code,而是先盤點 codebase + 資料 + 風險, 讓老闆看完知道值不值得往 Phase 2 走

🤖 提案人:Claude 📅 提案日:2026-05-16 📂 類型:架構盤點(不寫 code) ⏱ 預估工時:1 個「睡覺時段」

📑 提案目錄

  1. 為什麼要做這件事
  2. 現況一張圖 — 我們今天長什麼樣
  3. 我盤點完發現的 5 件事
  4. 哪些模組天生適合 AI 化(評分表)
  5. 資料缺口 — 我們現在沒有的東西
  6. 哪些地方需要 event 化(不然 AI 看不到)
  7. 具體長什麼樣 — 一個可互動的 prototype
  8. 建議的順序(4 個 Phase)
  9. 成本估算
  10. 風險與技術債
  11. 老闆,請選一個
  12. 給工程師看的技術規格

1. 為什麼要做這件事

老闆,

我整理過去 2 週的 dogfood 紀錄,發現我們的系統會做事,但不會主動想事

• 訂位網頁壞了 → 老闆要打開報告才知道
• 收銀機零用金低了 → 一直到關帳才被發現
• 客人 no-show 一直發生 → 沒人追蹤趨勢
• 海邊小巫每週四 lunch 客流總是冷 → 沒人提醒
• 庫存某項目快用完 → 廚師臨時才發現

這些不是「沒做 feature」,是沒有一個會主動觀察、會記住、會提醒的角色。 傳統 POS 系統的天花板就是這。

如果我們花時間把架構打好,這個角色(我)就可以變成餐廳的「數位副店長」, 老闆睡覺時我幫看數據、發 anomaly 警示、產出明天的建議。

但這件事不能急。先 Phase 1 盤點,看看現在的 codebase 多接近這個目標

— Claude (AI 員工),2026-05-16 提案

2. 現況一張圖

今天 ChefsMate 的資料流長這樣(粗略畫,省略很多細節):

───────────── 使用者操作層 ───────────── 👤 客人 🍳 老闆 / 員工 │ │ ▼ ▼ chefsmate.app ChefsMatePOS (iPad) (web 訂位) ChefsMate (主 App) ChefsMateBooking StaffsMate (Flutter) │ │ └───────┬────────────────┘ │ ▼ HTTP / Realtime ───────────── Supabase 後端 ───────────── ┌──────────────────────────┐ │ PostgreSQL (60+ 表) │ │ - reservations, orders │ │ - menu_items, assets │ │ - customer_loyalty, ... │ └─────────┬────────────────┘ │ ┌────────┴─────────┐ │ │ Realtime Edge Functions (35+) (WebSocket) (Email / Push / RPC) ───────────── 目前還沒有的 ───────────── ❌ Event Log (操作沒有時序紀錄) ❌ AI Memory (沒地方存「世界模型」) ❌ Vector DB (沒有 semantic search) ❌ Background AI (沒有 cron-style AI 觀察員) ❌ Anomaly Detector (異常都靠老闆肉眼) ❌ Conversation UI (沒有「跟 AI 講話」入口)
⚡ 一句話總結現況

我們有很完整的「事情發生 → 寫進 DB」的能力, 但沒有「事情發生 → 觸發 AI 思考」的能力。 這是兩種完全不同的架構哲學。

3. 我盤點完發現的 5 件事

① 4 層架構讓我們處於「半好」狀態

CLAUDE.md 規定所有商業邏輯都要走 Route → Orchestrator → Gate + Primitive + Repository。 這個架構對 AI 化非常有利,因為 AI 可以呼叫 Orchestrator 像呼叫 API 一樣, 不需要重寫 UI。但 80% 的 codebase 還沒搬完(PO 重構才到 Step 1.4-B)。

② Supabase 已經有「事件感」但沒有「事件紀錄」

Realtime channel 訂閱 36+ 表 → 任何 INSERT/UPDATE 都會推送。 這就是 event 的雛形!但我們把它當推播用,沒存進 event_log 表, 所以 AI 看不到「過去發生了什麼」。

③ 客人端資料 sparse,POS 端資料豐富

客人面:只有訂位 / 取消 / 修改記錄。
POS 面:訂位 + 訂單 + 結帳 + 桌位移動 + 廚房狀態 + 員工出勤 + 損益。
→ AI 的「世界模型」建立應該從 POS 端開始,客人端是輔助。

④ 我們已經在偷偷做 AI 的事,但沒有命名

例如:TablePredictionService(預測哪桌坐哪組客人)、 cloudSmartService(呼叫 Edge Function 算開放時段)、 autoExpireOverdueReservations(cron 自動 no-show)。 這些都是「規則式 AI」,只差一個共同的「AI brain」入口。

⑤ 沒有任何地方在用 LLM / vector DB

整個 codebase grep 過了:0 個 OpenAI / Anthropic SDK 引用、0 個 pgvector / Pinecone 整合。 完全乾淨的 greenfield。
好處:沒有歷史包袱。壞處:每個模組都要自己接。

4. 哪些模組天生適合 AI 化

我把 POS 主要模組依「AI 化價值 / 困難度」分數列出來:

模組 AI 化價值 實作難度 推薦動工順序 具體 use case
訂位 / 候位 ⭐⭐⭐⭐⭐ 1 「明天 7 點客流預測 / no-show 風險 / 桌位安排建議」
菜單 / 銷售分析 ⭐⭐⭐⭐⭐ 2 「下週要打哪個菜的折扣?哪個菜該下架?」
記帳 / 報表 ⭐⭐⭐⭐ 3 「這週成本超支 8%,主因是哪幾個品項?」
客人關係(CRM) ⭐⭐⭐⭐ 4 「VIP 妮妮 30 天沒來,要不要寄優惠券?」
採購 / 庫存 ⭐⭐⭐ 5 「下週叫貨建議單」
員工排班 ⭐⭐⭐ 6 「下週四 lunch 客流預估 → 應該排幾個外場?」
結帳 / 廚房 KDS ⭐⭐ 不急 低決策含量,不需要 AI
外場座位佈局 ⭐⭐ 不急 一次性設定,不需要 AI 持續介入
✅ 我的建議

先做訂位 + 銷售分析 + 記帳。這 3 個模組共同特性:
(1)資料已經結構化在 supabase
(2)有時序性(適合 trend / anomaly 分析)
(3)老闆每天都要花時間看,最直接省力

5. 資料缺口 — 我們現在沒有的東西

要做 AI,需要 AI 「看得到的歷史」。我盤點下來缺這些:

缺什麼 為什麼需要 多難補
event_log 表 記錄所有操作的時序,AI 看歷史用 (一張表 + 一個觸發器)
天氣資料 客流預測強相關(下雨人少) (接 OpenWeather API)
國定假日 / 行事曆 連假前後客流模式不同 (一張靜態表)
附近活動 / 演唱會 大型活動會湧入或抽光客流 (要爬蟲 + 人工 curation)
外送平台訂單 UberEats / Foodpanda 訂單也算營收 (要整合 API 或人工輸入)
AI 對話記憶 讓 AI 記得老闆的偏好 / 過去討論 (pgvector + summarization pipeline)
明確的「重要程度」標記 讓 AI 知道哪些事件值得提醒 (event importance scoring) (需要設計 scoring rules)

6. 哪些地方需要 event 化

「event 化」= 把這件事的發生時間 + 內容 + 因果關係寫成一筆 row, 以後可以查、可以彙總、AI 可以摘要。今天我們很多地方只改了 state 沒留 event, AI 看到「訂位現在是 cancelled」但不知道什麼時候、為什麼、誰按的。

───── 今天的做法(state-only) ───── reservations 表: id=ABC, status=cancelled, updated_at=2026-05-16 13:30 ↑ AI 只能看到「現在是這樣」,無法回答: - 它從哪個 status 變成 cancelled? - 是誰取消的?客人 / 老闆 / 自動? - 取消時老闆同時做了什麼? ───── 我建議的做法(event log) ───── event_log 表: { ts: 2026-05-16 13:30, event_type: "reservation.cancelled", entity_id: ABC, actor: "owner@user_profile_123", payload: { from: "confirmed", to: "cancelled", reason: "客人臨時有事" }, importance: 6 // 0-10, AI 評估用 } ↑ AI 可以: - 查最近一週所有 cancelled events - 看到取消理由分佈 - 自動寫週報:「本週取消 12 次,主因:客人臨時有事 (8)」

需要 event 化的重點操作(依優先序):

  1. 訂位生命週期(created / confirmed / cancelled / no_show / arrived / completed / modified)
  2. 訂單生命週期(opened / item_added / paid / refunded / void)
  3. 桌位操作(assigned / transferred / merged / split / freed)
  4. 資金流(cash_in / cash_out / asset_transfer / settlement)
  5. 菜單變動(item_added / item_disabled / price_changed)
  6. 採購 / 庫存(po_created / po_received / stock_depleted)

7. 具體長什麼樣 — 一個可互動的 prototype

這是我想像中老闆 Phase 2 之後會用到的 UI(傳統 dashboard → 對話式):

🤖 AI 副店長
晚安老闆,今天打烊前的快訊:

⚠️ 異常 1:零用金缺 $1,200

收銀機現在 $2,800,預設 $4,000。建議從營業額錢包補進去,避免明早來不及。

💡 機會:VIP 妮妮 31 天沒來

上次消費 $2,400。生日是下週三。要不要寄一張 8 折券?
明天 lunch 客流預測?
明天週四 lunch(12:00-14:00)預估 14-18 組
依據:上 4 個週四同時段平均 16 組 + 明天沒下雨 + 附近沒大型活動

📋 我建議

• 排班:2 外場 + 2 廚房應夠
• 主菜備料:牛肉麵 ×20、招牌炒飯 ×15
• 風險:王先生有 4 人訂位但信用分數 40%(曾 2 次 no-show),建議提前一小時確認
王先生那組怎麼提醒?
幫您起一封 LINE 提醒草稿,要寄嗎?
「王先生您好,提醒您今日 12:30 在海邊小巫的 4 位訂位...」
🎬 這個畫面背後的技術

每個 AI 講的話都來自3 件事
(1) 從 event_log 拉最近資料 → (2) 加上 context(天氣 / 假日) → (3) 餵 LLM 出建議卡片
UI 是 SwiftUI Chat + 動態渲染卡片。卡片按鈕直接呼叫既有 orchestrator(補錢 / 寄信 etc)。

8. 建議的順序 — 4 個 Phase

2026-05 (現在進行)

Phase 1:可行性盤點(這份提案)

產出本文件 + 老闆綠燈 / 紅燈決策。不寫 code。

預估 2-3 週

Phase 2:基礎建設(不打擾日常使用)

• 建 event_log 表 + 觸發器(POS 內所有寫操作自動 log)
• 接天氣 / 假日 API(cron 每天拉)
• 整合 Claude API(Edge Function 包一層)
• 第一個 use case:「每日異常摘要」(cron 跑,結果存 daily_ai_summary 表,POS 開機顯示)

預估 1 個月

Phase 3:對話介面 + 主動建議

• POS 加「🤖 AI 副店長」tab(chat UI)
• AI 能查資料 + 起草 action(不能直接執行,要老闆按確認)
• 第一批主動建議:低庫存 / 高 no-show 訂位 / VIP 久未來 / 零用金低

預估 1-2 個月(看 Phase 3 效果)

Phase 4:半自動執行

• 老闆把信任的 action 設為「不用問我」(白名單)
• AI 在白名單範圍內可自己執行(例:低庫存自動下叫貨單草稿、no-show 客人自動扣信用分)
• 所有自動行為都進 event_log,老闆可隨時 audit

9. 成本估算(每月)

Claude API
$80-150
假設老闆 + 副店長每天對話 30 次 + cron 每日摘要 1 次
Supabase 額外用量
$10-20
event_log + pgvector storage
Vercel cron + edge
$0-10
現有 plan 已含
天氣 / 假日 API
$0
OpenWeather free tier 夠用

→ 月成本 ~ $100-180 USD(單一餐廳)。 若多店,token 成本線性成長但 infra 固定。

10. 風險與技術債

AI 給的建議錯誤但老闆照做了

例如 AI 建議寄折扣券給某 VIP,但其實該 VIP 已經是黑名單。 對策:所有 AI 建議都要老闆按 confirm, Phase 4 自動執行白名單也要設「最大金額 / 最大頻率」上限。

Token 成本失控

若沒節制,AI 對話 / 摘要可能燒掉每月 $500+。 對策:(1) prompt caching;(2) 短期記憶用 small model(Haiku),長期 reasoning 用 Sonnet;(3) 設定每日 budget alarm。

跟現有 4 層架構衝突

AI 不能直接 SQL,必須走 orchestrator。 對策:建一個「AI tool library」當 orchestrator 的 wrapper,AI 只能呼叫白名單 tool。

Phase 4 自動執行被員工誤觸發

例:員工不小心觸發「AI 建議補貨」,下了大單但其實不需要。 對策:白名單只給老闆角色,員工角色只能看不能執行。

Vendor lock-in(Anthropic / Supabase)

整個 stack 黏住兩家公司。 對策:tool library 抽象 LLM 介面,未來換 OpenAI / Gemini 不用重寫業務 code。

「不該做」清單(避免 overengineering)

• ❌ 不要一開始就建 multi-agent system(複雜度爆炸)
• ❌ 不要試圖讓 AI 替代老闆做最終決策
• ❌ 不要直接接 voice assistant(先做好文字版)
• ❌ 不要做 generative menu design(沒有市場驗證)

11. 老闆,請選一個

📌 看完了,老闆想怎麼進行?

(點完按鈕請告訴 AI 你選了哪個,AI 會依此安排排程。
也可以在 老闆報告 → 許願池 補充想法。)

12. 給工程師看的技術規格

以下為 Phase 2 落地時的具體技術設計,給後續實作參考。本 section 預設讀者熟悉 supabase / Next.js / Swift。

12.1 Event Log 表設計

CREATE TABLE event_log (
  id BIGSERIAL PRIMARY KEY,
  ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  restaurant_id UUID NOT NULL REFERENCES restaurants(id),
  event_type TEXT NOT NULL,        -- e.g. "reservation.cancelled"
  entity_table TEXT NOT NULL,      -- "reservations"
  entity_id UUID NOT NULL,
  actor_user_profile_id UUID,      -- nullable for system events
  actor_role TEXT,                 -- "owner" / "staff" / "customer" / "system"
  payload JSONB NOT NULL,          -- { from, to, reason, ... }
  importance SMALLINT DEFAULT 5,   -- 0-10, AI scoring use
  correlation_id UUID,             -- 串連 multi-step 操作
  created_at TIMESTAMPTZ DEFAULT NOW()
);

CREATE INDEX idx_event_log_restaurant_ts ON event_log(restaurant_id, ts DESC);
CREATE INDEX idx_event_log_entity ON event_log(entity_table, entity_id);
CREATE INDEX idx_event_log_type_ts ON event_log(event_type, ts DESC);
CREATE INDEX idx_event_log_high_importance ON event_log(restaurant_id, ts DESC) WHERE importance >= 7;

12.2 Event 寫入策略

  • 不用 PG trigger(trigger 寫 JSONB 容易死掉、無法 testable)
  • 改在每個 Orchestrator 完成時手動 emit event(已有 eventBus 雛形)
  • events 走 eventBus.publish() → subscriber 寫 event_log(async, non-blocking)
  • 失敗只 log warn,不影響 orchestrator 本身(best-effort)

12.3 AI Brain Edge Function 架構

supabase/functions/ai-brain/
├── index.ts            # 入口:接 /ai/chat 或 /ai/summarize
├── tools/              # tool library (AI 能呼叫的 orchestrator wrappers)
│   ├── query.ts        # SELECT-only queries
│   ├── action.ts       # POST orchestrator(要求 confirm token)
│   └── registry.ts     # tool 白名單 + role gating
├── context/            # 餵給 LLM 的 context builder
│   ├── recent_events.ts
│   ├── weather.ts
│   ├── holidays.ts
│   └── memory.ts       # short-term + long-term memory retrieval
└── llm/                # Anthropic SDK wrapper + prompt cache
    ├── client.ts
    └── prompts.ts

12.4 Memory Pipeline

層級儲存取出策略例子
Short-term當前對話 context window直接帶「剛才老闆問的客流」
Workingevent_log 最近 7 天SQL filter by ts + importance「上週 no-show 統計」
Long-termai_memory_summaries 表 (pgvector)semantic search by embedding「老闆討厭外帶單」
Structured既有 supabase 表tool call「妮妮的消費紀錄」

12.5 Summarization Cron

// 每日 03:00 跑(避開營業時段)
POST /api/ai/cron/daily-summary
  ├── 拉昨日 event_log(filter importance >= 5)
  ├── 拉昨日 orders 統計
  ├── 拉天氣 + 假日
  ├── 餵 Claude Sonnet → JSON output: { highlights[], anomalies[], suggestions[] }
  ├── INSERT INTO daily_ai_summary (date, content_json)
  └── 老闆 POS 開機時 GET /api/ai/summary/today 顯示卡片

12.6 Vector DB 選型

  • 用 pgvector(不要 Pinecone)— 已經在 supabase 上,省一筆 vendor
  • embedding:Anthropic 還沒有 first-party embedding API,用 voyage-3-lite ($0.02/M tokens)
  • summarization 頻率:每週 batch 一次,每次處理過去 7 天的 event_log,存進 ai_memory_summaries

12.7 安全 / Tool Gating

// tool registry 範例
const TOOLS = {
  query_reservations: { role: ['owner','staff'], readonly: true },
  query_orders:       { role: ['owner','staff'], readonly: true },
  send_email:         { role: ['owner'], readonly: false, max_per_day: 50, requires_confirm: true },
  create_purchase_order: { role: ['owner'], readonly: false, max_amount: 5000, requires_confirm: true },
  // ❌ never expose direct SQL / DDL
}

12.8 不該做的(避免 overengineering 清單)

  • ❌ 不要寫自己的 agent framework — 直接用 Anthropic SDK + tool use
  • ❌ 不要先做 voice (太多 edge cases)
  • ❌ 不要先做 multi-agent / hierarchical agents
  • ❌ 不要 fine-tune 模型(用 prompt + tool 就夠)
  • ❌ 不要試圖讓 AI 替代 4 層架構的 orchestrator — AI 只是新的 client

12.9 Phase 2 第一個交付(demo-able)

讓老闆能驗收 Phase 2 的東西:

  1. event_log 表上線 + 至少 3 種 orchestrator 在寫(cancellation / payment / settlement)
  2. 每日摘要 cron 跑通,POS 開機顯示「昨日 1 件異常 + 2 個建議」
  3. 沒有任何 UI 改動老闆能直接看 effect

Phase 2 通過 = 老闆說「我每天確實會看 AI 摘要」→ Phase 3 啟動。

12.10 監控 / Observability

// 必要的 metric
- ai_call_count_per_day
- ai_call_token_in / token_out (per restaurant)
- ai_call_latency_p95
- ai_tool_invocation_count by name
- ai_action_confirm_rate  (老闆按 confirm vs reject 比例 → 訊號 AI 對不對)
- daily_summary_generation_success_rate
📅 提案版本:v1 (DRAFT, 2026-05-16)
🔄 老闆 feedback 後會更新本提案 → 變 v2 / v3
💬 想問問題 / 補需求?許願池