30 天到了。
第一天我寫下這段話:
這次鐵人賽對我來說,不只是完成 30 篇文章,更希望透過每天一步一步的累積,
真正理解 AI 是如何從「收到指令」走向「自主完成任務」。
今天來回答這個問題。
Day 1 前言:為什麼想做這個題目
Day 2-7 Python 基礎:變數、判斷、迴圈、List、Dict、Function
Day 8-11 穩固地基:例外處理、檔案、JSON、Class
Day 12-15 連上世界:環境變數、HTTP、天氣 API、Tool 封裝
Day 16-17 看見與記錄:資料分析、logging 與 trace
Day 18-20 AI 進場:第一次呼叫、Prompt 設計、結構化輸出
Day 21-22 轉捩點:Tool Use、工具註冊表
Day 23-26 架構思考:Workflow、控制流、自主的邊界、記憶
Day 27-29 整合專案:設計、實作、驗收
Day 30 回顧
從 print("Hello") 到一個會自己決定要查什麼、記得我不吃牛肉的助理。
回到開頭的問題:AI 是怎麼從「收到指令」走向「自主完成任務」的?
我的答案是:它從來沒有真的「自主」,是我們設計的結構讓它看起來自主。
具體來說,有三個關鍵的轉折:
# 之前
"好的,我幫你記下明天下午三點跟客戶開會"
# 之後
{"action": "create_event", "title": "跟客戶開會", "date": "2026-10-04"}
當 AI 的輸出可以被程式讀懂,它的判斷就變成了控制流。
這是第一道門。在這之前,AI 只能產生給人看的文字;在這之後,它能觸發動作。
模型:「我想呼叫 get_weather」
↓
程式:實際執行,拿到結果
↓
程式:把結果傳回給模型
↓
模型:「根據這個結果,我下一步要…」
迴圈形成了。
前一步的結果影響下一步的決定,這就是「自主」的技術本質。它不是什麼神祕的東西,就是一個 while 迴圈加上把結果餵回去。
if response.stop_reason != "tool_use":
return answer # 模型說「我講完了」
在傳統程式裡,迴圈什麼時候結束是我們寫的。在 Agent 裡,是模型決定的。
這才是真正的分界線。
我們仍然設上限(max_turns、Budget),但在上限之內,何時停止是它說了算。
我原本以為做 Agent 的難點在於「怎麼讓 AI 更聰明」。實際做下來,卡住我最久的都是工程問題:
required=False(Day 24)safe_run()(Day 15)模型本身很強。弱的是它周圍的那些程式碼。
而這些工程能力,Day 8 到 Day 17 就全部涵蓋了。那十天看起來跟 AI 無關,但它們才是 Agent 能不能穩定運作的關鍵。
這是最違反直覺的一課。
我一開始把 system prompt 當成「說明文字」,寫得很隨意。後來才發現,這些東西的影響力跟程式碼一樣大:
| 我寫的文字 | 決定了什麼 |
|---|---|
| Tool description | AI 知不知道有這個能力、何時該用 |
| Schema description | AI 填的參數對不對 |
| 錯誤訊息 | AI 失敗後知不知道怎麼辦 |
| System prompt | AI 的行為邊界與優先順序 |
Day 29 那個「假裝設好鬧鐘」的 bug,修法不是改程式,是把 prompt 裡抽象的規則改成可執行的檢查步驟。
所以我現在會用對待程式碼的方式對待 prompt:版本控制、寫測試、記錄為什麼這樣改。
這是我覺得最有意思的發現。
# ❌ AI 不知道該怎麼辦
"查詢失敗"
# ✅ AI 知道可以重試
"查詢天氣逾時,請稍後再試"
# ✅ AI 知道不該重試,該問使用者
"找不到「東京」,本工具只支援台灣縣市"
# ✅ AI 知道要換個方式
"你已經用相同參數呼叫過兩次了,結果不會改變。請改用其他方式,或告訴使用者目前的困難。"
在傳統程式裡,錯誤訊息是給人看的。在 Agent 裡,錯誤訊息會直接進到模型的 context,影響它的下一步決策。
Day 29 的實測裡,add_todo 失敗了一次(模型給了「下週五」而不是日期格式),但它看到錯誤訊息後自己修正重試成功了。好的錯誤訊息讓 Agent 有自我修復的能力。
這個結論有點反高潮,但我覺得很重要。
Day 29 的實測數據:
| 路徑 | 成本 | 耗時 |
|---|---|---|
| 純程式 | $0.0002 | 0.7s |
| Agent | $0.0412 | 7.8s |
差 130 倍。
而「列出待辦清單」這件事,用 Day 16 的排序加格式化就做得很好,根本不需要 AI。
所以我的原則變成:
先問「這件事一定要 AI 嗎」,再問「要用多聰明的 AI」。
Router 的設計(Day 23)就是這個原則的實踐——80% 的請求走便宜的路,20% 的長尾才交給 Agent。實測省了約 50% 成本。
模型很願意幫忙,願意到會腦補。
Day 29 那個鬧鐘的例子,它寧可說謊也要「幫上忙」。這不是它壞,是它被訓練成要有幫助。
所以我的 system prompt 裡,關於「不要編造」「不要假裝」「不確定就問」的規則,比關於「要做什麼」的規則還多。
一個可靠的助理,誠實比能幹重要。
Day 25 我寫過這句話,現在更確定:
確認機制不是「因為 AI 不可靠」,而是「因為那是我的事」。
如果 Agent 刪掉了我的資料,我不能說「這是 AI 決定的」。那是我的資料,我的責任。
技術會進步,模型會更可靠。但「不可逆的決定要有人負責」這件事,我覺得不會因為模型變強就改變。
做得對的:
會改的:
一個可以每天用的生活助理:
life-assistant/
├── 10 個工具(天氣、待辦、時間、記憶、計算)
├── 3 個 Workflow(簡報、天氣、待辦)
├── 1 個 Agent 迴圈(含預算、確認、trace)
├── 2 層記憶(對話歷史、長期偏好)
└── 完整的基礎設施(設定、日誌、追蹤、測試)
實測三天:45 次請求,$0.94,沒有崩潰過。
我現在每天早上真的會打開它。這點對我來說比程式碼本身更有價值——它不是一個 demo,是一個我會用的東西。
給想繼續的人(包括我自己)幾個方向:
| 方向 | 做什麼 |
|---|---|
| 接更多資料源 | Google Calendar、Notion、發票 API、台鐵時刻 |
| 換個介面 | LINE Bot、Telegram Bot、或簡單的網頁 |
| 主動提醒 | 用系統排程每天早上自動推送簡報 |
| 寫更多測試 | 補上 workflow 層和 Agent 層的測試 |
因為架構是分層的,這些改動都不會動到核心邏輯。
| 方向 | 要學什麼 |
|---|---|
| RAG(檢索增強) | 向量資料庫、embedding、語意搜尋 |
| 多 Agent 協作 | 一個 Agent 規劃、另一個執行 |
| MCP | Model Context Protocol,工具的標準化協定 |
| 評估(Eval) | 系統性地測量 Agent 的表現,而不是憑感覺 |
我自己最想做的是評估。這 30 天我都是靠手動測試和直覺判斷「好不好」,但這不可持續。有一組自動化的評估集,才能放心地修改 prompt。
不是技術問題,但值得想:
如果你也想做類似的東西,我的建議:
1. 不要一開始就用框架
LangChain、LlamaIndex 這類框架很強大,但如果你不知道底下發生什麼事,出問題時完全束手無策。
Day 21 那三十幾行的 Agent 迴圈,是整個系列最有價值的程式碼。先自己寫一遍,再去用框架,你會知道框架在幫你做什麼。
2. 從一個你真的會用的東西開始
我選生活助理,是因為我每天早上真的想知道要不要帶傘。
如果做一個你不會用的東西,你不會發現那些只有真實使用才會遇到的問題(空清單、API 掛掉、第十輪對話變貴)。
3. 把基礎打好
例外處理、檔案、JSON、logging——這些看起來跟 AI 無關的東西,才是 Agent 能不能穩定運作的關鍵。
4. 從最簡單的開始
能用 if-else 嗎?→ 用
不行的話,能用單次 AI 呼叫嗎?→ 用
不行的話,能用固定 Workflow 嗎?→ 用
真的都不行 → 才用 Agent
5. 記錄一切
Day 17 的 logging 和 trace,是我整個系列最推薦的投資。
第一天我說:
那麼,就從 Python 開始吧。
30 天後,我想說的是:
AI Agent 不是魔法。
它是 while 迴圈、try/except、json.loads()、一個 HTTP 請求、還有一些寫得夠清楚的文字。
這 30 天最大的收穫,不是學會了怎麼用 AI,而是理解了AI 在一個系統裡的位置——它很擅長理解語意和處理模糊,但它需要一個穩固的工程結構把它撐起來。
那個結構是我們寫的。
也因為這樣,「自主決策」這四個字,其實一直都是人在決定的——我們決定給它什麼工具、什麼資訊、什麼邊界、什麼時候該停。
AI 負責在我們設計的空間裡做選擇。設計那個空間,才是我們的工作。
感謝每一位看到這裡的人。
這 30 天不是終點。程式碼還會繼續改,助理還會繼續用。
如果你也想開始,現在就是好時機。
那麼,就從 Python 開始吧。
— pzhiqi,2026.10.14
| Day | 主題 |
|---|---|
| 1 | 前言 |
| 2 | 開始之前,先從 Python 打好基礎 |
| 3 | 讓 Python 記住資料:變數與基本資料型態 |
| 4 | 讓程式開始做決定:if、elif、else |
| 5 | 讓程式處理多筆資料:List、Loop 與 Agent 的記憶迴圈 |
| 6 | 讓資料擁有結構與名稱:Dictionary 與 Agent 的資料傳遞 |
| 7 | 將程式碼打包成可重用的模組:Function 與 Agent 的 Tool 第一步 |
| 8 | 讓程式在出錯時不會停下來:例外處理與 Agent 的穩定性 |
| 9 | 讓資料離開記憶體:檔案讀寫與 Agent 的長期記憶 |
| 10 | 讓資料能被交換:JSON 與 Agent 的共通語言 |
| 11 | 用 Class 描述一件事:物件導向與 Agent 的角色設計 |
| 12 | 把鑰匙藏好:環境變數、.env 與 API Key 管理 |
| 13 | 讓程式連上外面的世界:HTTP 與 API 基礎 |
| 14 | 第一個真實資料來源:串接中央氣象署天氣 API |
| 15 | 什麼才算一個「工具」?Tool 的介面設計 |
| 16 | 從一堆資料到一句結論:排序、篩選與統計 |
| 17 | 讓程式記住它做過什麼:logging 與 Agent 的可觀測性 |
| 18 | AI 進場:第一次用 Python 呼叫大型語言模型 |
| 19 | 把話說清楚:Prompt 設計的原則與實作 |
| 20 | 讓 AI 回傳程式能用的東西:結構化輸出 |
| 21 | 讓 AI 動手:Tool Use 的原理與第一次實作 |
| 22 | 工具註冊表:讓 Agent 的能力可以隨時擴充 |
| 23 | 從單次呼叫到流程:什麼是 Workflow |
| 24 | 讓流程能轉彎:Workflow 的控制流與狀態管理 |
| 25 | 自主決策的分界線:什麼時候該讓 AI 自己決定 |
| 26 | Agent 的記憶:從對話歷史到長期偏好 |
| 27 | 生活助理專案(一):需求拆解與系統設計 |
| 28 | 生活助理專案(二):工具層與流程層實作 |
| 29 | 生活助理專案(三):整合、驗收與實測結果 |
| 30 | 從 Prompt 到自主決策:30 天回顧與下一步 |