iT邦幫忙

2026 iThome 鐵人賽

DAY 8
0
ChatGPT & Codex

AI 時代的輕量化開發:ChatGPT 打造 LINE 多模態記帳與續訂預警 Agent系列 第 8

[Day 08] 從規則式 Bot 到 AI Agent:SubWise 首次串接 Gemini API

  • 分享至 

  • xImage
  •  

前言

前幾天已經完成 SubWise 的基礎建設:

  • Day 03:部署 Flask Backend 到 Render
  • Day 04:完成 LINE Webhook 串接
  • Day 05:完成 Echo Bot 與 Command Router
  • Day 06:建立 Google Cloud Service Account 與 Google Sheets 環境
  • Day 07:完成 Google Sheets CRUD 資料層

到了今天,終於要開始加入整個 SubWise 最重要的核心能力——AI。今天的目標是讓 SubWise 不再只是「收到訊息 → 回覆訊息」的 LINE Bot,而是開始具備理解使用者語意的能力。

今天完成的內容不只是「API 有成功呼叫」,而是包含:安裝並確認 Gemini Python SDK、建立獨立的 Gemini 模組、製作 Interactive Chat 測試程式、建立 SubWise AI 身份與 System Prompt、驗證 AI 理解消費與訂閱情境、加入 API 錯誤處理並實際測試。也就是說,今天不只是「接上 Gemini」,而是開始建立真正屬於 SubWise 的 AI。


今日實作實錄

一、確認 Gemini SDK

啟用虛擬環境後,確認 google-genai 是否已經安裝:

pip show google-genai

成功看到 Name: google-genai 與版本號,代表 Gemini Python SDK 已經可以使用。

二、建立 Gemini Client

建立 gemini_client.py,負責處理 Gemini API:

import os
from dotenv import load_dotenv
from google import genai

load_dotenv()

client = genai.Client(
    api_key=os.getenv("GEMINI_API_KEY")
)

這裡的概念跟之前串接 Google Sheets 很像——不把 API Key 寫死在程式碼裡,而是從 .env 讀取 GEMINI_API_KEY,避免把金鑰直接寫進 GitHub。

三、第一次呼叫 Gemini API

建立呼叫函式:

def ask_gemini(prompt):
    response = client.models.generate_content(
        model="gemini-3.6-flash",
        contents=prompt
    )
    return response.text

執行 ask_gemini("請用一句話介紹 SubWise 是什麼。"),資料流變成:
Python → Gemini Client → Gemini API → AI 回覆

這是 SubWise 第一次真正擁有 AI 能力。

四、建立 Interactive Chat 測試工具

如果每次都要修改程式才能測試問題太麻煩,因此另外建立 test_gemini.py,做成簡單的互動式聊天介面,可以連續輸入問題直到輸入 exit 才結束,讓 Prompt 測試變得非常方便。

五、建立 SubWise 的 AI 身份

單純串接 Gemini 還不夠,因為 Gemini 本身是通用型 AI,不會自動知道自己是 SubWise。因此加入 System Prompt:

SYSTEM_PROMPT = """
你是 SubWise,一個 AI 智慧記帳與訂閱管理管家。

你的主要工作是協助使用者:
1. 管理日常消費
2. 分析消費類別
3. 管理訂閱服務
4. 提醒即將發生的訂閱扣款
5. 提供簡單、實用的財務管理建議
"""

再把 Prompt 和使用者問題一起送給 Gemini:

response = client.models.generate_content(
    model="gemini-3.6-flash",
    contents=f"{SYSTEM_PROMPT}\n\n使用者問題:{prompt}"
)

這樣 Gemini 就開始知道「我是 SubWise」,是今天很重要的一個轉變。

六、加入 SubWise 的行為規則

除了身份之外,也加入了基本規則:使用繁體中文回答、回覆簡潔容易理解、協助判斷消費類別、優先判斷 Netflix / Spotify / ChatGPT 等服務是否屬於訂閱、不自行捏造使用者沒有提供的資訊、資訊不足時主動詢問。這些規則看起來簡單,但實際測試後效果很明顯。

七、測試 SubWise AI 的理解能力

完成 System Prompt 後,實際測試四種情境:

  • 身份測試:輸入「你是誰?」,Gemini 成功回答「我是 SubWise,你的 AI 智慧記帳與訂閱管理管家」,代表 System Prompt 已經生效。
  • 記帳情境理解:輸入「我今天午餐花了120元」,Gemini 能理解拆解成日期、項目、金額、類別,而這整個過程完全沒有寫 if "午餐" in text 這種規則式判斷,是 AI 自己理解自然語言的結果,這正是之後「AI 自動記帳」的基礎。
  • 訂閱服務辨識:輸入「Netflix 算什麼?」,Gemini 能判斷這是訂閱服務、娛樂、數位串流,還會進一步詢問扣款金額、日期、週期,符合未來訂閱管理的方向。
  • 資訊不足時主動詢問:輸入「我今天花了120元」(沒說花在哪),AI 沒有亂猜是午餐,而是反問「這筆錢是用在哪裡呢?」,這正是 Prompt 裡「不要自行捏造使用者沒有提供的消費資訊」發揮作用的結果,對未來真正自動記帳非常重要。

SubWise 不只是回答問題,還能理解消費情境、判斷訂閱服務,甚至在資訊不足時主動反問——這些行為完全是靠 Prompt 設計出來的,沒有寫任何一行 if-else 判斷式:
https://ithelp.ithome.com.tw/upload/images/20260809/20178527Vwk1X6kERS.png
https://ithelp.ithome.com.tw/upload/images/20260809/201785276b6nwoawr2.png
https://ithelp.ithome.com.tw/upload/images/20260809/201785271TSiKLHUyF.png

八、加入 API 錯誤處理並實際測試

把 API 呼叫包進 try/except,讓 SubWise 遇到 API 問題時不會直接噴出一大串 Python Traceback:

def ask_gemini(prompt):
    try:
        response = client.models.generate_content(
            model="gemini-3.6-flash",
            contents=f"{SYSTEM_PROMPT}\n\n使用者問題:{prompt}"
        )
        return response.text
    except Exception as e:
        print(f"❌ Gemini API 發生錯誤:{e}")
        return (
            "⚠️ SubWise AI 暫時無法回應。\n\n"
            "可能原因:\n"
            "• Gemini API 額度不足\n"
            "• 網路連線異常\n"
            "• AI 服務暫時忙碌\n\n"
            "請稍後再試。"
        )

為了確認錯誤處理真的有效,故意把模型名稱改成 gemini-invalid-test-model 再執行測試。API 確實回傳 404 NOT_FOUND,但這次 Python 沒有直接崩潰,而是顯示了設計好的友善提示訊息。這次驗證也讓我確認:錯誤處理不是「寫了就算完成」,而是真的要故意製造錯誤測試看看。

故意讓程式出錯,確認即使 Gemini API 發生問題,SubWise 也不會直接崩潰,而是給使用者看得懂的提示:
https://ithelp.ithome.com.tw/upload/images/20260809/20178527VfzXxrDJy0.png


今天踩到的坑

1.429 RESOURCE_EXHAUSTED(API 配額不足)
第一次正式串接 Gemini 時,API 回傳 429 RESOURCE_EXHAUSTED,錯誤訊息顯示已超過目前的配額限制。這次踩坑讓我發現:API 串接成功不代表永遠都能正常使用,實際開發還需要考慮 API 配額、RPM/TPM 限制、模型可用性、API Key 正確性、網路狀態等因素,這也讓「錯誤處理」變得非常重要。

2.404 NOT_FOUND(模型不存在)
後續確認模型設定時又遇到 404 NOT_FOUND,原因是當時使用的模型名稱無法提供給目前的 API 使用,最後改成測試成功的 gemini-3.6-flash 才解決。這也提醒我:不要看到網路文章上的模型名稱就直接複製,AI SDK 與模型版本都可能持續更新,實際使用時應該確認目前 API 所支援的模型。

3.API 錯誤不能直接丟給使用者
真正的產品需要把底層 API 錯誤轉換成使用者看得懂的訊息,這也是加入 try/except 錯誤處理的原因。


今日成果整理

  • 安裝並確認 Gemini Python SDK
  • 建立 Gemini API Client(gemini_client.py
  • 第一次成功呼叫 Gemini API
  • 建立 Interactive Chat 測試工具
  • 建立 SubWise AI 身份與 System Prompt
  • 加入行為規則,驗證記帳情境與訂閱辨識理解
  • 加入 API 錯誤處理並故意測試驗證
  • Git Commit / GitHub Push

今天最大的成果不是「成功叫 AI 回答問題」,而是 SubWise 開始從一個普通的 LINE Bot,逐漸變成真正的 AI Agent:
使用者 → SubWise AI Layer → Gemini API → AI 理解使用者語意

而前幾天完成的 Google Sheets,也在另一端準備好了:
LINE Bot → SubWise AI → Google Sheets

接下來真正的挑戰,就是把這兩個部分接起來。


明日預告

Day09 我會嘗試讓 Gemini 將「我今天午餐花了 120 元」這樣的自然語言,轉換成程式可以直接使用的結構化資料:
自然語言 → Gemini → 固定 JSON → Python → Google Sheets

這會是 SubWise 從「會聊天的 AI」進化成「真的可以幫我記帳的 AI」的重要一步。Day 08 完成,下一站,讓 AI 開始真正理解資料。我們明天見!


上一篇
[Day 07] 讓 SubWise 真正「記住資料」:Google Sheets CRUD 與資料層模組化
下一篇
[Day 09] 讓 AI 不只會聊天:把 Gemini 自然語言轉成程式看得懂的 JSON
系列文
AI 時代的輕量化開發:ChatGPT 打造 LINE 多模態記帳與續訂預警 Agent20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言