昨天的 Day 12,完成了 SubWise 的第一個核心能力:使用者說「我今天買咖啡花了 80 元」→ Gemini AI 辨識消費 → 寫入 Google Sheets。
今天則往前再走一步。如果 SubWise 已經能夠「記帳」,下一個問題自然就是:「那我可以問它,我到底花了多少錢嗎?」
因此 Day 13 的目標,是讓 SubWise 開始具備「查帳」能力,讓使用者可以直接用自然語言詢問自己的消費與訂閱資料。今天主要完成四件事:建立 Query Service、讓 Gemini 判斷使用者的查詢意圖、從 Google Sheets 篩選與計算資料、將查詢結果透過 LINE 回傳給使用者。
前面開發過程中已經建立過 query_service.py,這次沒有重新打造,而是重新檢查它是否符合今天的需求。Query Service 主要負責三件事:
today、yesterday、week、month、all 五種區間Amount 欄位加總這讓 query_service.py 專門負責「資料處理」,而不是把所有邏輯都塞進 app.py。
修改 Gemini 的 System Prompt,新增查詢類型:
{
"type": "query",
"target": "expense",
"period": "yesterday",
"keyword": null
}
Gemini 不需要自己去讀 Google Sheets,只需要回答「使用者到底想查什麼?」,例如「我昨天花多少錢?」對應 period: yesterday,「我這個月花多少錢?」對應 period: month,「我有哪些訂閱?」對應 target: subscription。這裡採用的核心設計是:Gemini 負責理解人話,Python 負責處理資料,讓 AI 和實際資料操作各司其職,也比較容易維護。
修改 app.py,新增 query 的處理流程。當 Gemini 回傳查詢意圖,Python 就會呼叫 query_service、讀取 Google Sheets、篩選指定日期、計算總金額、整理結果、回傳 LINE。整體架構變成:
使用者 → LINE Bot → Gemini AI → 判斷 Query Intent
→ Query Service → Google Sheets → 篩選/計算/格式化 → LINE 回覆
先在本機測試 query_service.py,查詢昨天消費得到「總支出 NT$320」,明細也正確列出三筆;查詢本月消費得到「總支出 NT$930」,代表日期篩選與加總邏輯都正常。
接著測試 Gemini + Query Service 是否真的串起來,直接輸入「我昨天花多少錢?」,Terminal 成功顯示 Gemini 判斷出查詢意圖、Python 呼叫 query_service 查詢 Google Sheets,最後得到「總支出 NT$320」,代表 Gemini 的「語意理解」與 Python 的「資料查詢」已經成功接在一起。
程式部署到 Render 後,實際用 LINE 測試三種情境,全部成功:
查詢昨天消費:輸入「我昨天花了多少錢」,SubWise 回覆總支出 NT$320 與三筆消費明細
查詢訂閱:輸入「我有哪些訂閱」,SubWise 成功從 Google Sheets 找到 Netflix(NT$390 / monthly,下次扣款 2026-08-15)
查詢本月消費:輸入「我這個月花了多少錢」,SubWise 成功計算出總支出 NT$930 並列出本月所有消費明細
至此,Day 13 的核心功能正式完成。
query 意圖判斷(target / period / keyword)app.py,串接 LINE Bot今天完成測試後提交 Git,Commit 8c0b74c,確認 git status 顯示 working tree clean,代表今天的程式版本已經完整保存。
目前 SubWise 已經具備:理解自然語言查詢、查詢今日/昨日/本月/全部消費、計算指定期間總支出、顯示消費明細、查詢訂閱服務與下次扣款日期,並透過 LINE 直接回傳結果。
目前 SubWise 已經能透過 LINE「記帳」與「查帳」,但這兩項功能都建立在使用者願意主動打字描述消費內容的前提上。明天 Day 14,我將開始讓 SubWise 具備「看得懂發票」的能力——串接 Gemini 的 Vision 功能,讓使用者只要拍一張發票照片傳到 LINE,SubWise 就能自動辨識出品項與金額,不必再手動輸入。
這會是 SubWise 從「AI 文字記帳」正式邁向「AI 多模態記帳」的第一步。我們明天見!