昨天的 Day 10,已經完成了 SubWise 最重要的第一個資料流:使用者說一句話 → Gemini 理解 → Python 解析 → Google Sheets 儲存。例如「我今天午餐花了 120 元」可以被 Gemini 轉換成結構化資料,再寫入 Google Sheets。
但做到這裡,發現一個問題:如果 SubWise 只能「記錄」,卻不能「回答」,那它還稱不上是一個真正的智慧記帳管家。
真正的應用程式通常需要兩個方向:
使用者 → SubWise → 寫入資料 → Google Sheets
↑
讀取資料
昨天完成的是 Write,今天 Day 11 要完成的是 Read + Query,也就是讓 SubWise 能回答「我有哪些訂閱?」「Netflix 什麼時候扣款?」「我這個月花多少錢?」這些問題。
如果使用者說「我今天午餐花了 120 元」,這是一筆新的消費(type: expense);但如果使用者說「我今天花多少錢?」,這就不是要新增資料,而是要查詢資料。因此讓 Gemini 多了一種類型:query。
目前 SubWise 的主要資料類型變成四種:expense、subscription、query、chat。
Query JSON 設計成:
{
"type": "query",
"target": "expense",
"period": "month",
"keyword": null
}
expense 或 subscription
today、yesterday、week、month、all
"Netflix"
{"type": "query", "target": "subscription", "period": "all", "keyword": null}。這正是 AI Agent 很重要的一個概念:LLM 負責理解意圖,Python 負責執行真正的資料操作。
keyword: "Netflix",讓 Python 知道只需要去 Google Sheets 找 Netflix 這一筆。period: "month";「我今天花多少錢?」則對應 period: "today",Python 可以依此選擇不同的資料範圍。有了 Gemini 的 Query JSON,下一步是讓 Python 真正執行查詢。把原本的 Google Sheets 功能進一步整理,架構變成:
Gemini Query JSON → Query Service → Google Sheets
例如 query_data("expense") 可以取得所有消費資料,query_data("subscription") 則取得所有訂閱。
實測成功讀取消費資料(6 筆)與訂閱資料(Netflix),代表昨天寫入的資料,今天已經可以重新被系統讀取。
如果把所有資料全部拿出來還是不夠實用——例如使用者問「我這個月花多少?」,不能把半年前的資料全部拿來計算。因此加入日期篩選,支援 today、yesterday、week、month、all 五種區間,測試結果:
| 期間 | 找到筆數 |
|---|---|
| today | 0 筆 |
| yesterday | 4 筆 |
| week | 4 筆 |
| month | 6 筆 |
| all | 6 筆 |
代表 Query Service 已經開始具備真正的資料篩選能力。
分別測試五種時間區間,today 找到 0 筆(因為今天還沒記帳)、yesterday 與 week 各找到 4 筆、month 與 all 則找到累積的 6 筆,證明日期篩選邏輯確實依照區間正確過濾資料,而不是每次都把整張表撈出來:

除了日期,也希望能搜尋特定訂閱。加入 keyword 參數後,搜尋「Netflix」成功找到 1 筆,搜尋「Spotify」則正確回傳 0 筆,代表關鍵字搜尋正常運作。
這是今天最值得記錄的一個設計思考。一開始可能會覺得「既然 Gemini 這麼聰明,那乾脆讓 Gemini 自己處理全部事情?」但實際設計後發現,最好把工作拆開:
也就是 Gemini = 大腦,Python = 執行者,Google Sheets = 記憶。這樣的架構比較容易維護,也方便未來替換資料庫。
現在整體流程變成:
使用者 → Gemini(理解自然語言)→ Query JSON(type/target/period/keyword)
→ Query Service → Google Sheets → 日期篩選 → 計算總金額 → 格式化結果 → SubWise 回
這比單純寫一堆 if "花多少" in message 成熟很多,因為系統不是靠大量關鍵字判斷,而是讓 Gemini 負責理解使用者的自然語言。
查詢消費資料成功,但查詢訂閱時連線突然中斷,出現 RemoteDisconnected 錯誤。這類問題很適合用來理解:API 能正常運作,不代表每一次 API Request 都一定成功——網路服務本來就可能遇到 Connection Error、Timeout、API 暫時無法使用、Rate Limit 等狀況。目前先確認核心功能正確,例外處理留待之後(Day 29)再進一步補強。
query 意圖判斷,資料類型擴充為 expense / subscription / query / chat現在 SubWise 已經可以做到:
1.查詢所有訂閱
👤 我有哪些訂閱?
🤖 🔔 SubWise 訂閱服務
📌 Netflix |💰 NT$390 / monthly |📅 下次扣款:2026-08-15 |🟢 Active
SubWise 直接從 Google Sheets 撈出目前的訂閱清單,不需要使用者自己記得訂閱了什麼:
2.查詢特定訂閱
👤 Netflix 什麼時候扣款?
🤖 📌 Netflix |💰 NT$390 / monthly |📅 下次扣款:2026-08-15 |🟢 Active
加上關鍵字「Netflix」後,SubWise 能精準鎖定單一訂閱回覆,而不是把所有訂閱都列出來讓使用者自己找:
3.查詢本月消費
👤 我這個月花多少錢?
🤖 💰 SubWise 消費查詢
📅 查詢期間:month |💵 總支出:NT$610
📋 消費明細:
2026-08-08|Food|NT$150|Lunch
2026-08-08|Transport|NT$50|MRT
2026-08-11|Food|NT$120|午餐
2026-08-11|Transport|NT$50|搭捷運
2026-08-11|Food|NT$120|午餐
2026-08-11|Food|NT$120|午餐
這是今天最重要的一組測試:SubWise 不只算出總支出,還能列出明細,代表日期篩選與資料彙整都已經正常運作:
4.一般對話
👤 你是誰?
🤖 💬 你好!我是 SubWise,你的 AI 智慧記帳與訂閱管理管家。
即使是單純聊天,SubWise 也能正確判斷「這不是查詢,也不是記帳」,讓 chat 與資料查詢自然分流,不會誤觸資料庫:
Day 12 的重點是讓 Gemini Query 真正接上整個 SubWise Service Router,讓「我今天花多少?」「我這個月花多少?」「我有哪些訂閱?」「Netflix 什麼時候扣款?」全部透過同一套流程自動判斷。到那時候,SubWise 才會開始真正有「Agent」的感覺。我們明天見!