我現在有狀態機的觀念了 想試試存進資料庫的樣子
輸出內容
=== 台灣餐廳點餐系統 (State Persistence) ===
輸入 'new' 開始新對話
輸入 'load <session_id>' 載入舊對話
輸入 'list' 查看所有對話
輸入 'state' 查看當前狀態
輸入 'quit' 結束
> new
✓ 創建新對話 #4
> 我要點餐
🤖 好的,請問您有沒有任何食物過敏或是特殊的飲食需求呢?
> 我對花生過敏
🤖 了解,我會特別注意。我們餐廳的菜單有牛肉麵 $150、滷肉飯 $50、珍珠奶茶 $45。請問您想要點哪一道菜呢?由於您有花生過敏,珍珠奶茶裡面的珍珠是使用花生油製作的,所以不建議您點選。
> 我要牛肉麵就好
🤖 好的,您點的是牛肉麵一碗,價格為$150。請問您還需要點其他的飲料或甜點嗎?
> 不用
🤖 好的,請問您要用現金還是信用卡付款呢?
> 信用卡
🤖 好的,您將使用信用卡付款。您的訂單為牛肉麵一碗,總價為$150。請問您是否確認訂單?
> 好喔我確認
🤖 感謝您的確認,您的訂單已經完成。請稍候片刻,我們將會為您準備餐點。謝謝您的光臨!
> state
當前狀態:
{
"allergy_confirmed": true,
"allergies": [
"我對花生過敏"
],
"current_items": [],
"order_previewed": false,
"order_confirmed": false,
"payment_provided": false
}
> list
最近的對話:
#4 | demo_user_1770793795 | 12 則訊息 | 更新: 2026-02-11 07:11:40
#3 | demo_user_1770792095 | 20 則訊息 | 更新: 2026-02-11 06:44:08
#2 | demo_user_1770792011 | 0 則訊息 | 更新: 2026-02-11 06:40:11
#1 | demo_user_1770791920 | 0 則訊息 | 更新: 2026-02-11 06:38:40
> quit
再見!
原始碼
這個範例過度簡化 所以當前狀態的內容 出錯很多 別在意
把狀態機持久化 其實就是 把前一個範例的 php array 存成一筆 row 而已
我目前認為 最簡化設計 只需要三張 table
chat_sessions chat_messages agent_states
就可以把對話、訊息、狀態機 持久化
彼此關聯是
chat_sessions <-> chat_messages 1 to N
chat_sessions <-> agent_states 1 to 1
建立對話時 同時建立狀態機
更新對話時 同時更新狀態機
chat_messages: 累積的對話歷史
agent_states: 當前的狀態快照(覆蓋式更新)