昨天完成了消費分析與訂閱相關功能後,SubWise 已經逐漸具備「可以使用」的功能。但開始發現一個問題:如果每次都要靠 AI 理解使用者想做什麼,真的適合當作記帳 Bot 嗎?
例如使用者明明只是想「我要查詢消費」,如果還需要把這句話送給 Gemini 判斷,除了浪費 API 額度,也會讓整個操作流程變得不穩定。因此今天 Day 26,決定從「使用者怎麼操作」的角度重新整理 SubWise,目標是:讓使用者打開 Bot 後,就能直接看到主要功能,而且常用功能不需要依賴 AI 判斷。
把原本單純的 help 文字回覆,設計成一個比較完整的首頁,直接告訴使用者 SubWise 可以做什麼(記帳、查詢、分析、訂閱、扣款提醒五大功能)。這樣使用者第一次輸入 help 時,就不只是看到一堆指令,而是可以直接理解「這個 Bot 到底能幫我做什麼?」
光有文字首頁還不夠,如果使用者看到功能列表還要自己重新輸入文字,其實還是有點麻煩,因此加入 LINE 的 Quick Reply。主選單提供 5 個按鈕(記帳/查詢/分析/訂閱/扣款提醒),每個按鈕背後都會送出對應的固定文字,例如點下「💰 記帳」實際送出的就是「記帳」這個字串,這樣原本的指令系統可以繼續使用,不需要為了 Quick Reply 重新設計整套架構。
「查詢」本身可以分成不同資料來源,因此建立 create_query_quick_reply(),提供「💰 消費」「🔔 訂閱」兩個選項;「分析」也建立 create_analysis_quick_reply(),提供「📅 今天」「📆 本週」「🗓️ 本月」三種期間。這比讓 Gemini 自己猜「使用者想查消費還是訂閱」更加明確。
建立 get_quick_reply(text),根據使用者目前輸入的文字,決定下一步要顯示哪一組 Quick Reply(help → 主選單、查詢 → 查詢選單、分析 → 分析期間選單),讓整個 Bot 的互動結構開始變得比較像真正的產品,而不是單純的聊天程式。
主選單新增「⏰ 扣款提醒」按鈕,讓使用者一鍵查詢未來 7 天內即將扣款的訂閱。這個功能其實不是今天才從零開始——query_service.py 裡的 get_upcoming_subscriptions(records, days=7) 昨天已經完成,會篩選 Active 訂閱、計算距離天數、找出未來 7 天內即將扣款的訂閱並排序;今天再補上 format_upcoming_subscriptions() 把資料轉換成使用者看得懂的 LINE 訊息,並確認無資料時會友善顯示「🔔 最近 7 天沒有即將扣款的訂閱。」而不是讓程式看起來像壞掉。
第一次在 LINE 上輸入「扣款提醒」,得到的不是預期結果,而是「⚠️ SubWise AI 暫時無法處理這則訊息,請稍後再試」。查看 Render Log 發現:
📩 LINE 收到訊息:扣款提醒
🤖 交給 Gemini AI 處理
❌ Gemini API 發生錯誤:429 RESOURCE_EXHAUSTED
原因是原本的分流邏輯只判斷文字有沒有在 fixed_commands 清單裡,而「扣款提醒」這個新按鈕的文字沒有被加進去,導致它被當成一般聊天訊息送給 Gemini,最後撞上今天的免費額度上限。
這其實是一個很典型的問題:功能明明不需要 AI,卻被送進 AI。
解決方式是把「扣款提醒」「即將扣款」「近期扣款」這幾種說法都加入 process_feature_command() 的固定判斷,讓它直接呼叫 process_upcoming_subscriptions(),完全不需要經過 Gemini。
修改後沒有馬上只靠 LINE 測試,先在 Python REPL 執行 process_command("扣款提醒"),確認流程確實走到 process_upcoming_subscriptions() 而不是 Gemini,接著用測試資料驗證「有扣款」與「無扣款」兩種情境:三筆測試訂閱中,一筆 Active 且在 7 天內、一筆 Active 但超過 7 天、一筆 Inactive,執行後成功只留下符合條件的那一筆,且 days_until 計算正確。確認服務邏輯沒問題後,才回到 LINE 正式測試,這次成功得到「🔔 最近 7 天沒有即將扣款的訂閱。」代表 LINE → 固定指令 → 扣款提醒功能 → Google Sheets → 7 天篩選 → 格式化 → LINE 回覆這整條流程已經成功繞過 Gemini 完整運作。
最後也把 help、記帳、查詢、分析、訂閱、扣款提醒 六個主要入口在 LINE 上逐一驗證了一遍,全部正常顯示對應的選單或內容。
目前 SubWise 的訊息處理架構:
使用者訊息
├─ 固定功能 → process_command() → 對應 Service → Google Sheets
└─ 自然語言 → Gemini AI
完成後確認 python -m py_compile app.py 沒有錯誤,Git 也確認 working tree clean。
今天完成的是「使用者如何進入功能」,明天 Day27 將延續這套互動式首頁,進一步優化各功能之間的操作流程:優化功能切換與返回首頁的體驗、讓 Quick Reply 操作更直覺、補強固定指令與 AI 分流的邊界情況,並實測完整的使用流程。讓 SubWise 不只是「有功能」,而是開始變成一個真正好操作的 LINE 智慧記帳管家。我們明天見!