AI Agent 的核心概念#
1.1 什麼是 AI Agent#
AI Agent 是 AI Model 的「手腳」 — 一層站在 user 跟 Model 之間的程式碼,負責執行 Model 想做但做不到的事(讀檔、跑指令、查網頁、改 code⋯⋯)。
AI Model(也叫 LLM、Large Language Model、大型語言模型)就是像 Claude、ChatGPT、Gemini 這種你可以用自然語言對話的 AI 模型。本質是 純文字生成器 — 給它輸入、它產生輸出,沒有手腳。後面章節都用 Model 這個詞代表 AI Model / LLM。
舉個例子。假設你想讓 Claude 幫你做這件事:「幫我讀 README.md 然後總結」。直接丟給 Model 看,會發生什麼?
sequenceDiagram
actor User
participant Model
User->>Model: "幫我讀 README.md 然後總結"
Model-->>User: "我沒辦法直接存取你的檔案系統,<br/>請貼上內容我可以幫你總結 ⋯⋯"Model 知道你要什麼,但它做不到 — 它只能輸出文字,沒辦法主動讀檔、跑指令、查網頁、改 code 這些「真實動作」。 沒有「手腳」幫它做事,Model 就只能停在「我做不到,請你貼給我」這一步。
加上 AI Agent 之後,Model 想做的事就有人替它執行:
sequenceDiagram
actor User
participant Agent as AI Agent
participant Model
User->>Agent: "幫我讀 README.md 然後總結"
Agent->>Model: 將對話傳給 Model
Model-->>Agent: "tool_use: read_file"
Note over Agent: 執行 read_file 讀檔
Agent->>Model: 把 tool_result 給 Model 繼續想
Model-->>Agent: "這個專案是 ⋯⋯"
Agent-->>User: "這個專案是 ⋯⋯"加了 AI Agent 之後,Model 還是只會輸出文字 — 但這次它寫的是 tool_use 標記,告訴 AI Agent 該叫哪個工具。 AI Agent 站在中間:看到 tool_use 就真的去讀檔,把讀檔結果包成 tool_result 訊息再回給 Model 繼續推論,最後把 Model 的總結轉給 User。
tool_use/tool_result是什麼? 是 Model API 訊息結構裡的兩個欄位 — Model 不會真的執行工具,它只是在回覆裡寫一個tool_use標記告訴 AI Agent 該叫哪個工具;AI Agent 執行完之後,把結果包成tool_result訊息傳回給 Model。 1.3 / 1.5 會反覆看到這兩個詞。
「手腳」這層內部由四個東西組成,接下來四節依序拆解:
- 1.2 Executor — AI Agent 的主體,真正動手執行的程式碼
- 1.3 Message 和 Role — Model 跟 Executor 用什麼格式溝通
- 1.4 Memory — Agent 的記憶 = 一個
messageslist,每輪都要重發整段歷史 - 1.5 Agent Loop — 為什麼一次任務要 Model 跟 Executor 反覆來回
1.2 Executor#
1.1 的圖把 AI Agent 當成黑盒子。打開來看,AI Agent 的核心元件叫 Executor — 後面章節會用「Executor」指 AI Agent 中那層「真正動手做事」的程式碼。 (業界其他名字:harness、scaffolding、agent runner,意思都一樣。)
Model 只會做一件事:看到對話歷史 → 輸出下一段文字 — 包括「我想呼叫 read_file」這種 tool_use 標記也是文字。 Executor 的工作就是把這種標記翻成真的去執行(讀檔、跑 shell、call API),執行結果包成 tool_result 訊息再回給 Model 繼續推論。
sequenceDiagram
actor User
box AI Agent
participant Executor
end
participant Model
User->>Executor: "幫我讀 README"
Executor->>Model: 將對話傳給 Model
Model-->>Executor: "tool_use: read_file"
Note over Executor: 執行 read_file 讀檔
Executor->>Model: 把 tool_result 給 Model
Model-->>Executor: "這個專案是 ⋯⋯"
Executor-->>User: "這個專案是 ⋯⋯"| 角色 | 位置 | 職責 |
|---|---|---|
| User | 外部 | 提需求、看結果。整個流程的起點與終點 |
| Executor | AI Agent 內部 | 接到 user 訊息 → 跟 Model 來回 → 執行真實動作(檔案系統、網路、shell)→ 把結果回給 user |
| Model | 外部服務(API) | 決定要做什麼 — 直接回答?還是先呼叫某個工具?呼叫哪個?參數是什麼? |
最關鍵的一句:模型不執行任何工具,它只在回覆文字裡寫出 tool_use 標記。真正動手讀檔、跑 shell、call API 的是 executor。這個分工是後面所有設計的根。
Model 不會自己知道 executor 有哪些工具 — 是 executor 主動把一份 「工具清單」 隨對話歷史一起傳給 Model 的。 工具清單長什麼樣、怎麼傳、實作該怎麼寫 CH02 詳談。
1.3 Message 和 Role#
Executor 跟 Model 的對話靠的是 Message 。
每個 Message 至少帶兩個欄位:
role— 誰在說話(user / assistant / system)content— 說了什麼(文字、tool_use 請求、tool_result ⋯⋯)
| |
Role 只有三種#
role 在 Anthropic 協定裡只有三種:
| Role | 誰寫的 | 內容 |
|---|---|---|
user | 真實使用者 ⊕ executor | 問題;或工具執行結果 |
assistant | 模型 | 文字回答 ⊕ 工具呼叫請求 |
system | 你(系統 prompt) | 模型行為設定 |
注意:沒有
toolrole。工具執行結果也是用userrole。
這個設計的好處是 訊息協定極簡:永遠是 user / assistant 交替,executor 只是「代寫 user 訊息」的角色。
user "幫我讀 README" ← 真使用者
assistant [我要呼叫 read_file] ← 模型決策
user [tool_result: "..."] ← executor 使用 user role 回覆 tool_result
assistant "這個專案是..." ← 模型總結1.4 Memory#
Agent 的記憶 = Message 歷史 = 一個 Messages list。
模型本身沒有記憶 — 因為他不會儲存每一次對話的 Message。
這跟 ChatGPT 網頁版「記得你問過什麼」不一樣 — 網頁版前端已經幫你把所有對話的 Message 塞回去給模型了。 Claude / GPT / 任何 Model API 都是沒有記憶的。
要讓模型「記得」事情,executor 會把所有對話的 Message(使用者的提問、tool_use、tool_result等)加到自己紀錄的 messages list,每次都是整個 messages list 一起傳送給模型,而不是只有單次對話的 message:模型看到完整的 Message 歷史,才知道下一步要做什麼。
| |
代價:對話越長,每輪傳的 token 越多,越貴越慢。 接下來 CH05 / CH06 / CH07 會把這層基礎記憶擴展成 短期 / 中期 / 長期 三層 memory 系統處理這個問題。
1.5 Agent Loop#
1.2 那張圖只示範了 一輪 工具呼叫(讀一個檔就總結完了)。真實任務通常要連續呼叫好幾個工具:
- 「列出 src/ 有哪些 Python 檔、每個做什麼」 → 先
ls src/→ 再對每個.py跑read_file - 「找出哪段 code 在處理 auth」 → 先
grep "auth"→ 再對命中的檔案read_file - 「修這個 bug」 →
read_file找問題 →write_file改 →run_shell跑 test 驗
每跑完一個工具,Model 都要看結果再決定下一步。所以 Executor 必須在 Model 跟「真實工具執行」之間 反覆來回 直到 Model 回 end_turn:
%%{init: {'sequence': {'noteAlign': 'left'}}}%%
sequenceDiagram
actor User
box AI Agent
participant Executor
end
participant Model
User->>Executor: ① 提出需求
loop Agent loop
Executor->>Model: ② 發送 messages list
alt stop_reason = tool_use
Model-->>Executor: ③ 要呼叫某個工具
Note over Executor: ④ 執行工具<br/>⑤ 把 tool_result 加到 messages list,回到 ②
else stop_reason = end_turn
Model-->>Executor: ③ 最終文字回答
Note over Executor: ④ 跳出 [Agent loop]
end
end
Executor-->>User: ⑤ 把最終回答轉給 user上圖兩條分支來自 Model 回應裡的 stop_reason 欄位 — 它是 Model 在每次回覆時附帶的「狀態旗標」,告訴 executor 當前這一輪是「還想呼叫工具」還是「已經有最終答案」。 Executor 看 stop_reason 決定下一步走哪條路:
- Executor 把累積的整段對話歷史發給 Model(1.4 講過:每輪都要把整段
messages重發) stop_reason = tool_use(要呼叫某個工具)→ executor 執行 Model 指定的工具 → 把結果包成tool_result加到對話 → 回到第 1 步stop_reason = end_turn(已經有最終答案)→ executor 把 Model 的文字答案抽出來回給 user → loop 結束
沒有這個迴圈,AI Agent 就只會「呼叫一次工具就結束」,做不了多步驟任務。退出條件就一個:stop_reason = end_turn。代表 Model 認為已有足夠資訊回答 user。
stop_reason 的完整清單#
除了上面 loop 用到的 tool_use 跟 end_turn,stop_reason 其實還有別的值:
| stop_reason | 意思 | 該做什麼 |
|---|---|---|
end_turn | 模型講完了 | 抽出文字,return |
tool_use | 模型要呼叫工具 | 執行 + append 結果 + 繼續 loop |
max_tokens | 輸出截斷了 | 提高 max_tokens 重試 |
stop_sequence | 撞到自訂停止字串 | 視情境處理 |
max_turns:避免無限次對話#
由於 Executor 會跟 Model 反覆來回 直到 end_turn,這層循環一旦不收斂就會 無限跑下去。常見的失控情境:
- Model 卡在「呼叫工具 → 看結果 → 又呼叫同一個工具」的死循環
- 工具持續回 error,Model 一直試新參數但都沒成功
為了避免無限來回,Agent Loop 必須加一個 最大次數 的限制:
| |
實務參考值:
- 一般問答任務:10 次夠
- 多步驟任務:30 次
- Agentic coding(讀很多檔、改很多地方):100+ 也常見
階段檢查點#
到這裡你應該理解:
- AI Agent = Model + Executor + Loop — 三個零件構成最小架構,每個各司其職
- Executor 是手腳 — Model 想做的事都靠 Executor 執行,工具呼叫、狀態維護都在這
- Message 是 protocol — Model 跟 Executor 之間靠 messages list 溝通,user / assistant / system 三種 role 各有用途
- Model 沒記憶 — 「記得」是 messages list 累積、每輪重發給它的假象
- Agent Loop 由
stop_reason控流 —tool_use繼續、end_turn收工;max_turns防無限循環
下一章 CH02 提供工具 把這章的「Tool calling」架構落地 — 寫出三件套(run_shell / read_file / write_file)的工具定義跟實作,讓 agent 真的能動手做事。