技術參考 · Reference

AI Agent 架構解剖

LLM 應用是由哪些元件組成的、它們各自解決什麼問題、哪些由模型判斷哪些由程式碼決定。 從最小的單次呼叫,一路拆到多代理系統。

14 節 約 20 分鐘 不綁特定框架或供應商

00核心心智模型

LLM 是一個無狀態的函數:文字進去,文字出來。它不記得你、沒有 session、 碰不到你的資料庫、也不會主動做任何事。整個 AI 架構裡其他所有元件的存在, 都是為了兩件事 —— 餵它該知道的,以及幫它做它想做的。

單次呼叫 完整輸入 指令 + 歷史 + 工具 + 檢索結果 LLM 機率性 · 無狀態 一段文字 或一份工具請求單 呼叫結束後 連線關閉。模型不保留任何東西。 下一次呼叫是它「這輩子第一次」看到你。
所有「AI 記得我說過什麼」的體驗,都是應用端把歷史重新送一遍做出來的幻覺。 記憶不在模型裡,在你的資料庫裡。
為什麼這件事決定一切
  • 模型無狀態 → 每一輪都要重傳全部上下文 → 成本隨對話長度累積
  • 模型碰不到外界 → 它只能「請求」你去做 → 控制權永遠在你的程式手上
  • 模型是機率性的 → 同樣輸入可能不同輸出 → 輸出必須被驗證才能信任

01五層架構總覽

不管用什麼框架、什麼供應商,成熟的 LLM 應用都會長出這五層加上一組橫切關注。 層與層之間的關係是「上層指揮下層」,而不是「上層包含下層」。

05
介面層Interface
Chat UICLI WebhookAPI 語音IDE 外掛
04
控制層Orchestration
Agent LoopPlanner RouterDispatcher Sub-agents
03
能力層Capabilities
ToolsSkills MCPRetrieval / RAG Memory
02
上下文層Context
System Prompt對話歷史 工具定義檢索結果 工具回傳
01
模型層Model
LLM 推論Inference Provider Tokenizer
橫切關注 GuardrailsObservability EvalState Store CacheSandbox

控制權的形狀

這張圖比分層圖更重要。它回答一個關鍵問題:誰呼叫誰? 答案是 —— Orchestrator 呼叫所有人,沒有人呼叫 Orchestrator。

Orchestrator 你寫的程式 · 唯一有主動權 LLM 送去 · 拿回建議 Tools 呼叫 MCP 呼叫 Retrieval 檢索 Memory 讀寫 Skills 讀取 實線 = 呼叫並取得結果  虛線 = 讀成文字塞進 context,沒有回傳值
LLM 那條線是唯一雙向的,但兩個方向都由 Orchestrator 發起 —— 它送出請求、收到建議,然後自己決定要不要照做。 Skills 的線是虛線,因為它不是被呼叫的端點,而是被讀進上下文的文字。

02模型層 — 引擎

元件職責可替換性
LLM唯一會「思考」的東西。無狀態、機率性、只吃文字吐文字高 — 但換模型要重測 prompt
Inference Provider實際跑模型的服務(雲端 API、自架推論伺服器)很高 — 多數 API 互相相容
Tokenizer文字 ↔ token 轉換,決定計費與上下文佔用綁定模型,不可自選

這層應該被抽象成一個介面。把模型當成可替換的零件,不要讓業務邏輯知道它在跟誰講話。 開源權重模型(可自架、可換供應商)與閉源 API 模型的最大差異就在這裡:後者換掉的成本高得多。

兩類常見的模型形態

標準模型
直接生成答案

收到輸入就開始逐 token 產出回應。延遲低、可預測、便宜。適合抽取、分類、格式轉換、一般對話。

推理模型
先思考再回答

先產出一段內部推理,再給最終答案。準確度較高,但延遲與費用都上升 —— 那段思考也是要付錢的 token。多數供應商提供「思考強度」參數讓你控制。

注意

推理模型的內部思考內容不適用與最終答案相同的安全與品質標準,設計上不應直接顯示給終端使用者。多數 API 提供參數把它從回應中排除。

03上下文層 — 最被低估的一層

Context window 是整個系統唯一的工作記憶。所有能力層元件最終都在爭奪這塊空間。 Context engineering 已經取代 prompt engineering 成為主要的工程課題 —— 問題從「怎麼把話說好」變成「有限空間裡該放什麼、什麼時候放、什麼時候丟」。

System Prompt
工具定義
Skill 內容
檢索結果
對話歷史 ↗
工具回傳 ↗
生成空間(須預留)
固定成本 · 每輪重傳 會膨脹 · 需要管理 不可壓縮
左半部是每輪都要重付的固定成本;中段的兩塊會隨著任務進行不斷長大, 是最需要主動管理的部分;最右側必須預留,否則模型會被截斷在句子中間。

三個必須理解的量

概念是什麼為什麼你要在意
Token 模型的最小處理單位。英文約 3–4 字元一個;中日韓文字約一字 0.6–1.5 個 計費單位。input 與 output 通常不同價,output 較貴
Context window 單次呼叫能容納的 token 上限(輸入+輸出合計) 硬性限制。超過就報錯或被截斷
Context rot 上下文塞入過多不相關內容後,模型注意力被稀釋、表現下降 「還沒到上限」不等於「可以繼續塞」。塞越多不一定越準
貫穿全文的主題

Skills 的漸進式載入、Tool 的搜尋機制、RAG 的檢索、Sub-agent 的上下文隔離 —— 這四個看起來完全不同的技術,其實在解同一個問題: context window 是稀缺資源,必須按需分配。理解這件事之後,很多架構選擇會突然變得合理。

04Tools — 讓模型能影響外界

Tool 是你定義的一個可執行 function。你用結構化的 schema 把它「介紹」給模型, 模型判斷該不該用,然後 —— 關鍵在這裡 —— 由你執行,不是由模型執行。

一個 tool 的三個部分

{
  "name": "search_orders",
  // description 就是 prompt:模型靠讀這段文字決定要不要呼叫
  "description": "當使用者要查詢訂單狀態或歷史時使用。
                  若使用者是要建立新訂單,改用 create_order。",
  "input_schema": {
    "type": "object",
    "properties": {
      "customer_id": { "type": "string" },
      "status": { "type": "string", "enum": ["pending","shipped","done"] }
    },
    "required": ["customer_id"]
  }
}
最容易被誤解的一點

模型永遠不會真的執行你的 function —— 它做不到,它在別人的機器上, 碰不到你的資料庫。它能做的只有輸出一份「我想呼叫 X,參數是這些」的請求單。 Tool calling 的本質是一個約定好格式的請求,不是遠端執行。

完整的一次來回

你的程式 LLM Tool 實作 ① messages + 工具定義 ② 「我要呼叫 X(args)」 ③ 驗證後實際執行 ④ 執行結果 分岔點 回覆不需要模型潤飾 → 用模板組字,到此結束(只花一次呼叫) 選用:只有在需要模型「讀懂結果再講人話」時才發生 ⑤ 全部重傳 + 工具結果 ⑥ 自然語言最終回答
步驟 ② 到 ④ 之間,模型已經下線了 —— 它不知道你有沒有執行、成功沒有,除非你在 ⑤ 告訴它。 第二次呼叫必須把前面所有內容重傳一次,所以每多一輪,輸入成本就疊加一次。

並行工具呼叫

「Tool calling 一定要多輪來回」是常見誤解。回應裡的工具請求是一個陣列 —— 模型可以在同一次生成裡要求呼叫多個工具,這叫 parallel tool calling,不增加往返次數。

真正觸發多輪的條件只有一個:模型需要看到執行結果,才能決定下一步該做什麼。 如果執行成功後你只要回一句模板訊息,那永遠是一去一回。

05Skills — 讓模型知道「怎麼做」

Tool 回答「我能做什麼」,Skill 回答「我該怎麼做」。 它是一包打包好的流程知識,通常是一個資料夾:

my-skill/
├── SKILL.md          ← frontmatter: name + description(常駐 context)
│                        body: 完整步驟、規範、範例(按需載入)
├── scripts/          ← 輔助腳本,需要時才執行
└── references/       ← 參考文件,需要時才讀

核心機制:漸進式揭露

這解決一個真實的困境 —— 「怎麼做一件事」的知識量遠大於「能做什麼」。 你不可能把 30 頁的品牌規範塞進一個 tool 的 description, 但可以做成 skill,讓它只在相關時才進到上下文。

00
啟動掃描
Orchestrator 掃過所有 skill 資料夾,只讀每個檔案最上面的 name 與 description,完全不讀內文。
~50 tok / 個
01
目錄常駐上下文
把這份「名字 + 什麼時候該用」的極簡清單放進 system prompt。每次呼叫都帶著,但很便宜。
固定成本
02
模型命中 → 才載入全文
LLM 讀目錄、比對語意,判斷某個 skill 適用,於是要求載入。Orchestrator 才去讀完整檔案並塞進上下文。需要更多細節時,再讀 references/。
~3,000 tok
分工是三方的:Orchestrator 提供選單,LLM 點菜,Orchestrator 上菜。 程式端從不判斷哪個 skill 相關 —— 那需要理解語意,所以交給模型。

為什麼值得這麼麻煩

Skill 數量全部載入漸進式載入
4 個12,000200
20 個60,0001,000
100 個300,000 · 爆了5,000

而且這是每一輪都要重傳的固定成本。十輪對話就是十倍浪費。 更重要的是 context rot —— 塞太多不相關的指令,模型反而會變笨。

description 是整包 skill 最重要的一行

它是唯一常駐上下文的內容。寫爛了,這個 skill 就永遠不會被觸發。

失敗寫法
描述「是什麼」

description: PDF 處理工具

模型看不出什麼情況該用。太模糊的版本則相反 —— 會在不該觸發時觸發,污染上下文。

有效寫法
描述「什麼時候用」

當需要讀取、拆分、合併 PDF 或填寫 PDF 表單時使用。觸發詞:PDF、表單、合併頁面。不適用於 Word/Excel,改用 office-docs。

有情境、有關鍵字、有邊界。

寫作心法

假裝你在寫一張給沒讀過內文的人看的索引卡:他必須只憑這張卡, 判斷現在該不該去翻那本書。加上「不適用於 X,改用 Y」特別有效 —— skill 一多,最常見的錯誤不是沒觸發,而是觸發了鄰居。

挑選 skill 的四種設計

做法適用規模取捨
A. 全部塞進上下文 < 5 個且都很短 + 最簡單,沒有選錯問題 − 不可擴展
B. 目錄常駐+模型判斷
主流做法
5 – 100 個 + 便宜、判斷準(模型懂語意與上下文) − 目錄本身仍有固定成本
C. 向量檢索先篩 100 個以上 + 可擴展到無限多 − 檢索會漏(語意相似 ≠ 該用),多一層延遲
D. 程式碼寫死規則 觸發條件明確可判斷 + 零成本、完全可預測 − 只能處理你想到的情況

實務上常是混搭:用 D 處理明確的(副檔名、路徑、使用者角色),B 處理其餘。

06MCP — 工具的插座

MCP(Model Context Protocol)不是一種能力,而是一個標準化的傳輸協定。 它把工具從「寫死在你的程式裡」變成「可插拔的外部伺服器」。

你的 Agent MCP Client MCP 協定(stdio / HTTP) 版控 Server tools · resources 別人寫的 資料庫 Server tools · resources 別人寫的 通訊軟體 Server tools · prompts 別人寫的
價值在於生態:你不用自己實作每個整合,裝一個 server 就有了。 每個 server 可提供三類東西 —— 可呼叫的 tools、可讀取的 resources、可套用的 prompts。
代價

每個 server 的工具定義都會佔上下文。接了 10 個 server、共 200 個工具, 光定義就可能吃掉十萬個 token。所以成熟的實作會加一層工具搜尋: 常駐只放工具名稱,模型需要時呼叫搜尋工具,才把那幾個相關工具的完整 schema 載入。 這和 Skill 的漸進式載入是同一個模式。

07Retrieval 與 Memory

Retrieval / RAG — 事實來源

模型的權重在訓練時就凍結了,而且不包含你的私有資料。 RAG 就是在呼叫模型之前(或之中)撈出相關資料塞進上下文。 關鍵是它有兩種模式,決定權的位置不同:

模式 A · 傳統 RAG
先檢索,再呼叫模型

Orchestrator 拿到問題就自己去檢索,把結果塞進上下文,然後才呼叫模型。

  • 延遲固定、可預測
  • 只查一次,查不到就沒了
  • 模型沒有機會說「這不夠,再查一次」
模式 B · Agentic Retrieval
把檢索包成工具

模型自己決定要不要查、查什麼、查幾次。檢索變成一個普通的 tool。

  • 更聰明:可以查完發現不夠再查
  • 更慢更貴:多輪往返
  • 執行仍由 Orchestrator 做,只是決定權移給模型

典型的檢索管線

使用者問題
   → 查詢改寫      把口語問題轉成好的搜尋語句(一次 LLM 呼叫)
   → 混合檢索      向量(語意相似)+ 關鍵字(精確命中)並行
   → 重排序        用專門的小模型把最相關的排到前面
   → 取前 N 名塞進上下文

每一步都可以省略,也都可以換成更複雜的做法。 混合檢索幾乎總是勝過單一檢索 —— 向量找得到「意思接近」,關鍵字找得到「就是這個詞」。

Memory — 狀態

常被混為一談,其實是三種完全不同的東西:

短期 Working中期 Session長期 Persistent
是什麼就是 context window 本身這次任務的進度、決策、中間結果跨 session 的事實:偏好、慣例、長期決策
生命週期一次呼叫一個任務永久
實作一個陣列KV store / DB checkpoint檔案或 DB + 按需檢索
難點空間不夠什麼時候存檢查點什麼時候該「想起來」
長期記憶的真正難題

不是「怎麼存」,而是「什麼時候該想起來」。 存了一萬條,這次對話該撈哪三條進上下文? 這本質上又變成一個檢索問題 —— 所以長期記憶的實作,最後幾乎都會長成一套 RAG。

08能力層對照 — 五個容易混淆的詞

這五個東西經常被放在一起講,但它們解決的是完全不同的問題。

回答的問題本質與模型的關係有回傳值?
Tools我能做什麼能力 Capability 模型請求 → 你執行有 · 結果
Skills我該怎麼做知識 Know-how 讀成文字 → 塞進上下文沒有 · 是指令
MCP從哪裡接進來傳輸協定 Transport 不直接參與,是通道有 · 代理工具結果
Retrieval我知道什麼事實 Facts 檢索結果 → 塞進上下文有 · 文件片段
Memory我記得什麼狀態 State 歷史/事實 → 塞進上下文有 · 狀態
最關鍵的一條分界線

Tool 是被呼叫的,Skill 是被讀取的。 Skill 沒有回傳值 —— 它把文字搬進上下文,改變的是模型的行為, 而不是給你一份資料。兩者互補:skill 的內容裡經常會寫「第三步請用 X 工具執行」。

09控制層 — 誰在指揮

Agent Loop:「Agent」這個詞的定義

有迴圈就是 agent,沒迴圈就不是。整個概念可以壓縮成十行程式碼:

messages = [system_prompt, user_input]

while True:
    response = llm(messages, tools)      # 想
    messages.append(response)

    if not response.tool_calls:        # 它不想再用工具了
        return response.text             # → 結束

    for call in response.tool_calls:
        result = dispatch(call)           # 做
        messages.append(tool_result(call.id, result))
    # 迴圈繼續:把結果餵回去,讓它決定下一步
呼叫 LLM(messages, tools) 回應含 工具請求? 否 回傳最終答案 結束 是 執行工具請求 結果 append 回 messages 沒有天然的終止條件 —— 一定要自己加 max_iterations 上限。 每一輪都會重傳全部歷史,成本與延遲隨輪數累積。
這個迴圈就是「AI Agent」的全部秘密。複雜度不在迴圈裡,在護欄與終止條件上。

Workflow 還是 Agent?這是最重要的架構決策

WORKFLOW · 路徑寫死在程式碼 步驟 1 呼叫 LLM 步驟 3 可預測 · 成本固定 · 好除錯 只能處理設計過的情境 AGENT · 路徑由模型決定 呼叫 LLM 要用工具 執行它指定的動作 完成 結束 有彈性 · 成本不定 · 難除錯 能處理沒預想過的情況
這個區分不是學術潔癖,它直接決定成本結構與除錯難度。 Workflow 每次執行成本固定,Agent 不是。
實務建議

絕大多數生產系統應該是 workflow,不是 agent。 只有當「你無法事先列舉所有可能路徑」時,才值得付 agent 的代價。 常見的成熟做法是混合:外層是固定階段的 workflow, 其中某一兩個階段內部才是 agent,讓它在有界的範圍內自己想辦法。

其他控制層元件

元件做什麼什麼時候需要
Planner 把大任務拆成可獨立執行的步驟,執行前先產出計畫 任務跨多步且順序重要時。直接丟進 agent loop 容易迷路
Router 判斷請求難度/意圖,分流到不同模型或路徑 想省錢時。簡單請求給小模型,或直接命中快取
Dispatcher 把工具名稱對應到實際 function 並執行 只要用了 tools 就需要。純程式,一個查表
Sub-agents 把子任務交給獨立的 agent,各有自己的上下文 任務會產生大量中間資料,而主流程只需要結論
Sub-agent 的第一價值不是並行

是上下文隔離。一個子 agent 讀了 50 個檔案,主流程只需要它三行結論 —— 那 50 個檔案的 token 從來沒有進過主上下文。 代價是子 agent 之間看不到彼此的發現,容易重複勞動, 所以適合互相獨立的任務,不適合需要協商的任務。

10橫切關注 — 上線後才知道多重要

Guardrails 護欄

輸入端
進到模型之前
  • Prompt injection 偵測
  • 個資遮罩
  • 惡意內容過濾
  • 速率限制與 token 上限
輸出端
離開模型之後
  • Schema 與型別驗證
  • 對照來源檢查幻覺
  • 敏感資料洩漏檢查
  • 高風險操作要求人工確認
唯一你必須內化的安全原則

模型的輸出永遠是不可信的輸入。 它必須先經過驗證,才能寫進資料庫、才能被執行、才能顯示給使用者。 這條原則同時擋掉了 prompt injection 的大部分實際危害 —— 就算攻擊者成功操控了模型,它產出的請求依然要通過你的驗證層。

Observability 可觀測性

LLM 應用的除錯難度遠高於傳統程式,因為同樣輸入可能有不同輸出。 沒有完整紀錄,事後根本無法重現問題。每一次呼叫至少要存:

  • 完整的輸入內容 —— 不只是使用者那句話,是整包送出去的東西
  • 模型、參數、版本 —— 供應商靜默更新模型是真實會發生的事
  • input/output token 數 —— 成本歸因的唯一依據
  • 延遲,分解到每個階段 —— 慢在檢索、模型、還是工具執行
  • 工具呼叫序列 —— agent 迷路時的唯一線索
  • 失敗發生在哪一層 —— 模型層?驗證層?執行層?

Eval 評估

沒有 eval 就沒辦法改進。 改了 prompt 之後,你憑什麼說變好了?靠感覺試三個 case 不算。

評分方式適用於成本
精確比對分類、格式轉換 —— 有唯一正解幾乎為零
程式化檢查JSON 合法性、必填欄位、數值範圍低
LLM-as-judge語氣、完整性、有沒有答到問題中 —— 要付模型費用
人工抽查最終品質把關、判斷 judge 準不準高,但不可完全省略

Sandbox 執行沙箱

一旦你給 agent 執行程式碼或操作檔案的能力,就需要隔離環境(容器、VM、獨立工作目錄)。 模型會寫出破壞性的指令,不是因為惡意,是因為它在解決問題 —— 而它不知道那個目錄裡有你三年的資料。

11誰是模型、誰是程式碼

架構圖上的一個框,不代表一個服務、一個模型、或一個進程。 很多框只是「同一顆 LLM 的第 N 次呼叫,換了不同的 system prompt」。

Planner、Router、Judge 這些聽起來像獨立系統的元件,實作起來往往就是一個函數, 裡面包一次 LLM 呼叫。理解這件事,能讓你看架構圖時不再被術語嚇到。

# 「Planner 元件」的全部實作
def plan(task: str) -> list[str]:
    resp = llm(
        system="你是任務規劃器。把使用者的目標拆解成 3-7 個"
               "可獨立執行的步驟。只輸出 JSON 陣列,不要解釋。",
        user=task,
    )
    return json.loads(resp)
由 LLM 完成
需要「理解語意」或「開放式判斷」
  • Planner — 分解任務
  • Router — 判斷意圖與難度
  • Query rewriter — 改寫檢索語句
  • Reranker — 重排檢索結果(常用專門小模型)
  • Summarizer — 壓縮過長的上下文
  • Judge — 評估輸出品質
  • 工具與 skill 的選擇
  • Sub-agent — 就是模型加自己的迴圈
由程式碼完成
確定性的、可測試的
  • Agent loop 本身 — 就是 while
  • Dispatcher — 名稱查表
  • Tool 實作 — 真正做事的部分
  • Schema 驗證
  • 向量檢索 — 相似度計算
  • Memory 讀寫
  • Guardrails — 格式、個資、速率
  • Observability — 記錄與計費
  • Cache — 命中判斷
判斷原則

需要理解人話或做開放式判斷的 → 交給 LLM。其他一律程式碼。 因為程式碼便宜、快、可預測、可測試。 每一個交給 LLM 的決定,都是在付錢買彈性 —— 要確認那份彈性真的需要。

三種呼叫模式的取捨

模式LLM 呼叫次數延遲適合
純解析
輸出用模板組
1最快格式轉換、分類、資料抽取
單步工具呼叫
+模板回覆
1最快要執行動作,但回覆不需模型潤飾
工具呼叫+模型潤飾2約兩倍需要模型讀懂結果再用人話說明
Agent loopN(不可預測)N 倍多步推理,下一步取決於上一步結果

12成熟度階梯

實務上該按這個順序往上加。每往上一層,成本、延遲、除錯難度都是跳躍式增加 —— 往上加要因為「真的需要」,不是因為「比較潮」。

LV 0
純呼叫
LLM + Prompt
文案生成、翻譯、改寫
LV 1
結構化輸出
+ Structured Output + 驗證層
資料抽取、意圖分類、表單填寫
LV 2
檢索增強
+ Retrieval / RAG
企業知識問答、客服、文件查詢
LV 3
工具使用
+ Tools / MCP + Guardrails
操作型助理,能真的改變系統狀態
LV 4
Agent
+ Agent Loop + Memory + 終止條件
自動化工作流,能處理沒預想過的路徑
LV 5
多代理系統
+ Sub-agents + Planner + Skills + Sandbox
程式開發代理、深度研究、大規模遷移
現實檢查

絕大多數應用停在 LV 1 到 LV 3 就已經足夠,而且往往是最佳解。 Agent 的價值只在「路徑無法事先窮舉」時才會浮現; 在路徑可窮舉的場景裡,它只會讓你付更多錢、等更久、更難除錯。

13常見誤解與術語

六個值得糾正的直覺

「模型可以呼叫我的 function」
它只能輸出一份請求單。執行永遠是你的程式做的 —— 模型在別人的機器上,碰不到你的任何東西。
「AI 記得我們之前聊過什麼」
記憶在你的資料庫裡。每一輪都是你把歷史重新送一遍,模型才「看到」前情提要。
「Tool calling 一定要多輪來回」
工具請求是陣列,一次生成可以要求多個工具。真正觸發多輪的是「模型需要看到執行結果才能決定下一步」。
「跑在伺服器上的程式就是 agent」
機器是 host,agent 是跑在上面的邏輯。而且要有「模型決定下一步」的迴圈才算 agent,否則是 workflow。
「架構圖上一個框就是一個服務」
Planner、Router、Judge 常常是同一顆模型換不同 prompt 呼叫。架構圖畫的是職責,不是進程數。
「上下文還沒滿,可以繼續塞」
塞入不相關內容會稀釋模型的注意力,表現反而下降。空間夠不等於該用。

術語速查

Token
模型的最小處理與計費單位
Context window
單次呼叫能容納的 token 上限,輸入輸出合計
Context engineering
決定有限上下文裡該放什麼、何時放、何時丟的工程實踐
System prompt
開發者給模型的指令,權重高於使用者輸入,使用者看不到
Structured output
在解碼層強制模型輸出符合指定 schema 的內容
Tool / Function calling
模型輸出「想呼叫哪個函數、參數為何」的機制
Parallel tool calling
同一次生成裡要求多個工具,不增加往返次數
Skill
打包成資料夾的流程知識,透過漸進式揭露按需載入
Progressive disclosure
只常駐簡短描述,判定相關後才載入完整內容
MCP
把工具、資源、prompt 從外部伺服器插進 agent 的標準協定
RAG
呼叫模型前後撈取外部資料塞進上下文,補足模型不知道的事
Hybrid retrieval
向量檢索與關鍵字檢索並用,再重排序
Agent loop
反覆「呼叫模型 → 執行工具 → 餵回結果」直到模型表示完成
Workflow
路徑寫死在程式碼裡的流程,模型只是其中一個步驟
Sub-agent
擁有獨立上下文的子代理,只把結論回報主流程
Guardrails
模型前後的輸入輸出檢查層
Prompt injection
使用者在輸入中夾帶指令,企圖覆蓋開發者的 system prompt
LLM-as-judge
用模型評分另一個模型的輸出,作為自動化評估手段
Context rot
上下文塞入過多不相關內容導致的表現退化
Idempotency
同一請求重複送達只產生一次副作用,防止重放造成重複寫入

一句話收尾

LLM 是唯一會思考的元件,但它什麼都做不到。 其他所有元件的存在,都是為了餵它該知道的,和幫它做它想做的。

→延伸閱讀

這頁是全景總覽 —— 講元件之間的關係、取捨與邊界。 每個主題還有一篇專門深入的筆記:

AI Agent 架構解剖 · 技術參考
內容為架構通論,不綁定特定框架或推論供應商。
術語隨產業演進,實作前請對照當前官方文件確認參數名稱與支援範圍。