← → 翻页 · ESC 索引
生成式 AI 職訓實務應用班 140hr · 弄一下工作室
D14 / 20
Day 14 · Part 6 · CH6-3 + CH6-4

Function + Agents

讓模型不只「說話」,還能動手

從 Tool Schema 到 ReAct Loop,從把 RAG 包成工具到三大陷阱防禦。今天結束,你能寫出第一個會循環呼叫工具的 Agent,並守得住生產環境。

Vol.14·Function Calling · ReAct · Tool-as-RAG · 防禦·2026
Duration · 4-5 小時授課 · D14 / 20
本日為 Part 6 · AI 應用開發進階的核心一日
— D14 / 20 —
Why Tools · 為什麼要讓模型動手
02 / 30
The Premise · 本日主張
不會用工具的 LLM, 永遠停在聊天框裡。

Function Calling 是 LLM 從「文字產生器」變成「行動代理」的開關。
但執行權永遠在你手上——這是它能上生產的前提。

— D14 核心主張·Tools 的本質是「結構化意圖」
Page 02 · The Premise
— · —
D14 · Learning Outcomes
03 / 30 講義 · CH6-4
OUTCOMES · 今天結束你會做到

四件事

不是「聽過」,而是「跑得起來」。

Outcome 01
寫得出 Tool Schema
用 JSON Schema 定義一個工具,description 寫到模型能正確判斷觸發。
Outcome 02
跑得動 ReAct Loop
手寫一個會循環的 Agent,至少呼叫兩次工具再收斂出答案。
Outcome 03
擋得住三大陷阱
無限迴圈、工具幻覺、未處理失敗——三種防禦各自寫在程式哪一段。
Page 03 · 學習目標 · 4-5 hours
5 Acts · D14
第一幕 · Function Calling 起點
Act I · 04 / 30
Act I · CH6-4 §1 · 約 80 分鐘

結構化意圖

模型不執行程式,只輸出「我想呼叫什麼」

搞清楚這個邊界,你才知道為什麼 Function Calling 是安全的、可控的,
而不是「讓 AI 直接動你的資料庫」這種恐怖故事。

Act I 開幕
— Function Calling 三步驟 —
Context · 為什麼純聊天不夠
05 / 30 講義 · CH6-4
The Limit · 純文字模型的天花板

模型不知道現在

它不知道現在幾點、不知道你的庫存、
不知道訂單狀態、不知道客戶是誰。
所有「即時 / 私有 / 動態」資料,它都沒有。

Tools 是這片空白的——
讓模型「知道何時去問」,由你決定「答案怎麼回」。
— D14 · Function Calling 動機
Therefore · 所以

Tools 補三類能力:

  • 即時資訊:天氣、匯率、新聞
  • 私有資料:訂單、客戶、內部知識
  • 副作用操作:寄信、寫入、付款

模型只負責判斷該呼叫哪個
執行、權限、稽核——全在你的程式裡。

Page 05 · The Limit
Act I · §1
Boundary · 邊界界定
06 / 30 講義 · CH6-4
Who Does What · 各自負責什麼

模型輸出意圖,程式才執行

Model · 模型負責

判斷 / 組裝 / 解讀

  • 讀 description 判斷該用哪個工具
  • 從對話拆出參數,組成 JSON
  • 看 tool_result 決定下一步
  • 不能直接呼叫網路、檔案、資料庫
Code · 程式負責

驗證 / 執行 / 回傳

  • 驗證工具名 + 參數合法
  • 真正去呼叫 API、查表、寫 DB
  • 把結果結構化包回 tool_result
  • 所有副作用都要過你這關
這就是 Function Calling 的安全性來源。模型再怎麼幻想要「rm -rf」,也得通過你程式碼那關。
Page 06 · Boundary
Act I · §1
How It Works · 運作三步驟
07 / 30 講義 · CH6-4
The Cycle · 一輪 Function Calling

三步走,反覆直到收束

Step 01

你定義工具

名稱 + description + JSON Schema 參數定義,
一次傳給模型作為「可用工具清單」。

Step 02

模型回 JSON

模型決定「呼叫哪個工具、帶什麼參數」,
回傳 tool_use 區塊,不執行任何事

Step 03

程式接手

你的程式真正執行,把結果以 tool_result
送回模型繼續對話,必要時再循環。

Step 01 是一次性設定,Step 02-03 是每次對話的循環。記住這個區分,下一幕的 Loop 就理所當然。
Page 07 · The Cycle
Act I · §1
Tool Schema · Anthropic Claude 範本
08 / 30 講義 · CH6-4
Reference Schema · 照抄起手式

get_weather 的標準寫法

// Anthropic Claude · 工具定義範例
{
  "name": "get_weather",
  "description": "查詢指定城市的當前天氣",
  "input_schema": {
    "type": "object",
    "properties": {
      "city": {
        "type": "string",
        "description": "城市名稱,例如 台北"
      },
      "unit": {
        "type": "string",
        "enum": ["celsius", "fahrenheit"]
      }
    },
    "required": ["city"]
  }
}
三個必填欄位·name / description / input_schema·required 決定強制度
Page 08 · Schema Reference
Act I · §1
The Crucial Field · description 是寫給模型看的
09 / 30 講義 · CH6-4
Description · 觸發精準度的命脈

寫 description = 寫給模型的說明文件

級別
寫法
結果
"取得天氣"
模型常常猜不到要傳什麼參數,或對錯時機呼叫。
"查詢城市天氣"
會用,但分不清「現在天氣」vs「未來預報」這種近義場景。
"查詢指定城市的當前天氣,僅限主要城市,不包含未來預報"
觸發精準、邊界清楚、模型不會誤用。
把 description 當給新進工程師看的 docstring——寫清楚「做什麼 / 不做什麼 / 什麼時候用」。
Page 09 · Description as Docstring
Act I · §1
Hands-on · 迷你練習 1(CH6-4 mp1)
10 / 30 講義 · CH6-4
MINI PRACTICE 01 · 約 20 分鐘

寫一個會用天氣 + 算術兩個工具的 Agent

Mock 兩個函式,組一個 while loop,丟一個「台北比東京熱幾度?」
看模型是不是真的會依序呼叫 get_weather × 2 → calculator × 1。

01
定義兩個 schema:get_weather(city)calculator(expression),description 寫到能精準觸發。
02
寫 while loop:只要 stop_reason === 'tool_use' 就解析、執行 mock、把 tool_result push 回 messages。
03
max_turns = 5 保護機制,超過就強制跳出。
04
丟「台北跟東京現在差幾度?」觀察 console log 的輪次順序與最終文字答案。
講義 CH6-4 mp1 已附完整 schema + mock 行為 + 範例 Prompt + 預期 console 輸出。學員照抄即可跑。
Page 10 · Mini Practice 01
Act I · 收尾
第二幕 · ReAct Agent Loop
Act II · 11 / 30
Act II · CH6-4 §2 · 約 60 分鐘

觀察 → 思考
行動 → 觀察

單次工具呼叫解決不了複雜任務,循環才能

ReAct 是當代最常見的 Agent 架構。
看懂它的本質——「狀態機 + 對話歷史」——你就會自己組任何 Loop。

Act II 開幕
— Reasoning + Acting —
ReAct Loop · 觀察 → 思考 → 行動 → 觀察
12 / 30 講義 · CH6-4
Reasoning + Acting

四個階段,循環直到收束

01 Observe

接收狀態

使用者輸入 + 上輪 tool_result。

02 Think

推理下一步

模型決定要呼叫哪個工具、帶什麼參數。

03 Act

輸出 tool_use

程式接手執行,取得結果。

04 Observe ↻

回到第一步

直到 stop_reason = end_turn 才結束。

Reasoning 與 Acting 交織——這就是 ReAct 名稱的來源。模型可以「想一下、做一下、再想一下」,而不是一次想完所有事。
Page 12 · ReAct Cycle
Act II · §2
Implementation · Agent Loop 程式步驟
13 / 30 講義 · CH6-4
5 Steps · 從零組一個 Loop

實作速查表

01
系統提示 + 工具清單
告訴模型角色、可用工具、何時該用工具而非直接回答。
02
呼叫 API
模型回 stop_reason: "tool_use"(Claude)/ finish_reason: "tool_calls"(OpenAI)= 想用工具。
03
解析 + 執行
取出 tool_use 區塊,把 input 傳入本地函式取結果。
04
tool_result 回送
tool_result 角色把結果送回,讓模型繼續推理。
05
循環直到 end_turn
只要還在要工具就繼續。最終模型輸出文字答案,結束 Loop。
關鍵變數·messages array · stop_reason · max_turns · tool_use_id
Page 13 · Loop Reference
Act II · §2
The Essence · Agent Loop 的本質
14 / 30 講義 · CH6-4
Mental Model · 真正的心智模型

Agent Loop 是狀態機,不是 ChatGPT

你的程式負責維護對話歷史(messages array)
模型每次都看到完整歷史,所以它能「記住」前幾輪的工具結果繼續推理。

模型本身無記憶。記憶在你的陣列裡。

Debug 第一招:把 messages 印出來。每一輪結束 console.log(JSON.stringify(messages, null, 2)),你就能看到對話的真實樣貌——比 ChatGPT 介面誠實一百倍。
三種角色·user · assistant · user(tool_result)·都疊在同一個 array
Page 14 · State Machine
Act II · 收尾
第三幕 · Tools 串知識(RAG-as-Tool)
Act III · 15 / 30
Act III · CH6-3 整合 · 約 60 分鐘

RAG
包成工具

Agent 需要查資料時,去呼叫一個叫 search_docs 的 function

RAG 不一定要寫成獨立 pipeline。
包成工具給 Agent 用,模型自己決定何時查、查什麼——更彈性,也更接近真實場景。

Act III 開幕
— RAG 不是 pipeline,是 tool —
Why RAG · Agent 為何需要查資料
16 / 30 講義 · CH6-3
The Gap · 模型不知道什麼

訓練資料不會更新
你的文件會。

公司 SOP、客戶資料、產品規格、會議紀錄、新政策——
這些是模型永遠不知道的「私有現在」。

RAG = Retrieval-Augmented Generation
讓 AI「讀你的文件回答問題」,而不是靠訓練資料猜。
So · 因此

在 D14 的 Agent 架構下:

  • 把「查文件」當成一個 search_docs 工具
  • 模型自己判斷何時查、查什麼關鍵字
  • 查到的 chunk 變 tool_result 回送
  • 模型再決定要不要再查、或開始作答

RAG 變成 Agent 的一個工具,不是獨立流程。

Page 16 · Why RAG
Act III · §1
RAG Pipeline · 五個必經環節
17 / 30 講義 · CH6-3
Indexing(離線) + Querying(線上)

五環節速查表

01

文件讀取

PDF / Word / 網頁 → 純文字

02

切塊

Chunking(含 overlap)

03

Embedding

每塊轉向量入庫

04

檢索

問題 → 向量 → top-k

05

生成

問題 + chunks → LLM

01–03 · Indexing

離線、文件更新才重跑、可預先準備好。

04–05 · Querying

線上、每次提問執行、效能瓶頸通常在這。

Page 17 · RAG Reference
Act III · §1
Wrap as Tool · 把 RAG 變成 Agent 的工具
18 / 30 講義 · CH6-3
Two Architectures · 兩種接法

RAG pipeline vs RAG as tool

Path A · 傳統 RAG Pipeline

每次都查

使用者問 → 強制檢索 → 把 chunks 塞進 prompt → 模型生成。

簡單、可預期,但「閒聊也檢索」會浪費 token、也沒給模型決定權。

Path B · RAG as Tool(推薦)

模型自己判斷

search_docs(query) 變一個 tool。

模型自己決定:寒暄不查、含糊問題先查、需要交叉比對就查多次。和 Agent Loop 天然契合。

實務建議:從 Path A 起手(簡單可控);資料越來越多、查詢越來越多元,再升級到 Path B。
Page 18 · Pipeline vs Tool
Act III · §1
Hands-on · 迷你練習 2(融合 CH6-3 + CH6-4)
19 / 30 講義 · CH6-3
MINI PRACTICE 02 · 約 25 分鐘

請假 SOP 包成 Agent 的 search_docs 工具

用 CH6-3 的請假 SOP 範本,組一個有兩個工具的 Agent:
search_docs(query) + calculator(expr),問「我年資 2 年 10 個月,特休可以休幾天?」

01
把 CH6-3 mp1 的請假 SOP 切成 4 個 chunk(按 ## 標題切),存成 chunks: [{id, section, text}]
02
定義 search_docs(query) → top-2 chunks,mock 用關鍵字配對也行(不必真跑 embedding)。
03
沿用練習 1 的 Agent Loop,加上 calculator 工具,問「年資 2 年 10 個月,特休幾天?」
04
觀察:模型是否先 search_docs → 找到「年資每加 1 年再加 1 天」→ 再 calculator 算出 8 天?
關鍵體驗:學員會看到模型「先查、再算、再答」的真實 ReAct 過程。這是純 RAG pipeline 做不到的。
Page 19 · Mini Practice 02
Act III · 收尾
第四幕 · 三大陷阱與防禦
Act IV · 20 / 30
Act IV · CH6-4 §3 · 約 60 分鐘

會跑 ≠ 上線
三大陷阱

無限迴圈 · 工具幻覺 · 未處理失敗

Demo 跑一次就過很容易。生產環境跑一萬次都不爆——
你需要把這三個陷阱當成設計需求,而不是 bug 才補。

Act IV 開幕
— Defensive Agent Design —
Trap 01 · Infinite Loop
21 / 30 講義 · CH6-4
Trap 01 · 最貴的失敗模式

無限迴圈:API 帳單的隱形殺手

症狀

模型反覆呼叫同一工具,或工具回錯讓模型陷入重試循環。

結果:API 費用暴增,程式卡死,半夜被叫起來看 dashboard。

防禦

① max_turns 守門:通常設 5-10。
② 同工具計數:一輪對話內某工具被呼叫超過 N 次強制中止。
③ 監控 + 告警:上線後追單一對話的 turn 分佈。

MAX_TURNS 寫死、不接受使用者輸入。留個逃生口,永遠比相信模型「自己會收斂」便宜。
Page 21 · Trap 01
Act IV · §3
Trap 02 · Tool Hallucination
22 / 30 講義 · CH6-4
Trap 02 · 模型亂發明工具

工具幻覺:呼叫一個你根本沒有的東西

症狀

模型呼叫不存在的工具名(例:send_email),或傳錯型別(字串塞給 integer 欄位)。
沒防禦時程式會直接 throw、整個 Agent crash。

防禦(速查)
const TOOLS = new Set(['get_weather','calculator']);

if (!TOOLS.has(name)) {
  return {
    success: false,
    error: `tool "${name}" not available.
Available: ${[...TOOLS].join(', ')}`
  };
}
關鍵:把錯誤訊息結構化送回模型,讓它自我修正。不要 throw 中斷整個流程——模型有能力換一個工具或承認自己不會。
Page 22 · Trap 02 + Defense
Act IV · §3
Trap 03 · Unhandled Failure
23 / 30 講義 · CH6-4
Trap 03 · 工具自己爆但沒人接

未處理失敗:給模型空值,它就會自己編一個

症狀

外部 API 503、網路逾時、查無資料——程式沒包 try/catch,
或包了但只回空字串給模型。

結果:模型在不完整資訊下繼續推理,輸出錯誤答案,使用者以為是真的。

防禦

工具函式永遠回結構化結果
{ success: false, error: '...' }

模型看到「查詢失敗,原因是 503」會誠實地告訴使用者,
看到空字串才會開始捏造。

規律:失敗訊息越具體,模型越誠實。「upstream 503」「city not in database」比 null / "" 安全一萬倍。
Page 23 · Trap 03
Act IV · §3
Side Effects · 不可逆操作的紅線
24 / 30 講義 · CH6-4
The Hard Rule · 上線前必守

有副作用的工具絕不能讓 Agent 自由重試

寄信、寫資料庫、扣款、發出訂單——所有不可逆的事

max_turns + 結構化錯誤不夠,因為 Agent 可能在「成功了但你以為失敗」的情況下重試一次,
於是同一封信寄兩次、同一筆款扣兩次。

解法:在工具實作層加 idempotency key。
每次呼叫帶一個唯一 ID(例:order_uuid),同一個 ID 第二次來,工具直接回上次的結果,不重複執行。
Read 工具·可隨意重試·Write 工具·必須冪等
Page 24 · Idempotency
Act IV · §3
Hands-on · 迷你練習 3(CH6-4 mp2)
25 / 30 講義 · CH6-4
MINI PRACTICE 03 · 約 20 分鐘

刻意觸發三陷阱,驗證防禦真的擋得住

用練習 1 的 Agent 為基底,依講義 mp2 三段壓測腳本各跑一次,
驗證 max_turns / 白名單 / try-catch 三層防禦真的有效。

A · 無限迴圈
把 calculator 改成永遠回 need_recompute:true,看 max_turns 是否擋住。
B · 工具幻覺
誘導模型呼叫不存在的 send_email,驗證程式回「工具不存在」而非 crash。
C · 未處理失敗
讓 get_weather 故意 throw exception,確保回 {success:false} 而非 500。
→ 整理
「陷阱 → 症狀 → 防禦」三列對照表寫進你的 Agent README 或 docstring。
講義 CH6-4 mp2 已附三段壓測腳本與對應 5-15 行 JS 修法範例 + 上線前 5 條檢查清單。
Page 25 · Mini Practice 03
Act IV · 收尾
第五幕 · 程式 vs n8n
Act V · 26 / 30
Act V · CH6-4 §4 · 約 30 分鐘

寫程式
還是該拖節點

Function Calling 兩條實作路線的取捨

n8n AI Agent 節點 vs 直寫 Anthropic / OpenAI API。
不是哪個比較好,是哪個適合你眼前這個任務。

Act V 開幕
— Tool of the Tools —
Compare · 程式 API vs n8n AI Agent
27 / 30 講義 · CH6-4
Side-by-side · 六個面向對照

選擇速查表

面向
程式碼(Claude / OpenAI API)
n8n AI Agent 節點
工具定義
手寫 JSON Schema,完全自訂
拖拉節點,平台管理 Schema
自訂程度
最高,可精控每個參數
中,受限平台支援的工具
整合難度
需自行處理 Loop、狀態、錯誤
,平台處理迴圈與錯誤
適用情境
嵌入既有系統、高度客製工具鏈
快速自動化、整合 SaaS 服務
成本控制
可自訂 max_turns、token 限制
依平台設定,彈性較低
除錯體驗
查 console log、API 回應
視覺化執行歷史,較直觀
Page 27 · Compare Reference
Act V · §4
Recommended Path · 不是二選一,是先後
28 / 30 講義 · CH6-4
The Workflow · 我的建議路線

n8n 驗證
再用程式碼重做需要客製的部分

第一階段:n8n 把工具鏈邏輯跑通
流程對不對、模型有沒有用對工具、token 預算多少——拖一拖就知道。
不用花一天寫 Loop、debug schema。

第二階段:用程式重寫高頻 / 嵌入既有系統的部分
確認流程可行後,把需要嵌入產品、需要更高效能、需要更細控制的工具
搬到 Anthropic / OpenAI 直接呼叫。

節省試錯成本:用 n8n 把「值不值得做」想清楚,再決定要不要花工程資源寫死。
n8n·探索 / 驗證 / 內部工具·程式·產品 / 高頻 / 嵌入
Page 28 · Recommendation
Act V · 收尾
Map · D14 → D15 接續
29 / 30
What's Next · 明天我們繼續

D15 · Streaming · Evals · 成本控管

D14(今天)
Function Calling + Agent Loop + 三大陷阱防禦 + RAG-as-Tool
D15 · CH6-5
Streaming(即時回應)讓使用者不等到天荒地老 — 給你的 Agent 加上「逐字浮現」
D15 · PRAC6-1
Evals 品質驗收 — 你怎麼知道你的 Agent 真的有變好?建一份可重跑的測試集
D15 · Cost
成本 Dashboard — 一個 Agent 對話花你多少?怎麼設預算上限不爆?
銜接重點:今天的 Agent 跑得起來;明天讓它跑得快、跑得準、跑得起
Page 29 · Map Forward
D14 → D15
End of D14
30 / 30
D14 / 20 · Function + Agents · Complete

To Be
Continued

明天 D15 · Streaming · Evals · Cost

你今天從「會用 ChatGPT 聊天」升級成「能寫一個會自己決定動手的 Agent」。
明天我們把它變成可以上線、可以驗收、可以付得起的東西。

Vol.14·Function Calling · ReAct · RAG-as-Tool · Defense·2026
弄一下工作室·生成式 AI 職訓 140hr·D14 / 20
感謝今天的投入
— 明天見 · D15 —