一場從原理到實作的旅程。
4 小時,你會手刻自己的 agent,並理解 Claude Code、Cursor 怎麼運作。
劉弘祥 · 2026.05.16
劉弘祥
AI 自動化技術顧問,專注於生成式 AI、流程自動化與知識管理領域。清大電機所畢業,現從事企業 AI 導入顧問與人才培訓工作。
曾為金融、保險、科技、媒體等產業提供教育訓練與顧問服務,累積數十場課程與演講經驗。
從 LLM 原理到 Agent 架構,一條清晰的理解路線。
從零開始手刻一個有 tool use 和 loop 的 agent。不是 demo,是你自己的 code。
知道接下來要學什麼、怎麼學、哪些資源值得看。
| Part | 主題 | 時長 |
|---|---|---|
| 1 | AI 是什麼?怎麼走到這裡的 | 50 min |
| 2 | LLM 的可能與限制 | 55 min |
| 3 | 手刻 Agent Loop(動手最多) | 65 min |
| 4 | 從玩具到真實系統 | 47 min |
| + | 總結與 Q&A | 10 min |
問題驅動。每段以問題開場,穿插互動 demo 和程式實作。
ChatGPT、Claude、Gemini、Copilot、Midjourney、Cursor...
完全沒聽過?有聽過但不確定?已經在用了?
雖然是很簡單的版本,但從此你就不會再覺得
Agent 是一個很遙遠的概念了。
提示:技術突破和大眾爆發之間隔了 5 年。差別不在技術,在產品介面。
這是 AI 第一次真正「走進普通人」的日子。
在這之前,AI 是研究議題。在這之後,AI 是產品。
模型沒有突然變強。
是「模型 + 工具 + 迴圈」這個組合終於成熟。
正確率 > 95%。固定 schema、保證結構化輸出。能規劃多步驟工具呼叫。
4K → 1M tokens。能塞下整個 codebase,agent 才能「看到全貌」做決策。
2022 GPT-3:1M token ≈ $60
2026 Haiku:1M token < $1
Agent 跑上百次呼叫也不破產。
提示:答案是 3 個 r(st-r-awbe-rr-y)。但 AI 看到的不是字母,是 token。
# 同樣意思,token 數差很多
"What is the capital of Taiwan?" → 8 tokens
"台灣的首都是哪裡?" → 14 tokens
"請問你能夠告訴我...到底是位於哪一個城市嗎?" → 35 tokens
中文用戶在「同樣 context window」下能塞的內容比英文少。這是 LLM 的隱性偏見。
提示:7B、70B、400B⋯⋯這些數字是「參數量」,每個參數就是一個旋鈕。
| 規模 | 代表模型 | 特性 |
|---|---|---|
| ~7B | Llama 3 8B, Gemma 7B | 消費級 GPU,速度快 |
| ~70B | Llama 3 70B, Qwen 72B | 多張 GPU,能力提升 |
| ~400B+ | GPT-4, Claude, Gemini | 雲端 API,最強但最貴 |
| 年份 | 模型 | Context | 大概能塞 |
|---|---|---|---|
| 2022 | GPT-3.5 | 4K tokens | 一篇短文 |
| 2023 | GPT-4 | 32K | 一份小報告 |
| 2023 | Claude 2 | 100K | 一本短書 |
| 2024 | Claude 3 / Gemini 1.5 | 200K–1M | 整個 codebase |
參數量不等於智商。小模型 + 好 context engineering 常常超越大模型 + 爛 prompt。
提示:有個參數叫 Temperature,控制模型輸出的「隨機程度」。
每次都選機率最高的 token
→ 穩定、可預測
同一個 prompt,每次跑結果一樣。
適合:寫程式、做 agent、結構化輸出
按原始機率分佈採樣
→ 更有創意、更多變
同一個 prompt,每次跑結果不同。
適合:寫文案、brainstorm、故事創作
實務建議:寫程式 / 做 agent 用 0~0.3;寫文案 / brainstorm 用 0.7~1.0
提示:LLM 一個 token 一個 token 生成。如果先讓它「想」,後面每一步都有更好的 context。
輸入: "今天天氣很"
模型內部:
下一個字機率分佈 = {
"好": 0.45,
"熱": 0.20,
"冷": 0.15,
"差": 0.08,
... (其他 5 萬個 token)
}
取最高機率(或加 sampling)→ "好"
接回去 → "今天天氣很好"
繼續猜下一個字 → ","
繼續猜 → "適合"
繼續猜 → "出門"
... 直到輸出 <end> token
每一步的 token 都有前一步當 context,準確度就會提升。先讓模型輸出推理過程,再輸出答案。
現代 reasoning model(Claude thinking、o1)會自動做 CoT。不用特別 prompt。
| Chatbot | Agent |
|---|---|
| 一輪一輪對話 | 自己連續執行多步驟 |
| 只能回應文字 | 能執行動作(寫檔、call API、改 DB) |
| 你問什麼答什麼 | 你給目標,它自己拆解 |
| 記憶在 context window 內 | 可以有跨對話的長期記憶 |
| 停在「給文字」 | 停在「達成目標」或「無法達成」 |
ChatGPT + tools, Claude.ai
本質還是「你問我答」,只是答的時候會去查資料、跑 code。
時間尺度:秒
Claude Code, Cursor
給明確任務、有限時間。中途會自己讀檔、跑命令、修正。
時間尺度:分鐘
Devin, Manus, ChatGPT Agent
長時間自己跑。網頁、檔案、外部 API 都能用。
時間尺度:小時~天
打開 Claude Code,給它一個 issue,看它自己讀檔、跑 grep、改 code、跑測試、commit。
關鍵觀察:沒有人教它「先 grep 再 read」,它自己想出來。後面三個 Part 都在拆這個東西。
export GEMINI_API_KEY="你的key"
免費額度:Gemini 2.0 Flash Lite
每分鐘 30 requests,足夠課堂使用。
Part 3 動手做 agent 時會用到。如果還沒申請,趁休息時間處理。
在動手做 agent 之前,我們得先理解「那個會思考的東西」其實是什麼——以及它不是什麼。
提示:LLM 不知道自己「知不知道」。它永遠會給答案,不會 return null。
因為它不知道自己「知不知道」。
return null它沒在算,它在「回憶看過類似題目的答案」。
解法:給它 calculator 工具。這就是 Part 3 要做的。
python examples-gemini/01_first_call.py
看:basic call、system prompt、temperature 對比、token usage。
使用 Gemini API + gemini-3.1-flash-lite 免費模型
提示:Prompt Engineering 是「怎麼寫好一句指令」。但現在更重要的是——模型看到的所有資訊怎麼設計。
2022-2023 大家研究:「那一句問句」怎麼寫
這些技巧現在還有用,但已經不是主戰場。
2024+ 重點變成:整個 context 怎麼設計
角色、規則、限制
展示想要的行為
能做什麼動作
過去說過什麼
查到的相關文件
過去學過的事
User:看看這個資料夾有什麼,幫我寫個 README.md
Claude:好的,請問資料夾路徑是?你希望 README 包含哪些內容?...
變成廢話對話
User:看看這個資料夾有什麼,幫我寫個 README.md
Claude:[自己 ls → read 多個檔案 → 理解專案 → 產生 README.md]
變成自主 agent
同一個模型,差別只在 context engineering。
模型是引擎,Context 是駕駛。
一樣的引擎能做計程車,也能做賽車。
python examples-gemini/02_token_explore.py
看:中英文 token 數差距、multi-turn 累積。
使用 Gemini API + gemini-3.1-flash-lite 免費模型
提示:有一種特殊的訊息叫 System Message,它在對話開始前就設定好模型的「行為邊界」。
對話開始前給模型的「角色設定」。不是對話的一部分,而是設定模型的行為基調。
在 Agent 中:System message 定義了 agent 的「人格」和「行為邊界」——該做什麼、不該做什麼、遇到錯誤怎麼處理。
calculator(1+1)」python examples-gemini/02_token_explore.py Demo 3
看:用 system prompt 強制模型輸出合法 JSON。
使用 Gemini API + gemini-3.1-flash-lite 免費模型
提示:如果模型可以「說」它想用計算機,而你的程式真的幫它算了呢?
給模型一份「工具清單」,模型可以選擇:
程式接到工具呼叫 → 真的去執行 → 把結果回給模型 → 模型決定下一步。
tools = [{
"name": "calculator",
"description": "進行四則運算,回傳結果",
"input_schema": {
"type": "object",
"properties": {"expression": {"type": "string"}},
"required": ["expression"]
}
}]
response = client.messages.create(
model="claude-sonnet-4-5",
tools=tools,
messages=[{"role": "user", "content": "幫我算 23 * 47"}]
)
tools = [{
"type": "function",
"function": {
"name": "calculator",
"description": "進行四則運算,回傳結果",
"parameters": {
"type": "object",
"properties": {"expression": {"type": "string"}},
"required": ["expression"]
}
}
}]
response = client.chat.completions.create(
model="gemini-3.1-flash-lite",
tools=tools,
messages=[{"role": "user", "content": "幫我算 23 * 47"}]
)
{
"model": "gemini-3.1-flash-lite",
"messages": [
{
"role": "user",
"content": "用一句話解釋什麼是 API"
}
]
}
{
"choices": [{
"message": {
"role": "assistant",
"content": "API 就是一份「菜單」——你照格式點餐,後廚(伺服器)就會把做好的結果端給你,你不需要知道廚房裡怎麼運作的。"
}
}],
"usage": {
"prompt_tokens": 18,
"completion_tokens": 52,
"total_tokens": 70
}
}
python examples-gemini/03_tool_use_basic.py
看:tool_use → execute → tool_result → final response 的完整一輪。
使用 Gemini API + gemini-3.1-flash-lite 免費模型
提示:ChatGPT 是「你問它答」,Agent 是「你給目標,它自己想辦法」。
| ChatGPT(Chatbot) | Agent |
|---|---|
| 一輪一輪對話 | 自己連續執行多步驟 |
| 只能回應文字 | 能執行動作(寫檔、call API、改 DB) |
| 你問什麼答什麼 | 你給目標,它自己拆解 |
| 記憶在 context window 內 | 可以有跨對話的長期記憶 |
| 停在「給文字」 | 停在「達成目標」或「無法達成」 |
提示:Agent 的本質就是一個 while 迴圈。每一輪:問模型 → 要用工具嗎?→ 執行 → 結果回去 → 再問。
如果模型呼叫工具後,需要再呼叫另一個工具怎麼辦?
例:「30 天後是星期幾?」
messages = [{"role": "user", "content": user_input}]
while True:
response = client.messages.create(
model=MODEL, tools=tools, messages=messages
)
messages.append({"role": "assistant", "content": response.content})
if response.stop_reason == "end_turn":
break # 模型不再需要工具,結束
tool_results = []
for block in response.content:
if block.type == "tool_use":
result = execute_tool(block.name, block.input)
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": result,
})
messages.append({"role": "user", "content": tool_results})
messages = [{"role": "user", "content": user_input}]
while True:
response = client.chat.completions.create(
model=MODEL, tools=tools, messages=messages
)
msg = response.choices[0].message
messages.append(msg)
if msg.tool_calls is None:
break # 模型不再需要工具,結束
for tc in msg.tool_calls:
result = execute_tool(tc.function.name,
json.loads(tc.function.arguments))
messages.append({
"role": "tool",
"tool_call_id": tc.id,
"content": str(result),
})
後面所有「花俏的東西」都是在這上面加裝飾:
變成角色化 agent
能做更多事
跨對話記得事
能拆解大任務
變成可觀察的產品
能驗證品質
框架會換、模型會變,但這個結構不變。
論文 ReAct: Synergizing Reasoning and Acting(2022)提出的模式:
Thought: "使用者想知道 30 天後是星期幾,我先拿今天日期"
Action: get_current_time()
Observation: "2026-05-16"
Thought: "今天 5/16,加 30 天是 6/15"
Action: get_weekday("2026-06-15")
Observation: "星期一"
Thought: "可以回答了"
Final: "2026 年 6 月 15 日是星期一。"
現在的 Claude / GPT 已經內建這個模式,不用特別 prompt 它。
python examples-gemini/04_agent_loop.py
給 agent 三個工具(時間、計算、星期),看它自己規劃多步驟。
使用 Gemini API + gemini-3.1-flash-lite 免費模型
{"role": "user", "content": "幫我算 (15 * 23) + 100 是多少?"}
{
"tool_calls": [{
"id": "call_abc123",
"function": {
"name": "calculator",
"arguments": "{\"expression\": \"(15 * 23) + 100\"}"
}
}]
}
eval("(15 * 23) + 100") # → 445
{"role": "tool", "tool_call_id": "call_abc123", "content": "445"}
{
"content": "(15 * 23) + 100 = 445",
"finish_reason": "stop"
}
提示:LLM 決定「用不用工具」和「怎麼用」,完全依賴你寫的描述。描述差 = agent 笨。
{
"name": "search",
"description": "search something"
}
模型不知道:搜什麼?網路還是本地?回傳什麼?
{
"name": "search_web",
"description": "Search the public internet for current info. Use when user asks about events after 2024 or current data. Returns top 5 results: title, snippet, URL."
}
明確說「何時用」、「回傳什麼」。
工具描述 = 給 LLM 的使用說明書。寫得好 agent 表現翻倍。
給 agent 一組「能讀寫檔案」的工具:
| 工具 | 說明 |
|---|---|
| list_directory | 列出資料夾內容 |
| read_file | 讀取檔案 |
| write_file | 寫入檔案 |
給它任務:「看看資料夾裡有什麼,幫我寫一份摘要。」
關鍵觀察:沒有人教它「先 list 再 read 再 write」,它自己規劃。
python examples-gemini/05_file_agent.py
注意 agent 自己探索的順序。試試把工具描述改差,看它變笨。
使用 Gemini API + gemini-3.1-flash-lite 免費模型
提示:對話越長,token 越多,模型注意力越被稀釋。你需要策略來控制。
角色、能力、限制、使用工具的規則、輸出風格。
描述差 → agent 不知何時用。Tool description 是 LLM 的「使用說明書」。
Tool 失敗時,把錯誤原封不動回傳給模型。不要 catch 然後吞掉。
長對話 token 會爆。截斷、摘要、compact、subagent 是四種應對。
只保留最近 N 輪。
簡單但遺忘舊資訊。
舊內容壓縮成摘要。
保留事實,細節遺失。
整段對話 LLM 重寫 = Claude Code compaction。
最聰明但最貴。
子任務獨立 context。
主對話完全乾淨。
你剛剛學會的東西:
Agent 不神秘。它就是一個 while 迴圈、一些工具、和一個會選工具的 LLM。
為什麼同樣是 Claude,跑在 Claude Code 裡像神,跑在裸 API 裡像新手?因為它穿了不同的「裝具」。
提示:模型是馬,Harness 是馬具。馬有力量,但需要馬具來引導和控制。
harness = 馬具、挽具
在 AI 圈,特指「把模型套上來用的整套裝置」。
Claude(模型)可以同時跑在:
對話介面、Artifacts、搜尋
檔案系統、Bash、subagent、hooks
你自己寫什麼,它就只有什麼
同模型、三種 harness、行為完全不同。
核心三件套
角色、規則、語氣
模型能「做」的事
多輪執行、狀態管理
外圍配件
跨對話記憶
權限、沙箱
使用者介面
品質追蹤
子任務分工
生命週期攔截
自我規劃
提示:它和你剛寫的 agent 是同一個架構。差別只在工程規模。
You are Claude Code, Anthropic's official CLI for Claude...
# Doing tasks
- The user will primarily request you to perform
software engineering tasks...
- Prefer editing existing files to creating new ones.
- Don't add features, refactor, or introduce abstractions
beyond what the task requires.
# Using your tools
- Prefer dedicated tools over Bash when one fits
(Read, Edit, Write)
- Use TodoWrite to plan and track work.
- You can call multiple tools in a single response.
# Tone and style
- Only use emojis if the user explicitly requests it.
- Your responses should be short and concise.
完整 system prompt 約 5000+ tokens。Anthropic 投入大量 prompt engineering 進去。
| 工具 | 用途 | 為什麼這樣設計 |
|---|---|---|
Read | 讀檔(加行號、限大小) | 不是 cat,因為要結構化 |
Edit | 精準 string replacement | 不是整檔重寫,省 token、減錯 |
Write | 建立新檔 | 少用,避免覆蓋 |
Bash | 執行 shell | 逃逸閥 |
Grep | 搜尋字串 | 不是叫 bash grep,是 ripgrep 包裝 |
TodoWrite | 自我管進度 | 強制 agent 規劃 |
Agent | spawn subagent | context isolation |
太粗(給 bash 就好)→ 模型亂下指令;太細 → tool 太多模型選不出來。
| 組件 | 課程範例 | Claude Code |
|---|---|---|
| System Prompt | 幾行 | 超過 1 萬字 |
| 工具數 | 3–5 個 | 數十個 |
| Loop | 基本 while | 加上錯誤處理、重試、token 管理 |
| Subagent | 範例 07 | 內建 Task tool 做 context isolation |
| 記憶 | JSON 檔 | CLAUDE.md + TodoWrite |
提示:其實就是「讀寫一個 JSON 檔案」。沒有任何神奇的技術。
給 agent 兩個工具:save_memory 和 load_memory
memory.json核心概念都一樣:agent 透過工具存取資訊。
python examples-gemini/06_agent_with_memory.py
第一次對話告訴 agent 你的名字,第二次(messages 重置)它還記得。
使用 Gemini API + gemini-3.1-flash-lite 免費模型
提示:主 agent 的 context 越長越混亂。如果能「開一個新的 LLM 對話」跑子任務呢?
為什麼需要:主對話 context 越長越貴 + 模型越混亂。
使用者:「幫我比較 Anthropic、OpenAI、Google 的 agent 策略」
→ spawn_subagent() × 3
研究 Anthropic
獨立 context
研究 OpenAI
獨立 context
研究 Google
獨立 context
只有摘要回到主 context,不被中間 100 步污染。
主對話只看到「結果」,不被中間 100 步污染。
python examples-gemini/07_subagent.py
主 agent 收到「比較三家公司」,spawn 三個 subagent,每個有獨立 context。
使用 Gemini API + gemini-3.1-flash-lite 免費模型
提示:Agent 有工具。被注入後不只是回答奇怪的東西——它可能執行危險操作。
Prompt injection 是攻擊者透過輸入文字,覆蓋或繞過 system message 的限制。
被注入 → 回答奇怪的東西
被注入 → 可能執行危險操作(刪檔案、發送資料)
提示:Agent 任務是開放式的,沒有「正確答案」。這是目前最難的問題之一。
做 agent 不難,做品質穩定的 agent 很難。
推薦工具:Inspect(UK AISI)、Promptfoo
| Harness | 模型 | 目標 | 特色 |
|---|---|---|---|
| ChatGPT | GPT-4/5 | 通用對話 | Web、Code Interpreter、Image Gen |
| Claude Code | Claude | Coding agent | 強檔案系統、Bash、subagent、hooks |
| Cursor | 多模型 | IDE-first coding | Diff-first、in-editor、Composer |
| Devin | 多模型 | 自主 coding agent | 長時間執行、瀏覽器、planner |
| Manus | 多模型 | 通用任務 agent | 多領域工具、自主執行 |
模型快變成「商品」,Harness 才是差異化。
想做出有特色的 agent 產品?
把今天串成一張圖,告訴你接下來該往哪走。
提示:Agent 是「用 API」,不是「跑模型」。計算在雲端,你的電腦只跑迴圈和執行工具。
完全可以,而且今天課程就是證明。
Agent 是「用 API」,不是「跑模型」。一台普通筆電 + 網路就夠了。
只要付一點點 token 費用(或免費模型)。今天用的 Gemini 就是免費的。
穩定、快速、不用管硬體。
Llama、Qwen、Gemma 等開源模型持續進步。
但入門階段先用 API 會比較順暢。
今天的 7 個範例約 32 次 API 呼叫、約 7,150 tokens,全部在 Gemini 免費額度內。
提示:Coding Agent → Multi-Agent → Eval → 多模態。按這個順序走不會迷路。
Claude Code:今天看到的,開源可學
Codex (OpenAI):類似概念
先用起來,體會 agent 能做什麼
讓 agent 有更多能力:瀏覽器操作、資料分析
多個 agent 協作:規劃者 + 執行者 + 審查者
LangGraph:graph-based
Pydantic AI:型別友善
Anthropic Agent SDK:官方、簡潔
怎麼衡量 agent 品質:Inspect、Promptfoo
讓 agent 操作瀏覽器、看圖、看影片
HARNESS
LOOP ↻
LLM
↑ Context(engineered)
Agent = LLM + Tools + Loop + Context
框架會換、模型會變,但這個結構不變。
你今天看到它的全貌了。
NTHUDS-0516
app.sli.do/event/jGSXuWdWbtvaq5FsFHu6Ut
問問題的最好時機:
「我大概懂了,但有件事我不太確定...」
清大資料科學社 · 2026.05.16
課程資源:Notion 頁面(掃 QR Code)
回饋:Slido NTHUDS-0516